@ -26,6 +26,7 @@ import engine.net.DispatchMessage;
@@ -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;
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 ) ;
}
}