diff --git a/src/engine/db/handlers/dbMobHandler.java b/src/engine/db/handlers/dbMobHandler.java index ad9e0a70..ae8cb0da 100644 --- a/src/engine/db/handlers/dbMobHandler.java +++ b/src/engine/db/handlers/dbMobHandler.java @@ -42,7 +42,7 @@ public class dbMobHandler extends dbHandlerBase { preparedStatement.setFloat(6, toAdd.bindLoc.z); preparedStatement.setInt(7, 0); preparedStatement.setFloat(8, toAdd.spawnRadius); - preparedStatement.setInt(9, toAdd.spawnTime); + preparedStatement.setInt(9, toAdd.spawnDelay); preparedStatement.setInt(10, toAdd.contractUUID); preparedStatement.setInt(11, toAdd.buildingUUID); preparedStatement.setInt(12, toAdd.level); diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java index 22cd65dd..cc5158cd 100644 --- a/src/engine/mobileAI/MobAI.java +++ b/src/engine/mobileAI/MobAI.java @@ -813,7 +813,7 @@ public class MobAI { } } } - } else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) { + } else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnDelay * 1000))) { if (Zone.respawnQue.contains(aiAgent) == false) { Zone.respawnQue.add(aiAgent); diff --git a/src/engine/net/client/msg/ManageCityAssetsMsg.java b/src/engine/net/client/msg/ManageCityAssetsMsg.java index 9392838e..1c32d841 100644 --- a/src/engine/net/client/msg/ManageCityAssetsMsg.java +++ b/src/engine/net/client/msg/ManageCityAssetsMsg.java @@ -727,9 +727,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg { if (!npcHire.isAlive()) { writer.put((byte) 1); // 1 SHOWs respawning - int respawnRemaining = (int) (((Mob) npcHire).deathTime + ((Mob) npcHire).spawnTime * 1000 - System.currentTimeMillis()) / 1000; + int respawnRemaining = (int) (((Mob) npcHire).deathTime + ((Mob) npcHire).spawnDelay * 1000 - System.currentTimeMillis()) / 1000; writer.putInt(respawnRemaining); // Seconds in respawn remaining. - writer.putInt(((Mob) npcHire).spawnTime); // max seconds for respawn + writer.putInt(((Mob) npcHire).spawnDelay); // max seconds for respawn } else writer.put((byte) 0); diff --git a/src/engine/net/client/msg/ManageNPCMsg.java b/src/engine/net/client/msg/ManageNPCMsg.java index 53797601..b9255b0a 100644 --- a/src/engine/net/client/msg/ManageNPCMsg.java +++ b/src/engine/net/client/msg/ManageNPCMsg.java @@ -364,14 +364,14 @@ public class ManageNPCMsg extends ClientNetMsg { writer.putInt(1); long curTime = System.currentTimeMillis() / 1000; - long upgradeTime = (mob.deathTime + (mob.spawnTime * 1000)) / 1000; + long upgradeTime = (mob.deathTime + (mob.spawnDelay * 1000)) / 1000; long timeLife = upgradeTime - curTime; if (upgradeTime * 1000 > System.currentTimeMillis()) { if (mob.guardCaptain.isAlive()) { writer.put((byte) 0);//shows respawning timer - writer.putInt(mob.spawnTime); - writer.putInt(mob.spawnTime); + writer.putInt(mob.spawnDelay); + writer.putInt(mob.spawnDelay); writer.putInt((int) timeLife); //time remaining for mob that is dead writer.putInt(0); writer.put((byte) 0); @@ -688,14 +688,14 @@ public class ManageNPCMsg extends ClientNetMsg { writer.putInt(1); long curTime = System.currentTimeMillis() / 1000; - long upgradeTime = (mob.deathTime + (mob.spawnTime * 1000)) / 1000; + long upgradeTime = (mob.deathTime + (mob.spawnDelay * 1000)) / 1000; long timeLife = upgradeTime - curTime; if (upgradeTime * 1000 > System.currentTimeMillis()) { if (mob.guardCaptain.isAlive()) { writer.put((byte) 0);//shows respawning timer - writer.putInt(mob.spawnTime); - writer.putInt(mob.spawnTime); + writer.putInt(mob.spawnDelay); + writer.putInt(mob.spawnDelay); writer.putInt((int) timeLife); //time remaining for mob that is dead writer.putInt(0); writer.put((byte) 0); diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java index 8f7f2b2d..27f7d641 100644 --- a/src/engine/objects/Mob.java +++ b/src/engine/objects/Mob.java @@ -26,6 +26,7 @@ import engine.net.DispatchMessage; import engine.net.client.msg.PetMsg; import engine.net.client.msg.PlaceAssetMsg; import engine.server.MBServerStatics; +import org.jetbrains.annotations.NotNull; import org.joda.time.DateTime; import org.pmw.tinylog.Logger; @@ -34,11 +35,14 @@ import java.sql.SQLException; import java.util.EnumSet; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup; +import static java.lang.Math.toIntExact; -public class Mob extends AbstractIntelligenceAgent { +public class Mob extends AbstractIntelligenceAgent implements Delayed { private static int staticID = 0; //mob specific @@ -51,10 +55,11 @@ public class Mob extends AbstractIntelligenceAgent { public boolean despawned = false; public Vector3fImmutable destination = Vector3fImmutable.ZERO; public MobBase mobBase; - public int spawnTime; + public int spawnDelay; public Zone parentZone; public boolean hasLoot = false; public long deathTime = 0; + public long respawnTime = 0; public int equipmentSetID = 0; public int runeSet = 0; public int bootySet = 0; @@ -104,7 +109,7 @@ public class Mob extends AbstractIntelligenceAgent { this.agentType = AIAgentType.MOBILE; this.spawnRadius = rs.getFloat("mob_spawnRadius"); - this.spawnTime = rs.getInt("mob_spawnTime"); + this.spawnDelay = rs.getInt("mob_spawnTime"); statLat = rs.getFloat("mob_spawnX"); statAlt = rs.getFloat("mob_spawnY"); @@ -135,8 +140,8 @@ public class Mob extends AbstractIntelligenceAgent { if (this.upgradeDateTime != null) Mob.submitUpgradeJob(this); - if (this.mobBase != null && this.spawnTime == 0) - this.spawnTime = this.mobBase.getSpawnTime(); + if (this.mobBase != null && this.spawnDelay == 0) + this.spawnDelay = this.mobBase.getSpawnTime(); this.runeSet = rs.getInt("runeSet"); this.bootySet = rs.getInt("bootySet"); @@ -450,7 +455,7 @@ public class Mob extends AbstractIntelligenceAgent { minionMobile.deathTime = System.currentTimeMillis(); minionMobile.guardCaptain = guardCaptain; - minionMobile.spawnTime = (int) (-2.500 * guardCaptain.building.getRank() + 22.5) * 60; + minionMobile.spawnDelay = (int) (-2.500 * guardCaptain.building.getRank() + 22.5) * 60; minionMobile.behaviourType = Enum.MobBehaviourType.GuardMinion; minionMobile.agentType = AIAgentType.GUARDMINION; minionMobile.guardedCity = guardCaptain.guardedCity; @@ -509,7 +514,7 @@ public class Mob extends AbstractIntelligenceAgent { siegeMinion.behaviourType = MobBehaviourType.SiegeEngine; siegeMinion.agentType = AIAgentType.SIEGEENGINE; siegeMinion.bindLoc = Vector3fImmutable.ZERO; - siegeMinion.spawnTime = (60 * 15); + siegeMinion.spawnDelay = (60 * 15); siegeMinion.runAfterLoad(); @@ -650,10 +655,10 @@ public class Mob extends AbstractIntelligenceAgent { } public String getSpawnTimeAsString() { - if (this.spawnTime == 0) + if (this.spawnDelay == 0) return MBServerStatics.DEFAULT_SPAWN_TIME_MS / 1000 + " seconds (Default)"; else - return this.spawnTime + " seconds"; + return this.spawnDelay + " seconds"; } @@ -875,7 +880,7 @@ public class Mob extends AbstractIntelligenceAgent { this.playerAgroMap.clear(); if (this.behaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) - this.spawnTime = (int) (-2.500 * this.guardCaptain.building.getRank() + 22.5) * 60; + this.spawnDelay = (int) (-2.500 * this.guardCaptain.building.getRank() + 22.5) * 60; if (this.isPet()) { @@ -1547,12 +1552,12 @@ public class Mob extends AbstractIntelligenceAgent { switch (this.behaviourType) { case GuardCaptain: this.agentType = AIAgentType.GUARDCAPTAIN; - this.spawnTime = 600; + this.spawnDelay = 600; this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc()); break; case GuardWallArcher: this.agentType = AIAgentType.GUARDWALLARCHER; - this.spawnTime = 450; + this.spawnDelay = 450; this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc()); break; } @@ -1883,4 +1888,15 @@ public class Mob extends AbstractIntelligenceAgent { lock.writeLock().unlock(); } } + + @Override + public long getDelay(@NotNull TimeUnit unit) { + long timeRemaining = this.respawnTime - System.currentTimeMillis(); + return unit.convert(timeRemaining, TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo(@NotNull Delayed o) { + return toIntExact(this.respawnTime - ((Mob) o).respawnTime); + } }