diff --git a/src/engine/gameManager/LootManager.java b/src/engine/gameManager/LootManager.java index a8204fa6..e5501b21 100644 --- a/src/engine/gameManager/LootManager.java +++ b/src/engine/gameManager/LootManager.java @@ -663,4 +663,27 @@ public enum LootManager { } } + + public static void GenerateStrongholdLoot(Mob mob, boolean commander){ + + mob.getCharItemManager().clearInventory(); + + int multiplier = 1; + if(commander) + multiplier = 2; + + int high = 500000; + int low = 125000; + int gold = ThreadLocalRandom.current().nextInt(low, high + 1) * multiplier; + + if (gold > 0) { + MobLoot goldAmount = new MobLoot(mob, gold); + mob.getCharItemManager().addItemToInventory(goldAmount); + } + + for(int i = 0; i < 3 * multiplier; i++){ + DropPresent(mob); + } + + } } diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java index e7fe266d..11301dfe 100644 --- a/src/engine/objects/Building.java +++ b/src/engine/objects/Building.java @@ -821,6 +821,10 @@ public class Building extends AbstractWorldObject { return this.meshScale; } + public void setMeshScale(Vector3f scale) { + this.meshScale = scale; + } + public final int getMeshUUID() { return this.meshUUID; } diff --git a/src/engine/objects/ItemBase.java b/src/engine/objects/ItemBase.java index 7a67f8fb..7baa4d34 100644 --- a/src/engine/objects/ItemBase.java +++ b/src/engine/objects/ItemBase.java @@ -220,16 +220,28 @@ public class ItemBase { AnniverseryGifts.add(971008); AnniverseryGifts.add(971009); AnniverseryGifts.add(971010); - //AnniverseryGifts.add(5101000); - //AnniverseryGifts.add(5101020); - //AnniverseryGifts.add(5101100); - //AnniverseryGifts.add(5101120); - //AnniverseryGifts.add(5101040); - //AnniverseryGifts.add(5101140); - //AnniverseryGifts.add(5101060); - //AnniverseryGifts.add(5101080); - - + AnniverseryGifts.add(5101000); + AnniverseryGifts.add(5101020); + AnniverseryGifts.add(5101100); + AnniverseryGifts.add(5101120); + AnniverseryGifts.add(5101040); + AnniverseryGifts.add(5101140); + AnniverseryGifts.add(5101060); + AnniverseryGifts.add(5101080); + + //fate peddler presents + AnniverseryGifts.add(971012); + AnniverseryGifts.add(971013); + AnniverseryGifts.add(971014); + AnniverseryGifts.add(971015); + AnniverseryGifts.add(971016); + AnniverseryGifts.add(971017); + AnniverseryGifts.add(971018); + AnniverseryGifts.add(971019); + AnniverseryGifts.add(971020); + AnniverseryGifts.add(971021); + AnniverseryGifts.add(971022); + AnniverseryGifts.add(971023); } public static int getDiscPrice(int uuid) { diff --git a/src/engine/objects/Mine.java b/src/engine/objects/Mine.java index f1b5da26..035297df 100644 --- a/src/engine/objects/Mine.java +++ b/src/engine/objects/Mine.java @@ -10,8 +10,11 @@ package engine.objects; import engine.Enum; +import engine.InterestManagement.InterestManager; import engine.InterestManagement.WorldGrid; import engine.gameManager.*; +import engine.math.Vector3f; +import engine.math.Vector3fImmutable; import engine.net.ByteBufferWriter; import engine.net.client.msg.ErrorPopupMsg; import engine.server.MBServerStatics; @@ -58,6 +61,11 @@ public class Mine extends AbstractGameObject { public final HashSet _playerMemory = new HashSet<>(); public ArrayList affectedPlayers = new ArrayList<>(); + //stronghold stuff + public boolean isStronghold = false; + public ArrayList strongholdMobs; + public HashMap oldBuildings; + /** * ResultSet Constructor */ @@ -180,9 +188,15 @@ public class Mine extends AbstractGameObject { writer.putInt(mine.getObjectType().ordinal()); writer.putInt(mine.getObjectUUID()); writer.putInt(mine.getObjectUUID()); //actually a hash of mine - writer.putString(mine.mineType.name); + if(mine.isStronghold){ + writer.putString("STRONGHOLD"); + writer.putString(""); + }else { + writer.putString(mine.mineType.name); + writer.putString(mine.capSize + " Man "); + } //writer.putString(mine.zoneName + " " + mine.capSize + " Man "); - writer.putString(mine.capSize + " Man "); + writer.putInt(mine.production.hash); writer.putInt(mine.production.baseProduction); writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here @@ -637,4 +651,88 @@ 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)); + } + + //update tower to become stronghold mesh + tower.setMeshScale(new Vector3f(2,2,2)); + tower.setMeshUUID(5001500); + + //create elite mobs + for(int i = 0; i < 15; i++){ + Mob guard = Mob.createMob(14315, Vector3fImmutable.getRandomPointOnCircle(tower.loc,30),Guild.getErrantGuild(),true,mineZone,null,0, "Elite",65); + if(guard != null){ + guard.setResists(new Resists("Elite")); + guard.healthMax *= 2; + guard.setHealth(guard.healthMax); + guard.spawnTime = 1000000000; + guard.runAfterLoad(); + InterestManager.setObjectDirty(guard); + this.strongholdMobs.add(guard); + LootManager.GenerateStrongholdLoot(guard,false); + } + } + //create stronghold commander + Mob commander = Mob.createMob(14315, Vector3fImmutable.getRandomPointOnCircle(tower.loc,30),Guild.getErrantGuild(),true,mineZone,null,0, "Commander",75); + if(commander != null){ + commander.setResists(new Resists("Elite")); + commander.healthMax *= 2; + commander.setHealth(commander.healthMax); + commander.spawnTime = 1000000000; + commander.runAfterLoad(); + 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.setMeshScale(new Vector3f(1,1,1)); + tower.setMeshUUID(1500100); + + this.setActive(false); + tower.setProtectionState(Enum.ProtectionState.NPC); + } } diff --git a/src/engine/objects/Resists.java b/src/engine/objects/Resists.java index 6b23699d..94bd0ce5 100644 --- a/src/engine/objects/Resists.java +++ b/src/engine/objects/Resists.java @@ -49,6 +49,9 @@ public class Resists { case "Dropper": setDropperResists(); break; + case "Elite": + setEliteResists(); + break; default: setGenericResists(); break; @@ -252,6 +255,24 @@ public class Resists { this.immuneTo.put(DamageType.Siege, true); } + public final void setEliteResists() { + this.immuneToAll = false; + this.resists.put(DamageType.Slash, 75f); + this.resists.put(DamageType.Crush, 75f); + this.resists.put(DamageType.Pierce, 75f); + this.resists.put(DamageType.Magic, 75f); + this.resists.put(DamageType.Bleed, 75f); + this.resists.put(DamageType.Poison, 75f); + this.resists.put(DamageType.Mental, 75f); + this.resists.put(DamageType.Holy, 75f); + this.resists.put(DamageType.Unholy, 75f); + this.resists.put(DamageType.Lightning, 75f); + this.resists.put(DamageType.Fire, 75f); + this.resists.put(DamageType.Cold, 75f); + this.resists.put(DamageType.Healing, 0f); + this.immuneTo.put(DamageType.Siege, true); + } + /** * Create generic resists */ diff --git a/src/engine/workthreads/HalfHourlyJobThread.java b/src/engine/workthreads/HalfHourlyJobThread.java index 87de4df1..0c0f4dc4 100644 --- a/src/engine/workthreads/HalfHourlyJobThread.java +++ b/src/engine/workthreads/HalfHourlyJobThread.java @@ -24,6 +24,7 @@ import org.pmw.tinylog.Logger; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadLocalRandom; import static engine.server.MBServerStatics.MINE_LATE_WINDOW; @@ -43,6 +44,9 @@ 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().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) { @@ -67,9 +71,25 @@ public class HalfHourlyJobThread implements Runnable { Logger.error("mineID: " + mine.getObjectUUID(), e.toString()); } } + + //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 ++; + } + } + } + } catch (Exception e) { Logger.error(e.toString()); } + + } public static void mineWindowOpen(Mine mine) {