diff --git a/src/engine/db/archive/PvpRecord.java b/src/engine/db/archive/PvpRecord.java index 8a09ef52..231fe03c 100644 --- a/src/engine/db/archive/PvpRecord.java +++ b/src/engine/db/archive/PvpRecord.java @@ -280,7 +280,7 @@ public class PvpRecord extends DataRecord { outStatement.setString(7, DataWarehouse.hasher.encrypt(victimGuild.getNation().getObjectUUID())); outStatement.setInt(8, this.victim.getLevel()); - outStatement.setString(9, DataWarehouse.hasher.encrypt(zone.getObjectUUID())); + outStatement.setString(9, DataWarehouse.hasher.encryptObjectID(zone.getObjectUUID())); outStatement.setString(10, zone.zoneName); outStatement.setFloat(11, this.location.getX()); outStatement.setFloat(12, -this.location.getZ()); // flip sign on 'y' coordinate diff --git a/src/engine/objects/Zone.java b/src/engine/objects/Zone.java index e199ffe1..d0914a6a 100644 --- a/src/engine/objects/Zone.java +++ b/src/engine/objects/Zone.java @@ -135,7 +135,7 @@ public class Zone extends AbstractWorldObject { zone.max_level = MACRO_ZONE_MAX_LEVEL; } - zone.hash = DataWarehouse.hasher.encrypt(zone.getObjectUUID()); + zone.hash = DataWarehouse.hasher.encryptObjectID(zone.getObjectUUID()); return zone; } diff --git a/src/engine/util/Hasher.java b/src/engine/util/Hasher.java index be5ef51d..9b3dacbc 100644 --- a/src/engine/util/Hasher.java +++ b/src/engine/util/Hasher.java @@ -245,6 +245,16 @@ public class Hasher { return encode(numbers, alphabet_, salt_, minHashLength_); } + // encode() fails on negative numbers, and static world objects have negative IDs. A static ID hashes as + // the pair (0, -id), which no single positive ID can produce. + public String encryptObjectID(long objectID) { + + if (objectID < 0) + return encrypt(0, -objectID); + + return encrypt(objectID); + } + public long[] decrypt(String hash) { return decode(hash); }