Commit Graph

987 Commits

Author SHA1 Message Date
DuckieTM c69ccba51d Merge pull request #242 from simoleo89/fix/modtools-bugs
fix(mod-tools): default-sanction topic id & alert typos
2026-06-15 07:15:52 +02:00
DuckieTM 75cd2791f8 Merge pull request #241 from simoleo89/fix/wired-bugs
fix(wired): @altitude scale & date-range NaN
2026-06-15 07:15:31 +02:00
DuckieTM 6fb8387afd Merge pull request #240 from simoleo89/fix/room-widget-bugs
fix(room): name-bubble, pet-fertilize chat & word-quiz bugs
2026-06-15 07:15:09 +02:00
DuckieTM 3eec31629f Merge pull request #239 from simoleo89/fix/messenger-setread-render
fix(messenger): mark thread read in an effect, not during render
2026-06-15 07:14:47 +02:00
DuckieTM abce531616 Merge pull request #238 from simoleo89/fix/inventory-state-bugs
fix(inventory): state-mutation & stale-read bugs
2026-06-15 07:14:28 +02:00
DuckieTM f1c9e1baee Merge pull request #237 from simoleo89/feat/furni-editor-create-missing
feat(furni-editor): create furnidata entry when missing (upsert Save)
2026-06-15 07:14:04 +02:00
simoleo89 b27f48f2a2 feat(furni-editor): sync empty public_name from furnidata name
When a furni has a matching furnidata entry with a display name but its
items_base.public_name (the DB fallback) is empty, the editor now shows a
'Sync from furnidata' button next to the Public Name field. It reuses the
generic item update (a partial { publicName } payload) to fill the DB column
from the stored furnidata name, so the read-only fallback stops being blank.
Button shows only when the entry's classname matches, the DB field is empty,
and the furnidata name is present; it disappears after the sync re-fetch.
2026-06-14 16:41:55 +02:00
simoleo89 88d2128295 docs(furni-editor): design for syncing empty public_name from furnidata 2026-06-14 15:53:13 +02:00
simoleo89 1676b3c871 fix(furni-editor): surface upsert failures and revert optimistic name on error
When creating a furnidata entry for a furni whose sprite id is already used
by another classname, the server rejects with ID_COLLISION. The client showed
the optimistic public-name change but never reverted it, so a failed create
looked like it had succeeded. On any FurniEditorResult failure, re-fetch the
item detail to restore the true state (the error alert was already shown).
2026-06-14 14:44:25 +02:00
simoleo89 ed5c9296a8 fix(mod-tools): typos in moderation-action result alerts
The ModeratorActionResultMessageEvent alerts (hardcoded, not LocalizeText) read
"successfull" and "applying tht moderation action". Fix to "successful" / "the".
2026-06-13 18:15:29 +02:00
simoleo89 149b1db38c fix(mod-tools): default-sanction sent the topic array index, not the topic id
sendDefaultSanction passed `selectedTopic` (the index into the topics array) as
the CFH topic id to DefaultSanctionMessageComposer, so the emulator applied the
default sanction against whatever topic happened to sit at that array position.
The sibling sendSanction (and the topic label) correctly use
`topics[selectedTopic].id`. Pass `category.id`, and move the `category` lookup
after the `selectedTopic === -1` guard (+ a `!category` guard).
2026-06-13 18:15:29 +02:00
simoleo89 742f7ee5f7 fix(wired): date-range condition saved NaN for empty/invalid dates
The save guard `if(startDateInstance && endDateInstance)` is always true — a bad
input parses to a truthy *Invalid Date*, so `getTime()/1000` wrote NaN into the
int params. A never-configured furni was worse: the read effect only seeded the
inputs when `intData.length >= 2`, so the first save sent `new Date('')` → NaN.
Guard on `isNaN(getTime())` and seed both inputs to "now" for the empty case.
2026-06-13 18:15:26 +02:00
simoleo89 728eceab65 fix(wired): @altitude shown 100x too large and round-trip-edited wrong
`liveState.altitude` is already z*100, but the @altitude inspector rows multiplied
by 100 again (showing z*10000). The edit-commit path parses the field back as
`parsed / 100` (expecting z*100), so the displayed value and the edit parser
disagreed: tweaking the shown number wrote a wildly wrong altitude (clamped to the
40 ceiling). Display the raw `altitude` so it round-trips with the editor.
2026-06-13 18:15:26 +02:00
simoleo89 648cea698d fix(room): word-quiz countdown mutates Map value objects in place
The 1s tick did `value.secondsLeft--` on the VoteValue objects held by the
previous state Map and returned the same Map reference when nothing expired — an
in-place state mutation (breaks memoization / StrictMode double-invoke). Rebuild
new value objects in a new Map each tick (and drop expired entries).
2026-06-13 18:15:24 +02:00
simoleo89 a2f8a4dd61 fix(room): pet-fertilize chat bubble — bad localization key + wrong target user
Two bugs in the pet rebreed/fertilize chat path: the localization key had a
stray trailing semicolon (`'widget.chatbubble.petrefertilized;'`) so the lookup
failed and the raw key rendered; and the target user was resolved via
`newRoomObject = getRoomObject(event.extraParam)` but then read back by
`roomObject.id` (the speaker), so `userName` was the speaker, not the target.
Use `newRoomObject.id`.
2026-06-13 18:15:24 +02:00
simoleo89 53463b8322 fix(room): name bubbles cleared for the wrong user on USER_REMOVED
The USER_REMOVED handler for a UNIT filtered name bubbles with
`bubble.roomIndex === event.id`, which KEEPS only the leaving user's bubble and
drops everyone else's (the two sibling filters on the next lines correctly use
`!==`). When any user left view, all other floating name bubbles vanished while
the departed user's lingered. Flip to `!==`.
2026-06-13 18:15:24 +02:00
simoleo89 f873d68ee9 fix(messenger): mark thread read in an effect, not during render
FriendsMessengerThreadView called `thread.setRead()` in the render body — a side
effect during render that mutates the MessengerThread instance the messenger hook
also reads to compute the unread indicator, making unread state order-dependent
(and it would NPE if `thread` was null). Move it into a no-dependency useEffect
(runs after every commit, same cadence as before) and guard the null thread.
2026-06-13 18:15:21 +02:00
simoleo89 af6f65b194 fix(inventory): drop leaking badge pending-counter; trust server active set
sendActiveBadges incremented pendingUpdatesRef on every edit, and the BadgesEvent
handler skipped applying the server's active badges while the counter was > 0,
decrementing once per BadgesEvent. The assumption was "one BadgesEvent echo per
SetActivatedBadges" — but the emulator's UserWearBadgeEvent answers with a
UserBadgesComposer room broadcast, NOT a BadgesEvent, so nothing ever decrements
the counter. It leaks upward with every toggle/reorder/swap and then silently
drops legitimate later BadgesEvent updates (the server-authoritative active set
never reapplies). Remove the counter and always apply the server's active badges
on BadgesEvent (edits are already persisted server-side, so this is correct).
2026-06-13 18:15:19 +02:00
simoleo89 39fbfdd9e2 fix(inventory): derive active prefix from the fresh list, not a stale closure
The ActivePrefixUpdatedEvent handler set the active prefix via
`setActivePrefix(prev => { const found = prefixes.find(...) })`, reading the
`prefixes` state from the closure — which lags by a render and is stale/empty when
the prefix was added earlier in the same event batch, so `found` was undefined and
the active prefix fell back to a partial item missing icon/color/displayName. Move
the derivation inside the `setPrefixes` updater so it reads the freshly-mapped list.
2026-06-13 18:15:19 +02:00
simoleo89 9cc9ef86c0 fix(inventory): stop unseen-tracker mutating shared state arrays in place
resetItems/removeUnseen/the UnseenItemsEvent handler each did `new Map(prevValue)`
(a shallow copy) then spliced/pushed the per-category array returned by
`.get(category)` — the SAME array reference still held by the previous Map. That
mutates state outside React's data flow (breaks under StrictMode double-invoke and
any updater replay). resetItems additionally did `splice(existing.indexOf(id), 1)`
with no guard, so an id not present (indexOf === -1) spliced off the wrong LAST
element. Replace each in-place splice/push with a cloned array set back on the new
Map (filter for removals, spread+push for the merge).
2026-06-13 18:15:19 +02:00
simoleo89 74cbeccb52 feat(furni-editor): create furnidata entry when missing (upsert Save)
When a furni has no furnidata entry (furniDataEntry === null), unlock the
name/description fields instead of locking them: the Save button becomes
"Create entry" and sends the existing FurniEditorUpdateFurnidataComposer (10046),
which the emulator now upserts (creates a complete entry from items_base). The
classname-mismatch case (entry resolved by id but for a different classname)
stays locked to avoid an id collision. On success the hook already re-fetches the
detail, so the panel flips to normal edit mode. Name input prefills (placeholder)
from the DB Public Name.
2026-06-13 18:01:02 +02:00
DuckieTM 93baedf206 Merge pull request #235 from duckietm/main
Sync Main to dev
2026-06-12 16:02:40 +02:00
DuckieTM 3c9332e798 Merge pull request #234 from duckietm/Dev
Dev
2026-06-12 16:01:58 +02:00
DuckieTM d0a7d200d1 Merge pull request #230 from hotellidev/multicolorfurnifix
Fix multicolor furni names
2026-06-12 15:54:27 +02:00
DuckieTM c62e041d46 Merge pull request #229 from simoleo89/feat/installer-configurable-renderer-dir
feat(installer): make the renderer folder configurable
2026-06-12 15:53:46 +02:00
DuckieTM 419cb4cbde Merge pull request #228 from RemcoEpicnabbo/Dev
Remove trailing comma in ui-config.example
2026-06-12 15:53:05 +02:00
hotellidev caf80e5386 Merge branch 'duckietm:main' into multicolorfurnifix 2026-06-12 03:15:02 +03:00
DuckieTM 32b0e2a370 Merge pull request #233 from duckietm/Dev
🆙 100% Guild Furni Catalog Page
2026-06-11 13:16:46 +02:00
duckietm de38371069 🆙 100% Guild Furni Catalog Page 2026-06-11 13:16:29 +02:00
DuckieTM 69b643761c Merge pull request #232 from duckietm/Dev
🆙 Fix scrollbar
2026-06-11 10:31:41 +02:00
duckietm 40864cf880 🆙 Fix scrollbar 2026-06-11 10:31:24 +02:00
DuckieTM c4d7070316 Merge pull request #231 from duckietm/Dev
🆙 Added colored background to items in group furni & fix catalog price
2026-06-11 10:14:58 +02:00
duckietm 5aa9dcd650 🆙 Added colored background to items in group furni & fix catalog price 2026-06-11 10:14:27 +02:00
hotellidev afaea87bcd Fix multicolor furni names 2026-06-11 04:07:06 +03:00
simoleo89 1cfa4ca9f0 feat(installer): make the renderer folder configurable
install.mjs hardcoded the renderer SDK location as ../Nitro_Render_V3, so re-running it next to a renderer checkout under a different name silently cloned a second copy.

Resolve the renderer dir by priority: --renderer-dir=<path> flag, NITRO_RENDERER_DIR env, interactive prompt, then auto-detect an existing sibling among Nitro_Render_V3 / renderer. A fresh clone with no flag/env still defaults to ../Nitro_Render_V3, and existing checkouts are auto-detected (no more duplicate clones). Adds --renderer-repo=<url> for the clone URL; --help, the step labels and the summary reflect the resolved dir.

Backward-compatible, pure installer change — no client/runtime code touched.
2026-06-10 22:18:48 +02:00
Remco Epicnabbo 477f974b7a Remove trailing comma in ui-config.example
Remove a trailing comma after the closing object in public/configuration/ui-config.example. This fixes invalid JSON syntax that could cause parsing errors when loading the UI configuration.
2026-06-10 21:45:21 +02:00
DuckieTM 7e9af4f37e Merge pull request #225 from duckietm/Dev
🆙 Fix Group Forum buy
2026-06-10 14:16:44 +02:00
duckietm 9fcbfba22f 🆙 Fix Group Forum buy 2026-06-10 14:16:18 +02:00
DuckieTM 7e63d5b844 Merge pull request #224 from duckietm/Dev
Dev
2026-06-10 10:24:47 +02:00
duckietm 4bfd5e96ec 🆙 Update catalogue Forum view 2026-06-10 10:17:20 +02:00
duckietm e5ca4936ea 🆙 Detached Theme from original NitroV3 2026-06-10 07:23:02 +02:00
DuckieTM b2000ba1a9 Merge pull request #223 from simoleo89/fix/skip-purchase-confirmation
fix(catalog): honor skip purchase confirmation setting
2026-06-10 06:18:46 +02:00
simoleo89 e6519c301f fix(catalog): honor skip purchase confirmation setting
Wire both classic and modern catalog purchase widgets to the shared catalogSkipPurchaseConfirmation setting used by User Settings. When enabled, the primary buy/rent button now calls the purchase flow directly instead of first switching to the CONFIRM state. Existing validation, gift purchases, club checks, limited sold-out handling, and Builders Club placement flows remain unchanged.
2026-06-09 22:29:11 +02:00
DuckieTM a1761d463f Merge pull request #222 from duckietm/Dev
Dev
2026-06-09 15:16:52 +02:00
duckietm 3ea6ec70a4 🆙 Update Purse 2026-06-09 13:55:33 +02:00
duckietm 3e92e718e5 🆙 Fix avatar head in friends chat 2026-06-09 07:11:28 +02:00
DuckieTM 4eb8efbebf Merge pull request #221 from duckietm/Dev
🆙  Added text
2026-06-08 13:02:54 +02:00
duckietm 9e309f4aaf 🆙 Added text 2026-06-08 13:02:32 +02:00
DuckieTM ac84d73f8a Merge pull request #220 from duckietm/Dev
Dev
2026-06-08 11:25:34 +02:00
duckietm ce8e6fa61f 🆙 Fix the avatar head in send pressent 2026-06-08 11:06:01 +02:00