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