From 237c3a3425cb8ea6a9e577981e94793855b011cc Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Wed, 17 Jun 2026 19:04:56 +0200 Subject: [PATCH] fix(wired): bound team condition inputs --- .../WiredConditionTeamGameBase.java | 7 +- .../conditions/WiredConditionTeamHasRank.java | 8 +- .../WiredConditionTeamHasScore.java | 8 +- .../WiredConditionTeamGameBaseTest.java | 91 +++++++++++++++++++ 4 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBaseTest.java diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBase.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBase.java index 1b5dd1d9..7fb26faa 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBase.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBase.java @@ -29,6 +29,7 @@ abstract class WiredConditionTeamGameBase extends InteractionWiredCondition { protected static final int COMPARISON_EQUAL = 1; protected static final int COMPARISON_HIGHER = 2; protected static final int TEAM_TRIGGERER = 0; + protected static final int MAX_SCORE = 1_000_000; private static final GameTeamColors[] SUPPORTED_TEAM_COLORS = new GameTeamColors[] { GameTeamColors.RED, @@ -96,7 +97,11 @@ abstract class WiredConditionTeamGameBase extends InteractionWiredCondition { } protected int normalizeScore(int value) { - return Math.max(0, value); + if (value < 0) { + return 0; + } + + return Math.min(value, MAX_SCORE); } protected int normalizeExplicitTeamType(int value) { diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasRank.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasRank.java index 58272197..2a634424 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasRank.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasRank.java @@ -65,7 +65,13 @@ public class WiredConditionTeamHasRank extends WiredConditionTeamGameBase { return; } - JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class); + JsonData data; + try { + data = WiredManager.getGson().fromJson(wiredData, JsonData.class); + } catch (RuntimeException ignored) { + this.resetSettings(); + return; + } if (data == null) { return; } diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasScore.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasScore.java index e85741a6..e5912127 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasScore.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamHasScore.java @@ -66,7 +66,13 @@ public class WiredConditionTeamHasScore extends WiredConditionTeamGameBase { return; } - JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class); + JsonData data; + try { + data = WiredManager.getGson().fromJson(wiredData, JsonData.class); + } catch (RuntimeException ignored) { + this.resetSettings(); + return; + } if (data == null) { return; } diff --git a/Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBaseTest.java b/Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBaseTest.java new file mode 100644 index 00000000..a4d94eae --- /dev/null +++ b/Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamGameBaseTest.java @@ -0,0 +1,91 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.wired.core.WiredSourceUtil; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class WiredConditionTeamGameBaseTest { + + private final ExposedTeamGameBase guard = new ExposedTeamGameBase(); + + @Test + void scoresAreNonNegativeAndCapped() { + assertEquals(0, this.guard.score(-1)); + assertEquals(42, this.guard.score(42)); + assertEquals(WiredConditionTeamGameBase.MAX_SCORE, this.guard.score(Integer.MAX_VALUE)); + } + + @Test + void userSourcesFallBackToTriggerWhenUnknown() { + assertEquals(WiredSourceUtil.SOURCE_TRIGGER, this.guard.userSource(-1)); + assertEquals(WiredSourceUtil.SOURCE_SELECTOR, this.guard.userSource(WiredSourceUtil.SOURCE_SELECTOR)); + } + + @Test + void teamTypesAndPlacementsStayInSupportedRange() { + assertEquals(1, this.guard.placement(-1)); + assertEquals(4, this.guard.placement(4)); + assertEquals(1, this.guard.explicitTeamType(-1)); + assertEquals(4, this.guard.explicitTeamType(4)); + } + + private static class ExposedTeamGameBase extends WiredConditionTeamGameBase { + private ExposedTeamGameBase() { + super(0, 0, null, "", 0, 0); + } + + @Override + public com.eu.habbo.habbohotel.wired.WiredConditionType getType() { + return com.eu.habbo.habbohotel.wired.WiredConditionType.TEAM_HAS_SCORE; + } + + @Override + public boolean evaluate(com.eu.habbo.habbohotel.wired.core.WiredContext ctx) { + return false; + } + + @Override + public boolean execute(com.eu.habbo.habbohotel.rooms.RoomUnit roomUnit, com.eu.habbo.habbohotel.rooms.Room room, Object[] stuff) { + return false; + } + + @Override + public boolean saveData(com.eu.habbo.habbohotel.items.interactions.wired.WiredSettings settings) { + return false; + } + + @Override + public void onPickUp() { + } + + @Override + public String getWiredData() { + return ""; + } + + @Override + public void loadWiredData(java.sql.ResultSet set, com.eu.habbo.habbohotel.rooms.Room room) { + } + + @Override + public void serializeWiredData(com.eu.habbo.messages.ServerMessage message, com.eu.habbo.habbohotel.rooms.Room room) { + } + + int score(int value) { + return this.normalizeScore(value); + } + + int userSource(int value) { + return this.normalizeUserSource(value); + } + + int placement(int value) { + return this.normalizePlacement(value); + } + + int explicitTeamType(int value) { + return this.normalizeExplicitTeamType(value); + } + } +}