Compare commits
218 Commits
f5d83aa259
...
5d4192bbcf
| Author | SHA1 | Date | |
|---|---|---|---|
| 5d4192bbcf | |||
| ea6ea4b0ee | |||
| 7f4d47505e | |||
| f9a3b17677 | |||
| d0374a2dea | |||
| cb89cc17be | |||
| d506807a8f | |||
| 1a0fc309f9 | |||
| 5ed7662798 | |||
| e3d6a32554 | |||
| 6f990d488f | |||
| 610de198e9 | |||
| 928be0facb | |||
| 80799753be | |||
| f9d2232a9b | |||
| cbd8685d4b | |||
| 274cf08dad | |||
| 2cbe5f38cd | |||
| 3d4058ad01 | |||
| 761ec6f4af | |||
| 5900068898 | |||
| 13f5e3eff2 | |||
| db9e950558 | |||
| 3f93bf08fb | |||
| 65eebcbb5d | |||
| 6ed3495780 | |||
| 06049a7135 | |||
| 12e073ca46 | |||
| 4ee4054ab3 | |||
| 11664a9218 | |||
| d414c19904 | |||
| 279a0aed91 | |||
| c6e0e36531 | |||
| 10b9f19036 | |||
| ad661ea464 | |||
| affe6b08ab | |||
| 1b2c218e83 | |||
| 9e96add299 | |||
| 9f9c3ba7f1 | |||
| d15b8a5246 | |||
| c1e1c730bb | |||
| a53c68054d | |||
| 99a79df02d | |||
| 1a0f318968 | |||
| 6ac65c73d5 | |||
| dc5a778610 | |||
| 20d9a232cc | |||
| 280bd61e2a | |||
| dadfc15d39 | |||
| 1764041272 | |||
| b9ef4eee63 | |||
| 823061c699 | |||
| 6809988e9c | |||
| a1a3ea6234 | |||
| 3684296959 | |||
| 68c8d91871 | |||
| 7655b67338 | |||
| 68aef50283 | |||
| 6494e07e9e | |||
| 859de1004e | |||
| 0afc8a2dc5 | |||
| f73184ac1e | |||
| 52b66be43b | |||
| bd208bd1ab | |||
| f7952008cd | |||
| a0c82d3f3f | |||
| dd01fd1688 | |||
| d2dc95c169 | |||
| 53f7165e24 | |||
| c90a250ba7 | |||
| e80dd66809 | |||
| 95558371df | |||
| 085f79cefd | |||
| a17b9fdd13 | |||
| 73b6854266 | |||
| fe8d512596 | |||
| ef8754c018 | |||
| 483ccbff00 | |||
| 07f736b8e6 | |||
| cd1de763e3 | |||
| d6d4008348 | |||
| 4bbbbf9fa2 | |||
| a3d29bb8f0 | |||
| 0d58aee2fe | |||
| bc5d0cc4a9 | |||
| 59c3bea2d6 | |||
| 13163ddb7e | |||
| 02a9256950 | |||
| d31d6c1f95 | |||
| bc099e9dc0 | |||
| 79bf0523a5 | |||
| a0d2ccb5ab | |||
| df54840a88 | |||
| 4b62517d99 | |||
| 0ce9ec3ae2 | |||
| 5279fa8fbe | |||
| 0d75e6db9b | |||
| ffb541a12e | |||
| 5fdaa11367 | |||
| 6b339da061 | |||
| f454fb5e1c | |||
| 5db8c47aa8 | |||
| e7571f3e83 | |||
| d9b513e88c | |||
| 7dcde390cd | |||
| 6a750f4eb2 | |||
| c6d24d25cc | |||
| c19ec913cb | |||
| 438ea04a1a | |||
| d7044c1663 | |||
| 3497d275a8 | |||
| 6fd61889a8 | |||
| 85983954de | |||
| 1e9eec2c48 | |||
| bd97745ed1 | |||
| 34d450fecf | |||
| be107c0858 | |||
| 8289786099 | |||
| 56f159d50a | |||
| 61961bab05 | |||
| e0387dce00 | |||
| 46b3db033b | |||
| bf9fdae58b | |||
| 7b8cafc8ac | |||
| 7793fab5d2 | |||
| 1ddcda5c5d | |||
| 9714393538 | |||
| d46f369599 | |||
| 2dfd2a53c2 | |||
| e3675ec9a4 | |||
| cb2ed0c766 | |||
| 6638fdcaff | |||
| d0b4634429 | |||
| 1fdf1f1339 | |||
| 6290c6d0af | |||
| 26a3ea4b18 | |||
| c7b2245005 | |||
| 5ba06796b1 | |||
| e359b1dfdf | |||
| cbc8216fe0 | |||
| da238b9986 | |||
| 897ddfe77a | |||
| 80f2db794f | |||
| 913a2601d5 | |||
| 40c27eef79 | |||
| df45e00fbd | |||
| a323f1ffb7 | |||
| ea6092db8a | |||
| 8c6eb48876 | |||
| 37d2f8a8ad | |||
| f18acf3e68 | |||
| 3fb08ca2c3 | |||
| 83be09d643 | |||
| 6de8249fb0 | |||
| 013ddcff66 | |||
| 8ece4caf1c | |||
| a94b12e8cd | |||
| c38103068e | |||
| f8caaf0e99 | |||
| ee809ddb37 | |||
| 227bd0523e | |||
| c096b29521 | |||
| 6a0520b126 | |||
| 240373898a | |||
| d33ad0cdef | |||
| a3a3070158 | |||
| b717c3d550 | |||
| 9aa5820ac2 | |||
| 1ac65dd9bd | |||
| 797a6951a8 | |||
| 7268de6e1e | |||
| fc602ce9f4 | |||
| 403bff27b4 | |||
| 44b9ba911d | |||
| c24f8fc85b | |||
| 75c56cbeee | |||
| 15f42c9658 | |||
| 525d0c21bb | |||
| cbf05cfe5b | |||
| aaa506a581 | |||
| a2fbfad00e | |||
| 031c52e25a | |||
| 693dfd827c | |||
| d26a2d35bf | |||
| 9839de128c | |||
| 12872ee51e | |||
| 2af08d6823 | |||
| f646075311 | |||
| dfca767476 | |||
| fd7b5952c2 | |||
| 4b46eddc47 | |||
| e26121177f | |||
| 91eb0c314f | |||
| 1d7a2d4eae | |||
| e4235d4d75 | |||
| 41a83115be | |||
| 3ce887cb34 | |||
| 874eb6189e | |||
| 5c5c491597 | |||
| ff78c1443c | |||
| cdc1c2d776 | |||
| a004c247ab | |||
| 048e90fb8f | |||
| c1498145e6 | |||
| 7654d5183a | |||
| 9b7fc0a93b | |||
| 200318ddcf | |||
| 1fdd0a1b32 | |||
| 8869772fa4 | |||
| 96bc894962 | |||
| 5a9f5f2eca | |||
| bd9dbcbb42 | |||
| f8269bb764 | |||
| c215047c00 | |||
| a313e3f364 | |||
| b34be1184e | |||
| e23c5527da | |||
| 847e62dd27 |
@@ -469,7 +469,7 @@ public class Enum {
|
||||
|
||||
// 14001 does not have a banestone to bind at
|
||||
|
||||
if (ruinZone.getLoadNum() == 14001)
|
||||
if (ruinZone.template == 14001)
|
||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
|
||||
else
|
||||
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
|
||||
@@ -2310,10 +2310,10 @@ public class Enum {
|
||||
ZONE(875),
|
||||
PLACEMENT(876);
|
||||
|
||||
public final float extents;
|
||||
public final float halfExtents;
|
||||
|
||||
CityBoundsType(float extents) {
|
||||
this.extents = extents;
|
||||
CityBoundsType(float halfExtents) {
|
||||
this.halfExtents = halfExtents;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,463 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
package engine.InterestManagement;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector2f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.Zone;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class HeightMap {
|
||||
|
||||
// Class variables
|
||||
|
||||
// Heightmap data for all zones.
|
||||
|
||||
public static final HashMap<Integer, HeightMap> heightmapByLoadNum = new HashMap<>();
|
||||
|
||||
// Bootstrap Tracking
|
||||
|
||||
public static int heightMapsCreated = 0;
|
||||
public static HeightMap PlayerCityHeightMap;
|
||||
|
||||
// Heightmap data for this heightmap
|
||||
|
||||
public BufferedImage heightmapImage;
|
||||
|
||||
private int heightMapID;
|
||||
private int maxHeight;
|
||||
private int fullExtentsX;
|
||||
private int fullExtentsY;
|
||||
|
||||
private float bucketWidthX;
|
||||
private float bucketWidthY;
|
||||
private int zoneLoadID;
|
||||
private float seaLevel = 0;
|
||||
private float outsetX;
|
||||
private float outsetZ;
|
||||
private int[][] pixelColorValues;
|
||||
|
||||
public HeightMap(ResultSet rs) throws SQLException {
|
||||
|
||||
this.heightMapID = rs.getInt("heightMapID");
|
||||
this.maxHeight = rs.getInt("maxHeight");
|
||||
int halfExtentsX = rs.getInt("xRadius");
|
||||
int halfExtentsY = rs.getInt("zRadius");
|
||||
this.zoneLoadID = rs.getInt("zoneLoadID");
|
||||
this.seaLevel = rs.getFloat("seaLevel");
|
||||
this.outsetX = rs.getFloat("outsetX");
|
||||
this.outsetZ = rs.getFloat("outsetZ");
|
||||
|
||||
|
||||
// Cache the full extents to avoid the calculation
|
||||
|
||||
this.fullExtentsX = halfExtentsX * 2;
|
||||
this.fullExtentsY = halfExtentsY * 2;
|
||||
|
||||
this.heightmapImage = null;
|
||||
File imageFile = new File(ConfigManager.DEFAULT_DATA_DIR + "heightmaps/" + this.heightMapID + ".bmp");
|
||||
|
||||
// early exit if no image file was found. Will log in caller.
|
||||
|
||||
if (!imageFile.exists())
|
||||
return;
|
||||
|
||||
// load the heightmap image.
|
||||
|
||||
try {
|
||||
this.heightmapImage = ImageIO.read(imageFile);
|
||||
} catch (IOException e) {
|
||||
Logger.error("***Error loading heightmap data for heightmap " + this.heightMapID + e.toString());
|
||||
}
|
||||
|
||||
// We needed to flip the image as OpenGL and Shadowbane both use the bottom left corner as origin.
|
||||
|
||||
// this.heightmapImage = MapLoader.flipImage(this.heightmapImage);
|
||||
|
||||
// Calculate the data we do not load from table
|
||||
|
||||
float numOfBuckets = this.heightmapImage.getWidth() - 1;
|
||||
float calculatedWidth = this.fullExtentsX / numOfBuckets;
|
||||
this.bucketWidthX = calculatedWidth;
|
||||
this.bucketWidthY = this.bucketWidthX; // This makes no sense.
|
||||
|
||||
// Generate pixel array from image data
|
||||
|
||||
generatePixelData();
|
||||
|
||||
HeightMap.heightmapByLoadNum.put(this.zoneLoadID, this);
|
||||
|
||||
heightMapsCreated++;
|
||||
}
|
||||
|
||||
//Created for PlayerCities
|
||||
public HeightMap() {
|
||||
|
||||
this.heightMapID = 999999;
|
||||
this.maxHeight = 5; // for real...
|
||||
int halfExtentsX = (int) Enum.CityBoundsType.ZONE.extents;
|
||||
int halfExtentsY = (int) Enum.CityBoundsType.ZONE.extents;
|
||||
this.zoneLoadID = 0;
|
||||
this.seaLevel = 0;
|
||||
this.outsetX = 128;
|
||||
this.outsetZ = 128;
|
||||
|
||||
// Cache the full extents to avoid the calculation
|
||||
|
||||
this.fullExtentsX = halfExtentsX * 2;
|
||||
this.fullExtentsY = halfExtentsY * 2;
|
||||
|
||||
this.heightmapImage = null;
|
||||
|
||||
// Calculate the data we do not load from table
|
||||
|
||||
this.bucketWidthX = halfExtentsX;
|
||||
this.bucketWidthY = halfExtentsY;
|
||||
|
||||
this.pixelColorValues = new int[this.fullExtentsX][this.fullExtentsY];
|
||||
|
||||
for (int y = 0; y < this.fullExtentsY; y++) {
|
||||
for (int x = 0; x < this.fullExtentsX; x++) {
|
||||
pixelColorValues[x][y] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public HeightMap(Zone zone) {
|
||||
|
||||
this.heightMapID = 999999;
|
||||
this.maxHeight = 0;
|
||||
int halfExtentsX = (int) zone.getBounds().getHalfExtents().x;
|
||||
int halfExtentsY = (int) zone.getBounds().getHalfExtents().y;
|
||||
this.zoneLoadID = 0;
|
||||
this.seaLevel = 0;
|
||||
this.outsetX = 0;
|
||||
this.outsetZ = 0;
|
||||
|
||||
// Cache the full extents to avoid the calculation
|
||||
|
||||
this.fullExtentsX = halfExtentsX * 2;
|
||||
this.fullExtentsY = halfExtentsY * 2;
|
||||
|
||||
this.heightmapImage = null;
|
||||
|
||||
// Calculate the data we do not load from table
|
||||
|
||||
this.bucketWidthX = halfExtentsX;
|
||||
this.bucketWidthY = halfExtentsY;
|
||||
|
||||
this.pixelColorValues = new int[this.fullExtentsX][this.fullExtentsY];
|
||||
|
||||
for (int y = 0; y < this.fullExtentsY; y++) {
|
||||
for (int x = 0; x < this.fullExtentsX; x++) {
|
||||
pixelColorValues[x][y] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void GeneratePlayerCityHeightMap() {
|
||||
|
||||
HeightMap.PlayerCityHeightMap = new HeightMap();
|
||||
|
||||
}
|
||||
|
||||
public static void GenerateCustomHeightMap(Zone zone) {
|
||||
|
||||
HeightMap heightMap = new HeightMap(zone);
|
||||
|
||||
HeightMap.heightmapByLoadNum.put(zone.getLoadNum(), heightMap);
|
||||
|
||||
}
|
||||
|
||||
public static Zone getNextZoneWithTerrain(Zone zone) {
|
||||
|
||||
Zone nextZone = zone;
|
||||
|
||||
if (zone.getHeightMap() != null)
|
||||
return zone;
|
||||
|
||||
if (zone.equals(ZoneManager.getSeaFloor()))
|
||||
return zone;
|
||||
|
||||
while (nextZone.getHeightMap() == null)
|
||||
nextZone = nextZone.getParent();
|
||||
|
||||
return nextZone;
|
||||
}
|
||||
|
||||
public static float getWorldHeight(Zone currentZone, Vector3fImmutable worldLoc) {
|
||||
|
||||
Vector2f parentLoc = new Vector2f(-1, -1);
|
||||
|
||||
if (currentZone == null)
|
||||
return 0;
|
||||
|
||||
currentZone = getNextZoneWithTerrain(currentZone);
|
||||
|
||||
if (currentZone == ZoneManager.getSeaFloor())
|
||||
return currentZone.getAbsY();
|
||||
|
||||
Zone parentZone = getNextZoneWithTerrain(currentZone.getParent());
|
||||
HeightMap heightMap = currentZone.getHeightMap();
|
||||
|
||||
if ((heightMap == null) || (currentZone == ZoneManager.getSeaFloor()))
|
||||
return currentZone.getAbsY();
|
||||
|
||||
Vector2f zoneLoc = ZoneManager.worldToZoneSpace(worldLoc, currentZone);
|
||||
Vector3fImmutable localLocFromCenter = ZoneManager.worldToLocal(worldLoc, currentZone);
|
||||
|
||||
if ((parentZone != null) && (parentZone.getHeightMap() != null))
|
||||
parentLoc = ZoneManager.worldToZoneSpace(worldLoc, parentZone);
|
||||
|
||||
float interaltitude = currentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc);
|
||||
|
||||
float worldAltitude = currentZone.worldAltitude;
|
||||
|
||||
float realWorldAltitude = interaltitude + worldAltitude;
|
||||
|
||||
//OUTSET
|
||||
|
||||
if (parentZone != null) {
|
||||
|
||||
float parentXRadius = currentZone.getBounds().getHalfExtents().x;
|
||||
float parentZRadius = currentZone.getBounds().getHalfExtents().y;
|
||||
|
||||
float offsetX = Math.abs((localLocFromCenter.x / parentXRadius));
|
||||
float offsetZ = Math.abs((localLocFromCenter.z / parentZRadius));
|
||||
|
||||
float bucketScaleX = heightMap.outsetX / parentXRadius;
|
||||
float bucketScaleZ = heightMap.outsetZ / parentZRadius;
|
||||
|
||||
float outsideGridSizeX = 1 - bucketScaleX; //32/256
|
||||
float outsideGridSizeZ = 1 - bucketScaleZ;
|
||||
float weight;
|
||||
|
||||
double scale;
|
||||
|
||||
if (offsetX > outsideGridSizeX && offsetX > offsetZ) {
|
||||
weight = (offsetX - outsideGridSizeX) / bucketScaleX;
|
||||
scale = Math.atan2((.5 - weight) * 3.1415927, 1);
|
||||
|
||||
float scaleChild = (float) ((scale + 1) * .5);
|
||||
float scaleParent = 1 - scaleChild;
|
||||
|
||||
float parentAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(parentLoc);
|
||||
float parentCenterAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(ZoneManager.worldToZoneSpace(currentZone.getLoc(), parentZone));
|
||||
|
||||
parentCenterAltitude += currentZone.getYCoord();
|
||||
parentCenterAltitude += interaltitude;
|
||||
|
||||
float firstScale = parentAltitude * scaleParent;
|
||||
float secondScale = parentCenterAltitude * scaleChild;
|
||||
float outsetALt = firstScale + secondScale;
|
||||
|
||||
outsetALt += currentZone.getParent().worldAltitude;
|
||||
realWorldAltitude = outsetALt;
|
||||
|
||||
} else if (offsetZ > outsideGridSizeZ) {
|
||||
|
||||
weight = (offsetZ - outsideGridSizeZ) / bucketScaleZ;
|
||||
scale = Math.atan2((.5 - weight) * 3.1415927, 1);
|
||||
|
||||
float scaleChild = (float) ((scale + 1) * .5);
|
||||
float scaleParent = 1 - scaleChild;
|
||||
float parentAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(parentLoc);
|
||||
float parentCenterAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(ZoneManager.worldToZoneSpace(currentZone.getLoc(), parentZone));
|
||||
|
||||
parentCenterAltitude += currentZone.getYCoord();
|
||||
parentCenterAltitude += interaltitude;
|
||||
float firstScale = parentAltitude * scaleParent;
|
||||
float secondScale = parentCenterAltitude * scaleChild;
|
||||
float outsetALt = firstScale + secondScale;
|
||||
|
||||
outsetALt += currentZone.getParent().worldAltitude;
|
||||
realWorldAltitude = outsetALt;
|
||||
}
|
||||
}
|
||||
|
||||
return realWorldAltitude;
|
||||
}
|
||||
|
||||
public static float getWorldHeight(Vector3fImmutable worldLoc) {
|
||||
|
||||
Zone currentZone = ZoneManager.findSmallestZone(worldLoc);
|
||||
|
||||
if (currentZone == null)
|
||||
return 0;
|
||||
return getWorldHeight(currentZone, worldLoc);
|
||||
|
||||
}
|
||||
|
||||
public static void loadAlHeightMaps() {
|
||||
|
||||
// Load the heightmaps into staging hashmap keyed by HashMapID
|
||||
|
||||
DbManager.HeightMapQueries.LOAD_ALL_HEIGHTMAPS();
|
||||
|
||||
//generate static player city heightmap.
|
||||
|
||||
HeightMap.GeneratePlayerCityHeightMap();
|
||||
|
||||
// Clear all heightmap image data as it's no longer needed.
|
||||
|
||||
for (HeightMap heightMap : HeightMap.heightmapByLoadNum.values()) {
|
||||
heightMap.heightmapImage = null;
|
||||
}
|
||||
|
||||
Logger.info(HeightMap.heightmapByLoadNum.size() + " Heightmaps cached.");
|
||||
}
|
||||
|
||||
public static boolean isLocUnderwater(Vector3fImmutable currentLoc) {
|
||||
|
||||
float localAltitude = HeightMap.getWorldHeight(currentLoc);
|
||||
Zone zone = ZoneManager.findSmallestZone(currentLoc);
|
||||
|
||||
if (localAltitude < zone.getSeaLevel())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public Vector2f getGridSquare(Vector2f zoneLoc) {
|
||||
|
||||
if (zoneLoc.x < 0)
|
||||
zoneLoc.setX(0);
|
||||
|
||||
if (zoneLoc.x >= this.fullExtentsX)
|
||||
zoneLoc.setX(this.fullExtentsX);
|
||||
|
||||
if (zoneLoc.y < 0)
|
||||
zoneLoc.setY(0);
|
||||
|
||||
if (zoneLoc.y > this.fullExtentsY)
|
||||
zoneLoc.setY(this.fullExtentsY);
|
||||
|
||||
// Flip Y coordinates
|
||||
|
||||
zoneLoc.setY(this.fullExtentsY - zoneLoc.y);
|
||||
|
||||
float xBucket = (zoneLoc.x / this.bucketWidthX);
|
||||
float yBucket = (zoneLoc.y / this.bucketWidthY);
|
||||
|
||||
return new Vector2f(xBucket, yBucket);
|
||||
}
|
||||
|
||||
public float getInterpolatedTerrainHeight(Vector2f zoneLoc) {
|
||||
|
||||
Vector2f gridSquare;
|
||||
|
||||
if (zoneLoc.x < 0 || zoneLoc.x > this.fullExtentsX)
|
||||
return -1;
|
||||
|
||||
if (zoneLoc.y < 0 || zoneLoc.y > this.fullExtentsY)
|
||||
return -1;
|
||||
|
||||
int maxX = (int) (this.fullExtentsX / this.bucketWidthX);
|
||||
int maxY = (int) (this.fullExtentsY / this.bucketWidthY);
|
||||
|
||||
gridSquare = getGridSquare(zoneLoc);
|
||||
|
||||
int gridX = (int) gridSquare.x;
|
||||
int gridY = (int) gridSquare.y;
|
||||
|
||||
if (gridX > maxX)
|
||||
gridX = maxX;
|
||||
if (gridY > maxY)
|
||||
gridY = maxY;
|
||||
|
||||
float offsetX = (gridSquare.x - gridX);
|
||||
float offsetY = gridSquare.y - gridY;
|
||||
|
||||
//get height of the 4 vertices.
|
||||
|
||||
float topLeftHeight = 0;
|
||||
float topRightHeight = 0;
|
||||
float bottomLeftHeight = 0;
|
||||
float bottomRightHeight = 0;
|
||||
|
||||
int nextY = gridY + 1;
|
||||
int nextX = gridX + 1;
|
||||
|
||||
if (nextY > maxY)
|
||||
nextY = gridY;
|
||||
|
||||
if (nextX > maxX)
|
||||
nextX = gridX;
|
||||
|
||||
topLeftHeight = pixelColorValues[gridX][gridY];
|
||||
topRightHeight = pixelColorValues[nextX][gridY];
|
||||
bottomLeftHeight = pixelColorValues[gridX][nextY];
|
||||
bottomRightHeight = pixelColorValues[nextX][nextY];
|
||||
|
||||
float interpolatedHeight;
|
||||
|
||||
interpolatedHeight = topRightHeight * (1 - offsetY) * (offsetX);
|
||||
interpolatedHeight += (bottomRightHeight * offsetY * offsetX);
|
||||
interpolatedHeight += (bottomLeftHeight * (1 - offsetX) * offsetY);
|
||||
interpolatedHeight += (topLeftHeight * (1 - offsetX) * (1 - offsetY));
|
||||
|
||||
interpolatedHeight *= (float) this.maxHeight / 256; // Scale height
|
||||
|
||||
return interpolatedHeight;
|
||||
}
|
||||
|
||||
private void generatePixelData() {
|
||||
|
||||
Color color;
|
||||
|
||||
// Generate altitude lookup table for this heightmap
|
||||
|
||||
this.pixelColorValues = new int[this.heightmapImage.getWidth()][this.heightmapImage.getHeight()];
|
||||
|
||||
for (int y = 0; y < this.heightmapImage.getHeight(); y++) {
|
||||
for (int x = 0; x < this.heightmapImage.getWidth(); x++) {
|
||||
|
||||
color = new Color(this.heightmapImage.getRGB(x, y));
|
||||
pixelColorValues[x][y] = color.getRed();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public float getBucketWidthX() {
|
||||
return bucketWidthX;
|
||||
}
|
||||
|
||||
public float getBucketWidthY() {
|
||||
return bucketWidthY;
|
||||
}
|
||||
|
||||
public int getHeightMapID() {
|
||||
return heightMapID;
|
||||
}
|
||||
|
||||
public BufferedImage getHeightmapImage() {
|
||||
return heightmapImage;
|
||||
}
|
||||
|
||||
public float getSeaLevel() {
|
||||
return seaLevel;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,224 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
package engine.InterestManagement;
|
||||
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector2f;
|
||||
import engine.math.Vector3fImmutable;
|
||||
import engine.objects.Zone;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import static java.lang.Math.PI;
|
||||
|
||||
public class Terrain {
|
||||
public static final HashMap<Integer, short[][]> _heightmap_pixel_cache = new HashMap<>();
|
||||
public short[][] terrain_pixel_data;
|
||||
public Vector2f terrain_size = new Vector2f();
|
||||
public Vector2f cell_size = new Vector2f();
|
||||
public Vector2f cell_count = new Vector2f();
|
||||
public float terrain_scale;
|
||||
public Vector2f blend_ratio = new Vector2f();
|
||||
public int heightmap;
|
||||
Zone zone;
|
||||
|
||||
public Terrain(Zone zone) {
|
||||
|
||||
this.zone = zone;
|
||||
this.heightmap = this.zone.terrain_image;
|
||||
|
||||
// Configure PLANAR zones to use the same 16x16 pixel image
|
||||
// that all similar terrains share. (See JSON)
|
||||
|
||||
if (this.zone.terrain_type.equals("PLANAR"))
|
||||
this.heightmap = 1006300; // all 0
|
||||
|
||||
// Load pixel data for this terrain from cache
|
||||
|
||||
this.terrain_pixel_data = Terrain._heightmap_pixel_cache.get(heightmap);
|
||||
|
||||
if (terrain_pixel_data == null)
|
||||
Logger.error("Pixel map empty for zone: " + this.zone.getObjectUUID() + ":" + this.zone.zoneName);
|
||||
|
||||
// Configure terrain based on zone properties
|
||||
|
||||
this.terrain_size.x = this.zone.major_radius * 2;
|
||||
this.terrain_size.y = this.zone.minor_radius * 2;
|
||||
|
||||
this.cell_count.x = this.terrain_pixel_data.length - 1;
|
||||
this.cell_count.y = this.terrain_pixel_data[0].length - 1;
|
||||
|
||||
this.cell_size.x = terrain_size.x / this.cell_count.x;
|
||||
this.cell_size.y = terrain_size.y / this.cell_count.y;
|
||||
|
||||
// Blending configuration. These ratios are used to calculate
|
||||
// the blending area between child and parent terrains when
|
||||
// they are stitched together.
|
||||
|
||||
Vector2f major_blend = new Vector2f(this.zone.max_blend / this.zone.major_radius,
|
||||
this.zone.min_blend / this.zone.major_radius);
|
||||
|
||||
Vector2f minor_blend = new Vector2f(this.zone.max_blend / this.zone.minor_radius,
|
||||
this.zone.min_blend / this.zone.minor_radius);
|
||||
|
||||
if (major_blend.y > 0.4f)
|
||||
blend_ratio.x = major_blend.y;
|
||||
else
|
||||
blend_ratio.x = Math.min(major_blend.x, 0.4f);
|
||||
|
||||
if (minor_blend.y > 0.4f)
|
||||
blend_ratio.y = minor_blend.y;
|
||||
else
|
||||
blend_ratio.y = Math.min(minor_blend.x, 0.4f);
|
||||
|
||||
// Scale coefficient for this terrain
|
||||
|
||||
this.terrain_scale = this.zone.terrain_max_y / 255f;
|
||||
}
|
||||
|
||||
public static Zone getNextZoneWithTerrain(Zone zone) {
|
||||
|
||||
// Not all zones have a terrain. Some are for display only
|
||||
// and heights returned are from the parent heightmap. This
|
||||
// is controlled in the JSON via the has_terrain_gen field.
|
||||
|
||||
Zone terrain_zone = zone;
|
||||
|
||||
if (zone == null)
|
||||
return ZoneManager.seaFloor;
|
||||
|
||||
if (zone.terrain != null)
|
||||
return zone;
|
||||
|
||||
if (zone.equals(ZoneManager.seaFloor))
|
||||
return zone;
|
||||
|
||||
while (terrain_zone.terrain == null)
|
||||
terrain_zone = terrain_zone.parent;
|
||||
|
||||
return terrain_zone;
|
||||
}
|
||||
|
||||
public static float getWorldHeight(Zone zone, Vector3fImmutable world_loc) {
|
||||
|
||||
// Retrieve the next zone with a terrain defined.
|
||||
|
||||
Zone terrainZone = getNextZoneWithTerrain(zone);
|
||||
Zone parentZone = getNextZoneWithTerrain(zone.parent);
|
||||
|
||||
// Transform world loc into zone space coordinate system
|
||||
|
||||
Vector2f terrainLoc = ZoneManager.worldToTerrainSpace(world_loc, terrainZone);
|
||||
Vector2f parentLoc = ZoneManager.worldToTerrainSpace(world_loc, parentZone);
|
||||
|
||||
// Offset from origin needed for blending function
|
||||
|
||||
Vector2f terrainOffset = ZoneManager.worldToZoneOffset(world_loc, terrainZone);
|
||||
|
||||
// Interpolate height for this position in both terrains
|
||||
|
||||
float interpolatedChildHeight = terrainZone.terrain.getInterpolatedTerrainHeight(terrainLoc);
|
||||
interpolatedChildHeight += terrainZone.global_height;
|
||||
|
||||
float interpolatedParentTerrainHeight = parentZone.terrain.getInterpolatedTerrainHeight(parentLoc);
|
||||
interpolatedParentTerrainHeight += parentZone.global_height;
|
||||
|
||||
// Blend between terrains
|
||||
|
||||
float blendCoefficient = terrainZone.terrain.getTerrainBlendCoefficient(terrainOffset);
|
||||
|
||||
float terrainHeight = interpolatedChildHeight * blendCoefficient;
|
||||
terrainHeight += interpolatedParentTerrainHeight * (1 - blendCoefficient);
|
||||
|
||||
return terrainHeight;
|
||||
|
||||
}
|
||||
|
||||
public static float getWorldHeight(Vector3fImmutable world_loc) {
|
||||
|
||||
Zone currentZone = ZoneManager.findSmallestZone(world_loc);
|
||||
|
||||
return getWorldHeight(currentZone, world_loc);
|
||||
|
||||
}
|
||||
|
||||
public Vector2f getTerrainCell(Vector2f terrain_loc) {
|
||||
|
||||
// Calculate terrain cell with offset
|
||||
|
||||
Vector2f terrain_cell = new Vector2f(terrain_loc.x / this.cell_size.x, terrain_loc.y / this.cell_size.y);
|
||||
|
||||
// Clamp values when standing directly on pole
|
||||
|
||||
terrain_cell.x = Math.max(0, Math.min(this.cell_count.x - 1, terrain_cell.x));
|
||||
terrain_cell.y = Math.max(0, Math.min(this.cell_count.y - 1, terrain_cell.y));
|
||||
|
||||
return terrain_cell;
|
||||
}
|
||||
|
||||
public float getInterpolatedTerrainHeight(Vector2f terrain_loc) {
|
||||
|
||||
float interpolatedHeight;
|
||||
|
||||
// Early exit for guild zones
|
||||
|
||||
if (this.zone.guild_zone)
|
||||
return 5.0f;
|
||||
|
||||
Vector2f terrain_cell = getTerrainCell(terrain_loc);
|
||||
|
||||
int pixel_x = (int) Math.floor(terrain_cell.x);
|
||||
int pixel_y = (int) Math.floor(terrain_cell.y);
|
||||
|
||||
Vector2f pixel_offset = new Vector2f(terrain_cell.x % 1, terrain_cell.y % 1);
|
||||
|
||||
// 4 surrounding vertices from the pixel array.
|
||||
|
||||
float top_left_pixel = terrain_pixel_data[pixel_x][pixel_y];
|
||||
float top_right_pixel = terrain_pixel_data[pixel_x + 1][pixel_y];
|
||||
float bottom_left_pixel = terrain_pixel_data[pixel_x][pixel_y + 1];
|
||||
float bottom_right_pixel = terrain_pixel_data[pixel_x + 1][pixel_y + 1];
|
||||
|
||||
// Interpolate between the 4 vertices
|
||||
|
||||
interpolatedHeight = top_left_pixel * (1 - pixel_offset.x) * (1 - pixel_offset.y);
|
||||
interpolatedHeight += top_right_pixel * (1 - pixel_offset.y) * (pixel_offset.x);
|
||||
interpolatedHeight += (bottom_left_pixel * (1 - pixel_offset.x) * pixel_offset.y);
|
||||
interpolatedHeight += (bottom_right_pixel * pixel_offset.y * pixel_offset.x);
|
||||
|
||||
interpolatedHeight *= this.terrain_scale; // Scale height
|
||||
|
||||
return interpolatedHeight;
|
||||
|
||||
}
|
||||
|
||||
public float getTerrainBlendCoefficient(Vector2f zone_offset) {
|
||||
|
||||
// Normalize terrain offset
|
||||
|
||||
Vector2f normalizedOffset = new Vector2f(Math.abs(zone_offset.x) / this.zone.major_radius,
|
||||
Math.abs(zone_offset.y) / this.zone.minor_radius);
|
||||
|
||||
float blendCoefficient;
|
||||
|
||||
if (normalizedOffset.x <= 1 - blend_ratio.x || normalizedOffset.x <= normalizedOffset.y) {
|
||||
|
||||
if (normalizedOffset.y < 1 - blend_ratio.y)
|
||||
return 1;
|
||||
|
||||
blendCoefficient = (normalizedOffset.y - (1 - blend_ratio.y)) / blend_ratio.y;
|
||||
} else
|
||||
blendCoefficient = (normalizedOffset.x - (1 - blend_ratio.x)) / blend_ratio.x;
|
||||
|
||||
blendCoefficient = (float) Math.atan((0.5f - blendCoefficient) * PI);
|
||||
|
||||
return (blendCoefficient + 1) * 0.5f;
|
||||
}
|
||||
}
|
||||
@@ -67,7 +67,7 @@ public class CityRecord extends DataRecord {
|
||||
cityRecord.locX = cityRecord.city.getTOL().getLoc().x;
|
||||
cityRecord.locY = -cityRecord.city.getTOL().getLoc().z; // flip sign on 'y' coordinate
|
||||
|
||||
cityRecord.zoneHash = cityRecord.city.getParent().getHash();
|
||||
cityRecord.zoneHash = cityRecord.city.getParent().hash;
|
||||
|
||||
if (cityRecord.eventType.equals(Enum.RecordEventType.CREATE))
|
||||
cityRecord.establishedDatetime = cityRecord.city.established;
|
||||
|
||||
@@ -52,7 +52,7 @@ public class MineRecord extends DataRecord {
|
||||
mineRecord.eventType = eventType;
|
||||
}
|
||||
|
||||
mineRecord.zoneHash = mine.getParentZone().getHash();
|
||||
mineRecord.zoneHash = mine.getParentZone().hash;
|
||||
|
||||
if (character.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
||||
player = (PlayerCharacter) character;
|
||||
|
||||
@@ -281,7 +281,7 @@ public class PvpRecord extends DataRecord {
|
||||
outStatement.setInt(8, this.victim.getLevel());
|
||||
|
||||
outStatement.setString(9, DataWarehouse.hasher.encrypt(zone.getObjectUUID()));
|
||||
outStatement.setString(10, zone.getName());
|
||||
outStatement.setString(10, zone.zoneName);
|
||||
outStatement.setFloat(11, this.location.getX());
|
||||
outStatement.setFloat(12, -this.location.getZ()); // flip sign on 'y' coordinate
|
||||
outStatement.setBoolean(13, this.pvpExp);
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
package engine.db.handlers;
|
||||
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.gameManager.DbManager;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class dbHeightMapHandler extends dbHandlerBase {
|
||||
|
||||
public dbHeightMapHandler() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void LOAD_ALL_HEIGHTMAPS() {
|
||||
|
||||
HeightMap thisHeightmap;
|
||||
HeightMap.heightMapsCreated = 0;
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_zone_heightmap INNER JOIN static_zone_size ON static_zone_size.loadNum = static_zone_heightmap.zoneLoadID")) {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
thisHeightmap = new HeightMap(rs);
|
||||
|
||||
if (thisHeightmap.getHeightmapImage() == null) {
|
||||
Logger.info("Imagemap for " + thisHeightmap.getHeightMapID() + " was null");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,8 +11,6 @@ package engine.db.handlers;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector2f;
|
||||
import engine.objects.Zone;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -33,18 +31,18 @@ public class dbZoneHandler extends dbHandlerBase {
|
||||
ArrayList<Zone> wsmList = new ArrayList<>();
|
||||
wsmList.addAll(zone.getNodes());
|
||||
if (zone.absX == 0.0f) {
|
||||
zone.absX = zone.getXCoord();
|
||||
zone.absX = zone.xOffset;
|
||||
}
|
||||
if (zone.absY == 0.0f) {
|
||||
zone.absY = zone.getYCoord();
|
||||
zone.absY = zone.yOffset;
|
||||
}
|
||||
if (zone.absZ == 0.0f) {
|
||||
zone.absZ = zone.getZCoord();
|
||||
zone.absZ = zone.zOffset;
|
||||
}
|
||||
for (Zone child : zone.getNodes()) {
|
||||
child.absX = child.getXCoord() + zone.absX;
|
||||
child.absY = child.getYCoord() + zone.absY;
|
||||
child.absZ = child.getZCoord() + zone.absZ;
|
||||
child.absX = child.xOffset + zone.absX;
|
||||
child.absY = child.yOffset + zone.absY;
|
||||
child.absZ = child.zOffset + zone.absZ;
|
||||
wsmList.addAll(this.GET_ALL_NODES(child));
|
||||
}
|
||||
return wsmList;
|
||||
@@ -91,26 +89,6 @@ public class dbZoneHandler extends dbHandlerBase {
|
||||
return zoneList;
|
||||
}
|
||||
|
||||
public void LOAD_ZONE_EXTENTS() {
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_zone_size`;")) {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
while (rs.next()) {
|
||||
Vector2f zoneSize = new Vector2f();
|
||||
int loadNum = rs.getInt("loadNum");
|
||||
zoneSize.x = rs.getFloat("xRadius");
|
||||
zoneSize.y = rs.getFloat("zRadius");
|
||||
ZoneManager._zone_size_data.put(loadNum, zoneSize);
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean DELETE_ZONE(final Zone zone) {
|
||||
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
|
||||
@@ -78,7 +78,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
||||
return;
|
||||
}
|
||||
|
||||
if (zone.isPlayerCity()) {
|
||||
if (zone.guild_zone) {
|
||||
throwbackError(pc, "Cannot use ./mob on Player cities. Try ./servermob instead.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -40,8 +40,8 @@ public class AuditMobsCmd extends AbstractDevCmd {
|
||||
|
||||
if (size >= count) {
|
||||
plusplus++;
|
||||
throwbackInfo(pcSender, zoneMicro.getName() + " at location " + zoneMicro.getLoc().toString() + " has " + size + " mobs. ");
|
||||
System.out.println(zoneMicro.getName() + " at location " + zoneMicro.getLoc().toString() + " has " + size + " mobs. ");
|
||||
throwbackInfo(pcSender, zoneMicro.zoneName + " at location " + zoneMicro.getLoc().toString() + " has " + size + " mobs. ");
|
||||
System.out.println(zoneMicro.zoneName + " at location " + zoneMicro.getLoc().toString() + " has " + size + " mobs. ");
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ public class AuditMobsCmd extends AbstractDevCmd {
|
||||
//ConcurrentHashMap<Mob, Long> respawnMap = Mob.getRespawnMap();
|
||||
// ConcurrentHashMap<Mob, Long> despawnMap = Mob.getDespawnMap();
|
||||
|
||||
throwbackInfo(pcSender, zone.getName() + ", numMobs: " + zone.zoneMobSet.size());
|
||||
throwbackInfo(pcSender, zone.zoneName + ", numMobs: " + zone.zoneMobSet.size());
|
||||
throwbackInfo(pcSender, "UUID, dbID, inRespawnMap, isAlive, activeAI, Loc");
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.math.Vector2f;
|
||||
@@ -21,7 +21,6 @@ public class GetHeightCmd extends AbstractDevCmd {
|
||||
|
||||
public GetHeightCmd() {
|
||||
super("getHeight");
|
||||
this.addCmdString("height");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -33,23 +32,42 @@ public class GetHeightCmd extends AbstractDevCmd {
|
||||
Zone heightmapZone;
|
||||
|
||||
currentZone = ZoneManager.findSmallestZone(playerCharacter.getLoc());
|
||||
heightmapZone = HeightMap.getNextZoneWithTerrain(currentZone);
|
||||
parentZone = HeightMap.getNextZoneWithTerrain(currentZone.getParent());
|
||||
heightmapZone = Terrain.getNextZoneWithTerrain(currentZone);
|
||||
parentZone = Terrain.getNextZoneWithTerrain(currentZone.parent);
|
||||
|
||||
float currentHeight = HeightMap.getWorldHeight(currentZone, playerCharacter.getLoc());
|
||||
float parentHeight = HeightMap.getWorldHeight(parentZone, playerCharacter.getLoc());
|
||||
Vector2f childZoneLoc = ZoneManager.worldToTerrainSpace(playerCharacter.getLoc(), heightmapZone);
|
||||
Vector2f childZoneOffset = ZoneManager.worldToZoneOffset(playerCharacter.getLoc(), heightmapZone);
|
||||
Vector2f normalizedOffset = new Vector2f(Math.abs(childZoneOffset.x) / heightmapZone.major_radius,
|
||||
Math.abs(childZoneOffset.y) / heightmapZone.minor_radius);
|
||||
Vector2f parentZoneLoc = ZoneManager.worldToTerrainSpace(playerCharacter.getLoc(), parentZone);
|
||||
|
||||
this.throwbackInfo(playerCharacter, "Current Zone : " + currentZone.getName());
|
||||
this.throwbackInfo(playerCharacter, "Heightmap Zone : " + heightmapZone.getName());
|
||||
this.throwbackInfo(playerCharacter, "Height returned: " + currentHeight);
|
||||
float childHeight = heightmapZone.terrain.getInterpolatedTerrainHeight(childZoneLoc);
|
||||
childHeight = childHeight + heightmapZone.global_height;
|
||||
|
||||
Vector2f zoneLoc = ZoneManager.worldToZoneSpace(playerCharacter.getLoc(), heightmapZone);
|
||||
Vector2f gridSquare = heightmapZone.getHeightMap().getGridSquare(zoneLoc);
|
||||
float parentHeight = parentZone.terrain.getInterpolatedTerrainHeight(parentZoneLoc);
|
||||
parentHeight += parentZone.global_height;
|
||||
|
||||
float blendedHeight = Terrain.getWorldHeight(currentZone, playerCharacter.getLoc());
|
||||
|
||||
Vector2f gridSquare = heightmapZone.terrain.getTerrainCell(childZoneLoc);
|
||||
gridSquare.x = (float) Math.floor(gridSquare.x);
|
||||
gridSquare.y = (float) Math.floor(gridSquare.y);
|
||||
|
||||
this.throwbackInfo(playerCharacter, "Current Zone : " + currentZone.zoneName);
|
||||
this.throwbackInfo(playerCharacter, "Heightmap Zone : " + heightmapZone.zoneName);
|
||||
this.throwbackInfo(playerCharacter, "Parent Zone: " + parentZone.zoneName);
|
||||
|
||||
this.throwbackInfo(playerCharacter, "Grid : " + "[" + gridSquare.x + "]" + "[" + gridSquare.y + "]");
|
||||
this.throwbackInfo(playerCharacter, "offset: " + "[" + childZoneOffset.x + "]" + "[" + childZoneOffset.y + "]");
|
||||
this.throwbackInfo(playerCharacter, "Normalized offset: " + "[" + normalizedOffset.x + "]" + "[" + normalizedOffset.y + "]");
|
||||
this.throwbackInfo(playerCharacter, "Blend: " + heightmapZone.terrain.getTerrainBlendCoefficient(childZoneOffset));
|
||||
|
||||
this.throwbackInfo(playerCharacter, "------------");
|
||||
|
||||
this.throwbackInfo(playerCharacter, "Child Height: " + Math.ceil(childHeight));
|
||||
this.throwbackInfo(playerCharacter, "Parent Height : " + Math.ceil(parentHeight));
|
||||
this.throwbackInfo(playerCharacter, "Blended Height : " + Math.ceil(blendedHeight));
|
||||
|
||||
this.throwbackInfo(playerCharacter, "Grid : " + (int) gridSquare.x + "x" + (int) gridSquare.y);
|
||||
this.throwbackInfo(playerCharacter, "Parent : " + parentZone.getName());
|
||||
this.throwbackInfo(playerCharacter, "Height returned : " + parentHeight);
|
||||
this.throwbackInfo(playerCharacter, "Character Height: " + playerCharacter.getCharacterHeight());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -48,7 +48,7 @@ public class GetOffsetCmd extends AbstractDevCmd {
|
||||
float difY = pcSender.getLoc().y - zone.absY;
|
||||
float difZ = pcSender.getLoc().z - zone.absZ;
|
||||
|
||||
throwbackInfo(pcSender, zone.getName() + ": (x: " + difX + ", y: " + difY + ", z: " + difZ + ')');
|
||||
throwbackInfo(pcSender, zone.zoneName + ": (x: " + difX + ", y: " + difY + ", z: " + difZ + ')');
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -51,7 +51,7 @@ public class GetZoneCmd extends AbstractDevCmd {
|
||||
}
|
||||
|
||||
for (Zone zone : allIn)
|
||||
throwbackInfo(pcSender, zone.getName() + "; UUID: " + zone.getObjectUUID() + ", loadNum: " + zone.getLoadNum());
|
||||
throwbackInfo(pcSender, zone.zoneName + "; UUID: " + zone.getObjectUUID() + ", loadNum: " + zone.template);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -81,7 +81,7 @@ public class GotoCmd extends AbstractDevCmd {
|
||||
continue;
|
||||
Zone zone = city.getParent();
|
||||
if (zone != null) {
|
||||
if (zone.isNPCCity() || zone.isPlayerCity())
|
||||
if (zone.isNPCCity || zone.guild_zone)
|
||||
loc = Vector3fImmutable.getRandomPointOnCircle(zone.getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
|
||||
else
|
||||
loc = zone.getLoc();
|
||||
@@ -97,10 +97,10 @@ public class GotoCmd extends AbstractDevCmd {
|
||||
Zone zone = (Zone) zoneAgo;
|
||||
if (zone == null)
|
||||
continue;
|
||||
if (!zone.getName().equalsIgnoreCase(cityName))
|
||||
if (!zone.zoneName.equalsIgnoreCase(cityName))
|
||||
continue;
|
||||
if (zone != null) {
|
||||
if (zone.isNPCCity() || zone.isPlayerCity())
|
||||
if (zone.isNPCCity || zone.guild_zone)
|
||||
loc = Vector3fImmutable.getRandomPointOnCircle(zone.getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
|
||||
else
|
||||
loc = zone.getLoc();
|
||||
|
||||
@@ -40,7 +40,7 @@ public class HotzoneCmd extends AbstractDevCmd {
|
||||
String input = data.toString().trim();
|
||||
|
||||
if (input.length() == 0) {
|
||||
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
|
||||
outString = "Current hotZone: " + ZoneManager.hotZone.zoneName + "\r\n";
|
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones();
|
||||
throwbackInfo(playerCharacter, outString);
|
||||
return;
|
||||
@@ -48,7 +48,7 @@ public class HotzoneCmd extends AbstractDevCmd {
|
||||
|
||||
if (input.equalsIgnoreCase("random")) {
|
||||
ZoneManager.generateAndSetRandomHotzone();
|
||||
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
|
||||
outString = "New hotZone: " + ZoneManager.hotZone.zoneName + "\r\n";
|
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones();
|
||||
throwbackInfo(playerCharacter, outString);
|
||||
return;
|
||||
|
||||
@@ -387,7 +387,7 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
output += newline;
|
||||
output += "EquipSet: " + targetNPC.getEquipmentSetID();
|
||||
output += newline;
|
||||
output += "Parent Zone LoadNum : " + targetNPC.getParentZone().getLoadNum();
|
||||
output += "Parent Zone LoadNum : " + targetNPC.getParentZone().template;
|
||||
|
||||
}
|
||||
|
||||
@@ -473,7 +473,7 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
output += "EquipSet: " + targetMob.equipmentSetID;
|
||||
output += newline;
|
||||
try {
|
||||
output += "Parent Zone LoadNum : " + targetMob.getParentZone().getLoadNum();
|
||||
output += "Parent Zone LoadNum : " + targetMob.getParentZone().template;
|
||||
} catch (Exception ex) {
|
||||
//who cares
|
||||
}
|
||||
|
||||
@@ -111,12 +111,12 @@ public class MakeBaneCmd extends AbstractDevCmd {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!zone.isPlayerCity()) {
|
||||
if (!zone.guild_zone) {
|
||||
throwbackError(pc, "This is not a player city.");
|
||||
return;
|
||||
}
|
||||
|
||||
City city = City.getCity(zone.getPlayerCityUUID());
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
if (city == null) {
|
||||
throwbackError(pc, "Unable to find the city associated with this zone.");
|
||||
return;
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.objects.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
public class PrintEffectsCmd extends AbstractDevCmd {
|
||||
|
||||
public PrintEffectsCmd() {
|
||||
super("printeffects");
|
||||
// super("printstats", MBServerStatics.ACCESS_LEVEL_ADMIN);
|
||||
}
|
||||
|
||||
public static ItemBase getWeaponBase(int slot, HashMap<Integer, MobEquipment> equip) {
|
||||
if (equip.containsKey(slot)) {
|
||||
MobEquipment item = equip.get(slot);
|
||||
if (item != null && item.getItemBase() != null) {
|
||||
return item.getItemBase();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
AbstractCharacter tar;
|
||||
|
||||
if (target != null && target instanceof AbstractCharacter) {
|
||||
tar = (AbstractCharacter) target;
|
||||
|
||||
String newline = "\r\n ";
|
||||
String output = "Effects For Character: " + tar.getName() + newline;
|
||||
|
||||
for(String effect : tar.effects.keySet()){
|
||||
output += effect + newline;
|
||||
}
|
||||
throwbackInfo(pc, output);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Returns the player's current stats";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "' /printstats'";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.objects.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
public class PrintRunesCmd extends AbstractDevCmd {
|
||||
|
||||
public PrintRunesCmd() {
|
||||
super("printrunes");
|
||||
// super("printstats", MBServerStatics.ACCESS_LEVEL_ADMIN);
|
||||
}
|
||||
|
||||
public static ItemBase getWeaponBase(int slot, HashMap<Integer, MobEquipment> equip) {
|
||||
if (equip.containsKey(slot)) {
|
||||
MobEquipment item = equip.get(slot);
|
||||
if (item != null && item.getItemBase() != null) {
|
||||
return item.getItemBase();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
AbstractCharacter tar;
|
||||
|
||||
if (target != null && target instanceof AbstractCharacter) {
|
||||
tar = (AbstractCharacter) target;
|
||||
|
||||
String newline = "\r\n ";
|
||||
String output = "Applied Runes For Character: " + ((AbstractCharacter) target).getName() + newline;
|
||||
|
||||
for(CharacterRune rune : ((AbstractCharacter)target).runes){
|
||||
output += rune.getRuneBaseID() + " " + rune.getRuneBase().getName() + newline;
|
||||
}
|
||||
throwbackInfo(pc, output);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Returns the player's current stats";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "' /printstats'";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -42,7 +42,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
||||
|
||||
private static void PurgeWalls(Zone zone, PlayerCharacter pc) {
|
||||
|
||||
if (!zone.isPlayerCity())
|
||||
if (!zone.guild_zone)
|
||||
return;
|
||||
|
||||
for (Building building : zone.zoneBuildingSet) {
|
||||
|
||||
@@ -60,12 +60,12 @@ public class RealmInfoCmd extends AbstractDevCmd {
|
||||
outString += ")";
|
||||
outString += newline;
|
||||
|
||||
outString += " Zone: " + serverZone.getName();
|
||||
outString += " Zone: " + serverZone.zoneName;
|
||||
|
||||
outString += newline;
|
||||
|
||||
if (serverZone.getParent() != null)
|
||||
outString += " Parent: " + serverZone.getParent().getName();
|
||||
if (serverZone.parent != null)
|
||||
outString += " Parent: " + serverZone.parent.zoneName;
|
||||
else
|
||||
outString += "Parent: NONE";
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.objects.*;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
@@ -25,42 +25,17 @@ public class RegionCmd extends AbstractDevCmd {
|
||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
|
||||
if (pc.region == null) {
|
||||
Regions region = ((AbstractCharacter)target).region;
|
||||
if (region == null) {
|
||||
this.throwbackInfo(pc, "No Region Found.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
String newLine = System.getProperty("line.separator");
|
||||
String result = "";
|
||||
result += (pc.region.getClass().getSimpleName());
|
||||
result += (" {");
|
||||
result += (newLine);
|
||||
Field[] fields = pc.region.getClass().getDeclaredFields();
|
||||
|
||||
//print field names paired with their values
|
||||
for (Field field : fields) {
|
||||
field.setAccessible(true);
|
||||
result += (" ");
|
||||
try {
|
||||
|
||||
if (field.getName().contains("Furniture"))
|
||||
continue;
|
||||
result += (field.getName());
|
||||
result += (": ");
|
||||
//requires access to private field:
|
||||
result += (field.get(pc.region).toString());
|
||||
} catch (IllegalAccessException ex) {
|
||||
System.out.println(ex);
|
||||
}
|
||||
result.trim();
|
||||
result += (newLine);
|
||||
if(region != null) {
|
||||
this.throwbackInfo(pc, "Region Info: " + ((AbstractCharacter) target).getName());
|
||||
this.throwbackInfo(pc, "Region Name: " + region);
|
||||
this.throwbackInfo(pc, "Region Height: " + region.lerpY((AbstractCharacter)target));
|
||||
}
|
||||
result += ("}");
|
||||
|
||||
this.throwbackInfo(pc, result.toString());
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -34,12 +34,12 @@ public class RemoveBaneCmd extends AbstractDevCmd {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!zone.isPlayerCity()) {
|
||||
if (!zone.guild_zone) {
|
||||
throwbackError(pc, "This is not a player city.");
|
||||
return;
|
||||
}
|
||||
|
||||
City city = City.getCity(zone.getPlayerCityUUID());
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
if (city == null) {
|
||||
throwbackError(pc, "Unable to find the city associated with this zone.");
|
||||
return;
|
||||
|
||||
@@ -130,7 +130,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
||||
building.disableSpire(false);
|
||||
|
||||
if ((building.getBlueprint() != null) && (building.getBlueprint().getBuildingGroup() == BuildingGroup.WAREHOUSE)) {
|
||||
City city = City.getCity(building.getParentZone().getPlayerCityUUID());
|
||||
City city = City.getCity(building.getParentZone().playerCityUUID);
|
||||
if (city != null) {
|
||||
city.setWarehouseBuildingID(0);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.objects.AbstractGameObject;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import engine.objects.Zone;
|
||||
|
||||
public class SeaAuditCmd extends AbstractDevCmd {
|
||||
|
||||
public SeaAuditCmd() {
|
||||
super("seaaudit");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void _doCmd(PlayerCharacter playerCharacter, String[] words,
|
||||
AbstractGameObject target) {
|
||||
|
||||
for (Zone zone : ZoneManager.getAllZones())
|
||||
if (zone.seaLevel > zone.global_height)
|
||||
this.throwbackInfo(playerCharacter, zone.getObjectUUID() + zone.zoneName);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getHelpString() {
|
||||
return "Queries heightmap engine";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String _getUsageString() {
|
||||
return "' /getheight";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -41,12 +41,12 @@ public class SetBaneActiveCmd extends AbstractDevCmd {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!zone.isPlayerCity()) {
|
||||
if (!zone.guild_zone) {
|
||||
throwbackError(pc, "This is not a player city.");
|
||||
return;
|
||||
}
|
||||
|
||||
City city = City.getCity(zone.getPlayerCityUUID());
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
if (city == null) {
|
||||
throwbackError(pc, "Unable to find the city associated with this zone.");
|
||||
return;
|
||||
|
||||
@@ -31,9 +31,9 @@ public class SetForceRenameCityCmd extends AbstractDevCmd {
|
||||
if (zone == null)
|
||||
return;
|
||||
boolean rename = words[0].equalsIgnoreCase("true") ? true : false;
|
||||
if (zone.getPlayerCityUUID() == 0)
|
||||
if (zone.playerCityUUID == 0)
|
||||
return;
|
||||
City city = City.getCity(zone.getPlayerCityUUID());
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
if (city == null)
|
||||
return;
|
||||
city.setForceRename(rename);
|
||||
|
||||
@@ -40,7 +40,7 @@ public class SummonCmd extends AbstractDevCmd {
|
||||
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
||||
String location = "Somewhere";
|
||||
if (zone != null)
|
||||
location = zone.getName();
|
||||
location = zone.zoneName;
|
||||
RecvSummonsRequestMsg rsrm = new RecvSummonsRequestMsg(pc.getObjectType().ordinal(), pc.getObjectUUID(), pc.getFirstName(),
|
||||
location, false);
|
||||
toSummon.getClientConnection().sendMsg(rsrm);
|
||||
|
||||
@@ -73,44 +73,41 @@ public class ZoneInfoCmd extends AbstractDevCmd {
|
||||
output = "Target Information:" + newline;
|
||||
output += StringUtils.addWS("UUID: " + objectUUID, 20);
|
||||
output += newline;
|
||||
output += "name: " + zone.getName();
|
||||
output += "name: " + zone.zoneName;
|
||||
output += newline;
|
||||
output += "loadNum: " + zone.getLoadNum();
|
||||
if (zone.getParent() != null) {
|
||||
output += StringUtils.addWS(", parent: " + zone.getParent().getObjectUUID(), 30);
|
||||
output += "Parentabs: x: " + zone.getParent().getAbsX() + ", y: " + zone.getParent().getAbsY() + ", z: " + zone.getParent().getAbsZ();
|
||||
output += "loadNum: " + zone.template;
|
||||
if (zone.parent != null) {
|
||||
output += StringUtils.addWS(", parent: " + zone.parent.getObjectUUID(), 30);
|
||||
output += "Parentabs: x: " + zone.parent.absX + ", y: " + zone.parent.absY + ", z: " + zone.parent.absZ;
|
||||
|
||||
} else
|
||||
output += StringUtils.addWS(", parent: none", 30);
|
||||
output += newline;
|
||||
output += "absLoc: x: " + zone.getAbsX() + ", y: " + zone.getAbsY() + ", z: " + zone.getAbsZ();
|
||||
output += "absLoc: x: " + zone.absX + ", y: " + zone.absY + ", z: " + zone.absZ;
|
||||
output += newline;
|
||||
output += "offset: x: " + zone.getXCoord() + ", y: " + zone.getYCoord() + ", z: " + zone.getZCoord();
|
||||
output += "offset: x: " + zone.xOffset + ", y: " + zone.yOffset + ", z: " + zone.zOffset;
|
||||
output += newline;
|
||||
output += "radius: x: " + zone.getBounds().getHalfExtents().x + ", z: " + zone.getBounds().getHalfExtents().y;
|
||||
output += "radius: x: " + zone.bounds.getHalfExtents().x + ", z: " + zone.bounds.getHalfExtents().y;
|
||||
output += newline;
|
||||
|
||||
if (zone.getHeightMap() != null) {
|
||||
output += "HeightMap ID: " + zone.getHeightMap().getHeightMapID();
|
||||
if (zone.terrain != null) {
|
||||
output += "Terrain image: " + zone.terrain_image;
|
||||
output += newline;
|
||||
output += "Bucket Width X : " + zone.getHeightMap().getBucketWidthX();
|
||||
output += newline;
|
||||
output += "Bucket Width Y : " + zone.getHeightMap().getBucketWidthY();
|
||||
|
||||
}
|
||||
output += "radius: x: " + zone.getBounds().getHalfExtents().x + ", z: " + zone.getBounds().getHalfExtents().y;
|
||||
|
||||
output += "radius: x: " + zone.bounds.getHalfExtents().x + ", z: " + zone.bounds.getHalfExtents().y;
|
||||
output += newline;
|
||||
// output += "minLvl = " + zone.getMinLvl() + " | maxLvl = " + zone.getMaxLvl();
|
||||
output += newline;
|
||||
output += "Sea Level = " + zone.getSeaLevel();
|
||||
output += "Sea Level = " + zone.seaLevel;
|
||||
output += newline;
|
||||
output += "World Altitude = " + zone.worldAltitude;
|
||||
output += "World Altitude = " + zone.global_height;
|
||||
throwbackInfo(player, output);
|
||||
|
||||
City city = ZoneManager.getCityAtLocation(player.getLoc());
|
||||
|
||||
output += newline;
|
||||
output += (city == null) ? "None" : city.getParent().getName();
|
||||
output += (city == null) ? "None" : city.getParent().zoneName;
|
||||
|
||||
if (city != null) {
|
||||
|
||||
@@ -130,7 +127,7 @@ public class ZoneInfoCmd extends AbstractDevCmd {
|
||||
|
||||
for (Zone child : nodes) {
|
||||
output += newline;
|
||||
output += child.getName() + " (" + child.getLoadNum() + ')';
|
||||
output += child.zoneName + " (" + child.template + ')';
|
||||
}
|
||||
}
|
||||
throwbackInfo(player, output);
|
||||
|
||||
@@ -40,7 +40,7 @@ public class ZoneSetCmd extends AbstractDevCmd {
|
||||
|
||||
zone = ZoneManager.findSmallestZone(playerCharacter.getLoc());
|
||||
|
||||
throwbackInfo(playerCharacter, zone.getName() + " (" + zone.getLoadNum() + ") " + zone.getObjectUUID());
|
||||
throwbackInfo(playerCharacter, zone.zoneName + " (" + zone.template + ") " + zone.getObjectUUID());
|
||||
|
||||
// NPC
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@ public enum DbManager {
|
||||
public static final dbBlueprintHandler BlueprintQueries = new dbBlueprintHandler();
|
||||
public static final dbBoonHandler BoonQueries = new dbBoonHandler();
|
||||
public static final dbShrineHandler ShrineQueries = new dbShrineHandler();
|
||||
public static final dbHeightMapHandler HeightMapQueries = new dbHeightMapHandler();
|
||||
public static final dbRunegateHandler RunegateQueries = new dbRunegateHandler();
|
||||
|
||||
public static final dbPowerHandler PowerQueries = new dbPowerHandler();
|
||||
|
||||
@@ -46,9 +46,11 @@ public enum DevCmdManager {
|
||||
DevCmdManager.registerDevCmd(new GetZoneCmd());
|
||||
DevCmdManager.registerDevCmd(new ZoneSetCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintBankCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintEffectsCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintEquipCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintInventoryCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintVaultCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintRunesCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintStatsCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintSkillsCmd());
|
||||
DevCmdManager.registerDevCmd(new PrintPowersCmd());
|
||||
@@ -142,7 +144,7 @@ public enum DevCmdManager {
|
||||
DevCmdManager.registerDevCmd(new ApplyBonusCmd());
|
||||
DevCmdManager.registerDevCmd(new AuditFailedItemsCmd());
|
||||
DevCmdManager.registerDevCmd(new SlotTestCmd());
|
||||
|
||||
DevCmdManager.registerDevCmd(new SeaAuditCmd());
|
||||
}
|
||||
|
||||
private static void registerDevCmd(AbstractDevCmd cmd) {
|
||||
|
||||
@@ -86,7 +86,7 @@ public enum LootManager {
|
||||
if(ib == null)
|
||||
break;
|
||||
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().zoneName + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
@@ -330,6 +330,8 @@ public enum LootManager {
|
||||
|
||||
public static void GenerateEquipmentDrop(Mob mob) {
|
||||
|
||||
if(mob.behaviourType.equals(Enum.MobBehaviourType.HamletGuard))
|
||||
return; // safehold guards don't drop their equipment
|
||||
//do equipment here
|
||||
int dropCount = 0;
|
||||
if (mob.getEquip() != null)
|
||||
|
||||
@@ -267,7 +267,7 @@ public enum MovementManager {
|
||||
Zone serverZone = null;
|
||||
|
||||
serverZone = ZoneManager.findSmallestZone(player.getLoc());
|
||||
cityObject = (City) DbManager.getFromCache(GameObjectType.City, serverZone.getPlayerCityUUID());
|
||||
cityObject = (City) DbManager.getFromCache(GameObjectType.City, serverZone.playerCityUUID);
|
||||
|
||||
// Do not send group messages if player is on grid
|
||||
|
||||
@@ -464,34 +464,20 @@ public enum MovementManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static void translocate(AbstractCharacter teleporter, Vector3fImmutable targetLoc, Regions region) {
|
||||
public static void translocate(AbstractCharacter teleporter, Vector3fImmutable targetLoc) {
|
||||
|
||||
|
||||
if (targetLoc == null)
|
||||
return;
|
||||
|
||||
Vector3fImmutable oldLoc = new Vector3fImmutable(teleporter.getLoc());
|
||||
|
||||
teleporter.stopMovement(targetLoc);
|
||||
teleporter.setRegion(region);
|
||||
|
||||
//mobs ignore region sets for now.
|
||||
if (teleporter.getObjectType().equals(GameObjectType.Mob)) {
|
||||
teleporter.setInBuildingID(0);
|
||||
teleporter.setInBuilding(-1);
|
||||
teleporter.setInFloorID(-1);
|
||||
TeleportToPointMsg msg = new TeleportToPointMsg(teleporter, targetLoc.getX(), targetLoc.getY(), targetLoc.getZ(), 0, -1, -1);
|
||||
DispatchMessage.dispatchMsgToInterestArea(oldLoc, teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
||||
return;
|
||||
}
|
||||
TeleportToPointMsg msg = new TeleportToPointMsg(teleporter, targetLoc.getX(), targetLoc.getY(), targetLoc.getZ(), 0, -1, -1);
|
||||
//we shouldnt need to send teleport message to new area, as loadjob should pick it up.
|
||||
// DispatchMessage.dispatchMsgToInterestArea(teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
DispatchMessage.dispatchMsgToInterestArea(oldLoc, teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
|
||||
Vector3fImmutable oldLoc = new Vector3fImmutable(teleporter.getLoc());
|
||||
teleporter.setLoc(targetLoc);
|
||||
if (teleporter.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
InterestManager.INTERESTMANAGER.HandleLoadForTeleport((PlayerCharacter) teleporter);
|
||||
|
||||
TeleportToPointMsg msg = new TeleportToPointMsg(teleporter, teleporter.loc.getX(), teleporter.loc.getY(), teleporter.loc.getZ(), 0, -1, -1);
|
||||
DispatchMessage.dispatchMsgToInterestArea(oldLoc, teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
|
||||
}
|
||||
|
||||
private static void syncLoc(AbstractCharacter ac, Vector3fImmutable clientLoc, boolean useClientLoc) {
|
||||
|
||||
@@ -458,4 +458,20 @@ public enum NPCManager {
|
||||
mob.skills.put(entry.skill_type, new CharacterSkill(skillBase, mob, entry.rank + mob.skills.get(entry.skill_type).getNumTrains()));
|
||||
}
|
||||
}
|
||||
|
||||
public static void applyRunesForNPC(NPC npc){
|
||||
npc.runes = new ArrayList<>();
|
||||
RuneBase shopkeeperBase = RuneBase.getRuneBase(252620);
|
||||
CharacterRune shopkeeper = new CharacterRune(shopkeeperBase,npc.getObjectUUID());
|
||||
npc.runes.add(shopkeeper);
|
||||
if(NPCManager._runeSetMap.containsKey(npc.runeSetID)) {
|
||||
for (int runeID : _runeSetMap.get(npc.runeSetID)) {
|
||||
RuneBase rb = RuneBase.getRuneBase(runeID);
|
||||
if(rb != null) {
|
||||
CharacterRune toApply = new CharacterRune(rb, npc.getObjectUUID());
|
||||
npc.runes.add(toApply);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.handlers.dbEffectsBaseHandler;
|
||||
import engine.db.handlers.dbPowerHandler;
|
||||
@@ -1772,7 +1772,7 @@ public enum PowersManager {
|
||||
} else {
|
||||
targetLoc = tl;
|
||||
try {
|
||||
targetLoc = targetLoc.setY(HeightMap.getWorldHeight(targetLoc)); //on ground
|
||||
targetLoc = targetLoc.setY(Terrain.getWorldHeight(targetLoc)); //on ground
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
targetLoc = tl;
|
||||
@@ -1974,7 +1974,7 @@ public enum PowersManager {
|
||||
} else {
|
||||
targetLoc = tl;
|
||||
try {
|
||||
targetLoc = targetLoc.setY(HeightMap.getWorldHeight(targetLoc)); //on ground
|
||||
targetLoc = targetLoc.setY(Terrain.getWorldHeight(targetLoc)); //on ground
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
package engine.gameManager;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.db.archive.CityRecord;
|
||||
import engine.db.archive.DataWarehouse;
|
||||
import engine.math.Bounds;
|
||||
@@ -25,7 +25,10 @@ import org.pmw.tinylog.Logger;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
@@ -46,9 +49,9 @@ public enum ZoneManager {
|
||||
public static Instant hotZoneLastUpdate;
|
||||
public static Zone hotZone = null;
|
||||
public static int hotZoneCycle = 0; // Used with HOTZONE_DURATION from config.
|
||||
public static HashMap<Integer, Vector2f> _zone_size_data = new HashMap<>();
|
||||
|
||||
/* Instance variables */
|
||||
private static Zone seaFloor = null;
|
||||
public static Zone seaFloor = null;
|
||||
|
||||
// Find all zones coordinates fit into, starting with Sea Floor
|
||||
|
||||
@@ -61,8 +64,8 @@ public enum ZoneManager {
|
||||
|
||||
if (zone != null) {
|
||||
allIn.add(zone);
|
||||
while (zone.getParent() != null) {
|
||||
zone = zone.getParent();
|
||||
while (zone.parent != null) {
|
||||
zone = zone.parent;
|
||||
allIn.add(zone);
|
||||
}
|
||||
}
|
||||
@@ -71,7 +74,7 @@ public enum ZoneManager {
|
||||
|
||||
// Find smallest zone coordinates fit into.
|
||||
|
||||
public static final Zone findSmallestZone(final Vector3fImmutable loc) {
|
||||
public static Zone findSmallestZone(final Vector3fImmutable loc) {
|
||||
|
||||
Zone zone = ZoneManager.seaFloor;
|
||||
|
||||
@@ -90,7 +93,7 @@ public enum ZoneManager {
|
||||
if (nodes != null)
|
||||
for (Zone child : nodes) {
|
||||
|
||||
if (Bounds.collide(loc, child.getBounds()) == true) {
|
||||
if (Bounds.collide(loc, child.bounds)) {
|
||||
zone = child;
|
||||
childFound = true;
|
||||
break;
|
||||
@@ -106,7 +109,7 @@ public enum ZoneManager {
|
||||
|
||||
ZoneManager.zonesByUUID.put(zone.getObjectUUID(), zone);
|
||||
|
||||
ZoneManager.zonesByName.put(zone.getName().toLowerCase(), zone);
|
||||
ZoneManager.zonesByName.put(zone.zoneName.toLowerCase(), zone);
|
||||
|
||||
}
|
||||
|
||||
@@ -148,11 +151,11 @@ public enum ZoneManager {
|
||||
return ZoneManager.zonesByName.get(zoneName);
|
||||
}
|
||||
|
||||
public static final Collection<Zone> getAllZones() {
|
||||
public static Collection<Zone> getAllZones() {
|
||||
return ZoneManager.zonesByUUID.values();
|
||||
}
|
||||
|
||||
public static final void setHotZone(final Zone zone) {
|
||||
public static void setHotZone(final Zone zone) {
|
||||
|
||||
if (!zone.isMacroZone())
|
||||
return;
|
||||
@@ -169,20 +172,16 @@ public enum ZoneManager {
|
||||
if (ZoneManager.hotZone == null)
|
||||
return false;
|
||||
|
||||
return (Bounds.collide(loc, ZoneManager.hotZone.getBounds()) == true);
|
||||
}
|
||||
|
||||
public static Zone getSeaFloor() {
|
||||
return ZoneManager.seaFloor;
|
||||
return (Bounds.collide(loc, ZoneManager.hotZone.bounds));
|
||||
}
|
||||
|
||||
public static void setSeaFloor(final Zone value) {
|
||||
ZoneManager.seaFloor = value;
|
||||
}
|
||||
|
||||
public static final void populateWorldZones(final Zone zone) {
|
||||
public static void populateWorldZones(final Zone zone) {
|
||||
|
||||
int loadNum = zone.getLoadNum();
|
||||
int loadNum = zone.template;
|
||||
|
||||
// Zones are added to separate
|
||||
// collections for quick access
|
||||
@@ -194,12 +193,12 @@ public enum ZoneManager {
|
||||
}
|
||||
|
||||
|
||||
if (zone.isPlayerCity()) {
|
||||
if (zone.guild_zone) {
|
||||
addPlayerCityZone(zone);
|
||||
return;
|
||||
}
|
||||
|
||||
if (zone.isNPCCity())
|
||||
if (zone.isNPCCity)
|
||||
addNPCCityZone(zone);
|
||||
|
||||
}
|
||||
@@ -209,12 +208,12 @@ public enum ZoneManager {
|
||||
}
|
||||
|
||||
private static void addNPCCityZone(final Zone zone) {
|
||||
zone.setNPCCity(true);
|
||||
zone.isNPCCity = true;
|
||||
ZoneManager.npcCityZones.add(zone);
|
||||
}
|
||||
|
||||
public static final void addPlayerCityZone(final Zone zone) {
|
||||
zone.setPlayerCity(true);
|
||||
zone.guild_zone = true;
|
||||
ZoneManager.playerCityZones.add(zone);
|
||||
}
|
||||
|
||||
@@ -250,7 +249,7 @@ public enum ZoneManager {
|
||||
|
||||
public static final boolean validHotZone(Zone zone) {
|
||||
|
||||
if (zone.getSafeZone() == (byte) 1)
|
||||
if (zone.peace_zone == (byte) 1)
|
||||
return false; // no safe zone hotzones// if (this.hotzone == null)
|
||||
|
||||
if (zone.getNodes().isEmpty())
|
||||
@@ -266,7 +265,7 @@ public enum ZoneManager {
|
||||
|
||||
// Enforce min level
|
||||
|
||||
if (zone.minLvl < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
|
||||
if (zone.min_level < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
|
||||
return false;
|
||||
|
||||
if (ZoneManager.hotZone != null)
|
||||
@@ -278,36 +277,45 @@ public enum ZoneManager {
|
||||
// Converts world coordinates to coordinates local to a given zone.
|
||||
|
||||
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
|
||||
Zone serverZone) {
|
||||
Zone zone) {
|
||||
|
||||
Vector3fImmutable localCoords;
|
||||
|
||||
localCoords = new Vector3fImmutable(worldVector.x - serverZone.absX,
|
||||
worldVector.y - serverZone.absY, worldVector.z
|
||||
- serverZone.absZ);
|
||||
localCoords = new Vector3fImmutable(worldVector.x - zone.absX,
|
||||
worldVector.y - zone.absY, worldVector.z
|
||||
- zone.absZ);
|
||||
|
||||
return localCoords;
|
||||
}
|
||||
|
||||
public static Vector2f worldToZoneSpace(Vector3fImmutable worldVector,
|
||||
Zone serverZone) {
|
||||
public static Vector2f worldToZoneOffset(Vector3fImmutable worldLoc,
|
||||
Zone zone) {
|
||||
|
||||
Vector2f zoneLoc;
|
||||
|
||||
zoneLoc = new Vector2f(worldLoc.x, worldLoc.z).subtract(zone.getLoc().x, zone.getLoc().z);
|
||||
zoneLoc.y *= -1;
|
||||
|
||||
return zoneLoc;
|
||||
|
||||
}
|
||||
|
||||
public static Vector2f worldToTerrainSpace(Vector3fImmutable worldLoc,
|
||||
Zone zone) {
|
||||
|
||||
Vector2f localCoords;
|
||||
Vector2f zoneOrigin;
|
||||
|
||||
// Top left corner of zone is calculated in world space by the center and it's extents.
|
||||
|
||||
zoneOrigin = new Vector2f(serverZone.getLoc().x, serverZone.getLoc().z);
|
||||
zoneOrigin = zoneOrigin.subtract(new Vector2f(serverZone.getBounds().getHalfExtents().x, serverZone.getBounds().getHalfExtents().y));
|
||||
zoneOrigin = new Vector2f(zone.getLoc().x, zone.getLoc().z);
|
||||
zoneOrigin = zoneOrigin.subtract(new Vector2f(zone.bounds.getHalfExtents().x, zone.bounds.getHalfExtents().y));
|
||||
|
||||
// Local coordinate in world space translated to an offset from the calculated zone origin.
|
||||
|
||||
localCoords = new Vector2f(worldVector.x, worldVector.z);
|
||||
localCoords = new Vector2f(worldLoc.x, worldLoc.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;
|
||||
@@ -315,18 +323,6 @@ public enum ZoneManager {
|
||||
|
||||
// Converts local zone coordinates to world coordinates
|
||||
|
||||
public static Vector3fImmutable localToWorld(Vector3fImmutable worldVector,
|
||||
Zone serverZone) {
|
||||
|
||||
Vector3fImmutable 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.
|
||||
@@ -387,8 +383,8 @@ public enum ZoneManager {
|
||||
|
||||
currentZone = ZoneManager.findSmallestZone(worldLoc);
|
||||
|
||||
if (currentZone.isPlayerCity())
|
||||
return City.getCity(currentZone.getPlayerCityUUID());
|
||||
if (currentZone.guild_zone)
|
||||
return City.getCity(currentZone.playerCityUUID);
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -411,7 +407,7 @@ public enum ZoneManager {
|
||||
|
||||
|
||||
treeBounds = Bounds.borrow();
|
||||
treeBounds.setBounds(new Vector2f(positionX, positionZ), new Vector2f(Enum.CityBoundsType.PLACEMENT.extents, Enum.CityBoundsType.PLACEMENT.extents), 0.0f);
|
||||
treeBounds.setBounds(new Vector2f(positionX, positionZ), new Vector2f(Enum.CityBoundsType.PLACEMENT.halfExtents, Enum.CityBoundsType.PLACEMENT.halfExtents), 0.0f);
|
||||
|
||||
zoneList = currentZone.getNodes();
|
||||
|
||||
@@ -420,7 +416,7 @@ public enum ZoneManager {
|
||||
if (zone.isContinent())
|
||||
continue;
|
||||
|
||||
if (Bounds.collide(treeBounds, zone.getBounds(), 0.0f))
|
||||
if (Bounds.collide(treeBounds, zone.bounds, 0.0f))
|
||||
validLocation = false;
|
||||
}
|
||||
|
||||
@@ -440,8 +436,8 @@ public enum ZoneManager {
|
||||
|
||||
//not player city, must be npc city..
|
||||
|
||||
if (!zone.isPlayerCity())
|
||||
zone.setNPCCity(true);
|
||||
if (!zone.guild_zone)
|
||||
zone.isNPCCity = true;
|
||||
|
||||
if ((ConfigManager.serverType.equals(Enum.ServerType.WORLDSERVER)) && (city.getHash() == null)) {
|
||||
|
||||
@@ -455,30 +451,36 @@ public enum ZoneManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static float caclulateWorldAltitude(Zone zone) {
|
||||
public static float calculateGlobalZoneHeight(Zone zone) {
|
||||
|
||||
float worldAlttitude = MBServerStatics.SEA_FLOOR_ALTITUDE;
|
||||
|
||||
// Seafloor
|
||||
|
||||
if (zone.getParent() == null)
|
||||
if (ZoneManager.seaFloor.equals(zone))
|
||||
return worldAlttitude;
|
||||
|
||||
Zone parentZone = zone.getParent();
|
||||
|
||||
// Children of seafloor
|
||||
|
||||
if (parentZone.getParent() == null)
|
||||
return worldAlttitude + zone.getYCoord();
|
||||
if (ZoneManager.seaFloor.equals(zone.parent))
|
||||
return worldAlttitude + zone.yOffset;
|
||||
|
||||
// return height from heightmap engine at zone location
|
||||
|
||||
worldAlttitude = HeightMap.getWorldHeight(parentZone, zone.getLoc());
|
||||
worldAlttitude = Terrain.getWorldHeight(zone.parent, zone.getLoc());
|
||||
|
||||
// Add zone offset to value
|
||||
|
||||
worldAlttitude += zone.getYCoord();
|
||||
worldAlttitude += zone.yOffset;
|
||||
|
||||
return worldAlttitude;
|
||||
}
|
||||
|
||||
public static boolean isLocUnderwater(Vector3fImmutable currentLoc) {
|
||||
|
||||
float localAltitude = Terrain.getWorldHeight(currentLoc);
|
||||
Zone zone = findSmallestZone(currentLoc);
|
||||
|
||||
return localAltitude < zone.seaLevel;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,8 +61,6 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.source.region != null)
|
||||
this.target.setRegion(this.source.region);
|
||||
//teleport target to source
|
||||
target.teleport(source.getLoc());
|
||||
}
|
||||
|
||||
@@ -736,7 +736,7 @@ public class MobAI {
|
||||
//mob no longer has its owner loaded, translate pet to owner
|
||||
|
||||
if (!mob.playerAgroMap.containsKey(mob.guardCaptain.getObjectUUID())) {
|
||||
MovementManager.translocate(mob, mob.guardCaptain.getLoc(), null);
|
||||
MovementManager.translocate(mob, mob.guardCaptain.getLoc());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -896,6 +896,13 @@ public class MobAI {
|
||||
|
||||
try {
|
||||
|
||||
if(mob.getTimestamps().containsKey("lastChase") == false)
|
||||
mob.getTimestamps().put("lastChase",System.currentTimeMillis());
|
||||
else if(System.currentTimeMillis() < mob.getTimestamps().get("lastChase").longValue() + (750 + ThreadLocalRandom.current().nextInt(0,500)))
|
||||
return;
|
||||
|
||||
mob.getTimestamps().put("lastChase",System.currentTimeMillis());
|
||||
|
||||
if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mob.getRange()) == false) {
|
||||
if (mob.getRange() > 15) {
|
||||
mob.destination = mob.getCombatTarget().getLoc();
|
||||
@@ -991,7 +998,7 @@ public class MobAI {
|
||||
try {
|
||||
|
||||
if (mob.guardCaptain == null && mob.isNecroPet() == false && mob.isSiege() == false)
|
||||
if (ZoneManager.getSeaFloor().zoneMobSet.contains(mob))
|
||||
if (ZoneManager.seaFloor.zoneMobSet.contains(mob))
|
||||
mob.killCharacter("no owner");
|
||||
|
||||
if (MovementUtilities.canMove(mob) && mob.behaviourType.canRoam)
|
||||
|
||||
@@ -51,7 +51,7 @@ public class MovementUtilities {
|
||||
|
||||
//Guards recall distance = 814.
|
||||
if (tol != null) {
|
||||
return !(agent.getLoc().distanceSquared2D(tol.getLoc()) > sqr(Enum.CityBoundsType.ZONE.extents));
|
||||
return !(agent.getLoc().distanceSquared2D(tol.getLoc()) > sqr(Enum.CityBoundsType.ZONE.halfExtents));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -68,8 +68,8 @@ public class MovementUtilities {
|
||||
float zoneRange = 250;
|
||||
|
||||
if (agent.getParentZone() != null) {
|
||||
if (agent.getParentZone().getBounds() != null)
|
||||
zoneRange = agent.getParentZone().getBounds().getHalfExtents().x * 2;
|
||||
if (agent.getParentZone().bounds != null)
|
||||
zoneRange = agent.getParentZone().bounds.getHalfExtents().x * 2;
|
||||
}
|
||||
|
||||
if (zoneRange > 300)
|
||||
|
||||
@@ -1196,7 +1196,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
|
||||
|
||||
if (npc.getCharItemManager().getInventoryCount() > 150) {
|
||||
if (npc.getParentZone() != null && npc.getParentZone().getPlayerCityUUID() == 0) {
|
||||
if (npc.getParentZone() != null && npc.getParentZone().playerCityUUID == 0) {
|
||||
ArrayList<Item> inv = npc.getInventory();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
try {
|
||||
@@ -1229,7 +1229,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
if (ib == null)
|
||||
return;
|
||||
|
||||
if (npc.getParentZone() != null && npc.getParentZone().getPlayerCityUUID() != 0)
|
||||
if (npc.getParentZone() != null && npc.getParentZone().playerCityUUID != 0)
|
||||
if (!npc.getCharItemManager().hasRoomInventory(ib.getWeight())) {
|
||||
|
||||
ErrorPopupMsg.sendErrorPopup(player, 21);
|
||||
@@ -1280,7 +1280,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
|
||||
if (building != null && building.getProtectionState().equals(ProtectionState.NPC))
|
||||
building = null;
|
||||
if (npc.getParentZone().getPlayerCityUUID() == 0)
|
||||
if (npc.getParentZone().playerCityUUID == 0)
|
||||
building = null;
|
||||
|
||||
//make sure npc can afford item
|
||||
|
||||
@@ -151,7 +151,7 @@ public class AbandonAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
cityZone = ZoneManager.findSmallestZone(targetBuilding.getLoc());
|
||||
|
||||
// Can't abandon a tree not within a player city zone
|
||||
if (cityZone.isPlayerCity() == false)
|
||||
if (cityZone.guild_zone == false)
|
||||
return;
|
||||
|
||||
if (targetBuilding.getCity() == null)
|
||||
|
||||
@@ -45,7 +45,7 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
|
||||
if (serverZone == null)
|
||||
return;
|
||||
|
||||
serverCity = City.GetCityFromCache(serverZone.getPlayerCityUUID());
|
||||
serverCity = City.GetCityFromCache(serverZone.playerCityUUID);
|
||||
|
||||
if (serverCity == null)
|
||||
return;
|
||||
|
||||
@@ -65,7 +65,7 @@ public class ChannelMuteMsgHandler extends AbstractClientMsgHandler {
|
||||
cityZone = ZoneManager.findSmallestZone(targetBuilding.getLoc());
|
||||
|
||||
// Can't abandon a tree not within a player city zone
|
||||
if (cityZone.isPlayerCity() == false)
|
||||
if (cityZone.guild_zone == false)
|
||||
return;
|
||||
|
||||
if (targetBuilding.getCity().hasBeenTransfered == true) {
|
||||
|
||||
@@ -69,7 +69,7 @@ public class ClaimGuildTreeMsgHandler extends AbstractClientMsgHandler {
|
||||
playerZone = building.getParentZone();
|
||||
|
||||
if (playerZone != null)
|
||||
playerCity = City.getCity(playerZone.getPlayerCityUUID());
|
||||
playerCity = City.getCity(playerZone.playerCityUUID);
|
||||
|
||||
// Oops! *** Refactor: Log error
|
||||
switch (msg.getMessageType()) {
|
||||
@@ -117,7 +117,7 @@ public class ClaimGuildTreeMsgHandler extends AbstractClientMsgHandler {
|
||||
dispatch = Dispatch.borrow(sourcePlayer, gtsm);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||
|
||||
CityZoneMsg czm = new CityZoneMsg(2, playerZone.getLoc().x, playerZone.getLoc().y, playerZone.getLoc().z, playerCity.getCityName(), playerZone, Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents);
|
||||
CityZoneMsg czm = new CityZoneMsg(2, playerZone.getLoc().x, playerZone.getLoc().y, playerZone.getLoc().z, playerCity.getCityName(), playerZone, Enum.CityBoundsType.ZONE.halfExtents, Enum.CityBoundsType.ZONE.halfExtents);
|
||||
DispatchMessage.dispatchMsgToAll(czm);
|
||||
|
||||
break;
|
||||
|
||||
@@ -75,12 +75,12 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
||||
|
||||
if (!zone.isPlayerCity()) {
|
||||
if (!zone.guild_zone) {
|
||||
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
||||
return true;
|
||||
}
|
||||
|
||||
City city = City.GetCityFromCache(zone.getPlayerCityUUID());
|
||||
City city = City.GetCityFromCache(zone.playerCityUUID);
|
||||
|
||||
if (city == null) {
|
||||
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
||||
@@ -254,7 +254,7 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
if (baneZone == null)
|
||||
return true;
|
||||
|
||||
City banedCity = City.getCity(baneZone.getPlayerCityUUID());
|
||||
City banedCity = City.getCity(baneZone.playerCityUUID);
|
||||
|
||||
if (banedCity == null)
|
||||
return true;
|
||||
|
||||
@@ -334,7 +334,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
||||
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
||||
|
||||
if (zone != null) {
|
||||
if (zone.isPlayerCity()) {
|
||||
if (zone.guild_zone) {
|
||||
loc = zone.getLoc();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
||||
if (zone == null)
|
||||
return false;
|
||||
|
||||
if (zone.getPlayerCityUUID() == 0)
|
||||
if (zone.playerCityUUID == 0)
|
||||
return false;
|
||||
|
||||
City city = building.getCity();
|
||||
|
||||
@@ -2,7 +2,6 @@ package engine.net.client.handlers;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.RealmMap;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
@@ -112,7 +111,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// Cannot place a tree underwater
|
||||
|
||||
if (HeightMap.isLocUnderwater(placementInfo.getLoc())) {
|
||||
if (ZoneManager.isLocUnderwater(placementInfo.getLoc())) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 6, ""); // Cannot place underwater
|
||||
return false;
|
||||
}
|
||||
@@ -138,7 +137,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
private static boolean validateBuildingPlacement(Zone serverZone, PlaceAssetMsg msg, ClientConnection origin, PlayerCharacter player, PlacementInfo placementInfo) {
|
||||
|
||||
if (serverZone.isPlayerCity() == false) {
|
||||
if (serverZone.guild_zone == false) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 52, player.getName());
|
||||
return false;
|
||||
}
|
||||
@@ -157,7 +156,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// Retrieve the building details we're placing
|
||||
|
||||
if (serverZone.isNPCCity() == true) {
|
||||
if (serverZone.isNPCCity == true) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 15, ""); // Cannot place in a peace zone
|
||||
return false;
|
||||
}
|
||||
@@ -178,7 +177,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// Cannot place a building underwater
|
||||
|
||||
if (HeightMap.isLocUnderwater(placementInfo.getLoc())) {
|
||||
if (ZoneManager.isLocUnderwater(placementInfo.getLoc())) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 6, ""); // Cannot place underwater
|
||||
return false;
|
||||
}
|
||||
@@ -186,7 +185,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
// Players cannot place buildings in mob zones.
|
||||
|
||||
if ((serverZone.isMacroZone() == true)
|
||||
|| (serverZone.getParent().isMacroZone() == true)) {
|
||||
|| (serverZone.parent.isMacroZone() == true)) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 57, player.getName()); // No building may be placed within this territory
|
||||
return false;
|
||||
}
|
||||
@@ -202,8 +201,8 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// Cannot place assets on a dead tree
|
||||
|
||||
if ((serverZone.isPlayerCity())
|
||||
&& (City.getCity(serverZone.getPlayerCityUUID()).getTOL().getRank() == -1)) {
|
||||
if ((serverZone.guild_zone)
|
||||
&& (City.getCity(serverZone.playerCityUUID).getTOL().getRank() == -1)) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "Cannot place asset on dead tree until world heals");
|
||||
return false;
|
||||
}
|
||||
@@ -262,14 +261,14 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// Must be a player city
|
||||
|
||||
if (serverZone.isPlayerCity() == false) {
|
||||
if (serverZone.guild_zone == false) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 41, player.getName()); // Cannot place outside a guild zone
|
||||
return false;
|
||||
}
|
||||
|
||||
//Test zone has a city object
|
||||
|
||||
City city = City.getCity(serverZone.getPlayerCityUUID());
|
||||
City city = City.getCity(serverZone.playerCityUUID);
|
||||
|
||||
if (city == null) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 52, ""); //"no city to associate asset with"
|
||||
@@ -513,7 +512,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
if (serverZone == null)
|
||||
return false;
|
||||
|
||||
cityObject = City.getCity(serverZone.getPlayerCityUUID());
|
||||
cityObject = City.getCity(serverZone.playerCityUUID);
|
||||
|
||||
// Early exit if something went horribly wrong
|
||||
|
||||
@@ -572,7 +571,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
// No valid player city found
|
||||
|
||||
if (serverCity == null || serverCity.getParent().isPlayerCity() == false) {
|
||||
if (serverCity == null || serverCity.getParent().guild_zone == false) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 52, ""); // Cannot place outisde a guild zone
|
||||
return false;
|
||||
}
|
||||
@@ -661,7 +660,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
if (!building.getBlueprint().isSiegeEquip())
|
||||
continue;
|
||||
|
||||
if (!building.getLoc().isInsideCircle(serverCity.getLoc(), CityBoundsType.ZONE.extents))
|
||||
if (!building.getLoc().isInsideCircle(serverCity.getLoc(), CityBoundsType.ZONE.halfExtents))
|
||||
continue;
|
||||
|
||||
if (building.getGuild() == null)
|
||||
@@ -750,8 +749,8 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
cityObjects = DbManager.CityQueries.CREATE_CITY(playerCharacter.getObjectUUID(), serverZone.getObjectUUID(),
|
||||
serverRealm.getRealmID(),
|
||||
plantLoc.x - serverZone.getAbsX(), plantLoc.y,
|
||||
plantLoc.z - serverZone.getAbsZ(), treeInfo.getRot().y, treeInfo.getW(), playerCharacter.getGuild().getName(), LocalDateTime.now());
|
||||
plantLoc.x - serverZone.absX, plantLoc.y,
|
||||
plantLoc.z - serverZone.absZ, treeInfo.getRot().y, treeInfo.getW(), playerCharacter.getGuild().getName(), LocalDateTime.now());
|
||||
|
||||
// Uh oh!
|
||||
|
||||
@@ -784,16 +783,16 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
// Link the zone with the city and then add
|
||||
// to the appropriate hash tables and cache
|
||||
|
||||
zoneObject.setPlayerCity(true);
|
||||
zoneObject.guild_zone = true;
|
||||
|
||||
if (zoneObject.getParent() != null)
|
||||
zoneObject.getParent().addNode(zoneObject); //add as child to parent
|
||||
if (zoneObject.parent != null)
|
||||
zoneObject.parent.addNode(zoneObject); //add as child to parent
|
||||
|
||||
ZoneManager.addZone(zoneObject.getObjectUUID(), zoneObject);
|
||||
ZoneManager.addPlayerCityZone(zoneObject);
|
||||
serverZone.addNode(zoneObject);
|
||||
|
||||
zoneObject.worldAltitude = ZoneManager.caclulateWorldAltitude(zoneObject);
|
||||
zoneObject.global_height = ZoneManager.calculateGlobalZoneHeight(zoneObject);
|
||||
|
||||
cityObject.setParent(zoneObject);
|
||||
cityObject.setObjectTypeMask(MBServerStatics.MASK_CITY); // *** Refactor : should have it already
|
||||
@@ -807,7 +806,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
// Update guild binds and tags
|
||||
//load the new city on the clients
|
||||
|
||||
CityZoneMsg czm = new CityZoneMsg(1, treeObject.getLoc().x, treeObject.getLoc().y, treeObject.getLoc().z, cityObject.getCityName(), zoneObject, Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents);
|
||||
CityZoneMsg czm = new CityZoneMsg(1, treeObject.getLoc().x, treeObject.getLoc().y, treeObject.getLoc().z, cityObject.getCityName(), zoneObject, Enum.CityBoundsType.ZONE.halfExtents, Enum.CityBoundsType.ZONE.halfExtents);
|
||||
DispatchMessage.dispatchMsgToAll(czm);
|
||||
|
||||
GuildManager.updateAllGuildBinds(playerNation, cityObject);
|
||||
@@ -858,7 +857,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
if (serverZone == null)
|
||||
return false;
|
||||
|
||||
cityObject = City.getCity(serverZone.getPlayerCityUUID());
|
||||
cityObject = City.getCity(serverZone.playerCityUUID);
|
||||
|
||||
if (cityObject == null)
|
||||
return false;
|
||||
@@ -932,7 +931,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
int shrineCount = 0;
|
||||
|
||||
cityObject = City.getCity(serverZone.getPlayerCityUUID());
|
||||
cityObject = City.getCity(serverZone.playerCityUUID);
|
||||
|
||||
// Cannot place shrine in abandoned city. Shrines must be owned
|
||||
// by the tol owner not the person placing them.
|
||||
@@ -1002,7 +1001,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
int barracksCount = 0;
|
||||
|
||||
cityObject = City.getCity(serverZone.getPlayerCityUUID());
|
||||
cityObject = City.getCity(serverZone.playerCityUUID);
|
||||
|
||||
// Cannot place barracks in abandoned city.
|
||||
|
||||
@@ -1062,7 +1061,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
if (validateCityBuildingPlacement(serverZone, msg, origin, player, msg.getFirstPlacementInfo()) == false)
|
||||
return false;
|
||||
|
||||
cityObject = City.getCity(serverZone.getPlayerCityUUID());
|
||||
cityObject = City.getCity(serverZone.playerCityUUID);
|
||||
|
||||
// We need to be able to access how much gold a character is carrying
|
||||
|
||||
@@ -1118,7 +1117,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
building.removeFromCache();
|
||||
WorldGrid.RemoveWorldObject(building);
|
||||
WorldGrid.removeObject(building);
|
||||
building.getParentZone().getParent().zoneBuildingSet.remove(building);
|
||||
building.getParentZone().parent.zoneBuildingSet.remove(building);
|
||||
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BARRACK)) {
|
||||
building.RemoveFromBarracksList();
|
||||
}
|
||||
@@ -1230,7 +1229,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
shrineType = Shrine.getShrineTypeByBlueprintUUID(blueprint.getBlueprintUUID());
|
||||
|
||||
city = City.getCity(currentZone.getPlayerCityUUID());
|
||||
city = City.getCity(currentZone.playerCityUUID);
|
||||
|
||||
if (city == null)
|
||||
return false;
|
||||
@@ -1295,7 +1294,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
return false;
|
||||
}
|
||||
|
||||
city = City.getCity(currentZone.getPlayerCityUUID());
|
||||
city = City.getCity(currentZone.playerCityUUID);
|
||||
|
||||
if (city == null)
|
||||
return false;
|
||||
@@ -1370,7 +1369,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
||||
newMesh.runAfterLoad();
|
||||
} else if (ago.getObjectType() == GameObjectType.Warehouse) {
|
||||
Warehouse warehouse = (Warehouse) ago;
|
||||
City city = City.getCity(currentZone.getPlayerCityUUID());
|
||||
City city = City.getCity(currentZone.playerCityUUID);
|
||||
|
||||
if (city == null)
|
||||
return true;
|
||||
|
||||
@@ -44,11 +44,11 @@ public class RepairBuildingMsgHandler extends AbstractClientMsgHandler {
|
||||
|
||||
serverZone = ZoneManager.findSmallestZone(pc.getLoc());
|
||||
|
||||
if (serverZone.getPlayerCityUUID() == 0 && targetBuilding.getBlueprint() != null && targetBuilding.getBlueprint().getBuildingGroup() != BuildingGroup.MINE)
|
||||
if (serverZone.playerCityUUID == 0 && targetBuilding.getBlueprint() != null && targetBuilding.getBlueprint().getBuildingGroup() != BuildingGroup.MINE)
|
||||
return;
|
||||
|
||||
|
||||
City city = City.GetCityFromCache(serverZone.getPlayerCityUUID());
|
||||
City city = City.GetCityFromCache(serverZone.playerCityUUID);
|
||||
|
||||
if (city != null) {
|
||||
if (city.getBane() != null && city.protectionEnforced == false)
|
||||
|
||||
@@ -110,7 +110,6 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
|
||||
player.stopMovement(player.getBindLoc());
|
||||
player.setSafeMode();
|
||||
player.updateLocation();
|
||||
player.setRegion(AbstractWorldObject.GetRegionByWorldObject(player));
|
||||
}
|
||||
|
||||
player.setTimeStamp("logout", 0);
|
||||
|
||||
@@ -92,7 +92,7 @@ public class CityAssetMsg extends ClientNetMsg {
|
||||
return;
|
||||
}
|
||||
|
||||
city = City.getCity(zone.getPlayerCityUUID());
|
||||
city = City.getCity(zone.playerCityUUID);
|
||||
|
||||
if (city == null) {
|
||||
Logger.debug("Failed to load city data for Tree of life.");
|
||||
|
||||
@@ -117,8 +117,8 @@ public class GuildTreeStatusMsg extends ClientNetMsg {
|
||||
city = null;
|
||||
|
||||
if (cityZone != null)
|
||||
if (cityZone.isPlayerCity())
|
||||
city = City.GetCityFromCache(cityZone.getPlayerCityUUID());
|
||||
if (cityZone.guild_zone)
|
||||
city = City.GetCityFromCache(cityZone.playerCityUUID);
|
||||
else if (this.treeOfLife != null && this.treeOfLife.getGuild() != null)
|
||||
city = this.treeOfLife.getGuild().getOwnedCity();
|
||||
|
||||
|
||||
@@ -299,8 +299,8 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
||||
Set<Building> buildings = ZoneManager.findSmallestZone(assetManager.getLoc()).zoneBuildingSet;
|
||||
|
||||
Building tol = null;
|
||||
if (playerZone.getPlayerCityUUID() != 0)
|
||||
city = City.GetCityFromCache(playerZone.getPlayerCityUUID());
|
||||
if (playerZone.playerCityUUID != 0)
|
||||
city = City.GetCityFromCache(playerZone.playerCityUUID);
|
||||
|
||||
if (city != null)
|
||||
tol = city.getTOL();
|
||||
@@ -368,7 +368,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
||||
if (zone == null)
|
||||
return;
|
||||
|
||||
City banedCity = City.getCity(zone.getPlayerCityUUID());
|
||||
City banedCity = City.getCity(zone.playerCityUUID);
|
||||
|
||||
if (banedCity == null)
|
||||
return;
|
||||
@@ -479,7 +479,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
||||
if (zone == null)
|
||||
writer.putString("Forlord");
|
||||
else
|
||||
writer.putString(zone.getName());
|
||||
writer.putString(zone.zoneName);
|
||||
|
||||
writer.putString(building.getGuild().getName());
|
||||
|
||||
@@ -621,9 +621,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
||||
} else {
|
||||
writer.putInt(1); //kos on/off?
|
||||
writer.putInt(3); // was 3
|
||||
if (zone.getPlayerCityUUID() != 0 && asset.assetIsProtected()) {
|
||||
if (zone.playerCityUUID != 0 && asset.assetIsProtected()) {
|
||||
writer.putInt(GameObjectType.Building.ordinal());
|
||||
writer.putInt(City.getCity(zone.getPlayerCityUUID()).getTOL().getObjectUUID());
|
||||
writer.putInt(City.getCity(zone.playerCityUUID).getTOL().getObjectUUID());
|
||||
} else {
|
||||
writer.putInt(0);
|
||||
writer.putInt(0);
|
||||
|
||||
@@ -73,7 +73,7 @@ public class ViewResourcesMessage extends ClientNetMsg {
|
||||
if (this.warehouseBuilding.getParentZone() == null)
|
||||
return false;
|
||||
|
||||
this.city = (City) DbManager.getObject(Enum.GameObjectType.City, this.warehouseBuilding.getParentZone().getPlayerCityUUID());
|
||||
this.city = (City) DbManager.getObject(Enum.GameObjectType.City, this.warehouseBuilding.getParentZone().playerCityUUID);
|
||||
|
||||
if (this.city == null)
|
||||
return false;
|
||||
|
||||
@@ -73,7 +73,7 @@ public class WorldDataMsg extends ClientNetMsg {
|
||||
|
||||
// TODO replace this return with SerializationException
|
||||
|
||||
Zone root = ZoneManager.getSeaFloor();
|
||||
Zone root = ZoneManager.seaFloor;
|
||||
if (root == null) {
|
||||
Logger.error("Failed to find Sea Floor!");
|
||||
return;
|
||||
|
||||
@@ -12,6 +12,7 @@ package engine.objects;
|
||||
import engine.Enum;
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.exception.SerializationException;
|
||||
import engine.gameManager.*;
|
||||
@@ -121,6 +122,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
public int hidden = 0; // current rank of hide/sneak/invis
|
||||
public CopyOnWriteArrayList<Integer> minions = new CopyOnWriteArrayList();
|
||||
|
||||
public ArrayList<CharacterRune> runes;
|
||||
|
||||
public AbstractCharacter() {
|
||||
super();
|
||||
this.firstName = "";
|
||||
@@ -512,10 +515,9 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
}
|
||||
|
||||
public static void teleport(AbstractCharacter worldObject, final Vector3fImmutable targetLoc) {
|
||||
Regions targetRegion = Regions.GetRegionForTeleport(targetLoc);
|
||||
worldObject.locationLock.writeLock().lock();
|
||||
try {
|
||||
MovementManager.translocate(worldObject, targetLoc, targetRegion);
|
||||
MovementManager.translocate(worldObject, targetLoc);
|
||||
if (worldObject.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
InterestManager.INTERESTMANAGER.HandleLoadForTeleport((PlayerCharacter) worldObject);
|
||||
} catch (Exception e) {
|
||||
@@ -983,8 +985,25 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
|
||||
@Override
|
||||
public final void setLoc(final Vector3fImmutable value) {
|
||||
super.setLoc(value); // set the location in the world
|
||||
Regions region = Regions.GetRegionForTeleport(value);
|
||||
float regionHeightOffset = 0;
|
||||
if(region != null){
|
||||
this.region = region;
|
||||
regionHeightOffset = region.lerpY(this);
|
||||
this.inBuilding = region.level; // -1 not in building 0 on ground floor, 1 on first floor etc
|
||||
this.inBuildingID = region.parentBuildingID;
|
||||
this.inFloorID = region.room;
|
||||
} else {
|
||||
this.region = null;
|
||||
this.inBuilding = -1;
|
||||
this.inBuildingID = 0;
|
||||
this.inFloorID = -1;
|
||||
}
|
||||
float terrainHeight = Terrain.getWorldHeight(value);
|
||||
Vector3fImmutable finalLocation = new Vector3fImmutable(value.x,terrainHeight + regionHeightOffset, value.z);
|
||||
super.setLoc(finalLocation); // set the location in the world
|
||||
this.resetLastSetLocUpdate();
|
||||
|
||||
}
|
||||
|
||||
public Vector3fImmutable getMovementLoc() {
|
||||
@@ -1449,10 +1468,9 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
}
|
||||
|
||||
public void teleport(final Vector3fImmutable targetLoc) {
|
||||
Regions targetRegion = Regions.GetRegionForTeleport(targetLoc);
|
||||
locationLock.writeLock().lock();
|
||||
try {
|
||||
MovementManager.translocate(this, targetLoc, targetRegion);
|
||||
MovementManager.translocate(this, targetLoc);
|
||||
MovementManager.sendRWSSMsg(this);
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
|
||||
@@ -130,7 +130,7 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
||||
ArrayList<Zone> allIn = ZoneManager.getAllZonesIn(this.getLoc());
|
||||
|
||||
for (Zone zone : allIn)
|
||||
if (zone.getSafeZone() == (byte) 1)
|
||||
if (zone.peace_zone == (byte) 1)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
||||
@@ -13,7 +13,7 @@ import engine.Enum.DispatchChannel;
|
||||
import engine.Enum.EffectSourceType;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.Enum.GridObjectType;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.job.AbstractScheduleJob;
|
||||
import engine.job.JobContainer;
|
||||
@@ -502,7 +502,13 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
||||
return;
|
||||
this.lastLoc = new Vector3fImmutable(this.loc);
|
||||
this.loc = loc;
|
||||
this.loc = this.loc.setY(HeightMap.getWorldHeight(this.getLoc()) + this.getAltitude());
|
||||
|
||||
if(this instanceof AbstractCharacter && this.region != null){
|
||||
this.loc = this.loc.setY(this.region.lerpY(this) + this.getAltitude());
|
||||
} else{
|
||||
this.loc = this.loc.setY(Terrain.getWorldHeight(this.getLoc()) + this.getAltitude());
|
||||
}
|
||||
|
||||
|
||||
//lets not add mob to world grid if he is currently despawned.
|
||||
if (this.getObjectType().equals(GameObjectType.Mob) && ((Mob) this).despawned)
|
||||
@@ -610,9 +616,6 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
||||
this.movingUp = movingUp;
|
||||
}
|
||||
|
||||
public void setRegion(Regions region) {
|
||||
this.region = region;
|
||||
}
|
||||
|
||||
//used for interestmanager loading and unloading objects to client.
|
||||
// if not in grid, unload from player.
|
||||
|
||||
@@ -13,7 +13,6 @@ import engine.Enum;
|
||||
import engine.Enum.ProtectionState;
|
||||
import engine.Enum.SiegePhase;
|
||||
import engine.Enum.SiegeResult;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.archive.BaneRecord;
|
||||
import engine.db.archive.DataWarehouse;
|
||||
@@ -135,7 +134,7 @@ public final class Bane {
|
||||
|
||||
// Cannot place banestone underwater;
|
||||
|
||||
if (HeightMap.isLocUnderwater(player.getLoc())) {
|
||||
if (ZoneManager.isLocUnderwater(player.getLoc())) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 6, ""); // Cannot place underwater
|
||||
return false;
|
||||
}
|
||||
@@ -163,8 +162,8 @@ public final class Bane {
|
||||
|
||||
// Cannot place assets on a dead tree
|
||||
|
||||
if ((cityZone.isPlayerCity()) &&
|
||||
(City.getCity(cityZone.getPlayerCityUUID()).getTOL().getRank() == -1)) {
|
||||
if ((cityZone.guild_zone) &&
|
||||
(City.getCity(cityZone.playerCityUUID).getTOL().getRank() == -1)) {
|
||||
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "Cannot bane a dead tree!");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ package engine.objects;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.RealmMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.archive.CityRecord;
|
||||
import engine.db.archive.DataWarehouse;
|
||||
@@ -206,7 +206,7 @@ public class Building extends AbstractWorldObject {
|
||||
// Altitude of this building is derived from the heightmap engine.
|
||||
|
||||
Vector3fImmutable tempLoc = new Vector3fImmutable(this.statLat + this.parentZone.absX, 0, this.statLon + this.parentZone.absZ);
|
||||
tempLoc = new Vector3fImmutable(tempLoc.x, HeightMap.getWorldHeight(tempLoc), tempLoc.z);
|
||||
tempLoc = new Vector3fImmutable(tempLoc.x, Terrain.getWorldHeight(tempLoc), tempLoc.z);
|
||||
this.setLoc(tempLoc);
|
||||
}
|
||||
}
|
||||
@@ -446,24 +446,24 @@ public class Building extends AbstractWorldObject {
|
||||
if (this.getBlueprint() != null && this.getBlueprint().isSiegeEquip() && this.protectionState.equals(ProtectionState.PROTECTED)) {
|
||||
if (this.getGuild() != null) {
|
||||
if (this.getGuild().getOwnedCity() != null) {
|
||||
if (this.getLoc().isInsideCircle(this.getGuild().getOwnedCity().getLoc(), CityBoundsType.ZONE.extents))
|
||||
if (this.getLoc().isInsideCircle(this.getGuild().getOwnedCity().getLoc(), CityBoundsType.ZONE.halfExtents))
|
||||
return this.getGuild().getOwnedCity();
|
||||
} else {
|
||||
Bane bane = Bane.getBaneByAttackerGuild(this.getGuild());
|
||||
|
||||
if (bane != null) {
|
||||
if (bane.getCity() != null) {
|
||||
if (this.getLoc().isInsideCircle(bane.getCity().getLoc(), CityBoundsType.ZONE.extents))
|
||||
if (this.getLoc().isInsideCircle(bane.getCity().getLoc(), CityBoundsType.ZONE.halfExtents))
|
||||
return bane.getCity();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.parentZone.isPlayerCity() == false)
|
||||
if (this.parentZone.guild_zone == false)
|
||||
return null;
|
||||
|
||||
return City.getCity(this.parentZone.getPlayerCityUUID());
|
||||
return City.getCity(this.parentZone.playerCityUUID);
|
||||
|
||||
}
|
||||
|
||||
@@ -1402,7 +1402,7 @@ public class Building extends AbstractWorldObject {
|
||||
// Buildings on an npc citygrid are never vulnerable
|
||||
|
||||
if (this.getCity() != null) {
|
||||
if (this.getCity().getParent().isNPCCity() == true)
|
||||
if (this.getCity().getParent().isNPCCity == true)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ package engine.objects;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.RealmMap;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.archive.CityRecord;
|
||||
@@ -334,7 +333,7 @@ public class City extends AbstractWorldObject {
|
||||
if (city.noTeleport)
|
||||
continue;
|
||||
|
||||
if (city.parentZone != null && city.parentZone.isPlayerCity()) {
|
||||
if (city.parentZone != null && city.parentZone.guild_zone) {
|
||||
|
||||
if (pc.getAccount().status.equals(AccountStatus.ADMIN)) {
|
||||
cities.add(city);
|
||||
@@ -395,7 +394,7 @@ public class City extends AbstractWorldObject {
|
||||
if (city.noRepledge)
|
||||
continue;
|
||||
|
||||
if (city.parentZone != null && city.parentZone.isPlayerCity()) {
|
||||
if (city.parentZone != null && city.parentZone.guild_zone) {
|
||||
|
||||
//list Player cities
|
||||
//open city, just list
|
||||
@@ -583,14 +582,10 @@ public class City extends AbstractWorldObject {
|
||||
|
||||
Bounds cityBounds = Bounds.borrow();
|
||||
cityBounds.setBounds(new Vector2f(this.location.x + 64, this.location.z + 64), // location x and z are offset by 64 from the center of the city.
|
||||
new Vector2f(Enum.CityBoundsType.GRID.extents, Enum.CityBoundsType.GRID.extents),
|
||||
new Vector2f(Enum.CityBoundsType.GRID.halfExtents, Enum.CityBoundsType.GRID.halfExtents),
|
||||
0.0f);
|
||||
this.setBounds(cityBounds);
|
||||
|
||||
if (zone.getHeightMap() == null && this.isNpc == 1 && this.getObjectUUID() != 1213) {
|
||||
HeightMap.GenerateCustomHeightMap(zone);
|
||||
Logger.info(zone.getName() + " created custom heightmap");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
@@ -791,7 +786,7 @@ public class City extends AbstractWorldObject {
|
||||
// Any players currently in the zone will not be processed by the heartbeat
|
||||
// if it's not the first effect toggled so we do it here manually
|
||||
|
||||
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, this.parentZone.getBounds().getHalfExtents().x * 1.2f, MBServerStatics.MASK_PLAYER);
|
||||
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, this.parentZone.bounds.getHalfExtents().x * 1.2f, MBServerStatics.MASK_PLAYER);
|
||||
|
||||
for (AbstractWorldObject playerObject : currentPlayers) {
|
||||
|
||||
@@ -869,12 +864,12 @@ public class City extends AbstractWorldObject {
|
||||
|
||||
public boolean isLocationWithinSiegeBounds(Vector3fImmutable insideLoc) {
|
||||
|
||||
return insideLoc.isInsideCircle(this.getLoc(), CityBoundsType.ZONE.extents);
|
||||
return insideLoc.isInsideCircle(this.getLoc(), CityBoundsType.ZONE.halfExtents);
|
||||
|
||||
}
|
||||
|
||||
public boolean isLocationOnCityZone(Vector3fImmutable insideLoc) {
|
||||
return Bounds.collide(insideLoc, this.parentZone.getBounds());
|
||||
return Bounds.collide(insideLoc, this.parentZone.bounds);
|
||||
}
|
||||
|
||||
private void applyAllCityEffects(PlayerCharacter player) {
|
||||
@@ -934,7 +929,7 @@ public class City extends AbstractWorldObject {
|
||||
|
||||
// Gather current list of players within the zone bounds
|
||||
|
||||
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.extents, MBServerStatics.MASK_PLAYER);
|
||||
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.halfExtents, MBServerStatics.MASK_PLAYER);
|
||||
currentMemory = new HashSet<>();
|
||||
|
||||
for (AbstractWorldObject playerObject : currentPlayers) {
|
||||
|
||||
@@ -104,7 +104,7 @@ public class ItemFactory {
|
||||
if (zone == null)
|
||||
return null;
|
||||
|
||||
City city = City.getCity(zone.getPlayerCityUUID());
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
|
||||
if (city == null)
|
||||
return null;
|
||||
@@ -796,7 +796,7 @@ public class ItemFactory {
|
||||
if (zone == null)
|
||||
return null;
|
||||
|
||||
City city = City.getCity(zone.getPlayerCityUUID());
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
|
||||
if (city == null)
|
||||
return null;
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Mine extends AbstractGameObject {
|
||||
this.flags = rs.getInt("flags");
|
||||
int parent = rs.getInt("parent");
|
||||
this.parentZone = ZoneManager.getZoneByUUID(parent);
|
||||
this.zoneName = this.parentZone.getParent().getName();
|
||||
this.zoneName = this.parentZone.parent.zoneName;
|
||||
|
||||
this.owningGuild = Guild.getGuild(ownerUID);
|
||||
Guild nation = null;
|
||||
@@ -129,7 +129,7 @@ public class Mine extends AbstractGameObject {
|
||||
|
||||
mine.getTimestamps().put("MineAttack", System.currentTimeMillis() + MBServerStatics.ONE_MINUTE);
|
||||
|
||||
ChatManager.chatNationInfo(mine.getGuild().getNation(), mine.getName() + " in " + mine.getParentZone().getParent().getName() + " is Under attack!");
|
||||
ChatManager.chatNationInfo(mine.getGuild().getNation(), mine.getName() + " in " + mine.getParentZone().parent.zoneName + " is Under attack!");
|
||||
}
|
||||
|
||||
public static void loadAllMines() {
|
||||
|
||||
@@ -841,13 +841,11 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
if (newLoc.equals(this.getEndLoc())) {
|
||||
this.stopMovement(newLoc);
|
||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
return;
|
||||
//Next upda
|
||||
}
|
||||
|
||||
setLoc(newLoc);
|
||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
//Next update will be end Loc, lets stop him here.
|
||||
|
||||
}
|
||||
@@ -899,7 +897,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
this.setCombatTarget(null);
|
||||
this.hasLoot = false;
|
||||
ZoneManager.getSeaFloor().zoneMobSet.remove(this);
|
||||
ZoneManager.seaFloor.zoneMobSet.remove(this);
|
||||
|
||||
try {
|
||||
this.clearEffects();
|
||||
@@ -971,8 +969,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
if (this.building == null && this.guardCaptain != null && ((Mob) this.guardCaptain).behaviourType.equals(MobBehaviourType.GuardCaptain))
|
||||
this.building = this.guardCaptain.building;
|
||||
else if (this.building != null)
|
||||
this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z);
|
||||
|
||||
this.loadInventory();
|
||||
|
||||
@@ -1653,7 +1649,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
|
||||
// Setup location for this Mobile
|
||||
|
||||
this.loc = new Vector3fImmutable(bindLoc);
|
||||
this.setLoc(bindLoc);
|
||||
this.endLoc = new Vector3fImmutable(bindLoc);
|
||||
|
||||
// Initialize inventory
|
||||
|
||||
@@ -865,7 +865,7 @@ public class NPC extends AbstractCharacter {
|
||||
|
||||
this.bindLoc = new Vector3fImmutable(this.statLat, this.statAlt, this.statLon);
|
||||
this.bindLoc = this.parentZone.getLoc().add(this.bindLoc);
|
||||
this.loc = new Vector3fImmutable(bindLoc);
|
||||
this.setLoc(bindLoc);
|
||||
|
||||
// Handle NPCs within buildings
|
||||
|
||||
@@ -894,7 +894,7 @@ public class NPC extends AbstractCharacter {
|
||||
this.stamina.set(this.staminaMax);
|
||||
}
|
||||
|
||||
if (this.parentZone.isPlayerCity())
|
||||
if (this.parentZone.guild_zone)
|
||||
if (NPC.GetNPCProfits(this) == null)
|
||||
NPCProfits.CreateProfits(this);
|
||||
|
||||
@@ -972,6 +972,10 @@ public class NPC extends AbstractCharacter {
|
||||
Bounds npcBounds = Bounds.borrow();
|
||||
npcBounds.setBounds(this.getLoc());
|
||||
|
||||
//apply NPC rune effects
|
||||
NPCManager.applyRunesForNPC(this);
|
||||
this.resists.setImmuneToAll(true);
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.error(e.getMessage());
|
||||
}
|
||||
@@ -1188,7 +1192,7 @@ public class NPC extends AbstractCharacter {
|
||||
if (serverZone == null)
|
||||
return null;
|
||||
|
||||
city = City.GetCityFromCache(serverZone.getPlayerCityUUID());
|
||||
city = City.GetCityFromCache(serverZone.playerCityUUID);
|
||||
|
||||
if (city == null) {
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@ package engine.objects;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.RealmMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.archive.CharacterRecord;
|
||||
import engine.db.archive.DataWarehouse;
|
||||
@@ -117,10 +117,8 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
public float landingAltitude = 0;
|
||||
public int bindBuilding = 0;
|
||||
public FriendStatus friendStatus = FriendStatus.Available;
|
||||
protected ArrayList<CharacterRune> runes;
|
||||
private BaseClass baseClass;
|
||||
private PromotionClass promotionClass;
|
||||
private long channelMute = 0; // none muted.
|
||||
private ConcurrentHashMap<Integer, String> ignoredPlayerIDs = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
||||
private boolean lfGroup = false;
|
||||
private boolean lfGuild = false;
|
||||
@@ -1509,16 +1507,16 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
return true;
|
||||
Zone zone = ZoneManager.findSmallestZone(breather.getLoc());
|
||||
|
||||
if (zone.getSeaLevel() != 0) {
|
||||
if (zone.seaLevel != 0) {
|
||||
|
||||
float localAltitude = breather.getLoc().y;
|
||||
|
||||
|
||||
if (localAltitude + breather.characterHeight < zone.getSeaLevel() - 2)
|
||||
if (localAltitude + breather.characterHeight < zone.seaLevel - 2)
|
||||
return false;
|
||||
|
||||
if (breather.isMoving()) {
|
||||
if (localAltitude + breather.characterHeight < zone.getSeaLevel())
|
||||
if (localAltitude + breather.characterHeight < zone.seaLevel)
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
@@ -1549,12 +1547,12 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(enterer.getLoc());
|
||||
|
||||
if (zone.getSeaLevel() != 0) {
|
||||
if (zone.seaLevel != 0) {
|
||||
|
||||
float localAltitude = enterer.getLoc().y + enterer.characterHeight;
|
||||
|
||||
|
||||
if (localAltitude < zone.getSeaLevel())
|
||||
if (localAltitude < zone.seaLevel)
|
||||
return true;
|
||||
} else {
|
||||
if (enterer.getLoc().y + enterer.characterHeight < 0)
|
||||
@@ -1581,12 +1579,12 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
leaveWater = 1f;
|
||||
|
||||
|
||||
if (zone.getSeaLevel() != 0) {
|
||||
if (zone.seaLevel != 0) {
|
||||
|
||||
float localAltitude = leaver.getLoc().y;
|
||||
|
||||
|
||||
if (localAltitude + leaveWater < zone.getSeaLevel())
|
||||
if (localAltitude + leaveWater < zone.seaLevel)
|
||||
return false;
|
||||
} else {
|
||||
if (leaver.getLoc().y + leaveWater < 0)
|
||||
@@ -1705,7 +1703,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
||||
|
||||
if (zone != null) {
|
||||
return zone.getSafeZone() == (byte) 1;
|
||||
return zone.peace_zone == (byte) 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -1799,7 +1797,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
|
||||
//DeathShroud
|
||||
|
||||
if (zone.getSafeZone() == 0)
|
||||
if (zone.peace_zone == 0)
|
||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
||||
|
||||
//enable this to give players deathshroud if mobs kill player.
|
||||
@@ -1845,7 +1843,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
|
||||
//DeathShroud
|
||||
|
||||
if (zone.getSafeZone() == 0)
|
||||
if (zone.peace_zone == 0)
|
||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
||||
|
||||
if (doPVPEXP) {
|
||||
@@ -1900,7 +1898,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
killCleanup();
|
||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
||||
|
||||
if (zone.getSafeZone() == 0)
|
||||
if (zone.peace_zone == 0)
|
||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
||||
|
||||
// Send death message if needed
|
||||
@@ -4741,10 +4739,10 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
||||
|
||||
if (zone.getSeaLevel() != 0) {
|
||||
if (zone.seaLevel != 0) {
|
||||
|
||||
float localAltitude = this.getLoc().y + this.centerHeight;
|
||||
if (localAltitude < zone.getSeaLevel())
|
||||
if (localAltitude < zone.seaLevel)
|
||||
return true;
|
||||
} else {
|
||||
if (this.getLoc().y + this.centerHeight < 0)
|
||||
@@ -4762,13 +4760,13 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
// If char is flying they aren't quite swimming
|
||||
try {
|
||||
|
||||
float localAltitude = HeightMap.getWorldHeight(currentLoc);
|
||||
float localAltitude = Terrain.getWorldHeight(currentLoc);
|
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(currentLoc);
|
||||
|
||||
if (zone.getSeaLevel() != 0) {
|
||||
if (zone.seaLevel != 0) {
|
||||
|
||||
if (localAltitude < zone.getSeaLevel())
|
||||
if (localAltitude < zone.seaLevel)
|
||||
return true;
|
||||
} else {
|
||||
if (localAltitude < 0)
|
||||
@@ -4834,7 +4832,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
} else
|
||||
this.altitude = this.getDesiredAltitude();
|
||||
|
||||
this.loc = this.loc.setY(HeightMap.getWorldHeight(this.getLoc()) + this.getAltitude());
|
||||
this.loc = this.loc.setY(Terrain.getWorldHeight(this.getLoc()) + this.getAltitude());
|
||||
|
||||
this.setTakeOffTime(0);
|
||||
MovementManager.finishChangeAltitude(this, this.getDesiredAltitude());
|
||||
@@ -4842,7 +4840,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
return;
|
||||
}
|
||||
|
||||
this.loc = this.loc.setY(HeightMap.getWorldHeight(this.getLoc()) + this.getAltitude());
|
||||
this.loc = this.loc.setY(Terrain.getWorldHeight(this.getLoc()) + this.getAltitude());
|
||||
}
|
||||
|
||||
public boolean hasBoon() {
|
||||
@@ -4888,12 +4886,10 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
if (this.isAlive() == false || this.getBonuses().getBool(ModType.Stunned, SourceType.None) || this.getBonuses().getBool(ModType.CannotMove, SourceType.None)) {
|
||||
//Target is stunned or rooted. Don't move
|
||||
this.stopMovement(newLoc);
|
||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
return;
|
||||
}
|
||||
if (newLoc.equals(this.getEndLoc())) {
|
||||
this.stopMovement(newLoc);
|
||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
if (this.getDebug(1))
|
||||
ChatManager.chatSystemInfo(this,
|
||||
"Arrived at End location. " + this.getEndLoc());
|
||||
@@ -4902,7 +4898,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
}
|
||||
|
||||
setLoc(newLoc);
|
||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||
|
||||
if (this.getDebug(1))
|
||||
ChatManager.chatSystemInfo(this,
|
||||
@@ -5436,14 +5431,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
return characterHeight;
|
||||
}
|
||||
|
||||
public void setCharacterHeight(float characterHeight) {
|
||||
this.characterHeight = characterHeight;
|
||||
}
|
||||
|
||||
public void setCenterHeight(float centerHeight) {
|
||||
this.centerHeight = centerHeight;
|
||||
}
|
||||
|
||||
public boolean isEnteredWorld() {
|
||||
return enteredWorld;
|
||||
}
|
||||
@@ -5452,40 +5439,10 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
this.enteredWorld = enteredWorld;
|
||||
}
|
||||
|
||||
public long getChannelMute() {
|
||||
return channelMute;
|
||||
}
|
||||
|
||||
public void setChannelMute(long channelMute) {
|
||||
this.channelMute = channelMute;
|
||||
}
|
||||
|
||||
public boolean isLastSwimming() {
|
||||
return lastSwimming;
|
||||
}
|
||||
|
||||
public boolean isTeleporting() {
|
||||
return isTeleporting;
|
||||
}
|
||||
|
||||
public void setTeleporting(boolean isTeleporting) {
|
||||
this.isTeleporting = isTeleporting;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void teleport(final Vector3fImmutable targetLoc) {
|
||||
|
||||
Regions targetRegion = Regions.GetRegionForTeleport(targetLoc);
|
||||
locationLock.writeLock().lock();
|
||||
|
||||
try {
|
||||
MovementManager.translocate(this, targetLoc, targetRegion);
|
||||
} catch (Exception e) {
|
||||
Logger.error(e);
|
||||
} finally {
|
||||
locationLock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public ReadWriteLock getTeleportLock() {
|
||||
return teleportLock;
|
||||
|
||||
@@ -3,6 +3,7 @@ package engine.objects;
|
||||
import engine.Enum;
|
||||
import engine.Enum.PortalType;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.BuildingManager;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.job.JobScheduler;
|
||||
import engine.jobs.CloseGateJob;
|
||||
@@ -104,7 +105,7 @@ public class Portal {
|
||||
if (player.getTimeStamp("lastMoveGate") < this.lastActive)
|
||||
return;
|
||||
|
||||
player.teleport(targetGate.getLoc());
|
||||
player.teleport(targetGate.getLoc().add(0,6,0));//offset height of runegate
|
||||
player.setSafeMode();
|
||||
|
||||
}
|
||||
|
||||
@@ -175,22 +175,6 @@ public class Realm {
|
||||
return (this.rulingCityUUID != 0);
|
||||
}
|
||||
|
||||
public float getMapR() {
|
||||
return this.mapR;
|
||||
}
|
||||
|
||||
public float getMapG() {
|
||||
return this.mapG;
|
||||
}
|
||||
|
||||
public float getMapB() {
|
||||
return this.mapB;
|
||||
}
|
||||
|
||||
public float getMapA() {
|
||||
return this.mapA;
|
||||
}
|
||||
|
||||
public boolean getCanBeClaimed() {
|
||||
return this.canBeClaimed;
|
||||
}
|
||||
@@ -211,37 +195,6 @@ public class Realm {
|
||||
return City.getCity(this.rulingCityUUID);
|
||||
}
|
||||
|
||||
public float getMapY1() {
|
||||
return this.mapY1;
|
||||
}
|
||||
|
||||
public float getMapX1() {
|
||||
return this.mapX1;
|
||||
}
|
||||
|
||||
public float getMapY2() {
|
||||
return this.mapY2;
|
||||
}
|
||||
|
||||
public float getMapX2() {
|
||||
return this.mapX2;
|
||||
}
|
||||
|
||||
public int getStretchX() {
|
||||
return this.stretchX;
|
||||
}
|
||||
|
||||
public int getStretchY() {
|
||||
return this.stretchY;
|
||||
}
|
||||
|
||||
public int getlocX() {
|
||||
return this.locX;
|
||||
}
|
||||
|
||||
public int getlocY() {
|
||||
return this.locY;
|
||||
}
|
||||
|
||||
// Call this after changing ownership before you serialize a realm
|
||||
|
||||
@@ -370,13 +323,6 @@ public class Realm {
|
||||
return charterType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param charterType the charterType to set
|
||||
*/
|
||||
public void setCharterType(int charterType) {
|
||||
this.charterType = charterType;
|
||||
}
|
||||
|
||||
public void abandonRealm() {
|
||||
|
||||
// Push event to warehouse
|
||||
@@ -417,32 +363,4 @@ public class Realm {
|
||||
return hash;
|
||||
}
|
||||
|
||||
public void setHash() {
|
||||
|
||||
this.hash = DataWarehouse.hasher.encrypt(this.realmID);
|
||||
|
||||
// Write hash to player character table
|
||||
|
||||
DataWarehouse.writeHash(Enum.DataRecordType.REALM, this.realmID);
|
||||
}
|
||||
|
||||
/* *** Keeping around in case needed for server wipe or some other emergency
|
||||
|
||||
public static void backfillRealms() {
|
||||
|
||||
// Backfill realm records
|
||||
|
||||
for (Realm realm : _realms.values()) {
|
||||
|
||||
realm.setHash();
|
||||
|
||||
if ( (realm.isRuled() == true) &&
|
||||
(DataWarehouse.recordExists(Enum.DataRecordType.REALM, realm.getRealmID()) == false)) {
|
||||
RealmRecord realmRecord = RealmRecord.borrow(realm, Enum.RecordEventType.CAPTURE);
|
||||
DataWarehouse.pushToWarehouse(realmRecord);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ public class Runegate {
|
||||
|
||||
writer.putInt(gateBuilding.getObjectType().ordinal());
|
||||
writer.putInt(gateBuilding.getObjectUUID());
|
||||
writer.putString(gateBuilding.getParentZone().getName());
|
||||
writer.putString(gateBuilding.getParentZone().zoneName);
|
||||
writer.putFloat(gateBuilding.getLoc().getLat());
|
||||
writer.putFloat(gateBuilding.getLoc().getAlt());
|
||||
writer.putFloat(gateBuilding.getLoc().getLong());
|
||||
|
||||
@@ -1272,7 +1272,7 @@ public class Warehouse extends AbstractWorldObject {
|
||||
return;
|
||||
}
|
||||
|
||||
City city = City.getCity(cityZone.getPlayerCityUUID());
|
||||
City city = City.getCity(cityZone.playerCityUUID);
|
||||
|
||||
if (city == null) {
|
||||
Logger.error("Failed to load City for Warehouse with UUID " + this.getObjectUUID());
|
||||
|
||||
+133
-191
@@ -10,7 +10,7 @@
|
||||
package engine.objects;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.db.archive.DataWarehouse;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
@@ -33,101 +33,135 @@ public class Zone extends AbstractGameObject {
|
||||
public final Set<Building> zoneBuildingSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||
public final Set<NPC> zoneNPCSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||
public final Set<Mob> zoneMobSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||
private final int playerCityID;
|
||||
private final String zoneName;
|
||||
private final float xCoord;
|
||||
private final float zCoord;
|
||||
private final float yCoord;
|
||||
private final int loadNum;
|
||||
private final byte safeZone;
|
||||
private final String Icon1;
|
||||
private final String Icon2;
|
||||
private final String Icon3;
|
||||
public final int playerCityUUID;
|
||||
public final String zoneName;
|
||||
public final float xOffset;
|
||||
public final float zOffset;
|
||||
public final float yOffset;
|
||||
public final int template;
|
||||
public final byte peace_zone;
|
||||
public final String icon1;
|
||||
public final String icon2;
|
||||
public final String icon3;
|
||||
public float absX = 0.0f;
|
||||
public float absY = 0.0f;
|
||||
public float absZ = 0.0f;
|
||||
public int minLvl;
|
||||
public int maxLvl;
|
||||
public int min_level;
|
||||
public int max_level;
|
||||
public boolean hasBeenHotzone = false;
|
||||
private ArrayList<Zone> nodes = null;
|
||||
private int parentZoneID;
|
||||
private Zone parent = null;
|
||||
private Bounds bounds;
|
||||
private boolean isNPCCity = false;
|
||||
private boolean isPlayerCity = false;
|
||||
private String hash;
|
||||
public float worldAltitude = 0;
|
||||
private float seaLevel = 0;
|
||||
//public static ArrayList<Mob> respawnQue = new ArrayList<>();
|
||||
public ArrayList<Zone> nodes = null;
|
||||
public int parentZoneID;
|
||||
public Zone parent = null;
|
||||
public Bounds bounds;
|
||||
public boolean isNPCCity = false;
|
||||
public boolean guild_zone;
|
||||
public String hash;
|
||||
public float global_height = 0;
|
||||
public float seaLevel = 0f;
|
||||
public float sea_level_offset = 0;
|
||||
public static final Set<Mob> respawnQue = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||
public static long lastRespawn = 0;
|
||||
public float major_radius;
|
||||
public float minor_radius;
|
||||
public float min_blend;
|
||||
public float max_blend;
|
||||
public String sea_level_type;
|
||||
public float sea_level;
|
||||
public String terrain_type;
|
||||
public float terrain_max_y;
|
||||
public int terrain_image;
|
||||
|
||||
public Terrain terrain = null;
|
||||
|
||||
/**
|
||||
* ResultSet Constructor
|
||||
*/
|
||||
public Zone(ResultSet rs) throws SQLException {
|
||||
|
||||
super(rs);
|
||||
this.parentZoneID = rs.getInt("parent");
|
||||
this.playerCityID = rs.getInt("isPlayerCity");
|
||||
this.isPlayerCity = this.playerCityID != 0;
|
||||
this.zoneName = rs.getString("Name");
|
||||
this.xCoord = rs.getFloat("XCoord");
|
||||
this.zCoord = rs.getFloat("ZCoord");
|
||||
this.yCoord = rs.getFloat("YOffset");
|
||||
this.loadNum = rs.getInt("LoadNum");
|
||||
this.safeZone = rs.getByte("SafeZone");
|
||||
this.Icon1 = rs.getString("Icon1");
|
||||
this.Icon2 = rs.getString("Icon2");
|
||||
this.Icon3 = rs.getString("Icon3");
|
||||
this.hash = rs.getString("hash");
|
||||
|
||||
this.minLvl = rs.getInt("minLvl");
|
||||
this.maxLvl = rs.getInt("maxLvl");
|
||||
this.parentZoneID = rs.getInt("parent");
|
||||
this.playerCityUUID = rs.getInt("playerCityUUID");
|
||||
this.guild_zone = this.playerCityUUID != 0;
|
||||
this.zoneName = rs.getString("zone_name");
|
||||
this.xOffset = rs.getFloat("xOffset");
|
||||
this.zOffset = rs.getFloat("zOffset");
|
||||
this.yOffset = rs.getFloat("yOffset");
|
||||
this.template = rs.getInt("template");
|
||||
this.peace_zone = rs.getByte("peace_zone");
|
||||
this.icon1 = rs.getString("icon1");
|
||||
this.icon2 = rs.getString("icon2");
|
||||
this.icon3 = rs.getString("icon3");
|
||||
this.min_level = rs.getInt("min_level");
|
||||
this.max_level = rs.getInt("max_level");
|
||||
this.major_radius = rs.getFloat("major_radius");
|
||||
this.minor_radius = rs.getFloat("minor_radius");
|
||||
this.min_blend = rs.getFloat("min_blend");
|
||||
this.max_blend = rs.getFloat("max_blend");
|
||||
this.sea_level_type = rs.getString("sea_level_type");
|
||||
this.sea_level_offset = rs.getFloat("sea_level");
|
||||
this.terrain_type = rs.getString("terrain_type");
|
||||
this.terrain_max_y = rs.getFloat("terrain_max_y");
|
||||
this.terrain_image = rs.getInt("terrain_image");
|
||||
|
||||
//this needs to be here specifically for new zones created after server boot (e.g. player city zones)
|
||||
Zone parentZone = ZoneManager.getZoneByUUID(parentZoneID);
|
||||
if (this.guild_zone) {
|
||||
this.max_blend = 128;
|
||||
this.min_blend = 128;
|
||||
this.terrain_max_y = 5;
|
||||
this.major_radius = (int) Enum.CityBoundsType.ZONE.halfExtents;
|
||||
this.minor_radius = (int) Enum.CityBoundsType.ZONE.halfExtents;
|
||||
this.terrain_type = "PLANAR";
|
||||
}
|
||||
|
||||
this.setParent(parentZone);
|
||||
if (this.terrain_type.equals("NONE"))
|
||||
this.terrain = null;
|
||||
else
|
||||
this.terrain = new Terrain(this);
|
||||
|
||||
if (this.minLvl == 0 && parentZone != null) {
|
||||
this.minLvl = parentZone.minLvl;
|
||||
this.maxLvl = parentZone.maxLvl;
|
||||
}
|
||||
//this needs to be here specifically for new zones created after server boot (e.g. player city zones)
|
||||
|
||||
if (parentZone != null)
|
||||
parentZone.addNode(this);
|
||||
Zone parentZone = ZoneManager.getZoneByUUID(parentZoneID);
|
||||
this.setParent(parentZone);
|
||||
|
||||
if (this.min_level == 0 && parentZone != null) {
|
||||
this.min_level = parentZone.min_level;
|
||||
this.max_level = parentZone.max_level;
|
||||
}
|
||||
|
||||
if (parentZone != null)
|
||||
parentZone.addNode(this);
|
||||
|
||||
// If zone doesn't yet hava a hash then write it back to the zone table
|
||||
|
||||
if (hash == null)
|
||||
setHash();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) {
|
||||
|
||||
if (zone.loadNum == 0 && zone.playerCityID == 0)
|
||||
if (zone.template == 0 && zone.playerCityUUID == 0)
|
||||
Logger.warn("Warning! WorldServerMap with ID " + zone.getObjectUUID() + " has a loadnum of 0 (player city) and no city linked. This will probably crash the client!");
|
||||
|
||||
// Player City Terraform values serialized here.
|
||||
|
||||
if (zone.playerCityID > 0) {
|
||||
if (zone.playerCityUUID > 0) {
|
||||
writer.put((byte) 1); // Player City - True
|
||||
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
|
||||
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
|
||||
writer.putFloat(Enum.CityBoundsType.ZONE.halfExtents);
|
||||
writer.putFloat(Enum.CityBoundsType.ZONE.halfExtents);
|
||||
} else
|
||||
writer.put((byte) 0); // Player City - False
|
||||
|
||||
writer.putFloat(zone.xCoord);
|
||||
writer.putFloat(zone.zCoord);
|
||||
writer.putFloat(zone.yCoord);
|
||||
writer.putFloat(zone.xOffset);
|
||||
writer.putFloat(zone.zOffset);
|
||||
writer.putFloat(zone.yOffset);
|
||||
|
||||
writer.putInt(0);
|
||||
writer.putInt(0);
|
||||
writer.putInt(zone.loadNum);
|
||||
writer.putInt(zone.template);
|
||||
|
||||
if (zone.playerCityID > 0) {
|
||||
City k = City.getCity(zone.playerCityID);
|
||||
if (zone.playerCityUUID > 0) {
|
||||
City k = City.getCity(zone.playerCityUUID);
|
||||
|
||||
if (k != null) {
|
||||
writer.putInt(k.getObjectType().ordinal());
|
||||
@@ -140,16 +174,16 @@ public class Zone extends AbstractGameObject {
|
||||
}
|
||||
writer.putInt(zone.nodes.size());
|
||||
|
||||
City city = City.getCity(zone.playerCityID);
|
||||
City city = City.getCity(zone.playerCityUUID);
|
||||
|
||||
if (city != null)
|
||||
writer.putString(city.getCityName());
|
||||
else
|
||||
writer.putString(zone.zoneName);
|
||||
writer.put(zone.safeZone);
|
||||
writer.putString(zone.Icon1);
|
||||
writer.putString(zone.Icon2);
|
||||
writer.putString(zone.Icon3);
|
||||
writer.put(zone.peace_zone);
|
||||
writer.putString(zone.icon1);
|
||||
writer.putString(zone.icon2);
|
||||
writer.putString(zone.icon3);
|
||||
writer.put((byte) 0); // Pad
|
||||
|
||||
for (Zone child : zone.nodes) {
|
||||
@@ -163,65 +197,11 @@ public class Zone extends AbstractGameObject {
|
||||
*/
|
||||
public void setBounds() {
|
||||
|
||||
float halfExtentX;
|
||||
float halfExtentY;
|
||||
|
||||
// Set initial bounds object
|
||||
|
||||
this.bounds = Bounds.borrow();
|
||||
this.bounds.setBounds(new Vector2f(this.absX, this.absZ), new Vector2f(this.major_radius, this.minor_radius), 0.0f);
|
||||
|
||||
// Player cities are assigned default value
|
||||
|
||||
if (this.loadNum == 0) {
|
||||
bounds.setBounds(new Vector2f(this.absX, this.absZ), new Vector2f(Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents), 0.0f);
|
||||
return;
|
||||
}
|
||||
|
||||
Vector2f zoneSize = ZoneManager._zone_size_data.get(this.loadNum);
|
||||
|
||||
// Default to player zone size on error? Maybe log this
|
||||
|
||||
if (zoneSize != null)
|
||||
this.bounds.setBounds(new Vector2f(this.absX, this.absZ), zoneSize, 0.0f);
|
||||
else
|
||||
bounds.setBounds(new Vector2f(this.absX, this.absZ), new Vector2f(Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents), 0.0f);
|
||||
|
||||
}
|
||||
|
||||
public int getPlayerCityUUID() {
|
||||
return this.playerCityID;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return zoneName;
|
||||
}
|
||||
|
||||
public float getXCoord() {
|
||||
return xCoord;
|
||||
}
|
||||
|
||||
public float getYCoord() {
|
||||
return yCoord;
|
||||
}
|
||||
|
||||
public float getZCoord() {
|
||||
return zCoord;
|
||||
}
|
||||
|
||||
public int getLoadNum() {
|
||||
return loadNum;
|
||||
}
|
||||
|
||||
public byte getSafeZone() {
|
||||
return safeZone;
|
||||
}
|
||||
|
||||
public String getIcon1() {
|
||||
return Icon1;
|
||||
}
|
||||
|
||||
public Zone getParent() {
|
||||
return this.parent;
|
||||
}
|
||||
|
||||
public void setParent(final Zone value) {
|
||||
@@ -229,76 +209,65 @@ public class Zone extends AbstractGameObject {
|
||||
this.parent = value;
|
||||
this.parentZoneID = (this.parent != null) ? this.parent.getObjectUUID() : 0;
|
||||
|
||||
// Zone AABB is set here as it's coordinate space is world requiring a parent.
|
||||
|
||||
// Seafloor
|
||||
|
||||
if (this.parent == null) {
|
||||
this.absX = this.xCoord;
|
||||
this.absX = this.xOffset;
|
||||
this.absY = MBServerStatics.SEA_FLOOR_ALTITUDE;
|
||||
this.absZ = this.zCoord;
|
||||
this.global_height = MBServerStatics.SEA_FLOOR_ALTITUDE;
|
||||
this.absZ = this.zOffset;
|
||||
this.seaLevel = 0;
|
||||
this.setBounds();
|
||||
return;
|
||||
}
|
||||
|
||||
this.absX = this.xCoord + parent.absX;
|
||||
this.absY = this.yCoord + parent.absY;
|
||||
this.absZ = this.zCoord + parent.absZ;
|
||||
this.absX = this.xOffset + parent.absX;
|
||||
this.absY = this.yOffset + parent.absY;
|
||||
this.absZ = this.zOffset + parent.absZ;
|
||||
|
||||
if (this.minLvl == 0 || this.maxLvl == 0) {
|
||||
this.minLvl = this.parent.minLvl;
|
||||
this.maxLvl = this.parent.maxLvl;
|
||||
if (this.min_level == 0 || this.max_level == 0) {
|
||||
this.min_level = this.parent.min_level;
|
||||
this.max_level = this.parent.max_level;
|
||||
}
|
||||
|
||||
this.setBounds();
|
||||
|
||||
if (this.getHeightMap() != null && this.getHeightMap().getSeaLevel() != 0)
|
||||
this.seaLevel = this.worldAltitude + this.getHeightMap().getSeaLevel();
|
||||
else
|
||||
this.seaLevel = this.parent.seaLevel;
|
||||
|
||||
this.global_height = ZoneManager.calculateGlobalZoneHeight(this);
|
||||
setSeaLevel();
|
||||
}
|
||||
|
||||
public float getAbsX() {
|
||||
return this.absX;
|
||||
}
|
||||
private void setSeaLevel() {
|
||||
|
||||
public float getAbsY() {
|
||||
return this.absY;
|
||||
}
|
||||
int world_sea_level = 0;
|
||||
|
||||
public float getAbsZ() {
|
||||
return this.absZ;
|
||||
if (this.parent == null) {
|
||||
this.sea_level = world_sea_level;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (this.sea_level_type) {
|
||||
case "WORLD":
|
||||
this.sea_level = world_sea_level + this.sea_level_offset;
|
||||
break;
|
||||
case "PARENT":
|
||||
this.sea_level = this.parent.sea_level + this.sea_level_offset;
|
||||
break;
|
||||
case "SELF":
|
||||
this.sea_level = this.global_height + this.sea_level_offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMacroZone() {
|
||||
|
||||
// Macro zones have icons.
|
||||
|
||||
if (this.isPlayerCity == true)
|
||||
if (this.guild_zone == true)
|
||||
return false;
|
||||
|
||||
if (this.parent == null)
|
||||
return false;
|
||||
|
||||
return !this.getIcon1().equals("");
|
||||
}
|
||||
|
||||
public boolean isNPCCity() {
|
||||
return this.isNPCCity;
|
||||
}
|
||||
|
||||
public void setNPCCity(boolean value) {
|
||||
this.isNPCCity = value;
|
||||
}
|
||||
|
||||
public boolean isPlayerCity() {
|
||||
return this.isPlayerCity;
|
||||
}
|
||||
|
||||
public void setPlayerCity(boolean value) {
|
||||
this.isPlayerCity = value;
|
||||
return !icon1.equals("");
|
||||
}
|
||||
|
||||
public Vector3fImmutable getLoc() {
|
||||
@@ -310,16 +279,15 @@ public class Zone extends AbstractGameObject {
|
||||
}
|
||||
|
||||
public ArrayList<Zone> getNodes() {
|
||||
|
||||
if (this.nodes == null) {
|
||||
this.nodes = DbManager.ZoneQueries.GET_MAP_NODES(super.getObjectUUID());
|
||||
|
||||
//Add reverse lookup for child->parent
|
||||
if (this.nodes != null)
|
||||
for (Zone zone : this.nodes) {
|
||||
for (Zone zone : this.nodes)
|
||||
zone.setParent(this);
|
||||
}
|
||||
}
|
||||
|
||||
return nodes;
|
||||
}
|
||||
|
||||
@@ -338,7 +306,7 @@ public class Zone extends AbstractGameObject {
|
||||
|
||||
public boolean isContinent() {
|
||||
|
||||
if (this.equals(ZoneManager.getSeaFloor()))
|
||||
if (this.equals(ZoneManager.seaFloor))
|
||||
return false;
|
||||
|
||||
if (this.getNodes().isEmpty())
|
||||
@@ -347,21 +315,9 @@ public class Zone extends AbstractGameObject {
|
||||
if (this.getNodes().get(0).isMacroZone())
|
||||
return true;
|
||||
|
||||
return this.getParent().equals(ZoneManager.getSeaFloor());
|
||||
return this.parent.equals(ZoneManager.seaFloor);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the bounds
|
||||
*/
|
||||
public Bounds getBounds() {
|
||||
return bounds;
|
||||
}
|
||||
|
||||
public String getHash() {
|
||||
return hash;
|
||||
}
|
||||
|
||||
public void setHash() {
|
||||
|
||||
this.hash = DataWarehouse.hasher.encrypt(this.getObjectUUID());
|
||||
@@ -371,18 +327,4 @@ public class Zone extends AbstractGameObject {
|
||||
DataWarehouse.writeHash(Enum.DataRecordType.ZONE, this.getObjectUUID());
|
||||
}
|
||||
|
||||
// Return heightmap for this Zone.
|
||||
|
||||
public HeightMap getHeightMap() {
|
||||
|
||||
if (this.isPlayerCity)
|
||||
return HeightMap.PlayerCityHeightMap;
|
||||
|
||||
return HeightMap.heightmapByLoadNum.get(this.loadNum);
|
||||
}
|
||||
|
||||
public float getSeaLevel() {
|
||||
return seaLevel;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class CreateMobPowerAction extends AbstractPowerAction {
|
||||
|
||||
PlayerCharacter owner = (PlayerCharacter) source;
|
||||
Mob currentPet = owner.getPet();
|
||||
Zone seaFloor = ZoneManager.getSeaFloor();
|
||||
Zone seaFloor = ZoneManager.seaFloor;
|
||||
Guild guild = Guild.getErrantGuild();
|
||||
ClientConnection origin = owner.getClientConnection();
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ public class MobRecallPowerAction extends AbstractPowerAction {
|
||||
return;
|
||||
|
||||
|
||||
MovementManager.translocate(awoac, awoac.getBindLoc(), null);
|
||||
MovementManager.translocate(awoac, awoac.getBindLoc());
|
||||
if (awoac.getObjectType() == GameObjectType.Mob) {
|
||||
//MobAI.setAwake((Mob)awoac,true);
|
||||
((Mob) awoac).setCombatTarget(null);
|
||||
|
||||
@@ -58,7 +58,7 @@ public class RecallPowerAction extends AbstractPowerAction {
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, engine.Enum.DispatchChannel.SECONDARY);
|
||||
|
||||
} else {
|
||||
MovementManager.translocate(awoac, awoac.getBindLoc(), null);
|
||||
MovementManager.translocate(awoac, awoac.getBindLoc());
|
||||
}
|
||||
} else {
|
||||
Vector3fImmutable bindloc = awoac.getBindLoc();
|
||||
|
||||
@@ -55,7 +55,7 @@ public class SummonPowerAction extends AbstractPowerAction {
|
||||
String location = "Somewhere";
|
||||
|
||||
if (zone != null)
|
||||
location = zone.getName();
|
||||
location = zone.zoneName;
|
||||
|
||||
RecvSummonsRequestMsg rsrm = new RecvSummonsRequestMsg(source.getObjectType().ordinal(), source.getObjectUUID(), source.getFirstName(),
|
||||
location, false);
|
||||
|
||||
@@ -101,7 +101,7 @@ public class TeleportPowerAction extends AbstractPowerAction {
|
||||
if (region != null && !region.isOutside())
|
||||
return;
|
||||
|
||||
MovementManager.translocate(awoac, targetLoc, region);
|
||||
MovementManager.translocate(awoac, targetLoc);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -136,25 +136,25 @@ public class LoginServerMsgHandler implements NetMsgHandler {
|
||||
cMajorVer = vim.getMajorVersion();
|
||||
cMinorVer = vim.getMinorVersion();
|
||||
|
||||
if (!cMajorVer.equals(this.server.getDefaultVersionInfo().getMajorVersion())) {
|
||||
this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Major Version Failure: " + cMajorVer, cc);
|
||||
return;
|
||||
}
|
||||
// if (!cMajorVer.equals(this.server.getDefaultVersionInfo().getMajorVersion())) {
|
||||
// this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Major Version Failure: " + cMajorVer, cc);
|
||||
// return;
|
||||
// }
|
||||
|
||||
/* if (!cMinorVer.equals(this.server.getDefaultVersionInfo().getMinorVersion())) {
|
||||
this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Minor Version Failure: " + cMinorVer, cc);
|
||||
return;
|
||||
} */
|
||||
|
||||
if (cMinorVer == null) {
|
||||
this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Minor Version Failure: ", cc);
|
||||
return;
|
||||
}
|
||||
// if (cMinorVer == null) {
|
||||
// this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Minor Version Failure: ", cc);
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (cMinorVer.length() < 8 || cMinorVer.length() > 16) {
|
||||
this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Minor Version Failure: ", cc);
|
||||
return;
|
||||
}
|
||||
// if (cMinorVer.length() < 8 || cMinorVer.length() > 16) {
|
||||
// this.KickToLogin(MBServerStatics.LOGINERROR_INCORRECT_CLIENT_VERSION, "Minor Version Failure: ", cc);
|
||||
// return;
|
||||
// }
|
||||
|
||||
// set MachineID for this connection
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import engine.Enum;
|
||||
import engine.Enum.DispatchChannel;
|
||||
import engine.Enum.MinionType;
|
||||
import engine.Enum.SupportMsgType;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.RealmMap;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.archive.DataWarehouse;
|
||||
@@ -39,6 +38,7 @@ import engine.net.client.msg.UpdateStateMsg;
|
||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.util.MapLoader;
|
||||
import engine.util.ThreadUtils;
|
||||
import engine.workthreads.DisconnectTrashTask;
|
||||
import engine.workthreads.HourlyJobThread;
|
||||
@@ -360,9 +360,6 @@ public class WorldServer {
|
||||
Logger.info("Loading item enchants");
|
||||
DbManager.LootQueries.LOAD_ENCHANT_VALUES();
|
||||
|
||||
Logger.info("Loading zone extent cache");
|
||||
DbManager.ZoneQueries.LOAD_ZONE_EXTENTS();
|
||||
|
||||
Logger.info("Loading Realms");
|
||||
Realm.loadAllRealms();
|
||||
|
||||
@@ -385,7 +382,7 @@ public class WorldServer {
|
||||
Blueprint.loadAllBlueprints();
|
||||
|
||||
Logger.info("Initializing Heightmap data");
|
||||
HeightMap.loadAlHeightMaps();
|
||||
MapLoader.loadAlHeightMaps();
|
||||
|
||||
Logger.info("Loading Race data");
|
||||
Enum.RaceType.initRaceTypeTables();
|
||||
@@ -466,14 +463,6 @@ public class WorldServer {
|
||||
Logger.info("Starting Mob AI Thread");
|
||||
MobAIThread.startAIThread();
|
||||
|
||||
for (Zone zone : ZoneManager.getAllZones()) {
|
||||
if (zone.getHeightMap() != null) {
|
||||
if (zone.getHeightMap().getBucketWidthX() == 0) {
|
||||
System.out.println("Zone load num: " + zone.getLoadNum() + " has no bucket width");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logger.info("World data loaded.");
|
||||
|
||||
//set default accesslevel for server *** Refactor who two separate variables?
|
||||
@@ -565,8 +554,7 @@ public class WorldServer {
|
||||
|
||||
for (Zone zone : rootParent) {
|
||||
|
||||
ZoneManager.addZone(zone.getLoadNum(), zone);
|
||||
zone.worldAltitude = ZoneManager.caclulateWorldAltitude(zone);
|
||||
ZoneManager.addZone(zone.template, zone);
|
||||
|
||||
//Handle Buildings
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
package engine.util;
|
||||
|
||||
import engine.InterestManagement.RealmMap;
|
||||
import engine.InterestManagement.Terrain;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
@@ -14,6 +15,10 @@ import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public enum MapLoader {
|
||||
|
||||
@@ -87,4 +92,54 @@ public enum MapLoader {
|
||||
g.dispose();
|
||||
return dimg;
|
||||
}
|
||||
|
||||
public static void loadAlHeightMaps() {
|
||||
|
||||
// Load pixel data for heightmaps
|
||||
|
||||
try (Stream<Path> filePathStream = Files.walk(Paths.get(ConfigManager.DEFAULT_DATA_DIR + "heightmaps/TARGA/"))) {
|
||||
filePathStream.forEach(filePath -> {
|
||||
|
||||
if (Files.isRegularFile(filePath)) {
|
||||
File imageFile = filePath.toFile();
|
||||
|
||||
BufferedImage heightmapImage;
|
||||
|
||||
try {
|
||||
heightmapImage = ImageIO.read(imageFile);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
int fileName = Integer.parseInt(imageFile.getName().substring(0, imageFile.getName().lastIndexOf(".")));
|
||||
boolean singleBandRaster = heightmapImage.getRaster().getNumBands() == 1;
|
||||
int color;
|
||||
|
||||
// Generate pixel data for this heightmap.
|
||||
|
||||
short[][] colorData = new short[heightmapImage.getWidth()][heightmapImage.getHeight()];
|
||||
|
||||
for (int y = 0; y < heightmapImage.getHeight(); y++)
|
||||
for (int x = 0; x < heightmapImage.getWidth(); x++) {
|
||||
|
||||
if (singleBandRaster)
|
||||
color = heightmapImage.getRaster().getSample(x, y, 0);
|
||||
else
|
||||
color = new Color(heightmapImage.getRGB(x, y)).getRed();
|
||||
|
||||
colorData[x][y] = (short) color;
|
||||
}
|
||||
|
||||
// Add pixel for this TGA image into the collection
|
||||
|
||||
Terrain._heightmap_pixel_cache.put(fileName, colorData);
|
||||
}
|
||||
|
||||
}); // Try with resources block
|
||||
|
||||
} catch (IOException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ public class DestroyCityThread implements Runnable {
|
||||
// Member variable assignment
|
||||
|
||||
cityZone = city.getParent();
|
||||
newParent = cityZone.getParent();
|
||||
newParent = cityZone.parent;
|
||||
formerGuild = city.getTOL().getGuild();
|
||||
|
||||
// Former guild loses it's tree!
|
||||
@@ -150,6 +150,6 @@ public class DestroyCityThread implements Runnable {
|
||||
// Zone and city should vanish upon next reboot
|
||||
// if the codebase reaches here.
|
||||
|
||||
Logger.info(city.getParent().getName() + " uuid:" + city.getObjectUUID() + "has been destroyed!");
|
||||
Logger.info(city.getParent().zoneName + " uuid:" + city.getObjectUUID() + "has been destroyed!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ public class HourlyJobThread implements Runnable {
|
||||
mineBuilding.rebuildMine();
|
||||
WorldGrid.updateObject(mineBuilding);
|
||||
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.lastClaimer.getName() + " has claimed the mine in " + mine.getParentZone().getParent().getName() + " for " + mine.getOwningGuild().getName() + ". The mine is no longer active.");
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.lastClaimer.getName() + " has claimed the mine in " + mine.getParentZone().parent.zoneName + " for " + mine.getOwningGuild().getName() + ". The mine is no longer active.");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
@@ -205,7 +205,7 @@ public class HourlyJobThread implements Runnable {
|
||||
if (ZoneManager.hotZone == null) {
|
||||
Logger.error("Null HotZone returned from ZoneManager");
|
||||
} else {
|
||||
Logger.info("HotZone switched to: " + ZoneManager.hotZone.getName());
|
||||
Logger.info("HotZone switched to: " + ZoneManager.hotZone.zoneName);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
Reference in New Issue
Block a user