@ -80,7 +80,7 @@ public class Building extends AbstractWorldObject {
				@@ -80,7 +80,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    / *   The  Blueprint  class  has  methods  able  to  derive   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     *   all  defining  characteristics  of  this  building ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * /   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private   int  blueprintUUID  =  0 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public   int  blueprintUUID  =  0 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  float  w  =  1 . 0f ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  Vector3f  meshScale  =  new  Vector3f ( 1 . 0f ,  1 . 0f ,  1 . 0f ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  int  doorState  =  0 ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -96,7 +96,7 @@ public class Building extends AbstractWorldObject {
				@@ -96,7 +96,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  ConcurrentHashMap < String ,  Long >  timestamps  =  null ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  ConcurrentHashMap < Integer ,  BuildingFriends >  friends  =  new  ConcurrentHashMap < > ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  ConcurrentHashMap < Integer ,  Condemned >  condemned  =  new  ConcurrentHashMap < > ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private   ProtectionState  protectionState  =  ProtectionState . NONE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public   ProtectionState  protectionState  =  ProtectionState . NONE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    private  ArrayList < Building >  children  =  null ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    / * *   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -277,86 +277,6 @@ public class Building extends AbstractWorldObject {
				@@ -277,86 +277,6 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  rank ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public  final  void  setRank ( int  newRank )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        int  newMeshUUID ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        boolean  success ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // If this building has no blueprint then set rank and exit immediatly.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( this . blueprintUUID  = =  0  | |  this . getBlueprint ( )  ! =  null  & &  this . getBlueprint ( ) . getBuildingGroup ( ) . equals ( BuildingGroup . MINE ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . rank  =  newRank ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            DbManager . BuildingQueries . CHANGE_RANK ( this . getObjectUUID ( ) ,  newRank ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Delete any upgrade jobs before doing anything else.  It won't quite work
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // if in a few lines we happen to delete this building.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        JobContainer  jc  =  this . getTimers ( ) . get ( "UPGRADE" ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( jc  ! =  null )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  ( ! JobScheduler . getInstance ( ) . cancelScheduledJob ( jc ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                Logger . error ( "failed to cancel existing upgrade job." ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Attempt write to database, or delete the building
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // if we are destroying it.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( newRank  = =  - 1 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            success  =  DbManager . BuildingQueries . DELETE_FROM_DATABASE ( this ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        else   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            success  =  DbManager . BuildingQueries . updateBuildingRank ( this ,  newRank ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( success  = =  false )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            Logger . error ( "Error writing to database UUID: "  +  this . getObjectUUID ( ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . isDeranking . compareAndSet ( false ,  true ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Change the building's rank
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . rank  =  newRank ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // New rank means new mesh
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        newMeshUUID  =  this . getBlueprint ( ) . getMeshForRank ( this . rank ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . meshUUID  =  newMeshUUID ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // New rank mean new max hitpoints.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . healthMax  =  this . getBlueprint ( ) . getMaxHealth ( this . rank ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . setCurrentHitPoints ( this . healthMax ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( this . getUpgradeDateTime ( )  ! =  null )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            BuildingManager . setUpgradeDateTime ( this ,  null ,  0 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // If we destroyed this building make sure to turn off
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // protection
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( this . rank  = =  - 1 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . protectionState  =  ProtectionState . NONE ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( ( this . getBlueprint ( ) . getBuildingGroup ( )  = =  BuildingGroup . TOL )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                & &  ( this . rank  = =  8 ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . meshUUID  =  Realm . getRealmMesh ( this . getCity ( ) ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // update object to clients
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . refresh ( true ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( this . getBounds ( )  ! =  null )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . getBounds ( ) . setBounds ( this ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Cleanup hirelings resulting from rank change
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        BuildingManager . cleanupHirelings ( this ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        this . isDeranking . compareAndSet ( true ,  false ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public  final  int  getOwnerUUID ( )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  ownerUUID ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -528,7 +448,7 @@ public class Building extends AbstractWorldObject {
				@@ -528,7 +448,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                MineRecord  mineRecord  =  MineRecord . borrow ( mine ,  attacker ,  RecordEventType . DESTROY ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                DataWarehouse . pushToWarehouse ( mineRecord ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                this . setRank ( - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                BuildingManager . setRank ( this ,  - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                this . setCurrentHitPoints ( ( float )  1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                this . healthMax  =  ( float )  1 ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                this . meshUUID  =  this . getBlueprint ( ) . getMeshForRank ( this . rank ) ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -551,9 +471,9 @@ public class Building extends AbstractWorldObject {
				@@ -551,9 +471,9 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        //  Time to either derank or destroy the building.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( ( this . rank  -  1 )  <  1 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . setRank ( - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            BuildingManager . setRank ( this ,  - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        else   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . setRank ( this . rank  -  1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            BuildingManager . setRank ( this ,  this . rank  -  1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -611,7 +531,7 @@ public class Building extends AbstractWorldObject {
				@@ -611,7 +531,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  ( spireBuilding  ! =  null )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                spireBuilding . disableSpire ( true ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                spire Building. setRank ( - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                BuildingManager  . setRank ( spireBuilding ,  - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -622,7 +542,7 @@ public class Building extends AbstractWorldObject {
				@@ -622,7 +542,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // Delete a random shrine
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  ( shrineBuilding  ! =  null )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                shrine Building. setRank ( - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                BuildingManager  . setRank ( shrineBuilding ,  - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( barracksBuildings . size ( )  >  this . rank  -  1 )  {   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -632,7 +552,7 @@ public class Building extends AbstractWorldObject {
				@@ -632,7 +552,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // Delete a random barrack
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  ( barracksBuilding  ! =  null )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                barracks Building. setRank ( - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                BuildingManager  . setRank ( barracksBuilding ,  - 1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // If the tree is R8 and deranking, we need to update it's
   
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -661,7 +581,7 @@ public class Building extends AbstractWorldObject {
				@@ -661,7 +581,7 @@ public class Building extends AbstractWorldObject {
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Let's do so and early exit
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  ( this . rank  >  1 )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            this . setRank ( rank  -  1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            BuildingManager . setRank ( this ,  rank  -  1 ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            City . lastCityUpdate  =  System . currentTimeMillis ( ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            return ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }