Add report abuse, mute, ban and black mark systems#1041
Merged
Conversation
Mutes add one black mark, bans two (including offline bans), so punishments accumulate toward the permanent punishment limit. Report-issued mutes record the rule broken.
Appending two identical marks in the same millisecond caused duplicate entries to be dropped.
ReportAbuse script injected Reports but no single was bound, causing NoDefinitionFoundException at startup.
GregHib
requested changes
Jun 26, 2026
Co-authored-by: Greg <GregHib@users.noreply.github.com>
* Added object examines * Added haybales, sacks, Groats farm crates object operations. * Added Seth Groats dialogue * Added water barrel functionality and changed bucket message to the correct one. * Farmer combat, sound, animations and drop table added. Added evil turnip seed to allotment seed table * Fixed ducks and drake animation, sounds and combat def Quack! * Spotless * One fix from last commit * Combined drops
* feat: implement beast of burden storage for summoning familiars Re-lands the work from GregHib#1015 (by @maatheusgois-dd) with the two review comments from Greg addressed: - Drop the redundant familiar_leash timer (and the ensureFollowerNearby helper it drove). Follow mode already teleports a familiar back when it drifts >15 tiles every tick, so the timer duplicated that. The Follow teleport improvement and the callFollower mode-reset are kept. - Clarify ensureBeastOfBurdenInventory: the clear() call discards a stale undersized inventory instance so the engine recreates it at the definition size; the empty guard prevents losing stored items. Added a comment and tightened the condition. Implements Store / Take BoB for beast-of-burden familiars (e.g. pack yak) via the beast_of_burden (671) and summoning_side (722) interfaces, registers the beast_of_burden inventory (id 530, 6x5), wires examine handlers, and drops stored items to the floor on dismiss. * fix: clamp beast of burden store/withdraw to held amount Greg noted the original PR could leave gaps in the beast of burden when depositing more items than were held. Root cause: when the requested amount exceeds the source count, MoveItemLimit's undo path (removed < added) removes the first `added` matches from the target — including items already present — then re-adds only `removed`, scattering the survivors into high slots and leaving empty gaps. A later deposit then fills those gaps, appearing to "skip" slots. Clamp the requested amount to what's actually held before moveToLimit in both store and withdraw, so removed == added and the undo path never runs. Adds BeastOfBurdenStoreLimitTest covering both directions. * fix: Take BoB withdraws as many items as fit Take BoB used moveAll, an atomic transaction that rolls back entirely if the inventory can't hold every carried item — so a player with fewer free slots than the familiar carried got "You don't have enough inventory space." and withdrew nothing. Use moveAllToLimit instead so the inventory fills up to capacity and the remainder stays on the familiar (still showing the full message when items are left behind), matching the single-item Withdraw behaviour. Adds BeastOfBurdenTakeTest covering the partial and full-fit cases. * feat: compact beast of burden items to the top on open When the familiar inventory is opened, reorganise the stored items so they fill the interface from the top with any empty slots pushed to the bottom, preserving order. Done in the beast_of_burden interfaceOpened handler so it covers every open path. Adds BeastOfBurdenCompactTest. * fix: enforce beast of burden slot capacity when storing Storing only blocked a new item type once the first `capacity` slots were full, so storing more of the same non-stackable item (or stackables) could fill the whole shared 30-slot inventory — e.g. a war tortoise (18 slots) accepted up to 28, a thorny snail (3) accepted 5. Count all used slots and the remaining free slots against the familiar's capacity: items merging into an existing stack take no new slot, a new stack takes one, and each non-stackable item takes one. Clamp non-stackable stores to the free slots and tell the player when the limit is hit. The per-familiar capacities (thorny snail 3 … pack yak 30) already come from the cache NPC definitions. Adds BeastOfBurdenCapacityTest. * feat: align beast of burden with wiki mechanics Comparison against the RuneScape wiki surfaced four behaviours that were missing or diverged: - Only tradeable items can be stored. Reject untradeable/lent/dummy items in store(), mirroring the trade-screen restriction, with a message. - The familiar inventory can't be accessed in combat. Gate openBeastOfBurden() on the under_attack clock. - Dropped items are now owner-only and retrievable for five minutes before despawning (was: never despawn), and use the wiki's drop message. - A familiar slain in combat now drops its stored items and is dismissed. Tag the familiar NPC with its owner on summon and handle its death via npcDeath, reusing dismissFamiliar (without re-removing the despawning NPC). Adds BeastOfBurdenWikiTest. Out of scope (documented divergences): GE high-value rejection, abyssal essence carriers, and bank-interface access. * fix: drop beast of burden items under the familiar's tile dropBeastOfBurdenItems() dropped onto the player's tile; on dismiss or familiar death the items should fall under the familiar instead. Use the follower's tile (falling back to the player if it's already gone). Updated the drop tests to place the familiar on a separate tile and assert the items land there, not under the player. * feat: reject beast of burden items worth over 5,000,000 Wiki: a familiar can't carry an unstackable item worth more than 5m, nor a stack whose total value exceeds 5m. Check the item value (def["price", def.cost], same as the price checker) in store(): reject an unstackable item priced over the cap, and reject a stackable store whose resulting stack total (existing + stored) would exceed it. Coins are therefore capped at 5,000,000. Adds tests (red_partyhat over cap; coins at/over 5m). * feat: prevent BoB from storing essence. * feat: add essence only beasts of burden. * refactor: address beast of burden review feedback - Move the 5m carry-value cap to game.properties (summoning.beastOfBurden.maxValue); add a Long accessor to Settings. - Inline familiarDef() to follower?.def. - Allow using an item on a familiar to store it (itemOnNPCOperate), reusing store() with its existing validation. * spotlessApply run
* Add all missing inventory string ids from rs3 beta * Update missing inv side iface ids
* Feat: Zogre Flesh Eaters * Basic fixes * Formatting * Add ogre dialogue expressions * Add more error handling safety around suspension resuming * Start adding zogre flesh eaters test * Add quest integration test * Fix disease and add disease tests * Formatting * Replace quest int variable with map strings * Tidy * Formatting * Fix monster examine unit test * Fix stat spy test --------- Co-authored-by: GregHib <greghib@users.noreply.github.com>
* bug: fix default hair on new player character creation * bug: fix infinite shooting star with negative remaining health Mining stardust while holding the max (>=200) returned -1 from addOre, which short-circuited deplete() in the mining loop. handleMinedStarDust never ran, so the shared totalCollected counter grew unbounded while the star never advanced a layer - causing an infinite star and a negative '% left of this layer' prospect message. Count the maxed swing as a successful mine (returns 1) so the star depletes normally and experience is awarded. Also clamp the layer percentage to >=0 as a guard. Fixes GregHib#1043 * test: maxed-stardust mining still depletes a shooting star Regression test for the infinite shooting star (GregHib#1043): a player holding 200 stardust mining a crashed star one layer-collection away from advancing must push it to the next tier. Fails against the old return -1 path (star never depletes, hits the tick limit). * bug: Brimhaven customs officer ship sails to Ardougne not Port Sarim The customs officer (npc 380) spawns at both Musa Point and Brimhaven docks but the shared script always sent players to Port Sarim. The Brimhaven officer now routes to Ardougne docks via the brimhaven_to_ardougne journey, branching on the officer's location. Adds the Brimhaven and Ardougne dock gangplank objects/teleports (2085-2088) so players can board and disembark the legacy ship. Closes GregHib#1045 * fix: set Brimhaven->Ardougne ship cutscene delay to 5 ticks Matches the canonical journey delay for varp value 8 (~3s). The ship's stop position on the journey map is defined by the client cache for that varp value, not by server data, so the delay only controls how long the cutscene runs before teleporting. * feat: add Captain Barnaby charter dialogue (Ardougne -> Brimhaven) - Captain Barnaby Talk-to/Pay-fare dialogue sails Ardougne -> Brimhaven (varp value 7). Repoints the dock spawn to captain_barnaby_2 (4974), the interactive variant; the previously-spawned captain_barnaby_1 (4961) has no Talk-to option. - Boarding either docked ship via the gangplank shows a hint to speak to the operator first (via objTeleportLand, so the teleport still runs). - Ship's ladder (9745) Climb-down gives the standard refusal message. Mirrors the Ardougne<->Brimhaven charter from 2011Scape/game#610. * Remove duplicate npc spawn * Remove duplicate npc spawn * fix: spawn interactive Captain Barnaby variant at Ardougne dock The remaining captain_barnaby spawn (id 381) has no Talk-to/Pay-fare option; only captain_barnaby_2 (id 4974) is the charter operator. * Revert "fix: spawn interactive Captain Barnaby variant at Ardougne dock" This reverts commit f61a6f525d5487743f139ce74dd5c85a5916adfe.
Longs aren't supported by the variable format system; sub-second precision isn't needed for mutes, bans, black marks or reports. Switch them to epoch seconds (Int), with PERMANENT as Int.MAX_VALUE. Chat message evidence keeps millisecond precision.
GregHib
approved these changes
Jun 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds player moderation systems: abuse reports, mutes, bans and black marks.
::mute,::permmute,::unmute,::ban,::permban,::unban,::blackmark,::blackmarks(work on offline players where applicable)Testing
ReportAbuseTestcovers report submission, validation, rate limiting, mod mute, and interface opening from the filter button, chatbox lines and private chatPunishmentsTestcovers black mark accumulation, expiry and ban flagsScreencast_20260610_085448.webm