@ -40,7 +40,6 @@ import java.util.ArrayList;
				@@ -40,7 +40,6 @@ import java.util.ArrayList;
					 
			
		
	
		
			
				
					import  java.util.HashMap ;  
			
		
	
		
			
				
					import  java.util.HashSet ;  
			
		
	
		
			
				
					import  java.util.concurrent.ConcurrentHashMap ;  
			
		
	
		
			
				
					import  java.util.concurrent.ThreadLocalRandom ;  
			
		
	
		
			
				
					import  java.util.concurrent.locks.ReentrantReadWriteLock ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					import static  engine.net.client.msg.ErrorPopupMsg.sendErrorPopup ;  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -99,11 +98,11 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -99,11 +98,11 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					    private  long  timeToSpawnSiege ;   
			
		
	
		
			
				
					    private  boolean  noAggro  =  false ;   
			
		
	
		
			
				
					    private  int  aggroTargetID  =  0 ;   
			
		
	
		
			
				
					    private  boolean  walkingHome  =  true ;   
			
		
	
		
			
				
					    private  final  boolean  walkingHome  =  true ;   
			
		
	
		
			
				
					    private  long  lastAttackTime  =  0 ;   
			
		
	
		
			
				
					    private  int  lastMobPowerToken  =  0 ;   
			
		
	
		
			
				
					    private  HashMap < Integer ,  MobEquipment >  equip  =  null ;   
			
		
	
		
			
				
					    private  Regions  lastRegion  =  null ;   
			
		
	
		
			
				
					    private  final  Regions  lastRegion  =  null ;   
			
		
	
		
			
				
					    private  DeferredPowerJob  weaponPower ;   
			
		
	
		
			
				
					    private  DateTime  upgradeDateTime  =  null ;   
			
		
	
		
			
				
					    private  boolean  lootSync  =  false ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -501,7 +500,8 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -501,7 +500,8 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        writer . putInt ( objectType ) ;   
			
		
	
		
			
				
					        writer . putInt ( mob . currentID ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    public  static  Mob  createMob ( int  loadID ,  Vector3fImmutable  spawn ,  Guild  guild ,  boolean  isMob ,  Zone  parent ,  Building  building ,  int  contractID )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  Mob  createMob ( int  loadID ,  Vector3fImmutable  spawn ,  Guild  guild ,  boolean  isMob ,  Zone  parent ,  Building  building ,  int  contractID ,  String  pirateName ,  int  rank )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Mob  mobWithoutID  =  new  Mob ( "" ,  "" ,  ( short )  0 ,  ( short )  0 ,  ( short )  0 ,  ( short )  0 ,  ( short )  0 ,  ( short )  1 ,  0 ,  false ,  false ,  false ,  spawn ,  spawn ,  Vector3fImmutable . ZERO ,  ( short )  1 ,  ( short )  1 ,  ( short )  1 ,  guild ,  ( byte )  0 ,  loadID ,  isMob ,  parent ,  building ,  contractID ) ;   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -521,7 +521,7 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -521,7 +521,7 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					            mob . setBindLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					            mob . setLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					            mob . region  =  AbstractWorldObject . GetRegionByWorldObject ( mob ) ;   
			
		
	
		
			
				
					            MovementManager . translocate ( mob , buildingWorldLoc , mob . region ) ;   
			
		
	
		
			
				
					            MovementManager . translocate ( mob ,   buildingWorldLoc ,   mob . region ) ;   
			
		
	
		
			
				
					            mob . nameOverride  =  NPC . getPirateName ( mob . getMobBaseID ( ) )  +  " the "  +  mob . getContract ( ) . getName ( ) ;   
			
		
	
		
			
				
					            mob . runAfterLoad ( ) ;   
			
		
	
		
			
				
					        }  catch  ( Exception  e )  {   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -653,6 +653,184 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -653,6 +653,184 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        mob . upgradeDateTime  =  upgradeDateTime ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  synchronized  Mob  createGuardMob ( Mob  guardCaptain ,  Guild  guild ,  Zone  parent ,  Vector3fImmutable  loc ,  short  level ,  String  pirateName )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        MobBase  minionMobBase ;   
			
		
	
		
			
				
					        Mob  mob ;   
			
		
	
		
			
				
					        int  maxSlots  =  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        switch  ( guardCaptain . getRank ( ) )  {   
			
		
	
		
			
				
					            case  1 :   
			
		
	
		
			
				
					            case  2 :   
			
		
	
		
			
				
					                maxSlots  =  1 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  3 :   
			
		
	
		
			
				
					                maxSlots  =  2 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  4 :   
			
		
	
		
			
				
					            case  5 :   
			
		
	
		
			
				
					                maxSlots  =  3 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  6 :   
			
		
	
		
			
				
					                maxSlots  =  4 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  7 :   
			
		
	
		
			
				
					                maxSlots  =  5 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            default :   
			
		
	
		
			
				
					                maxSlots  =  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( guardCaptain . siegeMinionMap . size ( )  = =  maxSlots )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        minionMobBase  =  guardCaptain . mobBase ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( minionMobBase  = =  null )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob  =  new  Mob ( minionMobBase ,  guild ,  parent ,  level ,  new  Vector3fImmutable ( 1 ,  1 ,  1 ) ,  0 ,  true ) ;   
			
		
	
		
			
				
					        mob . setLevel ( level ) ;   
			
		
	
		
			
				
					        if  ( guardCaptain . equipmentSetID  ! =  0 )   
			
		
	
		
			
				
					            mob . equipmentSetID  =  guardCaptain . equipmentSetID ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . runAfterLoad ( ) ;   
			
		
	
		
			
				
					        mob . despawned  =  true ;   
			
		
	
		
			
				
					        //grab equipment and name from minionbase.
   
			
		
	
		
			
				
					        if  ( guardCaptain . contract  ! =  null )  {   
			
		
	
		
			
				
					            Enum . MinionType  minionType  =  Enum . MinionType . ContractToMinionMap . get ( guardCaptain . contract . getContractID ( ) ) ;   
			
		
	
		
			
				
					            if  ( minionType  ! =  null )  {   
			
		
	
		
			
				
					                String  rank  =  "" ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( guardCaptain . getRank ( )  <  3 )   
			
		
	
		
			
				
					                    rank  =  MBServerStatics . JUNIOR ;   
			
		
	
		
			
				
					                else  if  ( guardCaptain . getRank ( )  <  6 )   
			
		
	
		
			
				
					                    rank  =  "" ;   
			
		
	
		
			
				
					                else  if  ( guardCaptain . getRank ( )  = =  6 )   
			
		
	
		
			
				
					                    rank  =  MBServerStatics . VETERAN ;   
			
		
	
		
			
				
					                else   
			
		
	
		
			
				
					                    rank  =  MBServerStatics . ELITE ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( rank . isEmpty ( ) )   
			
		
	
		
			
				
					                    mob . nameOverride  =  pirateName  +  " "  +  minionType . getRace ( )  +  " "  +  minionType . getName ( ) ;   
			
		
	
		
			
				
					                else   
			
		
	
		
			
				
					                    mob . nameOverride  =  pirateName  +  " "  +  minionType . getRace ( )  +  " "  +  rank  +  " "  +  minionType . getName ( ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( parent  ! =  null )   
			
		
	
		
			
				
					            mob . setRelPos ( parent ,  loc . x  -  parent . absX ,  loc . y  -  parent . absY ,  loc . z  -  parent . absZ ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . setObjectTypeMask ( MBServerStatics . MASK_MOB  |  mob . getTypeMasks ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // mob.setMob();
   
			
		
	
		
			
				
					        mob . isPlayerGuard  =  true ;   
			
		
	
		
			
				
					        mob . setParentZone ( parent ) ;   
			
		
	
		
			
				
					        DbManager . addToCache ( mob ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        RuneBase  guardRune  =  RuneBase . getRuneBase ( 252621 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        for  ( MobBaseEffects  mbe  :  guardRune . getEffectsList ( ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            EffectsBase  eb  =  PowersManager . getEffectByToken ( mbe . getToken ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( eb  = =  null )  {   
			
		
	
		
			
				
					                Logger . info ( "EffectsBase Null for Token "  +  mbe . getToken ( ) ) ;   
			
		
	
		
			
				
					                continue ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            //check to upgrade effects if needed.
   
			
		
	
		
			
				
					            if  ( mob . effects . containsKey ( Integer . toString ( eb . getUUID ( ) ) ) )  {   
			
		
	
		
			
				
					                if  ( mbe . getReqLvl ( )  >  ( int )  mob . level )  {   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                Effect  eff  =  mob . effects . get ( Integer . toString ( eb . getUUID ( ) ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( eff  = =  null )   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                //Current effect is a higher rank, dont apply.
   
			
		
	
		
			
				
					                if  ( eff . getTrains ( )  >  mbe . getRank ( ) )   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                //new effect is of a higher rank. remove old effect and apply new one.
   
			
		
	
		
			
				
					                eff . cancelJob ( ) ;   
			
		
	
		
			
				
					                mob . addEffectNoTimer ( Integer . toString ( eb . getUUID ( ) ) ,  eb ,  mbe . getRank ( ) ,  true ) ;   
			
		
	
		
			
				
					            }  else  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( mbe . getReqLvl ( )  >  ( int )  mob . level )   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                mob . addEffectNoTimer ( Integer . toString ( eb . getUUID ( ) ) ,  eb ,  mbe . getRank ( ) ,  true ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        int  slot  =  0 ;   
			
		
	
		
			
				
					        slot  + =  guardCaptain . siegeMinionMap . size ( )  +  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        guardCaptain . siegeMinionMap . put ( mob ,  slot ) ;   
			
		
	
		
			
				
					        mob . setInBuildingLoc ( guardCaptain . building ,  guardCaptain ) ;   
			
		
	
		
			
				
					        Vector3fImmutable  buildingWorldLoc  =  ZoneManager . convertLocalToWorld ( guardCaptain . building ,  mob . inBuildingLoc ) ;   
			
		
	
		
			
				
					        mob . setBindLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					        mob . setLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					        mob . deathTime  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					        mob . spawnTime  =  900 ;   
			
		
	
		
			
				
					        mob . npcOwner  =  guardCaptain ;   
			
		
	
		
			
				
					        mob . BehaviourType  =  Enum . MobBehaviourType . GuardMinion ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        return  mob ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  synchronized  Mob  createSiegeMob ( NPC  owner ,  int  loadID ,  Guild  guild ,  Zone  parent ,  Vector3fImmutable  loc ,  short  level )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        MobBase  minionMobBase ;   
			
		
	
		
			
				
					        Mob  mob ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( owner . getSiegeMinionMap ( ) . size ( )  = =  3 )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        minionMobBase  =  MobBase . getMobBase ( loadID ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( minionMobBase  = =  null )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob  =  new  Mob ( minionMobBase ,  guild ,  parent ,  level ,  new  Vector3fImmutable ( 1 ,  1 ,  1 ) ,  0 ,  false ) ;   
			
		
	
		
			
				
					        mob . runAfterLoad ( ) ;   
			
		
	
		
			
				
					        mob . despawned  =  true ;   
			
		
	
		
			
				
					        DbManager . addToCache ( mob ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( parent  ! =  null )   
			
		
	
		
			
				
					            mob . setRelPos ( parent ,  loc . x  -  parent . absX ,  loc . y  -  parent . absY ,  loc . z  -  parent . absZ ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . setObjectTypeMask ( MBServerStatics . MASK_MOB  |  mob . getTypeMasks ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        //mob.setMob();
   
			
		
	
		
			
				
					        mob . setSiege ( true ) ;   
			
		
	
		
			
				
					        mob . setParentZone ( parent ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        int  slot  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( ! owner . getSiegeMinionMap ( ) . containsValue ( 1 ) )   
			
		
	
		
			
				
					            slot  =  1 ;   
			
		
	
		
			
				
					        else  if  ( ! owner . getSiegeMinionMap ( ) . containsValue ( 2 ) )   
			
		
	
		
			
				
					            slot  =  2 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        owner . getSiegeMinionMap ( ) . put ( mob ,  slot ) ;   
			
		
	
		
			
				
					        mob . setInBuildingLoc ( owner . building ,  owner ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Vector3fImmutable  buildingWorldLoc  =  ZoneManager . convertLocalToWorld ( owner . building ,  mob . inBuildingLoc ) ;   
			
		
	
		
			
				
					        mob . setBindLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					        mob . setLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . setSpawnTime ( 10 ) ;   
			
		
	
		
			
				
					        mob . setNpcOwner ( owner ) ;   
			
		
	
		
			
				
					        mob . BehaviourType  =  MobBehaviourType . Pet1 ;   
			
		
	
		
			
				
					        mob . BehaviourType . canRoam  =  false ;   
			
		
	
		
			
				
					        return  mob ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    private  void  clearStatic ( )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( this . parentZone  ! =  null )  this . parentZone . zoneMobSet . remove ( this ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -735,6 +913,10 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -735,6 +913,10 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        return  loadID ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    / *   
			
		
	
		
			
				
					     *  Serialization   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    @Override   
			
		
	
		
			
				
					    public  int  getObjectUUID ( )  {   
			
		
	
		
			
				
					        return  currentID ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -744,10 +926,6 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -744,10 +926,6 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        return  this . statLat ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    / *   
			
		
	
		
			
				
					     *  Serialization   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  float  getSpawnY ( )  {   
			
		
	
		
			
				
					        return  this . statAlt ;   
			
		
	
		
			
				
					    }   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -958,6 +1136,10 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -958,6 +1136,10 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        return  0f ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    / *   
			
		
	
		
			
				
					     *  Database   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    / * *   
			
		
	
		
			
				
					     *  @  Kill  this  Character   
			
		
	
		
			
				
					     * /   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1019,10 +1201,6 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1019,10 +1201,6 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    / *   
			
		
	
		
			
				
					     *  Database   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    @Override   
			
		
	
		
			
				
					    public  void  killCharacter ( String  reason )  {   
			
		
	
		
			
				
					        killCleanup ( ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1593,9 +1771,11 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1593,9 +1771,11 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        Mob  mob  =  null ;   
			
		
	
		
			
				
					        NPC  npc  =  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( ac . getObjectType ( ) . equals ( GameObjectType . Mob ) )  mob  =  ( Mob )  ac ;   
			
		
	
		
			
				
					        if  ( ac . getObjectType ( ) . equals ( GameObjectType . Mob ) )   
			
		
	
		
			
				
					            mob  =  ( Mob )  ac ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        else  if  ( ac . getObjectType ( ) . equals ( GameObjectType . NPC ) )  npc  =  ( NPC )  ac ;   
			
		
	
		
			
				
					        else  if  ( ac . getObjectType ( ) . equals ( GameObjectType . NPC ) )   
			
		
	
		
			
				
					            npc  =  ( NPC )  ac ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        BuildingModelBase  buildingModel  =  BuildingModelBase . getModelBase ( inBuilding . getMeshUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1609,7 +1789,8 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1609,7 +1789,8 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					            //-1 slot means no slot available in building.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( npc  ! =  null )  {   
			
		
	
		
			
				
					                if  ( npc . getSiegeMinionMap ( ) . containsKey ( this ) )  putSlot  =  npc . getSiegeMinionMap ( ) . get ( this ) ;   
			
		
	
		
			
				
					                if  ( npc . getSiegeMinionMap ( ) . containsKey ( this ) )   
			
		
	
		
			
				
					                    putSlot  =  npc . getSiegeMinionMap ( ) . get ( this ) ;   
			
		
	
		
			
				
					            }  else  if  ( mob  ! =  null )  {   
			
		
	
		
			
				
					                //if (mob.getSiegeMinionMap().containsKey(this)) putSlot = mob.getSiegeMinionMap().get(this);
   
			
		
	
		
			
				
					                int  hirelings  =  mob . building . getHirelings ( ) . size ( ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1628,27 +1809,26 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1628,27 +1809,26 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        this . inBuildingLoc  =  slotLocation ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  ItemBase  getWeaponItemBase ( boolean  mainHand )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( this . equipmentSetID  ! =  0 )   
			
		
	
		
			
				
					            if  ( equip  ! =  null )  {   
			
		
	
		
			
				
					            MobEquipment  me ;   
			
		
	
		
			
				
					                 MobEquipment  me ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( mainHand )  me  =  equip . get ( 1 ) ;  //mainHand
   
			
		
	
		
			
				
					            else  me  =  equip . get ( 2 ) ;  //offHand
   
			
		
	
		
			
				
					                 if  ( mainHand )  me  =  equip . get ( 1 ) ;  //mainHand
   
			
		
	
		
			
				
					                 else  me  =  equip . get ( 2 ) ;  //offHand
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( me  ! =  null )  {   
			
		
	
		
			
				
					                 if  ( me  ! =  null )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                ItemBase  ib  =  me . getItemBase ( ) ;   
			
		
	
		
			
				
					                     ItemBase  ib  =  me . getItemBase ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( ib  ! =  null )   
			
		
	
		
			
				
					                    return  ib ;   
			
		
	
		
			
				
					                     if  ( ib  ! =  null )   
			
		
	
		
			
				
					                         return  ib ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        MobBase  mb  =  this . mobBase ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( mb  ! =  null )  if  ( equip  ! =  null )  {   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1685,10 +1865,10 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1685,10 +1865,10 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					            this . equip  =  new  HashMap < > ( 0 ) ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        // Combine mobbase and mob aggro arrays into one bitvector
   
			
		
	
		
			
				
					        if ( this . getMobBase ( ) . notEnemy . size ( )  >  0 )   
			
		
	
		
			
				
					        if   ( this . getMobBase ( ) . notEnemy . size ( )  >  0 )   
			
		
	
		
			
				
					            this . notEnemy . addAll ( this . getMobBase ( ) . notEnemy ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if ( this . getMobBase ( ) . enemy . size ( )  >  0 )   
			
		
	
		
			
				
					        if   ( this . getMobBase ( ) . enemy . size ( )  >  0 )   
			
		
	
		
			
				
					            this . enemy . addAll ( this . getMobBase ( ) . enemy ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        try  {   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1801,17 +1981,14 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1801,17 +1981,14 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        return  this . upgradeDateTime  ! =  null ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  void  setNoAggro ( boolean  noAggro )  {   
			
		
	
		
			
				
					        this . noAggro  =  noAggro ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  void  setAggroTargetID ( int  aggroTargetID )  {   
			
		
	
		
			
				
					        this . aggroTargetID  =  aggroTargetID ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  long  getLastAttackTime ( )  {   
			
		
	
		
			
				
					        return  lastAttackTime ;   
			
		
	
		
			
				
					    }   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1867,7 +2044,6 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -1867,7 +2044,6 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					        this . isPlayerGuard  =  isPlayerGuard ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  void  setPatrolPointIndex ( int  patrolPointIndex )  {   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -2047,13 +2223,14 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -2047,13 +2223,14 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					                DispatchMessage . dispatchMsgDispatch ( dispatch ,  Enum . DispatchChannel . SECONDARY ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( pet  ! =  null  & &  pet . getObjectUUID ( )  = =  this . getObjectUUID ( ) )   
			
		
	
		
			
				
					                owner . setPet ( null ) ;   
			
		
	
		
			
				
					                     owner . setPet ( null ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( this . getObjectType ( ) . equals ( GameObjectType . Mob ) )   
			
		
	
		
			
				
					                    this . setOwner ( null ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    private  void  slotMobInBuilding ( )  {   
			
		
	
		
			
				
					        int  maxSlots  =  10 ;   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2063,180 +2240,4 @@ public class Mob extends AbstractIntelligenceAgent {
				@@ -2063,180 +2240,4 @@ public class Mob extends AbstractIntelligenceAgent {
					 
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    public  static  synchronized  Mob  createGuardMob ( Mob  guardCaptain ,  Guild  guild ,  Zone  parent ,  Vector3fImmutable  loc ,  short  level ,  String  pirateName )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        MobBase  minionMobBase ;   
			
		
	
		
			
				
					        Mob  mob ;   
			
		
	
		
			
				
					        int  maxSlots  =  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        switch  ( guardCaptain . getRank ( ) )  {   
			
		
	
		
			
				
					            case  1 :   
			
		
	
		
			
				
					            case  2 :   
			
		
	
		
			
				
					                maxSlots  =  1 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  3 :   
			
		
	
		
			
				
					                maxSlots  =  2 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  4 :   
			
		
	
		
			
				
					            case  5 :   
			
		
	
		
			
				
					                maxSlots  =  3 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  6 :   
			
		
	
		
			
				
					                maxSlots  =  4 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            case  7 :   
			
		
	
		
			
				
					                maxSlots  =  5 ;   
			
		
	
		
			
				
					                break ;   
			
		
	
		
			
				
					            default :   
			
		
	
		
			
				
					                maxSlots  =  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( guardCaptain . siegeMinionMap . size ( )  = =  maxSlots )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        minionMobBase  =  guardCaptain . mobBase ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( minionMobBase  = =  null )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob  =  new  Mob ( minionMobBase ,  guild ,  parent ,  level ,  new  Vector3fImmutable ( 1 ,  1 ,  1 ) ,  0 ,  true ) ;   
			
		
	
		
			
				
					        mob . setLevel ( level ) ;   
			
		
	
		
			
				
					        if ( guardCaptain . equipmentSetID  ! =  0 )   
			
		
	
		
			
				
					            mob . equipmentSetID  =  guardCaptain . equipmentSetID ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . runAfterLoad ( ) ;   
			
		
	
		
			
				
					        mob . despawned  =  true ;   
			
		
	
		
			
				
					        //grab equipment and name from minionbase.
   
			
		
	
		
			
				
					        if  ( guardCaptain . contract  ! =  null )  {   
			
		
	
		
			
				
					            Enum . MinionType  minionType  =  Enum . MinionType . ContractToMinionMap . get ( guardCaptain . contract . getContractID ( ) ) ;   
			
		
	
		
			
				
					            if  ( minionType  ! =  null )  {   
			
		
	
		
			
				
					                String  rank  =  "" ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( guardCaptain . getRank ( )  <  3 )   
			
		
	
		
			
				
					                    rank  =  MBServerStatics . JUNIOR ;   
			
		
	
		
			
				
					                else  if  ( guardCaptain . getRank ( )  <  6 )   
			
		
	
		
			
				
					                    rank  =  "" ;   
			
		
	
		
			
				
					                else  if  ( guardCaptain . getRank ( )  = =  6 )   
			
		
	
		
			
				
					                    rank  =  MBServerStatics . VETERAN ;   
			
		
	
		
			
				
					                else   
			
		
	
		
			
				
					                    rank  =  MBServerStatics . ELITE ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( rank . isEmpty ( ) )   
			
		
	
		
			
				
					                    mob . nameOverride  =  pirateName  +  " "  +  minionType . getRace ( )  +  " "  +  minionType . getName ( ) ;   
			
		
	
		
			
				
					                else   
			
		
	
		
			
				
					                    mob . nameOverride  =  pirateName  +  " "  +  minionType . getRace ( )  +  " "  +  rank  +  " "  +  minionType . getName ( ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( parent  ! =  null )   
			
		
	
		
			
				
					            mob . setRelPos ( parent ,  loc . x  -  parent . absX ,  loc . y  -  parent . absY ,  loc . z  -  parent . absZ ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . setObjectTypeMask ( MBServerStatics . MASK_MOB  |  mob . getTypeMasks ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // mob.setMob();
   
			
		
	
		
			
				
					        mob . isPlayerGuard  =  true ;   
			
		
	
		
			
				
					        mob . setParentZone ( parent ) ;   
			
		
	
		
			
				
					        DbManager . addToCache ( mob ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        RuneBase  guardRune  =  RuneBase . getRuneBase ( 252621 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        for  ( MobBaseEffects  mbe  :  guardRune . getEffectsList ( ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            EffectsBase  eb  =  PowersManager . getEffectByToken ( mbe . getToken ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            if  ( eb  = =  null )  {   
			
		
	
		
			
				
					                Logger . info ( "EffectsBase Null for Token "  +  mbe . getToken ( ) ) ;   
			
		
	
		
			
				
					                continue ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            //check to upgrade effects if needed.
   
			
		
	
		
			
				
					            if  ( mob . effects . containsKey ( Integer . toString ( eb . getUUID ( ) ) ) )  {   
			
		
	
		
			
				
					                if  ( mbe . getReqLvl ( )  >  ( int )  mob . level )  {   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                Effect  eff  =  mob . effects . get ( Integer . toString ( eb . getUUID ( ) ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( eff  = =  null )   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                //Current effect is a higher rank, dont apply.
   
			
		
	
		
			
				
					                if  ( eff . getTrains ( )  >  mbe . getRank ( ) )   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                //new effect is of a higher rank. remove old effect and apply new one.
   
			
		
	
		
			
				
					                eff . cancelJob ( ) ;   
			
		
	
		
			
				
					                mob . addEffectNoTimer ( Integer . toString ( eb . getUUID ( ) ) ,  eb ,  mbe . getRank ( ) ,  true ) ;   
			
		
	
		
			
				
					            }  else  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                if  ( mbe . getReqLvl ( )  >  ( int )  mob . level )   
			
		
	
		
			
				
					                    continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					                mob . addEffectNoTimer ( Integer . toString ( eb . getUUID ( ) ) ,  eb ,  mbe . getRank ( ) ,  true ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        int  slot  =  0 ;   
			
		
	
		
			
				
					        slot  + =  guardCaptain . siegeMinionMap . size ( )  +  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        guardCaptain . siegeMinionMap . put ( mob ,  slot ) ;   
			
		
	
		
			
				
					        mob . setInBuildingLoc ( guardCaptain . building ,  guardCaptain ) ;   
			
		
	
		
			
				
					        Vector3fImmutable  buildingWorldLoc  =  ZoneManager . convertLocalToWorld ( guardCaptain . building ,  mob . inBuildingLoc ) ;   
			
		
	
		
			
				
					        mob . setBindLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					        mob . setLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					        mob . deathTime  =  System . currentTimeMillis ( ) ;   
			
		
	
		
			
				
					        mob . spawnTime  =  900 ;   
			
		
	
		
			
				
					        mob . npcOwner  =  guardCaptain ;   
			
		
	
		
			
				
					        mob . BehaviourType  =  Enum . MobBehaviourType . GuardMinion ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        return  mob ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    public  static  synchronized  Mob  createSiegeMob ( NPC  owner ,  int  loadID ,  Guild  guild ,  Zone  parent ,  Vector3fImmutable  loc ,  short  level )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        MobBase  minionMobBase ;   
			
		
	
		
			
				
					        Mob  mob ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( owner . getSiegeMinionMap ( ) . size ( )  = =  3 )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        minionMobBase  =  MobBase . getMobBase ( loadID ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( minionMobBase  = =  null )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob  =  new  Mob ( minionMobBase ,  guild ,  parent ,  level , new  Vector3fImmutable ( 1 , 1 , 1 ) ,  0 , false ) ;   
			
		
	
		
			
				
					        mob . runAfterLoad ( ) ;   
			
		
	
		
			
				
					        mob . despawned  =  true ;   
			
		
	
		
			
				
					        DbManager . addToCache ( mob ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( parent  ! =  null )   
			
		
	
		
			
				
					            mob . setRelPos ( parent ,  loc . x  -  parent . absX ,  loc . y  -  parent . absY ,  loc . z  -  parent . absZ ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . setObjectTypeMask ( MBServerStatics . MASK_MOB  |  mob . getTypeMasks ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        //mob.setMob();
   
			
		
	
		
			
				
					        mob . setSiege ( true ) ;   
			
		
	
		
			
				
					        mob . setParentZone ( parent ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        int  slot  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( ! owner . getSiegeMinionMap ( ) . containsValue ( 1 ) )   
			
		
	
		
			
				
					            slot  =  1 ;   
			
		
	
		
			
				
					        else  if  ( ! owner . getSiegeMinionMap ( ) . containsValue ( 2 ) )   
			
		
	
		
			
				
					            slot  =  2 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        owner . getSiegeMinionMap ( ) . put ( mob ,  slot ) ;   
			
		
	
		
			
				
					        mob . setInBuildingLoc ( owner . building ,  owner ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Vector3fImmutable  buildingWorldLoc  =  ZoneManager . convertLocalToWorld ( owner . building ,  mob . inBuildingLoc ) ;   
			
		
	
		
			
				
					        mob . setBindLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					        mob . setLoc ( buildingWorldLoc ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        mob . setSpawnTime ( 10 ) ;   
			
		
	
		
			
				
					        mob . setNpcOwner ( owner ) ;   
			
		
	
		
			
				
					        mob . BehaviourType  =  MobBehaviourType . Pet1 ;   
			
		
	
		
			
				
					        mob . BehaviourType . canRoam  =  false ;   
			
		
	
		
			
				
					        return  mob ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					}