@ -17,9 +17,11 @@ import engine.objects.Building;
				@@ -17,9 +17,11 @@ import engine.objects.Building;
					 
			
		
	
		
			
				
					import  engine.objects.City ;  
			
		
	
		
			
				
					import  engine.objects.Zone ;  
			
		
	
		
			
				
					import  engine.server.MBServerStatics ;  
			
		
	
		
			
				
					import  engine.server.world.WorldServer ;  
			
		
	
		
			
				
					import  org.pmw.tinylog.Logger ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					import  java.time.Instant ;  
			
		
	
		
			
				
					import  java.time.LocalDateTime ;  
			
		
	
		
			
				
					import  java.time.ZoneId ;  
			
		
	
		
			
				
					import  java.util.ArrayList ;  
			
		
	
		
			
				
					import  java.util.Collection ;  
			
		
	
		
			
				
					import  java.util.Collections ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -33,405 +35,435 @@ import java.util.concurrent.ThreadLocalRandom;
				@@ -33,405 +35,435 @@ import java.util.concurrent.ThreadLocalRandom;
					 
			
		
	
		
			
				
					 * /   
			
		
	
		
			
				
					public  enum  ZoneManager  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ZONEMANAGER ;   
			
		
	
		
			
				
					    ZONEMANAGER ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  Instant  hotZoneLastUpdate ;   
			
		
	
		
			
				
					    /* Instance variables */   
			
		
	
		
			
				
					    private  static  Zone  seaFloor  =  null ;   
			
		
	
		
			
				
					    public  static  Zone  hotZone  =  null ;   
			
		
	
		
			
				
					    public  static  int  hotZoneCycle  =  0 ;   // Used with HOTZONE_DURATION from config.
   
			
		
	
		
			
				
					    private  static  final  ConcurrentHashMap < Integer ,  Zone >  zonesByID  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ) ;   
			
		
	
		
			
				
					    private  static  final  ConcurrentHashMap < Integer ,  Zone >  zonesByUUID  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ) ;   
			
		
	
		
			
				
					    private  static  final  ConcurrentHashMap < String ,  Zone >  zonesByName  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ) ;   
			
		
	
		
			
				
					    public  static  final  Set < Zone >  macroZones  =  Collections . newSetFromMap ( new  ConcurrentHashMap < > ( ) ) ;   
			
		
	
		
			
				
					    private  static  final  Set < Zone >  npcCityZones  =  Collections . newSetFromMap ( new  ConcurrentHashMap < > ( ) ) ;   
			
		
	
		
			
				
					    private  static  final  Set < Zone >  playerCityZones  =  Collections . newSetFromMap ( new  ConcurrentHashMap < > ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    // Find all zones coordinates fit into, starting with Sea Floor
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  ArrayList < Zone >  getAllZonesIn ( final  Vector3fImmutable  loc )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        ArrayList < Zone >  allIn  =  new  ArrayList < > ( ) ;   
			
		
	
		
			
				
					        Zone  zone ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        zone  =  ZoneManager . findSmallestZone ( loc ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( zone  ! =  null )  {   
			
		
	
		
			
				
					            allIn . add ( zone ) ;   
			
		
	
		
			
				
					            while  ( zone . getParent ( )  ! =  null )  {   
			
		
	
		
			
				
					                zone  =  zone . getParent ( ) ;   
			
		
	
		
			
				
					                allIn . add ( zone ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        return  allIn ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Instance variables */   
			
		
	
		
			
				
						private  static  Zone  seaFloor  =  null ;   
			
		
	
		
			
				
						private  static  Zone  hotzone  =  null ;   
			
		
	
		
			
				
						private  static   ConcurrentHashMap < Integer ,  Zone >  zonesByID  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ) ;   
			
		
	
		
			
				
						private  static   ConcurrentHashMap < Integer ,  Zone >  zonesByUUID  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ) ;   
			
		
	
		
			
				
						private  static   ConcurrentHashMap < String ,  Zone >  zonesByName  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ) ;   
			
		
	
		
			
				
						private  static   Set < Zone >  macroZones  =  Collections . newSetFromMap ( new  ConcurrentHashMap < > ( ) ) ;   
			
		
	
		
			
				
						private  static   Set < Zone >  npcCityZones  =  Collections . newSetFromMap ( new  ConcurrentHashMap < > ( ) ) ;   
			
		
	
		
			
				
						private  static  Set < Zone >  playerCityZones  =  Collections . newSetFromMap ( new  ConcurrentHashMap < > ( ) ) ;   
			
		
	
		
			
				
					    // Find smallest zone coordinates fit into.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						// Find all zones coordinates fit into, starting with Sea Floor
   
			
		
	
		
			
				
					    public  static  final  Zone  findSmallestZone ( final  Vector3fImmutable  loc )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  ArrayList < Zone >  getAllZonesIn ( final  Vector3fImmutable  loc )  {   
			
		
	
		
			
				
					        Zone  zone  =  ZoneManager . seaFloor ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							ArrayList < Zone >  allIn  =  new  ArrayList < > ( ) ;   
			
		
	
		
			
				
							Zone  zone ;   
			
		
	
		
			
				
					        if  ( zone  = =  null )   
			
		
	
		
			
				
					            return  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							zone  =  ZoneManager . findSmallestZone ( loc ) ;   
			
		
	
		
			
				
					        boolean  childFound  =  true  ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone  ! =  null )  {   
			
		
	
		
			
				
								allIn . add ( zone ) ;   
			
		
	
		
			
				
								while  ( zone . getParent ( )  ! =  null )  {   
			
		
	
		
			
				
									zone  =  zone . getParent ( ) ;   
			
		
	
		
			
				
									allIn . add ( zone ) ;   
			
		
	
		
			
				
								}   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							return  allIn ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        while  ( childFound )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						// Find smallest zone coordinates fit into.
   
			
		
	
		
			
				
					            childFound  =  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  Zone  findSmallestZone ( final  Vector3fImmutable  loc )  {   
			
		
	
		
			
				
					            ArrayList < Zone >  nodes  =  zone . getNodes ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Zone  zone  =  ZoneManager . seaFloor ;   
			
		
	
		
			
				
					            // Logger.info("soze", "" + nodes.size());
   
			
		
	
		
			
				
					            if  ( nodes  ! =  null )   
			
		
	
		
			
				
					                for  ( Zone  child  :  nodes )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone  = =  null )   
			
		
	
		
			
				
								return  null ;   
			
		
	
		
			
				
					                    if  ( Bounds . collide ( loc ,  child . getBounds ( ) )  = =  true )  {   
			
		
	
		
			
				
					                        zone  =  child ;   
			
		
	
		
			
				
					                        childFound  =  true ;   
			
		
	
		
			
				
					                        break ;   
			
		
	
		
			
				
					                    }   
			
		
	
		
			
				
					                }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        return  zone ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							boolean  childFound  =  true ;   
			
		
	
		
			
				
					    public  static  void  addZone ( final  int  zoneID ,  final  Zone  zone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							while  ( childFound )  {   
			
		
	
		
			
				
					        ZoneManager . zonesByID . put ( zoneID ,  zone ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								childFound  =  false ;   
			
		
	
		
			
				
					        if  ( zone  ! =  null )   
			
		
	
		
			
				
					            ZoneManager . zonesByUUID . put ( zone . getObjectUUID ( ) ,  zone ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								ArrayList < Zone >  nodes  =  zone . getNodes (  ) ;  
			
		
	
		
			
				
					        ZoneManager . zonesByName . put ( zone . getName ( ) . toLowerCase ( ) ,  zone  ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								// Logger.info("soze", "" + nodes.size());
   
			
		
	
		
			
				
								if  ( nodes  ! =  null )   
			
		
	
		
			
				
									for  ( Zone  child  :  nodes )  {   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
										if  ( Bounds . collide ( loc ,  child . getBounds ( ) )  = =  true )  {   
			
		
	
		
			
				
											zone  =  child ;   
			
		
	
		
			
				
											childFound  =  true ;   
			
		
	
		
			
				
											break ;   
			
		
	
		
			
				
										}   
			
		
	
		
			
				
									}   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							return  zone ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    // Returns the number of available hotZones
   
			
		
	
		
			
				
					    // remaining in this cycle (1am)
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  void  addZone ( final  int  zoneID ,  final  Zone  zone  )  {  
			
		
	
		
			
				
					    public  static  int  availableHotZones ( )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							ZoneManager . zonesByID . put ( zoneID ,  zone )  ;  
			
		
	
		
			
				
					        int  count  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone  ! =  null )   
			
		
	
		
			
				
								ZoneManager . zonesByUUID . put ( zone . getObjectUUID ( ) ,  zone ) ;   
			
		
	
		
			
				
					        for  ( Zone  zone  :  ZoneManager . macroZones )   
			
		
	
		
			
				
					            if  ( ZoneManager . validHotZone ( zone ) )   
			
		
	
		
			
				
					                count  =  count  +  1 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							ZoneManager . zonesByName . put ( zone . getName ( ) . toLowerCase ( ) ,  zone ) ;   
			
		
	
		
			
				
					        return  count ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    // Resets the  availability of hotZones
   
			
		
	
		
			
				
					    // for this cycle
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static   Zone  getZoneByUUID ( final  int  zoneUUID )  {   
			
		
	
		
			
				
							return  ZoneManager . zonesByUUID . get ( zoneUUID ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    public  static  void  resetHotZones ( )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static   Zone  getZoneByZoneID ( final  int  zoneID )  {   
			
		
	
		
			
				
					        for  ( Zone  zone  :  ZoneManager . macroZones )   
			
		
	
		
			
				
					            if  ( zone . hasBeenHotzone )   
			
		
	
		
			
				
					                zone . hasBeenHotzone  =  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  ZoneManager . zonesByID . get ( zoneID ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  Collection < Zone >  getAllZones (  )  {  
			
		
	
		
			
				
							 return  ZoneManager . zonesByUUID . values ( ) ;  
			
		
	
		
			
				
						 }  
			
		
	
		
			
				
					    public  static  Zone  getZoneByUUID ( final  int  zoneUUID  )  {  
			
		
	
		
			
				
					         return  ZoneManager . zonesByUUID . get ( zoneUUID ) ;  
			
		
	
		
			
				
					     }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  Zone  getHotZone ( )  {   
			
		
	
		
			
				
							return  ZoneManager . hotzone ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    public  static  Zone  getZoneByZoneID ( final  int  zoneID )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  void  setHotZone ( final  Zone  zone )  {   
			
		
	
		
			
				
							if  ( ! zone . isMacroZone ( ) )   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
							ZoneManager . hotzone  =  zone ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        return  ZoneManager . zonesByID . get ( zoneID ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  boolean  inHotZone ( final  Vector3fImmutable  loc )  {   
			
		
	
		
			
				
					    public  static  final  Collection < Zone >  getAllZones ( )  {   
			
		
	
		
			
				
					        return  ZoneManager . zonesByUUID . values ( ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ZoneManager . hotzone  = =  null )   
			
		
	
		
			
				
								return  false ;   
			
		
	
		
			
				
					    public  static  final  void  setHotZone ( final  Zone  zone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  ( Bounds . collide ( loc ,  ZoneManager . hotzone . getBounds  ( ) )  = =  true ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        if  ( ! zone . isMacroZone  ( ) )  
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  void  setSeaFloor ( final  Zone  value )  {   
			
		
	
		
			
				
							ZoneManager . seaFloor  =  value ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        ZoneManager . hotZone  =  zone ;   
			
		
	
		
			
				
					        ZoneManager . hotZoneCycle  =  1 ;   // Used with HOTZONE_DURATION from config.
   
			
		
	
		
			
				
					        zone . hasBeenHotzone  =  true ;   
			
		
	
		
			
				
					        ZoneManager . hotZoneLastUpdate  =  LocalDateTime . now ( ) . withMinute ( 0 ) . withSecond ( 0 ) . atZone ( ZoneId . systemDefault ( ) ) . toInstant ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Zone  getSeaFloor ( )  {   
			
		
	
		
			
				
							return  ZoneManager . seaFloor ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  void  populateWorldZones ( final  Zone  zone  )  {  
			
		
	
		
			
				
					    public  static  boolean  inHotZone ( final  Vector3fImmutable  loc )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							int  loadNum  =  zone . getLoadNum ( ) ;   
			
		
	
		
			
				
					        if  ( ZoneManager . hotZone  = =  null )   
			
		
	
		
			
				
					            return  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// Zones are added to separate
   
			
		
	
		
			
				
							// collections for quick access
   
			
		
	
		
			
				
							// based upon their type.
   
			
		
	
		
			
				
					        return  ( Bounds . collide ( loc ,  ZoneManager . hotZone . getBounds ( ) )  = =  true ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone . isMacroZone ( ) )  {   
			
		
	
		
			
				
								addMacroZone ( zone ) ;   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					    public  static  void  setSeaFloor ( final  Zone  value )  {   
			
		
	
		
			
				
					        ZoneManager . seaFloor  =  value ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  Zone  getSeaFloor ( )  {   
			
		
	
		
			
				
					        return  ZoneManager . seaFloor ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone . isPlayerCity ( ) )  {   
			
		
	
		
			
				
								addPlayerCityZone ( zone ) ;   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					    public  static  final  void  populateWorldZones ( final  Zone  zone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone . isNPCCity ( ) )   
			
		
	
		
			
				
								addNPCCityZone ( zone ) ;   
			
		
	
		
			
				
					        int  loadNum  =  zone . getLoadNum ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        // Zones are added to separate
   
			
		
	
		
			
				
					        // collections for quick access
   
			
		
	
		
			
				
					        // based upon their type.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						private  static  void  addMacroZone ( final  Zone  zone )  {   
			
		
	
		
			
				
							ZoneManager . macroZones . add ( zone ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        if  ( zone . isMacroZone ( ) )  {   
			
		
	
		
			
				
					            addMacroZone ( zone ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						private  static  void  addNPCCityZone ( final  Zone  zone )  {   
			
		
	
		
			
				
							zone . setNPCCity ( true ) ;   
			
		
	
		
			
				
							ZoneManager . npcCityZones . add ( zone ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  void  addPlayerCityZone ( final  Zone  zone  )  {  
			
		
	
		
			
				
							zone . setPlayerCity ( tru e ) ;  
			
		
	
		
			
				
							ZoneManager . playerCityZones . add ( zone )  ;  
			
		
	
		
			
				
						 }  
			
		
	
		
			
				
					        if  ( zone . isPlayerCity ( ) )  {   
			
		
	
		
			
				
					            addPlayerCityZone ( zone ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					         }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  void  generateAndSetRandomHotzone ( )  {   
			
		
	
		
			
				
					        if  ( zone . isNPCCity ( ) )   
			
		
	
		
			
				
					            addNPCCityZone ( zone ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Zone  hotzone ;   
			
		
	
		
			
				
							ArrayList < Integer >  zoneArray  =  new  ArrayList < > ( ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ZoneManager . macroZones . isEmpty ( ) )   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
					    private  static  void  addMacroZone ( final  Zone  zone )  {   
			
		
	
		
			
				
					        ZoneManager . macroZones . add ( zone ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							for  ( Zone  zone  :  ZoneManager . macroZones )  {   
			
		
	
		
			
				
					    private  static  void  addNPCCityZone ( final  Zone  zone )  {   
			
		
	
		
			
				
					        zone . setNPCCity ( true ) ;   
			
		
	
		
			
				
					        ZoneManager . npcCityZones . add ( zone ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( validHotZone ( zone ) )   
			
		
	
		
			
				
									zoneArray . add ( zone . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
					    public  static  final  void  addPlayerCityZone ( final  Zone  zone )  {   
			
		
	
		
			
				
					        zone . setPlayerCity ( true ) ;   
			
		
	
		
			
				
					        ZoneManager . playerCityZones . add ( zone ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					    public  static  final  void  generateAndSetRandomHotzone ( )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							int  entryIndex  =  ThreadLocalRandom . current ( ) . nextInt ( zoneArray . size ( ) ) ;   
			
		
	
		
			
				
					        Zone  hotZone ;   
			
		
	
		
			
				
					        ArrayList < Integer >  zoneArray  =  new  ArrayList < > ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							hotzone  =  ZoneManager . getZoneByUUID ( zoneArray . get ( entryIndex ) ) ;   
			
		
	
		
			
				
					        if  ( ZoneManager . macroZones . isEmpty ( ) )   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Reset hotZone availability if none are left.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( hotzone  = =  null ) {   
			
		
	
		
			
				
								Logger . error (  "Hotzone is null" ) ;   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					        if  ( ZoneManager . availableHotZones ( )  = =  0 )   
			
		
	
		
			
				
					            ZoneManager . resetHotZones ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        for  ( Zone  zone  :  ZoneManager . macroZones )   
			
		
	
		
			
				
					            if  ( validHotZone ( zone ) )   
			
		
	
		
			
				
					                zoneArray . add ( zone . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							ZoneManager . setHotZone ( hotzone ) ;   
			
		
	
		
			
				
							WorldServer . setLastHZChange ( System . currentTimeMillis ( ) ) ;   
			
		
	
		
			
				
					        int  entryIndex  =  ThreadLocalRandom . current ( ) . nextInt ( zoneArray . size ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        hotZone  =  ZoneManager . getZoneByUUID ( zoneArray . get ( entryIndex ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  final  boolean  validHotZone ( Zone  zone )  {   
			
		
	
		
			
				
					        if  ( hotZone  = =  null )  {   
			
		
	
		
			
				
					            Logger . error ( "Hotzone is null" ) ;   
			
		
	
		
			
				
					            return ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone . getSafeZone ( )  = =  ( byte )  1 )   
			
		
	
		
			
				
								return  false ;  // no safe zone hotzones// if (this.hotzone == null)
   
			
		
	
		
			
				
					        ZoneManager . setHotZone ( hotZone ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone . getNodes ( ) . isEmpty ( ) )   
			
		
	
		
			
				
								return  false ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( zone . equals ( ZoneManager . seaFloor ) )   
			
		
	
		
			
				
								return  false ;   
			
		
	
		
			
				
					    public  static  final  boolean  validHotZone ( Zone  zone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// return false; //first time setting, accept it
   
			
		
	
		
			
				
							// if (this.hotzone.getUUID() == zone.getUUID())
   
			
		
	
		
			
				
							// return true; //no same hotzone
   
			
		
	
		
			
				
					        if  ( zone . getSafeZone ( )  = =  ( byte )  1 )   
			
		
	
		
			
				
					            return  false ;  // no safe zone hotzones// if (this.hotzone == null)
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ZoneManager . hotzone  ! =  null  )  
			
		
	
		
			
				
								return  ZoneManager . hotzone . getObjectUUID ( )  ! =  zone . getObjectUUID ( )  ;  
			
		
	
		
			
				
					        if  ( zone . getNodes ( ) . isEmpty ( )  )  
			
		
	
		
			
				
					            return  false  ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  true ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        if  ( zone . equals ( ZoneManager . seaFloor ) )   
			
		
	
		
			
				
					            return  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/ * *   
			
		
	
		
			
				
						 *  Gets  a  MacroZone  by  name .   
			
		
	
		
			
				
						 *   
			
		
	
		
			
				
						 *  @param  inputName   
			
		
	
		
			
				
						 *             MacroZone  name  to  search  for   
			
		
	
		
			
				
						 *  @return  Zone  of  the  MacroZone ,  or  Null   
			
		
	
		
			
				
						 * /   
			
		
	
		
			
				
					        //no duplicate hotZones
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Zone  findMacroZoneByName ( String  inputName )  {   
			
		
	
		
			
				
							synchronized  ( ZoneManager . macroZones )  {   
			
		
	
		
			
				
								for  ( Zone  zone  :  ZoneManager . macroZones )  {   
			
		
	
		
			
				
									String  zoneName  =  zone . getName ( ) ;   
			
		
	
		
			
				
									if  ( zoneName . equalsIgnoreCase ( inputName ) )   
			
		
	
		
			
				
										return  zone ;   
			
		
	
		
			
				
								}   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							return  null ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        if  ( zone . hasBeenHotzone  = =  true )   
			
		
	
		
			
				
					            return  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						// Converts world coordinates to coordinates local to a given zone. 
  
			
		
	
		
			
				
					        // Enforce min level
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Vector3fImmutable  worldToLocal ( Vector3fImmutable  worldVector ,   
			
		
	
		
			
				
								Zone  serverZone )  {   
			
		
	
		
			
				
					        if  ( zone . minLvl  <  Integer . parseInt ( ConfigManager . MB_HOTZONE_MIN_LEVEL . getValue ( ) ) )   
			
		
	
		
			
				
					            return  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Vector3fImmutable  localCoords ;   
			
		
	
		
			
				
					        if  ( ZoneManager . hotZone  ! =  null )   
			
		
	
		
			
				
					            return  ZoneManager . hotZone . getObjectUUID ( )  ! =  zone . getObjectUUID ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							localCoords  =  new  Vector3fImmutable ( worldVector . x  -  serverZone . absX ,   
			
		
	
		
			
				
									worldVector . y  -  serverZone . absY ,  worldVector . z   
			
		
	
		
			
				
									-  serverZone . absZ ) ;   
			
		
	
		
			
				
					        return  true ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  localCoords ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					    / * *   
			
		
	
		
			
				
					     *  Gets  a  MacroZone  by  name .   
			
		
	
		
			
				
					     *   
			
		
	
		
			
				
					     *  @param  inputName  MacroZone  name  to  search  for   
			
		
	
		
			
				
					     *  @return  Zone  of  the  MacroZone ,  or  Null   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  Zone  findMacroZoneByName ( String  inputName )  {   
			
		
	
		
			
				
					        synchronized  ( ZoneManager . macroZones )  {   
			
		
	
		
			
				
					            for  ( Zone  zone  :  ZoneManager . macroZones )  {   
			
		
	
		
			
				
					                String  zoneName  =  zone . getName ( ) ;   
			
		
	
		
			
				
					                if  ( zoneName . equalsIgnoreCase ( inputName ) )   
			
		
	
		
			
				
					                    return  zone ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        return  null ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Vector2f  worldToZoneSpace ( Vector3fImmutable  worldVector ,   
			
		
	
		
			
				
								Zone  serverZone )  {   
			
		
	
		
			
				
					    // Converts world coordinates to coordinates local to a given zone.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Vector2f  localCoords ;   
			
		
	
		
			
				
							Vector2f  zoneOrigin ;   
			
		
	
		
			
				
					    public  static  Vector3fImmutable  worldToLocal ( Vector3fImmutable  worldVector ,   
			
		
	
		
			
				
					                                                 Zone  serverZone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// Top left corner of zone is calculated in world space by the center and it's extents.
   
			
		
	
		
			
				
					        Vector3fImmutable  localCoords ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        localCoords  =  new  Vector3fImmutable ( worldVector . x  -  serverZone . absX ,   
			
		
	
		
			
				
					                worldVector . y  -  serverZone . absY ,  worldVector . z   
			
		
	
		
			
				
					                -  serverZone . absZ ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        return  localCoords ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							zoneOrigin  =  new  Vector2f ( serverZone . getLoc ( ) . x ,  serverZone . getLoc ( ) . z ) ;   
			
		
	
		
			
				
							zoneOrigin  =  zoneOrigin . subtract ( new  Vector2f ( serverZone . getBounds ( ) . getHalfExtents ( ) . x ,  serverZone . getBounds ( ) . getHalfExtents ( ) . y ) ) ;   
			
		
	
		
			
				
					    public  static  Vector2f  worldToZoneSpace ( Vector3fImmutable  worldVector ,   
			
		
	
		
			
				
					                                            Zone  serverZone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// Local coordinate in world space translated to an offset from the calculated zone origin.
   
			
		
	
		
			
				
					        Vector2f  localCoords ;   
			
		
	
		
			
				
					        Vector2f  zoneOrigin ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							localCoords  =  new  Vector2f ( worldVector . x ,  worldVector . z ) ;   
			
		
	
		
			
				
							localCoords  =  localCoords . subtract ( zoneOrigin ) ;   
			
		
	
		
			
				
					        // Top left corner of zone is calculated in world space by the center and it's extents.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							localCoords . setY ( ( serverZone . getBounds ( ) . getHalfExtents ( ) . y  *  2 )  -  localCoords . y ) ;   
			
		
	
		
			
				
					        zoneOrigin  =  new  Vector2f ( serverZone . getLoc ( ) . x ,  serverZone . getLoc ( ) . z ) ;   
			
		
	
		
			
				
					        zoneOrigin  =  zoneOrigin . subtract ( new  Vector2f ( serverZone . getBounds ( ) . getHalfExtents ( ) . x ,  serverZone . getBounds ( ) . getHalfExtents ( ) . y ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // Local coordinate in world space translated to an offset from the calculated zone origin.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        localCoords  =  new  Vector2f ( worldVector . x ,  worldVector . z ) ;   
			
		
	
		
			
				
					        localCoords  =  localCoords . subtract ( zoneOrigin ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        localCoords . setY ( ( serverZone . getBounds ( ) . getHalfExtents ( ) . y  *  2 )  -  localCoords . y ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// TODO : Make sure this value does not go outside the zone's bounds.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  localCoords ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        // TODO : Make sure this value does not go outside the zone's bounds.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						// Converts local zone coordinates to world coordinates
   
			
		
	
		
			
				
					        return  localCoords ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Vector3fImmutable  localToWorld ( Vector3fImmutable  worldVector ,   
			
		
	
		
			
				
								Zone  serverZone )  {   
			
		
	
		
			
				
					    // Converts local zone coordinates to world coordinates
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Vector3fImmutable  worldCoords ;   
			
		
	
		
			
				
					    public  static  Vector3fImmutable  localToWorld ( Vector3fImmutable  worldVector ,   
			
		
	
		
			
				
					                                                 Zone  serverZone )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							worldCoords  =  new  Vector3fImmutable ( worldVector . x  +  serverZone . absX ,   
			
		
	
		
			
				
									worldVector . y  +  serverZone . absY ,  worldVector . z   
			
		
	
		
			
				
									+  serverZone . absZ ) ;   
			
		
	
		
			
				
					        Vector3fImmutable  worldCoords ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  worldCoords ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        worldCoords  =  new  Vector3fImmutable ( worldVector . x  +  serverZone . absX ,   
			
		
	
		
			
				
					                worldVector . y  +  serverZone . absY ,  worldVector . z   
			
		
	
		
			
				
					                +  serverZone . absZ ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        return  worldCoords ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/ * *   
			
		
	
		
			
				
						 *  Converts  from  local  ( relative  to  this  building )  to  world .   
			
		
	
		
			
				
						 *   
			
		
	
		
			
				
						 *  @param  localPos  position  in  local  reference  ( relative  to  this  building )   
			
		
	
		
			
				
						 *  @return  position  relative  to  world   
			
		
	
		
			
				
						 * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Vector3fImmutable  convertLocalToWorld ( Building  building ,  Vector3fImmutable  localPos )  {   
			
		
	
		
			
				
					    / * *   
			
		
	
		
			
				
					     *  Converts  from  local  ( relative  to  this  building )  to  world .   
			
		
	
		
			
				
					     *   
			
		
	
		
			
				
					     *  @param  localPos  position  in  local  reference  ( relative  to  this  building )   
			
		
	
		
			
				
					     *  @return  position  relative  to  world   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// convert from SB rotation value to radians
   
			
		
	
		
			
				
					    public  static  Vector3fImmutable  convertLocalToWorld ( Building  building ,  Vector3fImmutable  localPos )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // convert from SB rotation value to radians
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( building . getBounds ( ) . getQuaternion ( )  = =  null )   
			
		
	
		
			
				
								return  building . getLoc ( ) ;   
			
		
	
		
			
				
							Vector3fImmutable  rotatedLocal  =  Vector3fImmutable . rotateAroundPoint ( Vector3fImmutable . ZERO ,  localPos ,  building . getBounds ( ) . getQuaternion ( ) ) ;   
			
		
	
		
			
				
							// handle building rotation
   
			
		
	
		
			
				
							// handle building translation
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  building . getLoc ( ) . add ( rotatedLocal . x ,  rotatedLocal . y , rotatedLocal . z ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        if  ( building . getBounds ( ) . getQuaternion ( )  = =  null )   
			
		
	
		
			
				
					            return  building . getLoc ( ) ;   
			
		
	
		
			
				
					        Vector3fImmutable  rotatedLocal  =  Vector3fImmutable . rotateAroundPoint ( Vector3fImmutable . ZERO ,  localPos ,  building . getBounds ( ) . getQuaternion ( ) ) ;   
			
		
	
		
			
				
					        // handle building rotation
   
			
		
	
		
			
				
					        // handle building translation
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        return  building . getLoc ( ) . add ( rotatedLocal . x ,  rotatedLocal . y ,  rotatedLocal . z ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						//used for regions, Building bounds not set yet.
   
			
		
	
		
			
				
						public  static  Vector3f  convertLocalToWorld ( Building  building ,  Vector3f  localPos ,  Bounds  bounds )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// convert from SB rotation value to radians
   
			
		
	
		
			
				
					    //used for regions, Building bounds not set yet.
   
			
		
	
		
			
				
					    public  static  Vector3f  convertLocalToWorld ( Building  building ,  Vector3f  localPos ,  Bounds  bounds )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // convert from SB rotation value to radians
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Vector3f  rotatedLocal  =  Vector3f . rotateAroundPoint ( Vector3f . ZERO ,  localPos ,  bounds . getQuaternion ( ) ) ;   
			
		
	
		
			
				
							// handle building rotation
   
			
		
	
		
			
				
							// handle building translation
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  new  Vector3f ( building . getLoc ( ) . add ( rotatedLocal . x ,  rotatedLocal . y , rotatedLocal . z ) ) ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        Vector3f  rotatedLocal  =  Vector3f . rotateAroundPoint ( Vector3f . ZERO ,  localPos ,  bounds . getQuaternion ( ) ) ;   
			
		
	
		
			
				
					        // handle building rotation
   
			
		
	
		
			
				
					        // handle building translation
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Vector3fImmutable  convertWorldToLocal ( Building  building ,  Vector3fImmutable  WorldPos )  {   
			
		
	
		
			
				
							Vector3fImmutable  convertLoc  =  Vector3fImmutable . rotateAroundPoint ( building . getLoc ( ) , WorldPos , - building . getBounds ( ) . getQuaternion ( ) . angleY ) ;   
			
		
	
		
			
				
					        return  new  Vector3f ( building . getLoc ( ) . add ( rotatedLocal . x ,  rotatedLocal . y ,  rotatedLocal . z ) ) ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  static  Vector3fImmutable  convertWorldToLocal ( Building  building ,  Vector3fImmutable  WorldPos )  {   
			
		
	
		
			
				
					        Vector3fImmutable  convertLoc  =  Vector3fImmutable . rotateAroundPoint ( building . getLoc ( ) ,  WorldPos ,  - building . getBounds ( ) . getQuaternion ( ) . angleY ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							convertLoc  =  convertLoc . subtract ( building . getLoc ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// convert from SB rotation value to radians
   
			
		
	
		
			
				
					        convertLoc  =  convertLoc . subtract ( building . getLoc ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  convertLoc ;   
			
		
	
		
			
				
					        // convert from SB rotation value to radians
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        return  convertLoc ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  Vector3fImmutable  convertNPCLoc ( Building  building ,  Vector3fImmutable  npcLoc )  {   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  Vector3fImmutable . rotateAroundPoint ( Vector3fImmutable . ZERO ,  npcLoc ,  - building . getBounds ( ) . getQuaternion ( ) . angleY ) ;   
			
		
	
		
			
				
					    public  static  Vector3fImmutable  convertNPCLoc ( Building  building ,  Vector3fImmutable  npcLoc )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					        return  Vector3fImmutable . rotateAroundPoint ( Vector3fImmutable . ZERO ,  npcLoc ,  - building . getBounds ( ) . getQuaternion ( ) . angleY ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						 // Method returns a city if the given location is within
   
			
		
	
		
			
				
						// a city siege radius.
   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  City  getCityAtLocation ( Vector3fImmutable  worldLoc )  {   
			
		
	
		
			
				
					    // Method returns a city if the given location is within
   
			
		
	
		
			
				
					    // a city siege radius.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							Zone  currentZone ;   
			
		
	
		
			
				
							ArrayList < Zone >  zoneList ;   
			
		
	
		
			
				
							City  city ;   
			
		
	
		
			
				
					    public  static  City  getCityAtLocation ( Vector3fImmutable  worldLoc )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							currentZone  =  ZoneManager . findSmallestZone ( worldLoc ) ;   
			
		
	
		
			
				
					        Zone  currentZone ;   
			
		
	
		
			
				
					        ArrayList < Zone >  zoneList ;   
			
		
	
		
			
				
					        City  city ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( currentZone . isPlayerCity ( ) )   
			
		
	
		
			
				
								return  City . getCity ( currentZone . getPlayerCityUUID ( ) ) ;   
			
		
	
		
			
				
					        currentZone  =  ZoneManager . findSmallestZone ( worldLoc ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// Not currently on a city grid.  Test nearby cities
   
			
		
	
		
			
				
							// to see if we are on one of their seige bounds.
   
			
		
	
		
			
				
					        if  ( currentZone . isPlayerCity ( ) )   
			
		
	
		
			
				
					            return  City . getCity ( currentZone . getPlayerCityUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							zoneList  =  currentZone . getNodes ( ) ;   
			
		
	
		
			
				
					        // Not currently on a city grid.  Test nearby cities
   
			
		
	
		
			
				
					        // to see if we are on one of their seige bounds.
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							for  ( Zone  zone  :  zoneList )  {   
			
		
	
		
			
				
					        zoneList  =  currentZone . getNodes ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( zone  = =  currentZone )   
			
		
	
		
			
				
									continue ;   
			
		
	
		
			
				
					        for  ( Zone  zone  :  zoneList )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( zone . isPlayerCity ( )  = =  fals e )  
			
		
	
		
			
				
									 continue ;  
			
		
	
		
			
				
					            if  ( zone  = =  currentZon e )  
			
		
	
		
			
				
					                 continue ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								city  =  City . getCity ( zone . getPlayerCityUUID ( ) ) ;   
			
		
	
		
			
				
					            if  ( zone . isPlayerCity ( )  = =  false )   
			
		
	
		
			
				
					                continue ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( worldLoc . isInsideCircle ( city . getLoc ( ) ,  Enum . CityBoundsType . SIEGE . extents ) )   
			
		
	
		
			
				
									return  city ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					            city  =  City . getCity ( zone . getPlayerCityUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  null ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					            if  ( worldLoc . isInsideCircle ( city . getLoc ( ) ,  Enum . CityBoundsType . SIEGE . extents ) )   
			
		
	
		
			
				
					                return  city ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/ *  Method  is  called  when  creating  a  new  player  city  to   
			
		
	
		
			
				
						 *  validate  that  the  new  zone  does  not  overlap  any  other   
			
		
	
		
			
				
						 *  zone  that  might  currently  exist   
			
		
	
		
			
				
						 * /   
			
		
	
		
			
				
					        return  null ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  static  boolean  validTreePlacementLoc ( Zone  currentZone ,  float  positionX ,  float  positionZ )  {   
			
		
	
		
			
				
					    / *  Method  is  called  when  creating  a  new  player  city  to   
			
		
	
		
			
				
					     *  validate  that  the  new  zone  does  not  overlap  any  other   
			
		
	
		
			
				
					     *  zone  that  might  currently  exist   
			
		
	
		
			
				
					     * /   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							// Member Variable declaration
   
			
		
	
		
			
				
					    public  static  boolean  validTreePlacementLoc ( Zone  currentZone ,  float  positionX ,  float  positionZ )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							ArrayList < Zone >  zoneList ;   
			
		
	
		
			
				
							boolean  validLocation  =  true ;   
			
		
	
		
			
				
							Bounds  treeBounds ;   
			
		
	
		
			
				
					        // Member Variable declaration
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( currentZone . isContininent ( )  = =  false )   
			
		
	
		
			
				
								return  false ;   
			
		
	
		
			
				
					        ArrayList < Zone >  zoneList ;   
			
		
	
		
			
				
					        boolean  validLocation  =  true ;   
			
		
	
		
			
				
					        Bounds  treeBounds ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( currentZone . isContininent ( )  = =  false )   
			
		
	
		
			
				
					            return  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							treeBounds  =  Bounds . borrow ( ) ;   
			
		
	
		
			
				
							treeBounds . setBounds ( new  Vector2f ( positionX ,  positionZ ) ,  new  Vector2f ( Enum . CityBoundsType . SIEGE . extents ,  Enum . CityBoundsType . SIEGE . extents ) ,  0 . 0f ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							zoneList  =  currentZone . getNodes ( ) ;   
			
		
	
		
			
				
					        treeBounds  =  Bounds . borrow ( ) ;   
			
		
	
		
			
				
					        treeBounds . setBounds ( new  Vector2f ( positionX ,  positionZ ) ,  new  Vector2f ( Enum . CityBoundsType . SIEGE . extents ,  Enum . CityBoundsType . SIEGE . extents ) ,  0 . 0f ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        zoneList  =  currentZone . getNodes ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							 for  ( Zone  zone  :  zoneList )  {  
			
		
	
		
			
				
					         for  ( Zone  zone  :  zoneList )  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								 if  ( zone . isContininent ( ) )  
			
		
	
		
			
				
									 continue ;  
			
		
	
		
			
				
					             if  ( zone . isContininent ( ) )  
			
		
	
		
			
				
					                 continue ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								 if  ( Bounds . collide ( treeBounds ,  zone . getBounds ( ) ,  0 . 0f ) )  
			
		
	
		
			
				
									 validLocation  =  false ;  
			
		
	
		
			
				
							 }  
			
		
	
		
			
				
					             if  ( Bounds . collide ( treeBounds ,  zone . getBounds ( ) ,  0 . 0f ) )  
			
		
	
		
			
				
					                 validLocation  =  false ;  
			
		
	
		
			
				
					         }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							 treeBounds . release ( ) ;  
			
		
	
		
			
				
							 return  validLocation ;  
			
		
	
		
			
				
					         treeBounds . release ( ) ;  
			
		
	
		
			
				
					         return  validLocation ;  
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					}