Merge branch 'lakebane-mines' into lakebane-custom-races
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.LootManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.loot.BootySetEntry;
|
||||
import engine.objects.*;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
@@ -26,7 +28,9 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
String output;
|
||||
|
||||
output = "Booty Simulation:" + newline;
|
||||
|
||||
if(target.getObjectType().equals(Enum.GameObjectType.Mob) == false){
|
||||
return;//ugh what?
|
||||
}
|
||||
Mob mob = (Mob) target;
|
||||
output += "Name: " + mob.getName() + newline;
|
||||
output += "Special Loot:" + newline;
|
||||
@@ -79,12 +83,19 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
goldAmount += lootItem.getNumOfItems();
|
||||
break;
|
||||
default:
|
||||
OtherDrops.add(lootItem);
|
||||
if(Warehouse.maxResources.containsKey(lootItem.getItemBaseID())){
|
||||
Resources.add(lootItem);
|
||||
} else {
|
||||
OtherDrops.add(lootItem);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
failures++;
|
||||
//throwbackError(playerCharacter,ex.getLocalizedMessage());
|
||||
//Logger.error(ex.fillInStackTrace());
|
||||
//return;
|
||||
}
|
||||
if (mob.getEquip() != null) {
|
||||
for (MobEquipment me : mob.getEquip().values()) {
|
||||
@@ -131,8 +142,17 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
}
|
||||
|
||||
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
||||
for(Item glass : GlassItems){
|
||||
output += " " + glass.getName() + newline;
|
||||
}
|
||||
output += "RUNE DROPS: " + Runes.size() + newline;
|
||||
for(Item rune : Runes){
|
||||
output += " " + rune.getName() + newline;
|
||||
}
|
||||
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
||||
for(Item contract : Contracts){
|
||||
output += " " + contract.getName() + newline;
|
||||
}
|
||||
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
||||
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
||||
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
||||
|
||||
@@ -645,16 +645,7 @@ public enum CombatManager {
|
||||
errorTrack = 4;
|
||||
|
||||
//Get hit chance
|
||||
|
||||
int chance;
|
||||
float dif = atr - defense;
|
||||
|
||||
if (dif > 100)
|
||||
chance = 94;
|
||||
else if (dif < -100)
|
||||
chance = 4;
|
||||
else
|
||||
chance = (int) ((0.45 * dif) + 49);
|
||||
int chance = (int)((atr-((atr+defense)*0.33f))/((defense-((atr+defense)*0.33f))+(atr-((atr+defense)*0.33f)))) * 100;
|
||||
|
||||
errorTrack = 5;
|
||||
|
||||
|
||||
@@ -116,10 +116,18 @@ public enum LootManager {
|
||||
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob) {
|
||||
|
||||
float dropRate = NORMAL_DROP_RATE;
|
||||
|
||||
//roll the geenric world drop table
|
||||
GenerateLootDrop(mob, 1300);
|
||||
if(ThreadLocalRandom.current().nextInt(1, 10000) == 5000) {
|
||||
MobLoot extraLoot = rollForGlass(mob);
|
||||
if (extraLoot != null) {
|
||||
mob.getCharItemManager().addItemToInventory(extraLoot);
|
||||
}
|
||||
}
|
||||
// Iterate all entries in this bootySet and process accordingly
|
||||
|
||||
boolean hasExtraRolled = false;
|
||||
for (BootySetEntry bse : entries) {
|
||||
|
||||
switch (bse.bootyType) {
|
||||
case "GOLD":
|
||||
GenerateGoldDrop(mob, bse);
|
||||
@@ -127,9 +135,8 @@ public enum LootManager {
|
||||
case "LOOT":
|
||||
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
|
||||
GenerateLootDrop(mob, bse.genTable); //generate normal loot drop
|
||||
if(ThreadLocalRandom.current().nextInt(1,101) < mob.level && mob.parentZone.getSafeZone() == 0) {
|
||||
if (ThreadLocalRandom.current().nextInt(1, 10000) < mob.level) {
|
||||
if (_genTables.containsKey(bse.genTable + 1)) {
|
||||
if(mob.parentZone.getSafeZone() == 0) {
|
||||
if (hasExtraRolled == false && ThreadLocalRandom.current().nextInt(1, 10000) < 5 * dropRate) {
|
||||
int roll = ThreadLocalRandom.current().nextInt(1, 101);
|
||||
MobLoot extraLoot = null;
|
||||
if (roll >= 1 && roll <= 50) {
|
||||
@@ -138,13 +145,13 @@ public enum LootManager {
|
||||
if (roll >= 51 && roll <= 94) {
|
||||
extraLoot = rollForRune(bse.genTable, mob);
|
||||
}
|
||||
if (roll >= 95) {
|
||||
extraLoot = rollForGlass(mob);
|
||||
}
|
||||
//if (roll >= 95) {
|
||||
// extraLoot = rollForGlass(mob);
|
||||
//}
|
||||
if (extraLoot != null) {
|
||||
mob.getCharItemManager().addItemToInventory(extraLoot);
|
||||
}
|
||||
}
|
||||
hasExtraRolled = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -193,9 +200,9 @@ public enum LootManager {
|
||||
|
||||
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
||||
int chance = ThreadLocalRandom.current().nextInt(1,101);
|
||||
if(chance > 5)
|
||||
if(chance > 10)
|
||||
return null;
|
||||
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
|
||||
int amount = ThreadLocalRandom.current().nextInt((int)(tableRow.minSpawn * 0.5f), (int)((tableRow.maxSpawn + 1) * 0.5f));
|
||||
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
||||
}
|
||||
|
||||
@@ -333,6 +340,8 @@ public enum LootManager {
|
||||
try {
|
||||
|
||||
MobLoot toAdd = getGenTableItem(tableID, mob);
|
||||
if(toAdd.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || toAdd.getItemBase().getType().equals(Enum.ItemType.RUNE))
|
||||
return;//block all contracts and runes that drop outside the confines of the new system
|
||||
|
||||
if (toAdd != null) {
|
||||
toAdd.setIsID(true);
|
||||
@@ -340,7 +349,6 @@ public enum LootManager {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
//TODO chase down loot generation error, affects roughly 2% of drops
|
||||
int i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,7 +393,7 @@ public enum LootManager {
|
||||
dropCount = 1;
|
||||
//break; // Exit on first successful roll.
|
||||
}
|
||||
if(ml != null && genericIB.isVorg()){
|
||||
if(ml != null && genericIB.isVorg() && mob.getMobBaseID() != 14062){
|
||||
ml.setIsID(true);
|
||||
ml.setDurabilityCurrent(ml.getDurabilityMax());
|
||||
mob.getCharItemManager().addItemToInventory(ml);
|
||||
@@ -493,7 +501,10 @@ public enum LootManager {
|
||||
}
|
||||
|
||||
public static MobLoot rollForContract(int table, Mob mob){
|
||||
GenTableEntry selectedRow = GenTableEntry.rollTable(table, 99, 1.0f);
|
||||
int roll = 99;
|
||||
if (table == 1900 || table == 1500)
|
||||
roll = 73;
|
||||
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
|
||||
if (selectedRow == null)
|
||||
return null;
|
||||
|
||||
@@ -516,7 +527,11 @@ public enum LootManager {
|
||||
return null;
|
||||
}
|
||||
public static MobLoot rollForRune(int table, Mob mob){
|
||||
GenTableEntry selectedRow = GenTableEntry.rollTable(table, 97, 1.0f);
|
||||
int roll = 97;
|
||||
if(table == 1900 || table == 1500){
|
||||
roll = 77;
|
||||
}
|
||||
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
|
||||
if (selectedRow == null)
|
||||
return null;
|
||||
|
||||
|
||||
@@ -2487,11 +2487,11 @@ public enum PowersManager {
|
||||
ChatManager.chatSystemInfo(pc, outmsg);
|
||||
return false; // can't target player, stop here
|
||||
} // target is mob
|
||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0)
|
||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == false)
|
||||
return pb.targetMob();
|
||||
|
||||
// target is pet
|
||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0)
|
||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == true)
|
||||
return pb.targetPet();
|
||||
|
||||
// target is Building
|
||||
|
||||
@@ -48,7 +48,12 @@ public class MobAI {
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter){
|
||||
if(((PlayerCharacter)target).getHidden() > 0){
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter && canCast(mob)) {
|
||||
|
||||
if (mob.isPlayerGuard() == false && MobCast(mob)) {
|
||||
@@ -249,6 +254,9 @@ public class MobAI {
|
||||
if(target.isPet() && target.isAlive() == false && target.guardCaptain.isAlive() == true){
|
||||
mob.setCombatTarget(target.guardCaptain);
|
||||
}
|
||||
if(mob.isPet()){
|
||||
AttackMob(target,mob);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
|
||||
}
|
||||
@@ -733,7 +741,7 @@ public class MobAI {
|
||||
|
||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
||||
|
||||
if (!loadedPlayer.isAlive()) {
|
||||
if (!loadedPlayer.isAlive() || loadedPlayer.getHidden() > 0) {
|
||||
loadedPlayers.remove(playerID);
|
||||
continue;
|
||||
}
|
||||
@@ -852,9 +860,6 @@ public class MobAI {
|
||||
private static void CheckForRespawn(Mob aiAgent) {
|
||||
|
||||
try {
|
||||
if(Mob.disciplineDroppers.contains(aiAgent) == true){
|
||||
return; // disc dropper respawns handled elsewhere
|
||||
}
|
||||
if (aiAgent.deathTime == 0) {
|
||||
aiAgent.setDeathTime(System.currentTimeMillis());
|
||||
return;
|
||||
@@ -891,7 +896,7 @@ public class MobAI {
|
||||
}
|
||||
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
|
||||
|
||||
if (Zone.respawnQue.contains(aiAgent) == false) {
|
||||
if (Zone.respawnQue.contains(aiAgent) == false && Mob.disciplineDroppers.contains(aiAgent) == false){
|
||||
Zone.respawnQue.add(aiAgent);
|
||||
}
|
||||
}
|
||||
@@ -978,7 +983,12 @@ public class MobAI {
|
||||
private static void chaseTarget(Mob mob) {
|
||||
|
||||
try {
|
||||
|
||||
if (mob.combatTarget.getObjectType() == Enum.GameObjectType.PlayerCharacter){
|
||||
if(((PlayerCharacter)mob.combatTarget).getHidden() > 0){
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
float rangeSquared = mob.getRange() * mob.getRange();
|
||||
float distanceSquared = mob.getLoc().distanceSquared2D(mob.getCombatTarget().getLoc());
|
||||
|
||||
|
||||
@@ -1408,7 +1408,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
}
|
||||
int cost = me.getMagicValue();
|
||||
int resourceCost = Warehouse.getCostForResource(me.getItemBase().getUUID());
|
||||
if(resourceCost != 0)
|
||||
if (resourceCost != 0)
|
||||
cost = resourceCost;
|
||||
|
||||
float bargain = sourcePlayer.getBargain();
|
||||
@@ -1440,10 +1440,9 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
|
||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
||||
ChatManager.chatSystemError(sourcePlayer,"Failed To Buy Item");
|
||||
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
||||
return;
|
||||
}
|
||||
|
||||
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
||||
if (buy != null) {
|
||||
me.transferEnchants(buy);
|
||||
|
||||
@@ -1254,33 +1254,37 @@ public class CharacterItemManager {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(ItemBase.getItemBase(i.getItemBaseID()).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
||||
int count = i.getNumOfItems();
|
||||
ArrayList<Item> purge = new ArrayList<>();
|
||||
for(Item item : this.inventory){
|
||||
if(item.getItemBaseID() == i.getItemBaseID()){
|
||||
if(item.getNumOfItems() + count <= Warehouse.getMaxResources().get(i.getItemBaseID())){
|
||||
purge.add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Item item : purge){
|
||||
count += item.getNumOfItems();
|
||||
this.removeItemFromInventory(item);
|
||||
item.junk();
|
||||
}
|
||||
Item resource = new MobLoot(this.getOwner(),i.getItemBase(),count,false).promoteToItem((PlayerCharacter)this.getOwner());
|
||||
this.inventory.add(resource);
|
||||
this.itemIDtoType.put(resource.getObjectUUID(), resource.getObjectType().ordinal());
|
||||
this.updateInventory(purge,false);
|
||||
return true;
|
||||
}
|
||||
} //else if (i.getItemBase().getType().equals(ItemType.RESOURCE)) {
|
||||
// if(this.inventoryContainsResource(i)){
|
||||
// Item resource = getResource(i);
|
||||
// if(resource != null){
|
||||
// resource.setNumOfItems(resource.getNumOfItems() + i.getNumOfItems());
|
||||
// return true;
|
||||
// }
|
||||
//}
|
||||
// }
|
||||
|
||||
this.inventory.add(i);
|
||||
this.itemIDtoType.put(i.getObjectUUID(), i.getObjectType().ordinal());
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean inventoryContainsResource(Item resource) {
|
||||
for(Item i : this.inventory){
|
||||
if(i.getItemBaseID() == resource.getItemBaseID())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private Item getResource(Item resource) {
|
||||
for(Item i : this.inventory){
|
||||
if(i.getItemBaseID() == resource.getItemBaseID())
|
||||
return i;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//called for adding gold of a specified amount
|
||||
public synchronized boolean addItemToInventory(Item i, int amount) {
|
||||
if (i.getItemBase().getType().equals(ItemType.GOLD))
|
||||
|
||||
@@ -1736,6 +1736,14 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
if(this.behaviourType.equals(MobBehaviourType.HamletGuard) && this.getMobBaseID() == 14104) {//guards
|
||||
this.behaviourType = MobBehaviourType.Aggro;
|
||||
}
|
||||
|
||||
for(MobEquipment equipped: this.equip.values()){
|
||||
if(equipped.getItemBase().isVorg() && this.getMobBaseID() != 14062){
|
||||
this.healthMax = 7500;
|
||||
this.setHealth(this.healthMax);
|
||||
this.level = 65;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -3325,7 +3325,9 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
|
||||
if (this.equals(tar))
|
||||
return true;
|
||||
|
||||
if(this.getSeeInvis() >= 20){
|
||||
return !tar.safemodeInvis();
|
||||
}
|
||||
return this.getSeeInvis() >= tar.hidden && !tar.safemodeInvis();
|
||||
}
|
||||
|
||||
@@ -4802,17 +4804,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
//}
|
||||
if(this.isEnteredWorld() && this.isActive() && this.getLevel() < 10){
|
||||
this.setLevel((short) 10);
|
||||
boolean hasConc = false;
|
||||
for(Item i : this.getCharItemManager().getInventory()){
|
||||
if(i.getItemBaseID() == 980066){
|
||||
hasConc = true;
|
||||
}
|
||||
}
|
||||
if(hasConc == false) {
|
||||
MobLoot conc = new MobLoot(this, ItemBase.getItemBase(980066), false);
|
||||
this.getCharItemManager().addItemToInventory(conc.promoteToItem(this), 1);
|
||||
this.getCharItemManager().updateInventory();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
@@ -393,8 +393,6 @@ public class Resists {
|
||||
* Expects heals as negative damage and damage as positive damage for fortitudes.
|
||||
*/
|
||||
public float getResistedDamage(AbstractCharacter source, AbstractCharacter target, DamageType type, float damage, int trains) {
|
||||
//handle fortitudes
|
||||
damage = handleFortitude(target, type, damage);
|
||||
//calculate armor piercing
|
||||
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None);
|
||||
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
|
||||
@@ -417,6 +415,8 @@ public class Resists {
|
||||
}
|
||||
target.cancelOnTakeDamage(type, (damageAfterResists));
|
||||
}
|
||||
//handle fortitudes last
|
||||
damageAfterResists = handleFortitude(target, type, damageAfterResists);
|
||||
return damageAfterResists;
|
||||
}
|
||||
|
||||
|
||||
@@ -196,12 +196,12 @@ public class WorldServer {
|
||||
}
|
||||
}
|
||||
|
||||
private int exec() {
|
||||
private int exec() throws IOException {
|
||||
|
||||
LocalDateTime nextHeartbeatTime = LocalDateTime.now();
|
||||
LocalDateTime nextPopulationFileTime = LocalDateTime.now();
|
||||
LocalDateTime nextFlashTrashCheckTime = LocalDateTime.now();
|
||||
LocalDateTime nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1);
|
||||
LocalDateTime nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(0);
|
||||
LocalDateTime nextWareHousePushTime = LocalDateTime.now();
|
||||
LocalDateTime nextDiscSpawn = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1);
|
||||
|
||||
@@ -236,7 +236,7 @@ public class WorldServer {
|
||||
//}else{
|
||||
// nextHourlyJobTime = LocalDateTime.now().withMinute(30).withSecond(0);
|
||||
//}
|
||||
nextHourlyJobTime = LocalDateTime.now().plusMinutes(1);
|
||||
nextHourlyJobTime = nextHourlyJobTime.plusMinutes(30);
|
||||
}
|
||||
|
||||
if (LocalDateTime.now().isAfter(nextWareHousePushTime)) {
|
||||
@@ -252,7 +252,7 @@ public class WorldServer {
|
||||
dropper.respawn();
|
||||
}
|
||||
}
|
||||
nextDiscSpawn = LocalDateTime.now().plusHours(3).withMinute(0).withSecond(0);
|
||||
nextDiscSpawn = LocalDateTime.now().plusHours(6).withMinute(0).withSecond(0);
|
||||
}
|
||||
ThreadUtils.sleep(50);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user