Commit Graph

283 Commits

Author SHA1 Message Date
duckietm e9efb23518 🆙 Latest Compiled version 2026-04-07 09:21:50 +02:00
duckietm 5e586d1093 🆙 Fix in habbomanager
The getCloneAccounts query had an operator-precedence bug:

WHERE ip_register = ? OR ip_current = ? AND id != ?
-- parsed as:
WHERE ip_register = ? OR (ip_current = ? AND id != ?)

So a user whose ip_register matched themselves would show up in their own clone list. Added parentheses:

WHERE (ip_register = ? OR ip_current = ?) AND id != ?

So please run the 006_HabboManager_fix before you run the update Emulator !
2026-04-07 09:20:15 +02:00
duckietm 65c777dbc8 Merge branch 'dev' of https://github.com/duckietm/Arcturus-Morningstar-Extended into dev 2026-04-07 08:45:44 +02:00
duckietm d161d8da82 🆙 Set all wired interaction type's 2026-04-07 08:45:42 +02:00
DuckieTM 0adb99a962 🆙 Update Gifts 2026-04-05 14:53:10 +02:00
DuckieTM 773694460f 🆙 Small fix Wired Highscore 2026-04-04 16:26:20 +02:00
DuckieTM e6f824aedd 🆙 Wired Core updates
Thanks to Migueg
2026-04-04 16:19:46 +02:00
DuckieTM 0916ff1e0b 🆙 Redone the userwalk flood detection 2026-04-04 08:49:19 +02:00
duckietm c030ea5fc6 🆙 Small update to SQL 2026-04-03 19:10:55 +02:00
duckietm d52609e78b 🆙 Update Optimize script, if run please run again ! 2026-04-03 14:09:25 +02:00
duckietm 791ddf679e 💯 added missing SQL 2026-04-01 11:19:13 +02:00
duckietm 0235421bec 🆙 Latest compiled 2026-04-01 09:08:19 +02:00
duckietm 8459e1a45e 🆙 Remove SQL for emu settings Youtube Thumbnail 2026-03-31 14:55:59 +02:00
duckietm 2246d82dc7 🆙 Fix Youtube TV's 2026-03-31 11:41:08 +02:00
DuckieTM 3bc82ee147 Merge pull request #59 from Lorenzune/feature/pr-20260327
Extend wired runtime metadata and placeholder support
2026-03-31 09:01:11 +02:00
duckietm 62814f2e21 🆙 Added permissions for Furni Editor 2026-03-30 16:21:03 +02:00
duckietm 544ea8c50f 👶 Oepsie in SQL 2026-03-30 13:56:13 +02:00
duckietm 52559dc748 🆙 SQL update file renamed 2026-03-30 13:10:03 +02:00
DuckieTM 88536e4e88 Merge pull request #53 from simoleo89/furnieditor
feat: FurniEditor WebSocket (packets 10040-10045)
2026-03-30 11:12:13 +02:00
DuckieTM 570ff24655 🆙 Update latest compiled version "READ the Description!"
We have upgrade our builder with Java JDK 25 !!!
On Linux please run : apt install openjdk-25-jdk
2026-03-29 16:07:44 +02:00
DuckieTM 0ebb303e0c 🆙 Small security fix Forum Groups & better cache
GuildChangeSettingsEvent 2000ms - Write
GuildForumPostThreadEvent 2000ms - Write
ModerateMessage/Thread 2000ms - Write
ThreadUpdate 2000ms -Write
UpdateSettings 2000ms- Write
MarkAsRead 2000ms - Write
Data/List/Threads/Messages - 500ms Read-only
2026-03-29 16:04:52 +02:00
DuckieTM 33a1a511ce Merge pull request #54 from duckietm/main
Sync Main to Dev
2026-03-29 14:48:57 +02:00
DuckieTM c34bf49e64 🆕 Groups Forums
- Please run the 002_forum_groups.sql !
2026-03-29 14:46:53 +02:00
DuckieTM bf0f246b84 🆙 stage 1 2026-03-28 19:35:00 +01:00
Life 7e736900a3 feat: FurniEditor WebSocket handlers (10040-10045) — search, detail, update, delete, interactions 2026-03-27 20:10:03 +01:00
duckietm 9cbfc6c1db 🆙 Fix Groups Forum SQL code 2026-03-27 17:11:21 +01:00
Lorenzune dfd9cd1357 Extend wired runtime metadata and placeholder support
- add wf_xtra_text_output_furni_name and expand text placeholders for furni, users, bots and pets

- include room, entry, teleport and item metadata needed by the new :wired tools flow

- animate furniture position updates through the wired movement path

- fix teleport pair persistence/lookups for items_teleports with explicit column inserts
2026-03-27 09:37:14 +01:00
DuckieTM f22e4c30a8 Merge pull request #52 from duckietm/dev
Dev
2026-03-26 15:22:04 +01:00
DuckieTM f7a75d8614 Merge pull request #51 from Lorenzune/feature/pr-20260326
Add wired evaluation and text placeholder extras
2026-03-26 15:19:59 +01:00
DuckieTM 00893b1436 Merge pull request #50 from duckietm/dev
🆙 Fix rooms loading
2026-03-26 15:19:23 +01:00
duckietm 95aea934bd 🆙 Fix rooms loading
- Layout Cache (eliminates 1 DB query per room load)

Standard room models (model_a, model_b, etc.) are loaded once at startup and cached in memory
RoomLayout gets a new constructor from cached data instead of ResultSet
~99% of rooms use standard models, so this saves a DB round-trip on nearly every room load

- Better Parallel Pipeline (reduced critical path)

Before: layout → [items|rights|wordfilter] → heightmap → [bots|pets|wired]
After:  layout → [items|rights|wordfilter|bots|pets] → [heightmap|wired]

Bots and pets only need layout for positioning, not items - so they now start immediately
Wired only needs items loaded (not heightmap) - so it now runs parallel with heightmap

-  Deferred Promotion Query (faster Room instantiation)

Moved room_promotions DB query from constructor to loadDataInternal() as an async task
Room constructor now only runs bans query (needed for entry check)
Saves ~20ms per Room instantiation for promoted rooms

-  Smart Heightmap (reduced tile iterations by 80-95%)

Instead of updating ALL tiles (1024 for 32x32 room), only updates tiles with items on them
Uses getTilesAt() for correct rotation-aware multi-tile coverage
For a room with 100 items on a 32x32 grid: ~200 tile updates instead of 1024
2026-03-26 12:44:12 +01:00
DuckieTM caf7affe77 Merge pull request #49 from duckietm/dev
Dev
2026-03-26 10:48:02 +01:00
duckietm b755828d85 🆙 Small fix UserCreditsComposer
se this instead of this.client.getHabbo() since giveCredits() is already called on the Habbo instance itself. No need for the round-trip through the client.
2026-03-26 10:43:26 +01:00
duckietm 31ebb96a9c 🆙 Speeds up the badge loading 2026-03-26 10:15:40 +01:00
duckietm f2d8f109ff 🆙 Optimization for the gameserver
- Room Cleanup Optimization (RoomManager.java)

Added roomsByOwner ConcurrentHashMap that tracks which rooms belong to which owner
clearInactiveRooms() now iterates unique owners instead of ALL rooms
Went from O(rooms × clients) to O(unique_owners × clients) every 120s

 - Volatile Fields (Room.java)

Removed volatile from 27 room config fields (score, category, chatMode, allowPets, etc.)
Kept volatile only on 8 fields that genuinely need cross-thread visibility (loaded, preLoaded, needsUpdate, muted, etc.)
Reduces CPU cache line invalidation on every room cycle tick

- Search Cache TTL (SearchUserEvent.java + CleanerThread.java)

SearchUserEvent now has 30-second TTL per entry instead of full wipe every 10s
SearchRoomsEvent already had LRU eviction (max 200) — removed redundant .clear() call
Frequently searched users stay cached, only stale entries get cleaned

- scheduledComposers/scheduledTasks — After reading the code, these are actually already handled correctly: processScheduledTasks() swaps the set with a fresh one before processing, and processScheduledComposers() calls .clear() after sending. No leak risk.
2026-03-26 09:59:02 +01:00
duckietm 5319e5e5c3 🆙 Database performance fixes
1. HabboManager - O(1) username lookup
Before: getHabbo(String) held a synchronized lock and iterated ALL online users every call
After: Secondary ConcurrentHashMap<String, Habbo> keyed by lowercase username → instant get() lookup, no lock contention

2. ItemsComponent - Batch DB saves
Before: dispose() spawned a separate thread per dirty item, each opening its own DB connection
After: Single connection, JDBC addBatch()/executeBatch() for both UPDATE and DELETE, flushed every 100 items. A user with 500 dirty items now does 5 batch executions instead of 500 thread spawns + 500 connections.

3. AcceptFriendRequestEvent - N+1 elimination
Before: For each offline user: query 1 (getOfflineHabboInfo by ID) → query 2 (load full Habbo by username) = 2 queries × up to 100 users = 200 queries
After: Single query by user ID directly = 1 query × up to 100 users = 100 queries (50% reduction)

4. RoomManager - Direct HashMap lookup
Before: getCategory(int id) iterated all categories checking getId() == id even though the map is already keyed by ID
After: Direct roomCategories.get(id) → O(1) instead of O(n)
2026-03-26 09:41:31 +01:00
duckietm f2b0ba0138 🆙 Start working on SQL 2026-03-26 09:20:49 +01:00
duckietm 954d0d9703 Stop tracking .idea directory 2026-03-26 09:18:24 +01:00
duckietm 7c0d3c2405 Stop tracking .idea directory 2026-03-26 09:17:35 +01:00
Lorenzune 32d2915b78 Add wired evaluation and text placeholder extras 2026-03-26 05:24:53 +01:00
DuckieTM 8a0fe42c94 Merge pull request #48 from duckietm/dev
🆙 Bump to Version 4.1.0
2026-03-25 12:46:58 +01:00
duckietm d4c0ddf09c 🆙 Bump to Version 4.1.0 2026-03-25 12:46:07 +01:00
DuckieTM 1d4000ea89 Merge pull request #47 from duckietm/dev
Dev
2026-03-25 12:40:01 +01:00
DuckieTM f57eefed0f Merge pull request #44 from simoleo89/dev
Fix CatalogPagesListComposer parsing error in Nitro client
2026-03-25 07:49:45 +01:00
DuckieTM 5aa20d8551 Merge pull request #46 from duckietm/dev
Dev
2026-03-25 07:43:45 +01:00
DuckieTM 50b120bee2 Merge pull request #45 from Lorenzune/feature/pr-20260325
Refine wired movement sync, extra behavior, and source handling
2026-03-25 07:38:32 +01:00
Lorenzune e5fbf6f8f4 Refine wired movement, extras, and source handling 2026-03-25 03:26:27 +01:00
Life 0a56f46d28 Fix CatalogPagesListComposer parsing error in Nitro client
The Nitro client's NodeData parser enforces safety limits (max 1000 offers,
500 children, 20 depth) using Math.min() on the count but the server was
sending all data beyond those limits. The unread bytes left in the buffer
corrupted parsing of subsequent nodes, causing RangeError.

Cap server-side output to match client limits and snapshot offerIds array
to prevent potential race conditions between size() and iteration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 21:52:55 +01:00
DuckieTM 195525a997 Merge pull request #43 from duckietm/dev
Dev
2026-03-24 11:50:02 +01:00
DuckieTM 0dc0c45096 Merge pull request #42 from Lorenzune/feature/wired-followups-20260324
Refine wired movement and extra behavior
2026-03-24 07:15:13 +01:00