Skip to content

Add report abuse, mute, ban and black mark systems#1041

Merged
GregHib merged 16 commits into
GregHib:mainfrom
HarleyGilpin:feat/report-abuse
Jun 28, 2026
Merged

Add report abuse, mute, ban and black mark systems#1041
GregHib merged 16 commits into
GregHib:mainfrom
HarleyGilpin:feat/report-abuse

Conversation

@HarleyGilpin

Copy link
Copy Markdown
Contributor

Summary

Adds player moderation systems: abuse reports, mutes, bans and black marks.

  • Report Abuse interface (594) opens from the chatbox Report button, right-clicking a player name in the chatbox, or a split private chat line; the client pre-fills the reported player's name
  • Reports are queued and saved off the game thread with chat history evidence (last 20 messages / 5 minutes)
  • Online moderators are notified of new reports and can request an immediate mute when reporting
  • Mod commands: ::mute, ::permmute, ::unmute, ::ban, ::permban, ::unban, ::blackmark, ::blackmarks (work on offline players where applicable)
  • Black marks expire after 12 months (permanent for real-world law offences); 10 active marks are required for permanent punishments
  • Muted players are blocked from public, private and clan chat; banned players are rejected at login

Testing

  • ReportAbuseTest covers report submission, validation, rate limiting, mod mute, and interface opening from the filter button, chatbox lines and private chat
  • PunishmentsTest covers black mark accumulation, expiry and ban flags
  • Verified in-game with the 634 client: right-click name → Report abuse opens the interface with the name pre-filled and the submitted report is saved
Screencast_20260610_085448.webm

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.
Comment thread game/src/main/kotlin/content/social/report/Mute.kt Outdated
Comment thread data/social/report/report.vars.toml Outdated
HarleyGilpin and others added 11 commits June 28, 2026 05:59
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 GregHib merged commit b081280 into GregHib:main Jun 28, 2026
2 checks passed
@HarleyGilpin HarleyGilpin deleted the feat/report-abuse branch June 28, 2026 22:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants