From 2f64fd43a32d6d8c1b5c17a6adf5e17b82a87dd8 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Tue, 27 Oct 2026 23:31:24 -0400 Subject: [PATCH] Hash negative zone IDs for warehouse records without failing Hasher.encode indexes arrays with the number, so a negative static zone ID (World Boot Plan 2.4) throws. encryptObjectID hashes a negative ID as the pair (0, -id), which no single positive ID can produce; positive IDs hash as before. Static zones and PvP records use it; mine records read the zone's stored hash. Value changes: none until static zones take negative IDs. Co-Authored-By: Claude Opus 5.5 --- src/engine/db/archive/PvpRecord.java | 2 +- src/engine/objects/Zone.java | 2 +- src/engine/util/Hasher.java | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) 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); }