diff --git a/src/resources/commands/callbacks/WaypointCmdCallback.java b/src/resources/commands/callbacks/WaypointCmdCallback.java index a3304c1ed..b34753d8d 100644 --- a/src/resources/commands/callbacks/WaypointCmdCallback.java +++ b/src/resources/commands/callbacks/WaypointCmdCallback.java @@ -63,9 +63,14 @@ public class WaypointCmdCallback implements ICmdCallback { if (Terrain.getTerrainFromName(cmdArgs[0]) != null) { // Terrain's name could also be part of the waypoint name, check to see if next few args are coords try { - x = Float.parseFloat(cmdArgs[1]); - if (cmdArgs.length >= 3) // Just to be sure.. Maybe someone wanted some numbers in the name. - z = Float.parseFloat(cmdArgs[2]); + if (cmdArgs.length > 2) { + x = Float.parseFloat(cmdArgs[1]); + if (cmdArgs.length >= 3) { + z = Float.parseFloat(cmdArgs[2]); // Just to be sure.. Maybe someone wanted some numbers in the name. + if (cmdArgs.length != 6) + cmdArgs = args.split(" ", 6); + } + } } catch (NumberFormatException e) { // This is just a named waypoint. cmdArgs = new String[]{args}; @@ -81,7 +86,8 @@ public class WaypointCmdCallback implements ICmdCallback { z = Float.parseFloat(cmdArgs[3]); // Ensure 100% this is a 6 argument command as the first param MUST be the planet name if (Terrain.getTerrainFromName(cmdArgs[0]) != null) - cmdArgs = args.split(" ", 6); + if (cmdArgs.length != 6) + cmdArgs = args.split(" ", 6); else cmdArgs = args.split(" ", 4); } catch (NumberFormatException e) { // This is intended for a name, should be 4 params @@ -135,7 +141,9 @@ public class WaypointCmdCallback implements ICmdCallback { color = WaypointColor.fromString(cmdArgs[4]); name = cmdArgs[5]; break; - default: break; + default: + // Not a valid format for /waypoint command + return; } Location location = new Location(player.getCreatureObject().getLocation()); @@ -146,26 +154,36 @@ public class WaypointCmdCallback implements ICmdCallback { if (!Float.isNaN(z)) location.setZ(z); + boolean differentPlanetMessage = false; if (terrain != null) { if (terrain != location.getTerrain()) { location.setTerrain(terrain); + differentPlanetMessage = true; } } if (name == null) name = "Waypoint"; - if (Float.isNaN(x) || Float.isNaN(z)) - return; - WaypointObject waypoint = createWaypoint(galacticManager.getObjectManager(), color, name, location); ghost.addWaypoint(waypoint); + + if (differentPlanetMessage) { + new ChatBroadcastIntent(player, "Waypoint: New waypoint \""+ name + "\" created for location " + + terrain.getName() + " (" + String.format("%.0f", location.getX()) + ", " + + String.format("%.0f", location.getY()) + ", "+ String.format("%.0f", location.getZ()) + ")").broadcast(); + } else { + new ChatBroadcastIntent(player, "Waypoint: New waypoint \""+ name + "\" created for location (" + + String.format("%.0f", location.getX()) + ", "+ String.format("%.0f", location.getY()) + + ", "+ String.format("%.0f", location.getZ()) + ")").broadcast(); + } } private WaypointObject createWaypoint(ObjectManager objManager, WaypointColor color, String name, Location location) { WaypointObject waypoint = (WaypointObject) objManager.createObject("object/waypoint/shared_waypoint.iff", location, false); waypoint.setColor(color); waypoint.setName(name); + // TODO: Check if the location collides with a building, and if it does then set the proper cellId return waypoint; } diff --git a/src/resources/encodables/OutOfBandPackage.java b/src/resources/encodables/OutOfBandPackage.java index 820a6d246..83962a2a5 100644 --- a/src/resources/encodables/OutOfBandPackage.java +++ b/src/resources/encodables/OutOfBandPackage.java @@ -83,7 +83,7 @@ public class OutOfBandPackage implements Encodable { } public void decode(ByteBuffer data) { - int size = data.getInt(); + int size = data.getInt() * 2; for (int read = 0; read < size; read+= 3) { boolean addedByte = data.getShort() > 0; // ?? Seen as 1 diff --git a/src/resources/objects/waypoint/WaypointObject.java b/src/resources/objects/waypoint/WaypointObject.java index 8ef8abaa8..3afd881cc 100644 --- a/src/resources/objects/waypoint/WaypointObject.java +++ b/src/resources/objects/waypoint/WaypointObject.java @@ -45,7 +45,7 @@ public class WaypointObject extends IntangibleObject implements OutOfBandPackage private static final long serialVersionUID = 1L; - private int cellNumber; + private long cellId; private String name = "New Waypoint"; private WaypointColor color = WaypointColor.BLUE; private boolean active = true; @@ -54,44 +54,38 @@ public class WaypointObject extends IntangibleObject implements OutOfBandPackage super(objectId, BaselineType.WAYP); } - - public int getCellNumber() { - return cellNumber; - } - - - public void setCellNumber(int cellNumber) { - this.cellNumber = cellNumber; - } - public String getName() { return name; } - public void setName(String name) { this.name = name; } - public WaypointColor getColor() { return color; } - public void setColor(WaypointColor color) { this.color = color; } - public boolean isActive() { return active; } - + public void setActive(boolean active) { this.active = active; } + public long getCellId() { + return cellId; + } + + public void setCellId(long cellId) { + this.cellId = cellId; + } + public void createObject(Player target) { // NOTE: Client is never sent a WAYP baseline in NGE, WaypointObject's just go inside the Waypoint List in PLAY. } @@ -100,11 +94,11 @@ public class WaypointObject extends IntangibleObject implements OutOfBandPackage public byte[] encode() { Location loc = getLocation(); ByteBuffer bb = ByteBuffer.allocate(42 + name.length() * 2).order(ByteOrder.LITTLE_ENDIAN); - bb.putInt(cellNumber); + bb.putInt(0); bb.putFloat((float) loc.getX()); bb.putFloat((float) loc.getY()); bb.putFloat((float) loc.getZ()); - bb.putLong(0); + bb.putLong(cellId); bb.putInt(CRC.getCrc(loc.getTerrain().getName())); bb.put(Encoder.encodeUnicode(name)); bb.putLong(getObjectId()); @@ -130,7 +124,7 @@ public class WaypointObject extends IntangibleObject implements OutOfBandPackage data.getInt(); // -3 data.getInt(); setLocation(data.getFloat(), data.getFloat(), data.getFloat()); - data.getLong(); + cellId = data.getLong(); getLocation().setTerrain(Terrain.getTerrainFromCrc(data.getInt())); name = Packet.getUnicode(data); data.getLong(); @@ -145,14 +139,14 @@ public class WaypointObject extends IntangibleObject implements OutOfBandPackage return false; if (o instanceof WaypointObject) { WaypointObject wp = (WaypointObject) o; - return wp.name.equals(name) && wp.cellNumber == cellNumber && wp.color == color && wp.active == active; + return wp.name.equals(name) && wp.cellId == cellId && wp.color == color && wp.active == active; } return false; } @Override public int hashCode() { - return ((super.hashCode() * 7 + name.hashCode()) * 13 + color.getValue()) * 17 + cellNumber; + return ((super.hashCode() * 7 + name.hashCode()) * 13 + color.getValue()) * 17 + (int) cellId; } @Override