diff --git a/src/engine/gameManager/HellgateManager.java b/src/engine/gameManager/HellgateManager.java index 94fb1198..294d2de0 100644 --- a/src/engine/gameManager/HellgateManager.java +++ b/src/engine/gameManager/HellgateManager.java @@ -3,12 +3,12 @@ package engine.gameManager; import engine.mobileAI.MobAI; import engine.mobileAI.utilities.CombatUtilities; import engine.mobileAI.utilities.MovementUtilities; -import engine.objects.Mob; -import engine.objects.Resists; -import engine.objects.Zone; +import engine.objects.*; import engine.server.MBServerStatics; import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.ThreadLocalRandom; public class HellgateManager { public static ArrayList hellgate_mobs; @@ -23,6 +23,29 @@ public class HellgateManager { public static final int hell_portal_4_zone_id = 998; public static boolean initialized = false; + + public static final ArrayList static_rune_ids_low = new ArrayList<>(Arrays.asList( + 250001, 250002, 250003, 250004, 250005, 250006, 250010, 250011, + 250012, 250013, 250014, 250015, 250019, 250020, 250021, 250022, + 250023, 250024, 250028, 250029, 250030, 250031, 250032, 250033, + 250037, 250038, 250039, 250040, 250041, 250042 + )); + + public static final ArrayList static_rune_ids_mid = new ArrayList<>(Arrays.asList( + 250006, 250007, 250008, + 250015, 250016, 250017, + 250024, 250025, 250026, + 250033, 250034, 250035, + 250042, 250043, 250044 + )); + + public static final ArrayList static_rune_ids_high = new ArrayList<>(Arrays.asList( + 250007, 250008, + 250016, 250017, + 250025, 250026, + 250034, 250035, + 250043, 250044 + )); public static void confiureHellgate(){ compile_mob_list(); } @@ -67,7 +90,7 @@ public class HellgateManager { switch(mob.getMobBaseID()){ case 14163: // basic saetor warrior mob.getCharItemManager().clearInventory(); - LootManager.GenerateStrongholdLoot(mob,false,false); + SpecialLootHandler(mob,false,false); mob.setResists(new Resists("Elite")); mob.healthMax = 8500; mob.setHealth(mob.healthMax); @@ -75,7 +98,7 @@ public class HellgateManager { break; case 12770: // minotaur mini boss mob.getCharItemManager().clearInventory(); - LootManager.GenerateStrongholdLoot(mob,true,false); + SpecialLootHandler(mob,true,false); mob.setResists(new Resists("Elite")); mob.healthMax = 12500; mob.setHealth(mob.healthMax); @@ -83,7 +106,7 @@ public class HellgateManager { break; case 14180: // mordoth, son of morlock mob.getCharItemManager().clearInventory(); - LootManager.GenerateStrongholdLoot(mob,false,true); + SpecialLootHandler(mob,false,true); mob.setResists(new Resists("Elite")); mob.healthMax = mob.mobBase.getHealthMax(); mob.setHealth(mob.healthMax); @@ -103,6 +126,7 @@ public class HellgateManager { mob.respawn(); } mob.setHealth(mob.healthMax); + SpecialLootHandler(mob,false,false); } for(Mob mob : hellgate_mini_bosses){ if(!mob.isAlive()){ @@ -112,6 +136,7 @@ public class HellgateManager { mob.respawn(); } mob.setHealth(mob.healthMax); + SpecialLootHandler(mob,true,false); } if(!hellgate_boss.isAlive()){ if(!hellgate_boss.despawned){ @@ -120,6 +145,7 @@ public class HellgateManager { hellgate_boss.respawn(); } hellgate_boss.setHealth(hellgate_boss.healthMax); + SpecialLootHandler(hellgate_boss,false,true); } public static void SpecialMobAIHandler(Mob mob){ @@ -139,9 +165,125 @@ public class HellgateManager { if(mob.combatTarget != null) MobAI.CheckForAttack(mob); - if(mob.combatTarget == null && mob.loc.distanceSquared(mob.bindLoc) > 100) + if(mob.combatTarget == null && mob.loc.distanceSquared(mob.bindLoc) > 1024) {//32 units mob.teleport(mob.bindLoc); - + mob.setCombatTarget(null); + MovementUtilities.aiMove(mob,mob.bindLoc,true); + } } + public static void SpecialLootHandler(Mob mob, Boolean commander, Boolean epic){ + mob.getCharItemManager().clearInventory(); + int contractRoll = ThreadLocalRandom.current().nextInt(1,101); + if(contractRoll <= 25){ + //generate random contract + + } + + int runeRoll = ThreadLocalRandom.current().nextInt(1,101); + ItemBase runeBase = null; + int roll; + int itemId; + if(runeRoll <= 60 && !commander && !epic) { + //generate random rune (standard 5-30) + roll = ThreadLocalRandom.current().nextInt(static_rune_ids_low.size() + 1); + itemId = static_rune_ids_low.get(0); + try { + itemId = static_rune_ids_low.get(roll); + } catch (Exception e) { + + } + runeBase = ItemBase.getItemBase(itemId); + if (runeBase != null) { + MobLoot rune = new MobLoot(mob, runeBase, true); + + if (rune != null) + mob.getCharItemManager().addItemToInventory(rune); + } + } + if(runeRoll <= 50 && commander) { + //generate random rune (30-40) + roll = ThreadLocalRandom.current().nextInt(static_rune_ids_mid.size() + 1); + itemId = static_rune_ids_mid.get(0); + try { + itemId = static_rune_ids_mid.get(roll); + } catch (Exception e) { + + } + runeBase = ItemBase.getItemBase(itemId); + if (runeBase != null) { + MobLoot rune = new MobLoot(mob, runeBase, true); + + if (rune != null) + mob.getCharItemManager().addItemToInventory(rune); + } + } + + if(runeRoll <= 80 && epic) { + //generate random rune (35-40) + roll = ThreadLocalRandom.current().nextInt(static_rune_ids_high.size() + 1); + itemId = static_rune_ids_high.get(0); + try { + itemId = static_rune_ids_high.get(roll); + } catch (Exception e) { + + } + runeBase = ItemBase.getItemBase(itemId); + if (runeBase != null) { + MobLoot rune = new MobLoot(mob, runeBase, true); + + if (rune != null) + mob.getCharItemManager().addItemToInventory(rune); + } + } + + if(commander || epic) { + //handle special case for racial guards + + roll = ThreadLocalRandom.current().nextInt(LootManager.racial_guard_uuids.size() + 1); + itemId = LootManager.racial_guard_uuids.get(0); + try { + itemId = LootManager.racial_guard_uuids.get(roll); + } catch (Exception e) { + + } + runeBase = ItemBase.getItemBase(itemId); + if (runeBase != null) { + MobLoot rune = new MobLoot(mob, runeBase, true); + + if (rune != null) + mob.getCharItemManager().addItemToInventory(rune); + } + } + + if(epic){ + //handle glass chance for epic + int glassRoll = ThreadLocalRandom.current().nextInt(1,101); + if(glassRoll < 5){ + int glassID = LootManager.rollRandomItem(126); + ItemBase glassItem = ItemBase.getItemBase(glassID); + if (glassItem != null) { + MobLoot glass = new MobLoot(mob, glassItem, true); + + if (glass != null) + mob.getCharItemManager().addItemToInventory(glass); + } + } + } + + //handle gold drops + int goldDrop; + if(!commander && !epic){ + goldDrop = ThreadLocalRandom.current().nextInt(25000); + mob.getCharItemManager().addGoldToInventory(goldDrop,false); + } + if(commander){ + goldDrop = ThreadLocalRandom.current().nextInt(100000,250000); + mob.getCharItemManager().addGoldToInventory(goldDrop,false); + } + if(epic){ + goldDrop = ThreadLocalRandom.current().nextInt(2500000,5000000); + mob.getCharItemManager().addGoldToInventory(goldDrop,false); + } + } } diff --git a/src/engine/objects/PlayerCharacter.java b/src/engine/objects/PlayerCharacter.java index 02de1f4e..1ea2fa12 100644 --- a/src/engine/objects/PlayerCharacter.java +++ b/src/engine/objects/PlayerCharacter.java @@ -5159,7 +5159,7 @@ public class PlayerCharacter extends AbstractCharacter { this.timestamps.put("SetDirty", System.currentTimeMillis()); }else if (this.timestamps.get("SetDirty") + 5000L < System.currentTimeMillis()){ InterestManager.setObjectDirty(this); - this.setDirtyLoad(true); + InterestManager.reloadCharacter(this,false); this.timestamps.put("SetDirty", System.currentTimeMillis()); }