diff --git a/src/engine/gameManager/LootManager.java b/src/engine/gameManager/LootManager.java index 3c090f3e..56c0f699 100644 --- a/src/engine/gameManager/LootManager.java +++ b/src/engine/gameManager/LootManager.java @@ -490,7 +490,7 @@ public enum LootManager { //roll 1-100 for the gen table selection - int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1); + int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1; GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE); if(selectedRow == null) @@ -654,14 +654,18 @@ public enum LootManager { } public static void DropPresent(Mob mob){ - int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size() - 1); - int presentID = ItemBase.AnniverseryGifts.get(random); - ItemBase presentBase = ItemBase.getItemBase(presentID); - if(presentBase != null){ - MobLoot lootItem = new MobLoot(mob, presentBase, true); - mob.getCharItemManager().addItemToInventory(lootItem); - } + int random = 971049 + ThreadLocalRandom.current().nextInt(24); + if (random > 971071) + random = 971071; + + int baseLoot = rollRandomItem(random); + ItemBase contract = ItemBase.getItemBase(baseLoot); + if (contract != null) { + MobLoot toAdd = new MobLoot(mob, contract, true); + if (toAdd != null) + mob.getCharItemManager().addItemToInventory(toAdd); + } } public static void GenerateStrongholdLoot(Mob mob, boolean commander) { @@ -680,20 +684,13 @@ public enum LootManager { MobLoot goldAmount = new MobLoot(mob, gold); mob.getCharItemManager().addItemToInventory(goldAmount); } + if (ThreadLocalRandom.current().nextInt(100) < 65) + DropPresent(mob); - int random = 3211 + ThreadLocalRandom.current().nextInt(6); - if(random > 3216) - random = 3216; - - int baseLoot = rollRandomItem(random); - ItemBase contract = ItemBase.getItemBase(baseLoot); - if (contract != null) { - MobLoot toAdd = new MobLoot(mob, contract, true); - - if (toAdd != null) - mob.getCharItemManager().addItemToInventory(toAdd); + if (commander) { - if (commander) { + //chance for glass + if (ThreadLocalRandom.current().nextInt(100) < 75) { int glassID = rollRandomItem(126); ItemBase glassItem = ItemBase.getItemBase(glassID); if (glassItem != null) { @@ -702,16 +699,22 @@ public enum LootManager { if (toAdd2 != null) mob.getCharItemManager().addItemToInventory(toAdd2); } + } + //chance for disc + if (ThreadLocalRandom.current().nextInt(100) < 75) { int discID = rollRandomItem(3202); ItemBase discItem = ItemBase.getItemBase(discID); - if (glassItem != null) { + if (discItem != null) { MobLoot toAdd3 = new MobLoot(mob, discItem, true); if (toAdd3 != null) mob.getCharItemManager().addItemToInventory(toAdd3); } + } + //chance for stat rune + if (ThreadLocalRandom.current().nextInt(100) < 75) { int runeID = rollRandomItem(3201); ItemBase runeItem = ItemBase.getItemBase(runeID); if (runeItem != null) { @@ -721,7 +724,6 @@ public enum LootManager { mob.getCharItemManager().addItemToInventory(toAdd4); } } - } } } diff --git a/src/engine/gameManager/StrongholdManager.java b/src/engine/gameManager/StrongholdManager.java new file mode 100644 index 00000000..7205a1c0 --- /dev/null +++ b/src/engine/gameManager/StrongholdManager.java @@ -0,0 +1,256 @@ +package engine.gameManager; + +import engine.Enum; +import engine.InterestManagement.InterestManager; +import engine.InterestManagement.WorldGrid; +import engine.math.Vector3f; +import engine.math.Vector3fImmutable; +import engine.objects.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.concurrent.ThreadLocalRandom; + +public class StrongholdManager { + + public static void processStrongholds() { + //end all current stronghold activities + ArrayList mines = Mine.getMines(); + for(Mine mine : mines){ + if (mine.isStronghold) + StrongholdManager.EndStronghold(mine); + } + + //process strongholds selecting 2 randomly to become active + int count = 0; + while (count < 2) { + int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1; + Mine mine = mines.get(random); + if (mine != null) { + if (!mine.isActive && !mine.isStronghold) { + StartStronghold(mine); + count++; + } + } + } + } + + public static void StartStronghold(Mine mine){ + + //remove buildings + Building tower = BuildingManager.getBuilding(mine.getBuildingID()); + if(tower == null) + return; + + mine.isStronghold = true; + mine.strongholdMobs = new ArrayList<>(); + mine.oldBuildings = new HashMap<>(); + + Zone mineZone = ZoneManager.findSmallestZone(tower.loc); + for(Building building : mineZone.zoneBuildingSet){ + mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID); + building.setMeshUUID(407650); + building.setMeshScale(new Vector3f(0,0,0)); + InterestManager.setObjectDirty(building); + WorldGrid.updateObject(building); + } + + //update tower to become stronghold mesh + tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone())); + tower.setMeshScale(new Vector3f(1,1,1)); + InterestManager.setObjectDirty(tower); + WorldGrid.updateObject(tower); + + //create elite mobs + for(int i = 0; i < 10; i++){ + Mob guard = Mob.createMob(getStrongholdGuardianID(mine.getParentZone()), Vector3fImmutable.getRandomPointOnCircle(tower.loc,30), Guild.getErrantGuild(),true,mineZone,null,0, "Elite Guardian",65); + if(guard != null){ + guard.equipmentSetID = getStrongholdMobEquipSetID(guard.getMobBaseID()); + guard.runAfterLoad(); + guard.setLevel((short)65); + guard.setResists(new Resists("Elite")); + guard.healthMax = 12500; + guard.setHealth(guard.healthMax); + guard.spawnTime = 1000000000; + guard.BehaviourType = Enum.MobBehaviourType.Aggro; + guard.maxDamageHandOne = 1550; + guard.minDamageHandOne = 750; + guard.atrHandOne = 1800; + guard.defenseRating = 2200; + InterestManager.setObjectDirty(guard); + mine.strongholdMobs.add(guard); + LootManager.GenerateStrongholdLoot(guard,false); + } + if(guard!= null && guard.level < 60) + guard.despawn(); + } + //create stronghold commander + Mob commander = Mob.createMob(getStrongholdCommanderID(mine.getParentZone()), tower.loc,Guild.getErrantGuild(),true,mineZone,null,0, "Guardian Commander",75); + if(commander != null){ + commander.equipmentSetID = getStrongholdMobEquipSetID(commander.getMobBaseID()); + commander.runAfterLoad(); + commander.setLevel((short)75); + commander.setResists(new Resists("Elite")); + commander.healthMax = 50000; + commander.setHealth(commander.healthMax); + commander.spawnTime = 1000000000; + commander.BehaviourType = Enum.MobBehaviourType.Aggro; + commander.maxDamageHandOne = 3500; + commander.minDamageHandOne = 1500; + commander.atrHandOne = 3500; + commander.defenseRating = 3500; + commander.mobPowers.clear(); + commander.mobPowers.put(563107033,40); //grounding shot + commander.mobPowers.put(429032838,40); // gravechill + commander.mobPowers.put(429413547,40); // grasp of thurin + commander.StrongholdCommander = true; + InterestManager.setObjectDirty(commander); + mine.strongholdMobs.add(commander); + LootManager.GenerateStrongholdLoot(commander,true); + } + + mine.setActive(true); + tower.setProtectionState(Enum.ProtectionState.PROTECTED); + } + + public static void EndStronghold(Mine mine){ + + //restore the buildings + Building tower = BuildingManager.getBuilding(mine.getBuildingID()); + if(tower == null) + return; + + mine.isStronghold = false; + + //get rid of the mobs + for(Mob mob : mine.strongholdMobs) { + mob.despawn(); + mob.removeFromCache(); + } + + //restore the buildings + Zone mineZone = ZoneManager.findSmallestZone(tower.loc); + for(Building building : mineZone.zoneBuildingSet){ + if(mine.oldBuildings.containsKey(building.getObjectUUID())) { + building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID())); + building.setMeshScale(new Vector3f(1, 1, 1)); + } + } + + //update tower to become Mine Tower again + tower.setMeshUUID(1500100); + + mine.setActive(false); + tower.setProtectionState(Enum.ProtectionState.NPC); + } + + public static int getStrongholdMeshID(Zone parent){ + while(!parent.isMacroZone()){ + parent = parent.getParent(); + if(parent.getName().toLowerCase().equals("seafloor")){ + return 0; + } + } + switch(parent.getObjectUUID()){ + case 197: + case 234: + case 178: + case 122: + return 814000; //Frost Giant Hall (ICE) + case 968: + case 951: + case 313: + case 331: + return 5001500; // Lich Queens Keep (UNDEAD) + case 785: + case 761: + case 717: + case 737: + return 1306600; // Temple of the Dragon (DESERT) + case 353: + case 371: + case 388: + case 532: + return 564600; // Undead Lord's Keep (SWAMP) + } + return 456100; // small stockade + } + + public static int getStrongholdGuardianID(Zone parent){ + switch(parent.getObjectUUID()){ + case 197: + case 234: + case 178: + case 122: + return 13528; // Mountain Giant Raider Axe + case 968: + case 951: + case 313: + case 331: + return 13643; // Vampire Spear Warrior + case 785: + case 761: + case 717: + case 737: + return 13802; // Desert Orc Warrior + case 353: + case 371: + case 388: + case 532: + return 12728; // Kolthoss Warrior + } + return 13434; // human sword and board warrior + } + + public static int getStrongholdCommanderID(Zone parent){ + switch(parent.getObjectUUID()){ + case 197: // Storm Giant Crossbow + case 234: // Storm Giant Crossbow + case 178: // Storm Giant Crossbow + case 122: // Storm Giant Crossbow + return 13515; + case 968: // Skeleton Bird Archer + case 951: // Skeleton Bird Archer + case 313: // Skeleton Bird Archer + case 331: // Skeleton Bird Archer + return 14280; + case 785: + case 761: + case 717: + case 737: + return 13789; // Desert Orc Xbow + case 353: + case 371: + case 388: + case 532: + return 12724; // xbow kolthoss + } + return 13433; + } + + public static int getStrongholdMobEquipSetID(int mobbaseUUID){ + switch(mobbaseUUID){ + case 14280: + return 10790; + case 13643: + return 6317; + case 13515: + return 7820; + case 13528: + return 5966; + case 13802: + return 9043; + case 13789: + return 9035; + case 12728: + return 6826; + case 12724: + return 9471; + case 13434: + return 6327; + case 13433: + return 6900; + } + return 0; + } +} diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java index 01c1fa96..0160ef8b 100644 --- a/src/engine/mobileAI/MobAI.java +++ b/src/engine/mobileAI/MobAI.java @@ -400,7 +400,7 @@ public class MobAI { PerformActionMsg msg; - if (!mobPower.isHarmful() || mobPower.targetSelf) { + if (!mob.StrongholdCommander && (!mobPower.isHarmful() || mobPower.targetSelf)) { PowersManager.useMobPower(mob, mob, mobPower, powerRank); msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob); } else { diff --git a/src/engine/objects/AbstractCharacter.java b/src/engine/objects/AbstractCharacter.java index 8e09249c..21a5f3b4 100644 --- a/src/engine/objects/AbstractCharacter.java +++ b/src/engine/objects/AbstractCharacter.java @@ -91,17 +91,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject { protected Resists resists = new Resists("Genric"); protected ConcurrentHashMap timers; protected ConcurrentHashMap timestamps; - protected int atrHandOne; + public int atrHandOne; protected int atrHandTwo; - protected int minDamageHandOne; - protected int maxDamageHandOne; + public int minDamageHandOne; + public int maxDamageHandOne; protected int minDamageHandTwo; protected int maxDamageHandTwo; protected float rangeHandOne; protected float rangeHandTwo; protected float speedHandOne; protected float speedHandTwo; - protected int defenseRating; + public int defenseRating; protected boolean isActive; // <-Do not use this for deleting character! protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc. protected ConcurrentHashMap recycleTimers; diff --git a/src/engine/objects/Mine.java b/src/engine/objects/Mine.java index b14754ee..cc24fe7e 100644 --- a/src/engine/objects/Mine.java +++ b/src/engine/objects/Mine.java @@ -658,106 +658,4 @@ public class Mine extends AbstractGameObject { _playerMemory.removeAll(toRemove); } - - public void StartStronghold(){ - - //remove buildings - Building tower = BuildingManager.getBuilding(this.buildingID); - if(tower == null) - return; - - this.isStronghold = true; - this.strongholdMobs = new ArrayList<>(); - this.oldBuildings = new HashMap<>(); - - Zone mineZone = ZoneManager.findSmallestZone(tower.loc); - for(Building building : mineZone.zoneBuildingSet){ - oldBuildings.put(building.getObjectUUID(),building.meshUUID); - building.setMeshUUID(407650); - building.setMeshScale(new Vector3f(0,0,0)); - InterestManager.setObjectDirty(building); - WorldGrid.updateObject(building); - } - - //update tower to become stronghold mesh - tower.setMeshUUID(423600); - tower.setMeshScale(new Vector3f(1,1,1)); - InterestManager.setObjectDirty(tower); - WorldGrid.updateObject(tower); - - //create elite mobs - for(int i = 0; i < 10; i++){ - Mob guard = Mob.createMob(14315, Vector3fImmutable.getRandomPointOnCircle(tower.loc,30),Guild.getErrantGuild(),true,mineZone,null,0, "Elite Guardian",65); - if(guard != null){ - guard.setLevel((short)65); - guard.setResists(new Resists("Elite")); - guard.healthMax *= 2; - guard.setHealth(guard.healthMax); - guard.spawnTime = 1000000000; - guard.BehaviourType = Enum.MobBehaviourType.Aggro; - guard.maxDamageHandOne *= 2; - guard.minDamageHandOne *= 2; - guard.atrHandOne *= 2; - guard.defenseRating *= 2; - InterestManager.setObjectDirty(guard); - this.strongholdMobs.add(guard); - LootManager.GenerateStrongholdLoot(guard,false); - } - if(guard!= null && guard.level < 60) - guard.despawn(); - } - //create stronghold commander - Mob commander = Mob.createMob(14293, tower.loc,Guild.getErrantGuild(),true,mineZone,null,0, "Guardian Commander",75); - if(commander != null){ - commander.setLevel((short)75); - commander.setResists(new Resists("Elite")); - commander.healthMax = 50000; - commander.setHealth(commander.healthMax); - commander.spawnTime = 1000000000; - commander.BehaviourType = Enum.MobBehaviourType.Aggro; - commander.maxDamageHandOne = 1500; - commander.minDamageHandOne = 3500; - commander.atrHandOne = 3500; - commander.defenseRating = 3500; - commander.mobPowers.put(429413547,40); - commander.mobPowers.put(429032838,40); - commander.mobPowers.put(57584498,40); - InterestManager.setObjectDirty(commander); - this.strongholdMobs.add(commander); - LootManager.GenerateStrongholdLoot(commander,true); - } - - this.setActive(true); - tower.setProtectionState(Enum.ProtectionState.PROTECTED); - } - public void EndStronghold(){ - - //restore the buildings - Building tower = BuildingManager.getBuilding(this.buildingID); - if(tower == null) - return; - - this.isStronghold = false; - - //get rid of the mobs - for(Mob mob : this.strongholdMobs) { - mob.despawn(); - mob.removeFromCache(); - } - - //restore the buildings - Zone mineZone = ZoneManager.findSmallestZone(tower.loc); - for(Building building : mineZone.zoneBuildingSet){ - if(this.oldBuildings.containsKey(building.getObjectUUID())) { - building.setMeshUUID(this.oldBuildings.get(building.getObjectUUID())); - building.setMeshScale(new Vector3f(1, 1, 1)); - } - } - - //update tower to become Mine Tower again - tower.setMeshUUID(1500100); - - this.setActive(false); - tower.setProtectionState(Enum.ProtectionState.NPC); - } } diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java index 6871a2c9..8e2181b5 100644 --- a/src/engine/objects/Mob.java +++ b/src/engine/objects/Mob.java @@ -101,6 +101,7 @@ public class Mob extends AbstractIntelligenceAgent { private DeferredPowerJob weaponPower; private DateTime upgradeDateTime = null; private boolean lootSync = false; + public boolean StrongholdCommander = false; /** diff --git a/src/engine/workthreads/HalfHourlyJobThread.java b/src/engine/workthreads/HalfHourlyJobThread.java index 0c0f4dc4..e3bb4e75 100644 --- a/src/engine/workthreads/HalfHourlyJobThread.java +++ b/src/engine/workthreads/HalfHourlyJobThread.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; +import static engine.gameManager.StrongholdManager.EndStronghold; import static engine.server.MBServerStatics.MINE_LATE_WINDOW; public class HalfHourlyJobThread implements Runnable { @@ -43,12 +44,8 @@ public class HalfHourlyJobThread implements Runnable { for (Mine mine : mines) { try { - - if(mine.isStronghold) - mine.EndStronghold(); - //handle mines opening on server reboot weird time interval - if(LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) { + if (LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) { if (LocalDateTime.now().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) { HalfHourlyJobThread.mineWindowOpen(mine); continue; @@ -64,7 +61,7 @@ public class HalfHourlyJobThread implements Runnable { // Close the mine if it reaches this far LocalDateTime openTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute); - if(LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30))) + if (LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30))) mineWindowClose(mine); } catch (Exception e) { @@ -72,19 +69,7 @@ public class HalfHourlyJobThread implements Runnable { } } - //process stronghold - int count = 0; - while(count < 2){ - int random = ThreadLocalRandom.current().nextInt(1,mines.size()) - 1; - Mine mine = mines.get(random); - if(mine != null){ - if(!mine.isActive){ - mine.StartStronghold(); - count ++; - } - } - } - + StrongholdManager.processStrongholds(); } catch (Exception e) { Logger.error(e.toString()); }