|
|
@ -26,6 +26,7 @@ import engine.net.DispatchMessage; |
|
|
|
import engine.net.client.msg.PetMsg; |
|
|
|
import engine.net.client.msg.PetMsg; |
|
|
|
import engine.net.client.msg.PlaceAssetMsg; |
|
|
|
import engine.net.client.msg.PlaceAssetMsg; |
|
|
|
import engine.server.MBServerStatics; |
|
|
|
import engine.server.MBServerStatics; |
|
|
|
|
|
|
|
import org.jetbrains.annotations.NotNull; |
|
|
|
import org.joda.time.DateTime; |
|
|
|
import org.joda.time.DateTime; |
|
|
|
import org.pmw.tinylog.Logger; |
|
|
|
import org.pmw.tinylog.Logger; |
|
|
|
|
|
|
|
|
|
|
@ -34,11 +35,14 @@ import java.sql.SQLException; |
|
|
|
import java.util.EnumSet; |
|
|
|
import java.util.EnumSet; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
|
|
|
|
import java.util.concurrent.Delayed; |
|
|
|
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock; |
|
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock; |
|
|
|
|
|
|
|
|
|
|
|
import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup; |
|
|
|
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; |
|
|
|
private static int staticID = 0; |
|
|
|
//mob specific
|
|
|
|
//mob specific
|
|
|
@ -51,10 +55,11 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
public boolean despawned = false; |
|
|
|
public boolean despawned = false; |
|
|
|
public Vector3fImmutable destination = Vector3fImmutable.ZERO; |
|
|
|
public Vector3fImmutable destination = Vector3fImmutable.ZERO; |
|
|
|
public MobBase mobBase; |
|
|
|
public MobBase mobBase; |
|
|
|
public int spawnTime; |
|
|
|
public int spawnDelay; |
|
|
|
public Zone parentZone; |
|
|
|
public Zone parentZone; |
|
|
|
public boolean hasLoot = false; |
|
|
|
public boolean hasLoot = false; |
|
|
|
public long deathTime = 0; |
|
|
|
public long deathTime = 0; |
|
|
|
|
|
|
|
public long respawnTime = 0; |
|
|
|
public int equipmentSetID = 0; |
|
|
|
public int equipmentSetID = 0; |
|
|
|
public int runeSet = 0; |
|
|
|
public int runeSet = 0; |
|
|
|
public int bootySet = 0; |
|
|
|
public int bootySet = 0; |
|
|
@ -104,7 +109,7 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
this.agentType = AIAgentType.MOBILE; |
|
|
|
this.agentType = AIAgentType.MOBILE; |
|
|
|
|
|
|
|
|
|
|
|
this.spawnRadius = rs.getFloat("mob_spawnRadius"); |
|
|
|
this.spawnRadius = rs.getFloat("mob_spawnRadius"); |
|
|
|
this.spawnTime = rs.getInt("mob_spawnTime"); |
|
|
|
this.spawnDelay = rs.getInt("mob_spawnTime"); |
|
|
|
|
|
|
|
|
|
|
|
statLat = rs.getFloat("mob_spawnX"); |
|
|
|
statLat = rs.getFloat("mob_spawnX"); |
|
|
|
statAlt = rs.getFloat("mob_spawnY"); |
|
|
|
statAlt = rs.getFloat("mob_spawnY"); |
|
|
@ -135,8 +140,8 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
if (this.upgradeDateTime != null) |
|
|
|
if (this.upgradeDateTime != null) |
|
|
|
Mob.submitUpgradeJob(this); |
|
|
|
Mob.submitUpgradeJob(this); |
|
|
|
|
|
|
|
|
|
|
|
if (this.mobBase != null && this.spawnTime == 0) |
|
|
|
if (this.mobBase != null && this.spawnDelay == 0) |
|
|
|
this.spawnTime = this.mobBase.getSpawnTime(); |
|
|
|
this.spawnDelay = this.mobBase.getSpawnTime(); |
|
|
|
|
|
|
|
|
|
|
|
this.runeSet = rs.getInt("runeSet"); |
|
|
|
this.runeSet = rs.getInt("runeSet"); |
|
|
|
this.bootySet = rs.getInt("bootySet"); |
|
|
|
this.bootySet = rs.getInt("bootySet"); |
|
|
@ -450,7 +455,7 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
|
|
|
|
|
|
|
|
minionMobile.deathTime = System.currentTimeMillis(); |
|
|
|
minionMobile.deathTime = System.currentTimeMillis(); |
|
|
|
minionMobile.guardCaptain = guardCaptain; |
|
|
|
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.behaviourType = Enum.MobBehaviourType.GuardMinion; |
|
|
|
minionMobile.agentType = AIAgentType.GUARDMINION; |
|
|
|
minionMobile.agentType = AIAgentType.GUARDMINION; |
|
|
|
minionMobile.guardedCity = guardCaptain.guardedCity; |
|
|
|
minionMobile.guardedCity = guardCaptain.guardedCity; |
|
|
@ -509,7 +514,7 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
siegeMinion.behaviourType = MobBehaviourType.SiegeEngine; |
|
|
|
siegeMinion.behaviourType = MobBehaviourType.SiegeEngine; |
|
|
|
siegeMinion.agentType = AIAgentType.SIEGEENGINE; |
|
|
|
siegeMinion.agentType = AIAgentType.SIEGEENGINE; |
|
|
|
siegeMinion.bindLoc = Vector3fImmutable.ZERO; |
|
|
|
siegeMinion.bindLoc = Vector3fImmutable.ZERO; |
|
|
|
siegeMinion.spawnTime = (60 * 15); |
|
|
|
siegeMinion.spawnDelay = (60 * 15); |
|
|
|
|
|
|
|
|
|
|
|
siegeMinion.runAfterLoad(); |
|
|
|
siegeMinion.runAfterLoad(); |
|
|
|
|
|
|
|
|
|
|
@ -650,10 +655,10 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public String getSpawnTimeAsString() { |
|
|
|
public String getSpawnTimeAsString() { |
|
|
|
if (this.spawnTime == 0) |
|
|
|
if (this.spawnDelay == 0) |
|
|
|
return MBServerStatics.DEFAULT_SPAWN_TIME_MS / 1000 + " seconds (Default)"; |
|
|
|
return MBServerStatics.DEFAULT_SPAWN_TIME_MS / 1000 + " seconds (Default)"; |
|
|
|
else |
|
|
|
else |
|
|
|
return this.spawnTime + " seconds"; |
|
|
|
return this.spawnDelay + " seconds"; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -875,7 +880,7 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
this.playerAgroMap.clear(); |
|
|
|
this.playerAgroMap.clear(); |
|
|
|
|
|
|
|
|
|
|
|
if (this.behaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) |
|
|
|
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()) { |
|
|
|
if (this.isPet()) { |
|
|
|
|
|
|
|
|
|
|
@ -1547,12 +1552,12 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
switch (this.behaviourType) { |
|
|
|
switch (this.behaviourType) { |
|
|
|
case GuardCaptain: |
|
|
|
case GuardCaptain: |
|
|
|
this.agentType = AIAgentType.GUARDCAPTAIN; |
|
|
|
this.agentType = AIAgentType.GUARDCAPTAIN; |
|
|
|
this.spawnTime = 600; |
|
|
|
this.spawnDelay = 600; |
|
|
|
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc()); |
|
|
|
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc()); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case GuardWallArcher: |
|
|
|
case GuardWallArcher: |
|
|
|
this.agentType = AIAgentType.GUARDWALLARCHER; |
|
|
|
this.agentType = AIAgentType.GUARDWALLARCHER; |
|
|
|
this.spawnTime = 450; |
|
|
|
this.spawnDelay = 450; |
|
|
|
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc()); |
|
|
|
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc()); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -1883,4 +1888,15 @@ public class Mob extends AbstractIntelligenceAgent { |
|
|
|
lock.writeLock().unlock(); |
|
|
|
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); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|