From 770739c256119013bf1de0142c0123f70078eee2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:16:33 +0000 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=86=99=20Bump=20version=20to=204.2.40?= =?UTF-8?q?=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Emulator/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emulator/pom.xml b/Emulator/pom.xml index ada1fd06..0c9dbc31 100644 --- a/Emulator/pom.xml +++ b/Emulator/pom.xml @@ -6,7 +6,7 @@ com.eu.habbo Habbo - 4.2.39 + 4.2.40 UTF-8 From 54ab6613f150c4c85c7e2b930b46c27874eb43b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:18:32 +0000 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=86=99=20Bump=20version=20to=204.2.41?= =?UTF-8?q?=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Emulator/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emulator/pom.xml b/Emulator/pom.xml index 0c9dbc31..9ac4f054 100644 --- a/Emulator/pom.xml +++ b/Emulator/pom.xml @@ -6,7 +6,7 @@ com.eu.habbo Habbo - 4.2.40 + 4.2.41 UTF-8 From d95e09e64f4a62faa14aee85419ad88824cf7fee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 13:10:40 +0000 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=86=99=20Bump=20version=20to=204.2.42?= =?UTF-8?q?=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Emulator/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emulator/pom.xml b/Emulator/pom.xml index 9ac4f054..7bbdf29f 100644 --- a/Emulator/pom.xml +++ b/Emulator/pom.xml @@ -6,7 +6,7 @@ com.eu.habbo Habbo - 4.2.41 + 4.2.42 UTF-8 From cd60cba35563340c6da43d3f2d21ac674193895b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 13:32:38 +0000 Subject: [PATCH 4/6] =?UTF-8?q?=F0=9F=86=99=20Bump=20version=20to=204.2.43?= =?UTF-8?q?=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Emulator/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emulator/pom.xml b/Emulator/pom.xml index 7bbdf29f..9311738f 100644 --- a/Emulator/pom.xml +++ b/Emulator/pom.xml @@ -6,7 +6,7 @@ com.eu.habbo Habbo - 4.2.42 + 4.2.43 UTF-8 From 2a28fbd2e5c578dd7bed552e9b13b2ac77d8323c Mon Sep 17 00:00:00 2001 From: hotellidev <291052888+hotellidev@users.noreply.github.com> Date: Thu, 11 Jun 2026 04:07:22 +0300 Subject: [PATCH 5/6] Fix multicolor furni in furni editor --- .../furnieditor/FurniDataManager.java | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/furnieditor/FurniDataManager.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/furnieditor/FurniDataManager.java index e575a45f..1156df90 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/furnieditor/FurniDataManager.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/furnieditor/FurniDataManager.java @@ -78,12 +78,24 @@ public class FurniDataManager { try { CachedIndex index = indexFor(source); + + // 1. Try exact classname match (preserves *N suffix for multicolor items) String key = baseClassname(classname); String byClassname = key != null ? index.byClassname.get(key) : null; if (byClassname != null) { return new LookupResult(byClassname, diagnostic(source, itemId, classname, "matched_classname")); } + // 2. Fallback: try stripped classname (without *N suffix) for items whose + // furnidata entry does not include the color-variant suffix. + String strippedKey = strippedClassname(classname); + if (strippedKey != null && !strippedKey.equals(key)) { + String byStripped = index.byClassname.get(strippedKey); + if (byStripped != null) { + return new LookupResult(byStripped, diagnostic(source, itemId, classname, "matched_classname_stripped")); + } + } + String byId = index.byId.get(itemId); if (byId != null) { return new LookupResult(byId, diagnostic(source, itemId, classname, "matched_id")); @@ -258,21 +270,58 @@ public class FurniDataManager { JsonObject obj = el.getAsJsonObject(); if (!obj.has("classname")) continue; + // Try exact match first (preserves *N suffix) String actual = baseClassname(obj.get("classname").getAsString()); if (wanted.equals(actual)) return obj.toString(); } } + // Fallback: try stripped classname (without *N suffix) + String strippedWanted = strippedClassname(classname); + if (strippedWanted != null && !strippedWanted.equals(wanted)) { + for (String section : SECTIONS) { + if (!root.has(section)) continue; + JsonObject sectionObj = root.getAsJsonObject(section); + if (!sectionObj.has("furnitype")) continue; + JsonArray types = sectionObj.getAsJsonArray("furnitype"); + + for (JsonElement el : types) { + JsonObject obj = el.getAsJsonObject(); + if (!obj.has("classname")) continue; + + String actual = strippedClassname(obj.get("classname").getAsString()); + if (strippedWanted.equals(actual)) return obj.toString(); + } + } + } + return null; } + /** + * Normalize a classname for index/lookup. + * + * Preserves the full classname including any {@code *N} color-variant suffix + * so that multicolor items (e.g. {@code rare_dragonlamp*1}, {@code rare_dragonlamp*2}) + * each get their own index entry. The stripped variant (without {@code *N}) is + * used as a fallback during lookup for items whose furnidata entry does not + * include the suffix. + */ private static String baseClassname(String classname) { if (classname == null) return null; + String base = classname.trim().toLowerCase(java.util.Locale.ROOT); + return base.isEmpty() ? null : base; + } + /** + * Like {@link #baseClassname(String)} but strips any trailing {@code *N} + * color-variant suffix. Used as a fallback during lookup. + */ + private static String strippedClassname(String classname) { + if (classname == null) return null; int star = classname.indexOf('*'); String base = star >= 0 ? classname.substring(0, star) : classname; base = base.trim().toLowerCase(java.util.Locale.ROOT); - return base.isEmpty() ? null : base; } From 510e0d082ee1ffad867c6360c4b44dd112945db4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:53:22 +0000 Subject: [PATCH 6/6] =?UTF-8?q?=F0=9F=86=99=20Bump=20version=20to=204.2.44?= =?UTF-8?q?=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Emulator/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Emulator/pom.xml b/Emulator/pom.xml index 9311738f..b281492a 100644 --- a/Emulator/pom.xml +++ b/Emulator/pom.xml @@ -6,7 +6,7 @@ com.eu.habbo Habbo - 4.2.43 + 4.2.44 UTF-8