@ -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 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}