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