diff --git a/src/engine/devcmd/cmds/SimulateBootyCmd.java b/src/engine/devcmd/cmds/SimulateBootyCmd.java index 7249ee3b..c80ef070 100644 --- a/src/engine/devcmd/cmds/SimulateBootyCmd.java +++ b/src/engine/devcmd/cmds/SimulateBootyCmd.java @@ -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; diff --git a/src/engine/gameManager/CombatManager.java b/src/engine/gameManager/CombatManager.java index 656a6b52..72c0282a 100644 --- a/src/engine/gameManager/CombatManager.java +++ b/src/engine/gameManager/CombatManager.java @@ -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; diff --git a/src/engine/gameManager/LootManager.java b/src/engine/gameManager/LootManager.java index ce892711..367242ad 100644 --- a/src/engine/gameManager/LootManager.java +++ b/src/engine/gameManager/LootManager.java @@ -116,10 +116,18 @@ public enum LootManager { private static void RunBootySet(ArrayList 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; diff --git a/src/engine/gameManager/PowersManager.java b/src/engine/gameManager/PowersManager.java index b81534a5..3d4aac1a 100644 --- a/src/engine/gameManager/PowersManager.java +++ b/src/engine/gameManager/PowersManager.java @@ -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 diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java index c4ccb590..748ca798 100644 --- a/src/engine/mobileAI/MobAI.java +++ b/src/engine/mobileAI/MobAI.java @@ -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()); diff --git a/src/engine/net/client/ClientMessagePump.java b/src/engine/net/client/ClientMessagePump.java index 8c305915..069e7b1b 100644 --- a/src/engine/net/client/ClientMessagePump.java +++ b/src/engine/net/client/ClientMessagePump.java @@ -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); diff --git a/src/engine/objects/CharacterItemManager.java b/src/engine/objects/CharacterItemManager.java index 3acec039..5e92e112 100644 --- a/src/engine/objects/CharacterItemManager.java +++ b/src/engine/objects/CharacterItemManager.java @@ -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 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)) diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java index 0824f8a1..1661d9cf 100644 --- a/src/engine/objects/Mob.java +++ b/src/engine/objects/Mob.java @@ -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 diff --git a/src/engine/objects/PlayerCharacter.java b/src/engine/objects/PlayerCharacter.java index 8278254b..f1f0a524 100644 --- a/src/engine/objects/PlayerCharacter.java +++ b/src/engine/objects/PlayerCharacter.java @@ -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) { diff --git a/src/engine/objects/Resists.java b/src/engine/objects/Resists.java index e72b1827..46ed5cf0 100644 --- a/src/engine/objects/Resists.java +++ b/src/engine/objects/Resists.java @@ -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; } diff --git a/src/engine/server/world/WorldServer.java b/src/engine/server/world/WorldServer.java index 1b9990de..84193fbb 100644 --- a/src/engine/server/world/WorldServer.java +++ b/src/engine/server/world/WorldServer.java @@ -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); }