|  |  |  | @ -34,409 +34,405 @@ import java.util.concurrent.ThreadLocalRandom;@@ -34,409 +34,405 @@ import java.util.concurrent.ThreadLocalRandom; | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | public enum ZoneManager { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	ZONEMANAGER; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/* 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 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; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Find smallest zone coordinates fit into.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final Zone findSmallestZone(final Vector3fImmutable loc) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		Zone zone = ZoneManager.seaFloor; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone == null) | 
			
		
	
		
			
				
					|  |  |  |  | 			return null; | 
			
		
	
		
			
				
					|  |  |  |  |     ZONEMANAGER; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /* Instance variables */ | 
			
		
	
		
			
				
					|  |  |  |  |     private static Zone seaFloor = null; | 
			
		
	
		
			
				
					|  |  |  |  |     private static Zone hotzone = null; | 
			
		
	
		
			
				
					|  |  |  |  |     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); | 
			
		
	
		
			
				
					|  |  |  |  |     private 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; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		boolean childFound = true; | 
			
		
	
		
			
				
					|  |  |  |  |     // Find smallest zone coordinates fit into.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		while (childFound) { | 
			
		
	
		
			
				
					|  |  |  |  |     public static final Zone findSmallestZone(final Vector3fImmutable loc) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			childFound = false; | 
			
		
	
		
			
				
					|  |  |  |  |         Zone zone = ZoneManager.seaFloor; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			ArrayList<Zone> nodes = zone.getNodes(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone == null) | 
			
		
	
		
			
				
					|  |  |  |  |             return null; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// Logger.info("soze", "" + nodes.size());
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (nodes != null) | 
			
		
	
		
			
				
					|  |  |  |  | 				for (Zone child : nodes) { | 
			
		
	
		
			
				
					|  |  |  |  |         boolean childFound = true; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 					if (Bounds.collide(loc, child.getBounds()) == true) { | 
			
		
	
		
			
				
					|  |  |  |  | 						zone = child; | 
			
		
	
		
			
				
					|  |  |  |  | 						childFound = true; | 
			
		
	
		
			
				
					|  |  |  |  | 						break; | 
			
		
	
		
			
				
					|  |  |  |  | 					} | 
			
		
	
		
			
				
					|  |  |  |  | 				} | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		return zone; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         while (childFound) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static void addZone(final int zoneID, final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  |             childFound = false; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.zonesByID.put(zoneID, zone); | 
			
		
	
		
			
				
					|  |  |  |  |             ArrayList<Zone> nodes = zone.getNodes(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone != null) | 
			
		
	
		
			
				
					|  |  |  |  | 			ZoneManager.zonesByUUID.put(zone.getObjectUUID(), zone); | 
			
		
	
		
			
				
					|  |  |  |  |             // Logger.info("soze", "" + nodes.size());
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (nodes != null) | 
			
		
	
		
			
				
					|  |  |  |  |                 for (Zone child : nodes) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.zonesByName.put(zone.getName().toLowerCase(), zone); | 
			
		
	
		
			
				
					|  |  |  |  |                     if (Bounds.collide(loc, child.getBounds()) == true) { | 
			
		
	
		
			
				
					|  |  |  |  |                         zone = child; | 
			
		
	
		
			
				
					|  |  |  |  |                         childFound = true; | 
			
		
	
		
			
				
					|  |  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         return zone; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static void addZone(final int zoneID, final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static  Zone getZoneByUUID(final int zoneUUID) { | 
			
		
	
		
			
				
					|  |  |  |  | 		return ZoneManager.zonesByUUID.get(zoneUUID); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.zonesByID.put(zoneID, zone); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static  Zone getZoneByZoneID(final int zoneID) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone != null) | 
			
		
	
		
			
				
					|  |  |  |  |             ZoneManager.zonesByUUID.put(zone.getObjectUUID(), zone); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return ZoneManager.zonesByID.get(zoneID); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.zonesByName.put(zone.getName().toLowerCase(), zone); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final Collection<Zone> getAllZones() { | 
			
		
	
		
			
				
					|  |  |  |  | 		return ZoneManager.zonesByUUID.values(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final Zone getHotZone() { | 
			
		
	
		
			
				
					|  |  |  |  | 		return ZoneManager.hotzone; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static Zone getZoneByUUID(final int zoneUUID) { | 
			
		
	
		
			
				
					|  |  |  |  |         return ZoneManager.zonesByUUID.get(zoneUUID); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final void setHotZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!zone.isMacroZone()) | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.hotzone = zone; | 
			
		
	
		
			
				
					|  |  |  |  | 		zone.hasBeenHotzone = true; | 
			
		
	
		
			
				
					|  |  |  |  | 		zone.becameHotzone = LocalDateTime.now(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static Zone getZoneByZoneID(final int zoneID) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static boolean inHotZone(final Vector3fImmutable loc) { | 
			
		
	
		
			
				
					|  |  |  |  |         return ZoneManager.zonesByID.get(zoneID); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ZoneManager.hotzone == null) | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  |     public static final Collection<Zone> getAllZones() { | 
			
		
	
		
			
				
					|  |  |  |  |         return ZoneManager.zonesByUUID.values(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return (Bounds.collide(loc, ZoneManager.hotzone.getBounds()) == true); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static final Zone getHotZone() { | 
			
		
	
		
			
				
					|  |  |  |  |         return ZoneManager.hotzone; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static void setSeaFloor(final Zone value) { | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.seaFloor = value; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static final void setHotZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!zone.isMacroZone()) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.hotzone = zone; | 
			
		
	
		
			
				
					|  |  |  |  |         zone.hasBeenHotzone = true; | 
			
		
	
		
			
				
					|  |  |  |  |         zone.becameHotzone = LocalDateTime.now(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static Zone getSeaFloor() { | 
			
		
	
		
			
				
					|  |  |  |  | 		return ZoneManager.seaFloor; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static boolean inHotZone(final Vector3fImmutable loc) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final void populateWorldZones(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (ZoneManager.hotzone == null) | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		int loadNum = zone.getLoadNum(); | 
			
		
	
		
			
				
					|  |  |  |  |         return (Bounds.collide(loc, ZoneManager.hotzone.getBounds()) == true); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// Zones are added to separate
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// collections for quick access
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// based upon their type.
 | 
			
		
	
		
			
				
					|  |  |  |  |     public static void setSeaFloor(final Zone value) { | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.seaFloor = value; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone.isMacroZone()) { | 
			
		
	
		
			
				
					|  |  |  |  | 			addMacroZone(zone); | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  |     public static Zone getSeaFloor() { | 
			
		
	
		
			
				
					|  |  |  |  |         return ZoneManager.seaFloor; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public static final void populateWorldZones(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone.isPlayerCity()) { | 
			
		
	
		
			
				
					|  |  |  |  | 			addPlayerCityZone(zone); | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  |         int loadNum = zone.getLoadNum(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone.isNPCCity()) | 
			
		
	
		
			
				
					|  |  |  |  | 			addNPCCityZone(zone); | 
			
		
	
		
			
				
					|  |  |  |  |         // Zones are added to separate
 | 
			
		
	
		
			
				
					|  |  |  |  |         // collections for quick access
 | 
			
		
	
		
			
				
					|  |  |  |  |         // based upon their type.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone.isMacroZone()) { | 
			
		
	
		
			
				
					|  |  |  |  |             addMacroZone(zone); | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	private static void addMacroZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.macroZones.add(zone); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	private static void addNPCCityZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 		zone.setNPCCity(true); | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.npcCityZones.add(zone); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone.isPlayerCity()) { | 
			
		
	
		
			
				
					|  |  |  |  |             addPlayerCityZone(zone); | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final void addPlayerCityZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 		zone.setPlayerCity(true); | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.playerCityZones.add(zone); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone.isNPCCity()) | 
			
		
	
		
			
				
					|  |  |  |  |             addNPCCityZone(zone); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static final void generateAndSetRandomHotzone() { | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		Zone hotzone; | 
			
		
	
		
			
				
					|  |  |  |  | 		ArrayList<Integer> zoneArray = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  |     private static void addMacroZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.macroZones.add(zone); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ZoneManager.macroZones.isEmpty()) | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
		
			
				
					|  |  |  |  |     private static void addNPCCityZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  |         zone.setNPCCity(true); | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.npcCityZones.add(zone); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		for (Zone zone : ZoneManager.macroZones) { | 
			
		
	
		
			
				
					|  |  |  |  |     public static final void addPlayerCityZone(final Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  |         zone.setPlayerCity(true); | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.playerCityZones.add(zone); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if (validHotZone(zone)) | 
			
		
	
		
			
				
					|  |  |  |  | 				zoneArray.add(zone.getObjectUUID()); | 
			
		
	
		
			
				
					|  |  |  |  |     public static final void generateAndSetRandomHotzone() { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  |         Zone hotzone; | 
			
		
	
		
			
				
					|  |  |  |  |         ArrayList<Integer> zoneArray = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size()); | 
			
		
	
		
			
				
					|  |  |  |  |         if (ZoneManager.macroZones.isEmpty()) | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		hotzone = ZoneManager.getZoneByUUID(zoneArray.get(entryIndex)); | 
			
		
	
		
			
				
					|  |  |  |  |         for (Zone zone : ZoneManager.macroZones) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (validHotZone(zone)) | 
			
		
	
		
			
				
					|  |  |  |  |                 zoneArray.add(zone.getObjectUUID()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (hotzone == null){ | 
			
		
	
		
			
				
					|  |  |  |  | 			Logger.error( "Hotzone is null"); | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		ZoneManager.setHotZone(hotzone); | 
			
		
	
		
			
				
					|  |  |  |  | 		WorldServer.setLastHZChange(System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         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)
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone.getNodes().isEmpty()) | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  |         ZoneManager.setHotZone(hotzone); | 
			
		
	
		
			
				
					|  |  |  |  |         WorldServer.setLastHZChange(System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (zone.equals(ZoneManager.seaFloor)) | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		//no duplicate hotzones
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if(zone.hasBeenHotzone == true){ | 
			
		
	
		
			
				
					|  |  |  |  | 			return false; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		// return false; //first time setting, accept it
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// if (this.hotzone.getUUID() == zone.getUUID())
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// return true; //no same hotzone
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ZoneManager.hotzone != null) | 
			
		
	
		
			
				
					|  |  |  |  | 			return ZoneManager.hotzone.getObjectUUID() != zone.getObjectUUID(); | 
			
		
	
		
			
				
					|  |  |  |  |     public static final boolean validHotZone(Zone zone) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return true; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone.getSafeZone() == (byte) 1) | 
			
		
	
		
			
				
					|  |  |  |  |             return false; // no safe zone hotzones// if (this.hotzone == null)
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Gets a MacroZone by name. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param inputName | 
			
		
	
		
			
				
					|  |  |  |  | 	 *            MacroZone name to search for | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return Zone of the MacroZone, or Null | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone.getNodes().isEmpty()) | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	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.equals(ZoneManager.seaFloor)) | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  |         //no duplicate hotzones
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (zone.hasBeenHotzone == true) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         // return false; //first time setting, accept it
 | 
			
		
	
		
			
				
					|  |  |  |  |         // if (this.hotzone.getUUID() == zone.getUUID())
 | 
			
		
	
		
			
				
					|  |  |  |  |         // return true; //no same hotzone
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Converts world coordinates to coordinates local to a given zone.
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (ZoneManager.hotzone != null) | 
			
		
	
		
			
				
					|  |  |  |  |             return ZoneManager.hotzone.getObjectUUID() != zone.getObjectUUID(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector, | 
			
		
	
		
			
				
					|  |  |  |  | 			Zone serverZone) { | 
			
		
	
		
			
				
					|  |  |  |  |         return true; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		Vector3fImmutable 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; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		localCoords = new Vector3fImmutable(worldVector.x - serverZone.absX, | 
			
		
	
		
			
				
					|  |  |  |  | 				worldVector.y - serverZone.absY, worldVector.z | 
			
		
	
		
			
				
					|  |  |  |  | 				- serverZone.absZ); | 
			
		
	
		
			
				
					|  |  |  |  |     // Converts world coordinates to coordinates local to a given zone.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return localCoords; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |     public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector, | 
			
		
	
		
			
				
					|  |  |  |  |                                                  Zone serverZone) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	public static Vector2f worldToZoneSpace(Vector3fImmutable worldVector, | 
			
		
	
		
			
				
					|  |  |  |  | 			Zone serverZone) { | 
			
		
	
		
			
				
					|  |  |  |  |         Vector3fImmutable localCoords; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		Vector2f localCoords; | 
			
		
	
		
			
				
					|  |  |  |  | 		Vector2f zoneOrigin; | 
			
		
	
		
			
				
					|  |  |  |  |         localCoords = new Vector3fImmutable(worldVector.x - serverZone.absX, | 
			
		
	
		
			
				
					|  |  |  |  |                 worldVector.y - serverZone.absY, worldVector.z | 
			
		
	
		
			
				
					|  |  |  |  |                 - serverZone.absZ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// Top left corner of zone is calculated in world space by the center and it's extents.
 | 
			
		
	
		
			
				
					|  |  |  |  |         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() == false) | 
			
		
	
		
			
				
					|  |  |  |  | 				continue; | 
			
		
	
		
			
				
					|  |  |  |  |             if (zone == currentZone) | 
			
		
	
		
			
				
					|  |  |  |  |                 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; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |