# RuneScape Dragonwilds: Together

**The MMO Mod**

One realm across many RuneScape: Dragonwilds Worlds, plus RuneScape-style trading, item ownership and protected
builds. The mod installs as the `Together-MMO` folder (up to 2.1.x it was `PlayerTrading`: the installer moves your
settings and data over).

Together gameplay activates automatically when you join an official Together World. It stays inactive in solo, listen-host and other servers. The existing **Join Together MMO** menu entry and World picker remain available; there is no activation setting.

## Install and update

Use the RSence Installer (DragonwildsTogether-Installer.exe) from www.rsence.com for the easiest setup, including UE4SS.
It also installs, updates and turns on/off our other mods, such as BetterSpellWheel.
The client ZIP contains only Together-MMO: manual installation requires Dragonwilds-compatible UE4SS 3.0.1.
Extract Together-MMO into RSDragonwilds/Binaries/Win64/ue4ss/Mods and keep your other mods.txt entries.
For an existing PlayerTrading install, use the installer to migrate settings and data safely.

Open the **RSence Installer** from Start ("Dragonwilds Together" before 2.2.0) to check for updates. **Apply update** downloads and verifies the
new installer, then updates the selected game folder after you close Dragonwilds. Settings, runtime data,
other mods and the Together ON/OFF setting stay. Official Worlds show update instructions when an older
client joins; versions below their minimum must update before playing.

## Trading

1. Press **F7** (or **Esc > TRADE**) and pick a nearby player to send a trade request.
2. They get a notice, press F7 and **ACCEPT**.
3. The trade window opens for both: click your items to offer them (choose 1 / 5 / 10 / ALL per
   click), click an offered item to take it back. Both press **ACCEPT**. Any change to either
   offer clears both acceptances.
4. The confirmation screen shows exactly what you give and what you receive. Both press
   **CONFIRM** and the items are swapped.

Trade activity shows in chat as `[Trade] ...` lines.

## Together (the official Worlds)

The Together Worlds (World 1, World 2, ...) are the official servers, and every World is linked to the others:

- **See players from other Worlds.** Players on other Worlds who are near the same
  spot in their World show up in yours, drawn as real characters: their looks, armour, helmet,
  cape and the tool or weapon in their hand, running, jumping, crouching, dodging, chopping,
  mining, fighting and casting as they do it. The monsters they're fighting are shown too.
  They're only there to look at: you can't touch, trade with or hit them.
- **World chat.** `/w message` reaches everyone in every World, `/l message` the players around
  you (on any World). Words from players on other Worlds float above their heads.
  `/mute name`, `/unmute name`, `/report name - reason`.
- **GP.** Killing monsters on a Together World can drop GP (bosses and dragons more). Your
  balance shows on screen; `/gp` prints it. GP lives on the Together hub, not in your save, so it
  follows you to every World.
- **Trade GP.** The trade window has **OFFER GP**. The GP is held by the hub until the trade
  completes, so nobody can offer GP they don't have.
- **Auction house** (**F9** or `/ah`): list items for GP, browse and buy from players in every
  World. A listing goes up, and bought items are final, once they are saved with your character
  (a moment), so a crash or a World hop can't duplicate or lose them. 1 % of each sale goes to the house.
- **Lodestones** are placed in the Together Worlds already; players can't build new ones there.
- **Privacy:** `/hide` stops other Worlds from seeing you, `/show` undoes it; `/anon` hides your
  name from them, `/named` shows it again.

- **Party** (**F6** or `/party`; `/inv name` invites, `/p` party chat): parties across Worlds with a
  compact, transparent party HUD. The first party inside a dungeon holds that copy; it resets once it has been empty for
  a while, runs are timed, and each character loots a dungeon once per lockout window.
- **Worlds** (**F6**, then **WORLDS**, or `/worlds`): every Together World with its players,
  capacity and free dungeons. **JOIN** one to play there with the same character (an exit to the
  menu and a join, about 20 seconds); the party leader can take the whole party.
- **Bank** (**F4** or `/bank`): one bank per character, the same in every Together World. Next to
  a chest you own in your totem area, F4 makes it a bank chest of a category; elsewhere it shows everything in
  your bank. Changes count once your character is saved.
- **Vault Core recall**: in Your Land (**F10** or `/land`), select your totem on the current
  World and choose **RECALL HOME**. It costs one saved Vault Core from your bag. Stay still through the
  cast and save preparation; damage, movement or other actions cancel it. Destination loading
  happens before payment. Paid cancellations refund to your personal bank. An uncertain dispatch
  requires support rather than an automatic retry. Both the client and World need recall support.
- **Your Land** (**F8**, **F10**, `/land` or `/base`): browse all zones on this World,
  select your totem, and expand its protected area. See your current radius, next size,
  exact GP and Vault Core price, and any shortfall before confirming. Existing land
  stays protected. Buildings and totems stay where you built them; party travel moves
  only you. Chests and workshops inside your land follow the totem's access list.
  The browser does not need a survey of every building. New packing, templates,
  duplication and cross-World building migration are retired. Old stored builds and
  accepted operations remain preserved for recovery; nothing is deleted by this change.
- **Realm characters:** the realm keeps a record of each character and checks it at every join,
  to keep items got on other servers, in solo worlds or by editing the save out. **Join with a NEW
  character: characters that played on other worlds are refused** (the World shows why, then sends
  you back to the menu).

- **The Codex** (**F1**, or `/help` / `/codex` on a Together World): every feature with its
  keys, commands and limits. Your first join shows a short welcome and a first-steps checklist
  (no reward: GP only comes from kills). The light under your GP shows the realm: green online,
  amber reconnecting, red offline (your World plays on; chat, GP, the auction house, the bank and
  World switching wait until it's back). `CodexKey` and `Welcome` in config.txt.

Together only runs on the Together Worlds: official servers hosted by us and registered on the hub by us (no public
registration), so the realm stays fair. In a player-hosted world (you host, your friends join) the mod gives you trading, dropped-item ownership and despawn, totem and chest access lists (F8), totems for everyone and the mod-required gate;
the realm features (world chat across Worlds, GP, the auction house, the bank, parties and dungeons across Worlds, the WORLDS list, portable bases and realm characters) are only on the official Worlds.

## Protection

- **Dropped items belong to whoever dropped them.** Other players don't get a pickup prompt,
  and if someone without the mod grabs one anyway, the host puts it back on the ground.
- **Player drops despawn after 24 hours** (world time; set `DroppedItemHours`).
- **Everyone can place a Build Protection Totem** (build menu › Furniture › Objects), one per
  map region each (Temple Woods, Bramblemead Valley, ...). A second one in the same region is
  removed with a message. The game's world-wide limit of 8 totems is raised to 200.
- **Everything placed inside your totem area belongs to you.** This includes older chests, crafting stations and pieces placed by trusted builders. Totems themselves keep their placer as owner. Press **F8**:
  - **next to a chest in your land:** manage your totem's access lists (bank chests keep their separate bank sharing);
  - **in your totem's area:** choose who may build there (**Building access**) and who may open
    chests there (**Chest access**).

  Inside a totem's area, only its owner and the players on its building list can build. Anything
  else placed there is removed and its materials are refunded.

  Inside protected land, the totem owner and chest access list control chest access; an old
  placer cannot bypass that protection. Outside protected land, the chest keeps its recorded
  owner and chest list. Realm landmarks and base-map pieces stay protected.

  Totems placed before the mod have no recorded owner: the world owner or admins manage them.
  Older chests inside owned land use the landowner; ownerless chests outside totems stay public. Owners and lists are saved in
  the mod's `data/` folder on the host.

## Everything is enforced by the server

Inside a totem's area, the host/server itself decides every request, so a modified client can't
get around it:
- **Chests:** opening one, moving items in or out of it, and pulling from it as a *linked chest*
  while crafting, building or repairing all need access to that chest. A linked chest you don't
  have access to is simply left out of what you can craft with.
- **Stations** (fires, furnaces, workbenches; `ProtectStations`) and **farm plots** can only be used by
  the area's owner and the players on its building or chest list ("trusted"). Anyone else is told
  "This belongs to <owner>'s base."
- **Items on the ground** that nobody dropped (cooked meat from a fire, other station output, crops,
  loot) and the owner's own items can only be picked up by the owner and trusted players. The game's
  item magnet never flies them to anyone else (`MagnetGuard`). Items a player dropped stay theirs;
  in their own area the owner can also pick up what lies there under the name of a player who isn't
  trusted, and `/reclaim <name>` (standing in the area) moves everything under that name into the
  owner's bag. If something is taken anyway, the server puts it back as the area owner's.
- Other players' inventories can never be touched.

## Players without the mod

With `RequireMod = true` (the default), players without the mod can still join, but they can only
walk around. They can't open chests, pick things up, use stations, build or change buildings. A
banner tells them to install the mod and rejoin. The host checks for the mod with a challenge
that only the mod can see and answer, so typing a fake reply in chat doesn't get past it.
Fighting, gathering and moving still work as normal.

## Requirements

- [UE4SS](https://github.com/UE4SS-RE/RE-UE4SS) for Dragonwilds.
- **Everyone who trades needs this mod, and so does the host.** The host checks both offers
  against the real inventories and moves the items, so nobody can trade items they don't have.
- Text chat must be available (it is in multiplayer worlds).
- Everything is enforced by the host: chest and building access, dropped-item ownership and
  the walk-only mode for players without the mod.

## Install

Copy the `Together-MMO` folder into `RSDragonwilds/Binaries/Win64/ue4ss/Mods/`.

Updating from 2.1.x or older by hand? Those installed as `Mods/PlayerTrading`. Copy its `config.txt` and `data/` folder
into `Together-MMO`, then delete `Mods/PlayerTrading` and its line in `mods.txt` (the installer does all of this for
you and keeps the old folder as a backup in `Together-MMO/data/PlayerTrading.migrated-<date>`). If both folders are
there when the game starts and the old copy is on, the new copy doesn't start that session: it copies your
`config.txt` (only over its own unchanged one) and the data files it lacks, turns the old copy off (`PlayerTrading : 0`,
`enabled.txt` -> `enabled.txt.migrated`) and asks you to restart; the next start copies what the old copy changed
meanwhile. If the old copy was OFF (turned off in the RSence Installer, formerly the Dragonwilds Together app), the new one stays OFF too; an old copy
switched off by hand (only `PlayerTrading : 0` in `mods.txt`) counts as making room, and the new one starts ON (the
installer keeps Together OFF in that case). A development copy (`dev.txt` or `tests/`) is never
touched. To go back to an older version, uninstall Together first: next to Together-MMO, an old copy is turned off again.

## Settings

`config.txt` in the mod folder (restart the game after editing). The installer keeps your copy on updates.
Keys and the client display options below can also be changed in game, without a restart: **Esc > TOGETHER SETTINGS**
(or `SettingsKey`, F3, or SETTINGS in the Codex). Those changes are saved in `data/settings.txt`, which overrides
config.txt; delete it to go back to config.txt's values (docs/SETTINGS.md).
**Host** settings count on whoever hosts the world; **client**
settings on each player's own PC. Together settings only do something on the Together Worlds.

| Key | Default | What it does |
|---|---|---|
| `OpenKey` | `F7` | Client. Opens the trade menu (F1-F12, a letter...; empty = pause menu only). |
| `ShowInPauseMenu` | `true` | Client. Adds the TRADE entry to the pause menu (Esc). |
| `MenuLabel` | `TRADE` | Client. The text of that pause menu entry. |
| `MaxDistance` | `15` | Host. How close (metres) players must be to trade; 0 = anywhere in the world. |
| `RequestSeconds` | `30` | How long a trade request stays open. |
| `LiveMapFeed` | `true` | Server. Writes building changes (piece type, position, rotation, plan/complete, removal; no player data) to `data/mapfeed.txt` for the realm map's live overlay, shown 45 s later. The file is replaced at every start and rotated at 4 MB (one old copy). `false` = off. |
| `HostAnswerSeconds` | `12` | Client. How long to wait for the host to carry out a confirmed trade. |
| `MessageSeconds` | `4` | Client. How long on-screen notices stay up. |
| `ChatFeedSeconds` | `20` | Client. How long the unified chat stays up after the last activity before it fades (10-60 s); with `UnifiedChat = false`, how long a world chat line stays in the old feed. |
| `OwnerOnlyPickup` | `true` | Host. Only the player who dropped an item can pick it up. |
| `OwnerOnlyGravestones` | `true` | Host. Only the player who died can open or take from their gravestone. |
| `DroppedItemHours` | `24` | Host. Player drops disappear after this many hours of world time; 0 = never. |
| `ReplaceTotemBlock` | `true` | Host. Totems use their owner's access lists instead of the game's block-everyone rule. |
| `AccessKey` | `F8` | Client. Opens the Access window (next to your chest or inside your totem's area). |
| `AnyoneCanPlaceTotem` | `true` | Host. Every player can place Build Protection Totems, not just the host. |
| `TotemsPerRegion` | `1` | Host. Totems per player per map region; 0 = no limit. |
| `MaxTotems` | `200` | Host. Totems in the whole world (the game's own limit is 8). |
| `TotemRadius` | `21` | Host. Totem area radius in metres (the game's own is 21); Together Worlds use the hub's tier table. |
| `TotemUpgrades` | `true` | Together Worlds. Totem owners plan a bigger area (F8, PLAN YOUR LAND) with GP + vault cores. |
| `TotemTiers` | `21/0/0/0/0;28/0/0/25000/2;35/0/0/100000/4;42/0/0/300000/8` | Together Worlds. radius/above/below m (0 = no limit)/GP/cores per tier; the hub's table wins. |
| `TotemCoreItem` | `Resources_VaultCore` | Server. The item an upgrade takes (short name). |
| `Recall` | `true` | Offer Vault Core recall to an owned standing totem on the current World when the World and hub support it. |
| `RecallSeconds` | `3` | Server. Interruptible recall cast duration (3–30 seconds); destination and character-save preparation are additional. |
| `RecallMoveCm` | `75` | Server. Maximum movement during recall before cancellation (1–75 centimetres). |
| `RecallPaceSeconds` | `2` | Server. Minimum interval between recall requests per character (2–60 seconds). |
| `AdminOps` | `true` | Server. Accept the hub's typed live operations (`admin tp`, `admin grave`; docs/RCON.md). Dedicated, hub-connected Worlds only; not a console. |
| `AdminOpMaxMove` | `20000` | Server. Centimetres a typed live-op destination may be from where the player or gravestone stands (`far` lifts it). |
| `AdminOpGraveRegistry` | `false` | Server. A gravestone move also writes the `GameplayObjectRegistry.Gravestones` entry. Unverified in game: off. |
| `GraveRescue` | `false` | Server. A gravestone whose own spot nobody can stand in is moved to the nearest spot that works, so its owner can reach it. Off until it has been watched moving a real gravestone; `admin grave` does the same move by hand. |
| `GraveRescueMax` | `16` | Server. Gravestone rescues per World boot. |
| `TotemBlockedSpots` | `` | Server. Places an upgraded area may not reach (`x,y,radius m;...`); Lodestones and dungeon entrances always. |
| `RequireMod` | `true` | Host. Players without the mod can join but only walk around. |
| `ProtectStations` | `true` | Host. In a totem's area, stations (fires, furnaces, workbenches) and farm plots: only its owner and its building or chest list. |
| `MagnetGuard` | `true` | Host. In a totem's area, the game's item magnet never flies an item to a player who may not pick it up. |
| `MagnetGuardCm` | `2500` | Host. How near (cm) such a player comes before the item's magnet is switched off. |
| `NaturalResourcesPublic` | `true` | Host. What world-grown trees (not planted ones), their logs and rocks drop stays first come, first served inside totem areas (the server marks the items created right after such a source breaks; station output, crops, refunds and loot stay the area's). |
| `NaturalDropCm` | `800` | Host. How far (cm) a natural drop may lie from the spot where its source broke. |
| `PlotFootprintCm` | `170` | Host. A farm plot's footprint radius (cm): it must lie wholly inside an area its placer may build in and out of other players' areas. |
| `PlotMatchCm` | `300` | Host. How far (cm) a placed farm plot may settle from its placement request and still be checked as that request's plot. |
| `ShowOthers` | `true` | Client. Together: show players from other Worlds around you. |
| `RealCharacterGhosts` | `true` | Client. Together: draw them as full characters; false = lighter stand-ins for slow PCs. |
| `NamePlates` | `12` | Client. Together: name plates only for the nearest N players; 0 = all. |
| `NamePlateRange` | `25` | Client. Together: ... within this many metres. |
| `NamePlateScale` | `0.4` | Client. Together: name plate size in the world (the game's own is 1.0). |
| `AuctionKey` | `F9` | Client. Together: opens the auction house (also `/ah`). |
| `NoNewLodestones` | `true` | Host. Together: players can't build Lodestones (the Together Worlds have them); built ones are refunded. |
| `MaxPlayers` | `50` | Host. Together: players per server (the game's cap is 6); 0 = the game's own. Also set Game.ini. |
| `PlayerNetRate` | `15` | Host. Together: player network updates per second (the game's own is 100); 0 = the game's own. |
| `FixedPlots` | `true` | Host. Permanent, World-bound land: your totem area controls building, chest and workshop access; retires new portable templates, packing, duplication and migration. |
| `PortableBases` | `true` | Together: pack up your base and rebuild it on any Together World. |
| `BaseKey` | `F10` | Client. Together: opens Your Land (also `/land` and `/base`). |
| `BasePiecesPerTick` | `6` | Host. Building pieces packed or rebuilt per server tick; lower = smoother, slower. |
| `BaseBurstPieces` | `20` | Host. While a pack or build runs, pieces per fast step (about every server frame), on top of the tick's. |
| `BaseBurstMs` | `16` | Host. At most this many ms of piece work per fast step (the server's frame budget). |
| `FitBurstMs` | `8` | Host. While a build or its ground check runs, ms of ground traces per fast step (the tick keeps `FitServerMsPerTick`). |
| `BaseSettleSeconds` | `0.35` | Host. A rebuilt piece counts as built once it has stood this long after its build's last piece went up (the game drops an unsupported piece within ~0.17 s of a change). |
| `BaseLayerGapSeconds` | `0` | Host. A higher layer goes up once the lower pieces are in the world, plus this long (`2.5` = the old layer-by-layer pace). |
| `BasePackRequestSeconds` | `1` | Host. PACK UP requests per player at most this often (they skip the chat box's pace on Worlds that verify senders). |
| `BaseWaitSeconds` | `300` | Host. A build waits at most this long for players to step out of where its pieces go; then it isn't started and stays packed (PICK UP TOTEM cancels the wait). |
| `Parties` | `true` | Together: parties across Worlds, party chat (`/p`) and the party HUD. |
| `PartyKey` | `F6` | Client. Together: opens the party window (also `/party`; `/inv name` invites). |
| `PartyTravel` | `menu` | Client. Together: joining another World goes through the main menu (`menu`, reliable) or directly (`open`). |
| `PartyHud` | `true` | Client. Together: the party HUD (members, dungeon run timer). |
| `PartyHudScale` | `100` | Client. Together: the party HUD's size in percent (70-150). |
| `PartyHudX` | `0` | Client. Together: moves the party HUD right (design px, -40 to 1200; negative = left). |
| `PartyHudY` | `0` | Client. Together: moves the party HUD down (design px, -160 to 480; negative = up). |
| `DungeonLocks` | `true` | Host. Together: a dungeon is held for the first party (or solo player) inside. |
| `DungeonReset` | `true` | Host. Together: an empty dungeon resets when the next party enters. |
| `DungeonResetMinutes` | `5` | Host. Together: ... once it has been empty this many minutes. |
| `LootLockout` | `true` | Host. Together: each character loots a dungeon's chests once per lockout window (set on the hub). |
| `DungeonRuns` | `true` | Host. Together: party dungeon runs are timed (HUD line + record on the hub). |
| `DungeonTimeLimitMinutes` | `20` | Host. Together: a party's dungeon run ends here; anyone still inside is moved to the entrance and the dungeon is freed (`0` = no limit). |
| `DungeonReentryMinutes` | `5` | Host. Together: after a timed-out run, that party can't take the same dungeon on this World again for this long. |
| `DevBots` | `false` | Host. DEVELOPMENT/TEST ONLY: simulated players in real parties. Keep false. |
| `Bank` | `true` | Together: one bank per character, the same in every Together World. |
| `BankKey` | `F4` | Client. Together: next to one of your chests, marks it as a bank chest of a category; anywhere else, shows everything in your bank (also `/bank`). |
| `BankTrust` | `true` | Host. Together: bank chest owners may share a chest with trusted players (DEPOSIT or FULL, F8 at the chest); the hub keeps and enforces the lists. |
| `BankCommit` | `character` | Host. Together: bank changes count once the player's character save is confirmed (`world` is weaker). |
| `BankSaveOk` | `1` | Host. Together: the game's character save result that means "saved" (measured live). |
| `BankStamp` | `off` | Host. Together: anti-rollback stamp in the character file; `off` (this game build) or `json`. |
| `BankTaggedItems` | `false` | Host. Together: items with gameplay tags (upgrades) stay out of the bank. |
| `BankGearItems` | `true` | Host. Together: tools, weapons and armour may go in the bank. |
| `Presets` | `true` | Host. Together: bank presets (20 loadouts per character), loaded at a personal chest. |
| `CraftFromBank` | `true` | Together Worlds. Crafting at a crafting station takes the ingredients you are missing from your own bank, through your bank chest of each item's category (or a personal chest) near the station. Never at processing stations. |
| `CraftPullOnSelect` | `true` | Client. Selecting a recipe you're short of (and each craft that leaves you short again) takes one craft's worth from your bank. |
| `CraftPullAuto` | `true` | Client. Once the ingredients are in your bag, craft again by itself. |
| `CraftBankRadius` | `0` | Server. How far (cm) from the station a bank chest may stand; 0 = the game's linked-storage radius (else 3000). |
| `CraftBankReadRadius` | `false` | Server. Read that radius from the game (once, after the World starts); false = 3000. |
| `PresetHotkeys` | `true` | Client. 1-9 load presets 1-9 while the bank window is open at a personal chest. |
| `PresetQuickBar` | `true` | Client. The quick-load bar under the bank window at a personal chest. |
| `PresetEquip` | `server` | Host. After a load: equip from the server, or `bag` (equip yourself). |
| `PresetHotbar` | `server` | Host. After a load: hotbar items into their slots, or `bag`. |
| `PresetSoundLoad` | `(empty)` | Client. Sound asset played when a load starts. |
| `PresetSoundDone` | `(empty)` | Client. Sound asset played when a load finishes. |
| `PresetSoundPick` | `(empty)` | Client. Sound asset played when a preset is picked or saved. |
| `TogetherUiScale` | `85` | Client. Menu, windows and pins size (70–125%). Draggable slider in Settings > HUD; Party HUD size stays separate. |
| `DockKey` | `F1` | Client. Opens the Together menu: a dock with every feature, each in a window you can move, resize and pin. |
| `TogetherMenu` | `true` | Client. `false` keeps the classic single window (the feature keys still work). |
| `CodexKey` | `` | Client. Together: opens the Codex directly, every feature with its keys and commands (also in the Together menu and `/help`). An older `CodexKey = F1` is kept: F1 opens the menu while `DockKey` is F1. |
| `SettingsKey` | `F3` | Client. Opens the Together settings (keys and display options, also Esc > TOGETHER SETTINGS). |
| `SettingsInPauseMenu` | `true` | Client. Adds the TOGETHER SETTINGS entry to the pause menu (Esc). |
| `Welcome` | `true` | Client. Together: the welcome pages and first-steps checklist on a character's first join. |
| `RealmJoin` | `open` | Client. Together: "Join Together MMO" joins the realm and the Codex shows its public join address (Direct join `185.28.22.59` = play.rsence.com); `closed`: "opening soon". (Replaces `RealmJoinOpen`, which is no longer read.) |
| `JoinButton` | `true` | Client. "Join Together MMO" in the game's main menu under PLAY: pick a character on the next screen, CHOOSE A WORLD (Best World = the most room, or World 1, World 2, ... with their players as of your last visit), and you are in the realm. The installed version, and "update available" once a World told you of a newer one, stand under it. `false` = no entry. |
| `JoinButtonPlace` | `menu` | Client. `menu`: the entry under PLAY; `card`: a card beside the menu (also used when the entry can't be added). |
| `RealmWorlds` | `World 1=185.28.22.59:7781;World 2=185.28.22.59:7782` | Client. The World picker's rows until this PC has been on a Together World (then the Worlds' own list). Only the realm gateway's addresses are joined. |
| `FitCheck` | `true` | Host+Client. Together: a region template must fit the ground at the totem (foundations, farm plots, props); false = only "no other totem, no buildings in the way". |
| `GhostPreview` | `true` | Client. While you place a Build Protection Totem that will build a template, the whole template is drawn around it (see-through, turning with the totem, at the heights the ground gives it). |
| `FitLeaveLoosePacked` | `true` | Host (announced to clients). A farm plot or prop standing on the ground outside the building whose ground is too uneven stays packed with the template (named and counted before you confirm) instead of refusing the whole build. More than half of the build staying packed is still refused. Never walls, floors, foundations or anything resting on the building. |
| `FitAdapt` | `true` | Host. Terrain adaptation when one shift of the whole building can't fit: levels of the building set on their own ground, buried bottom layers of foundation stacks stay packed with the template (counted, recoverable). Support foundations only with FitSupportMaxLayers > 0 (0 by default). The World's check is heavier with it on large templates (measured on a Wine World: 157 pieces about 154 ms over several ticks, 3000 records about 2.9 s, worst single tick about 94 ms). |
| `FitAdaptMaxShiftCm` | `450` | Host. With FitAdapt: how far the building may move up/down. |
| `FitSupportMaxLayers` | `0` | Host. With FitAdapt: support foundations under one foundation at most (0: omissions only). |
| `FitSectionMaxShiftCm` | `800` | Host. With FitAdapt: a level of the building (foundations side by side at one height) set on its own ground may move up/down this far; pieces between levels that move apart stay packed. |
| `FitForceSnap` | `true` | Host. When a template doesn't fit the ground, its owner may FORCE it: every ground foundation set on its own ground (its top 5 cm over the highest point under it), what stands on a foundation moves with it, a piece over several foundations takes the highest of their shifts (counted and told). All the ground must be visible. Offered only while the World runs without building stability. |
| `FitForceExact` | `true` | Host. ... or force it exactly as the template is: pieces may end up in the ground or floating; works on ground the World can't see yet. Without building stability only. Neither force mode sets aside the area (radius/heights), claims, pieces in the way, farm plot permissions or anything but the ground rules. |
| `FitFoundationAboveTopCm` | `-5` | Host+Client. Together, fit: the ground may stand this many cm above a foundation's top. |
| `FitFoundationDepthCm` | `300` | Host+Client. Together, fit: a foundation's depth under its top when the game's own bounds aren't loaded. |
| `FitFoundationMinEmbedCm` | `15` | Host+Client. Together, fit: a foundation's bottom must reach this many cm into the lowest ground under it. |
| `FitMaxShiftCm` | `150` | Host+Client. Together, fit: the whole building may be raised or lowered this many cm (one offset; walls stay on their foundations). |
| `FitPieceMaxShiftCm` | `150` | Host+Client. Together, fit: a farm plot or ground prop may end up at most this many cm from its template height (plus the building's shift). |
| `FarmPlotMaxSlopeCm` | `16` | Host+Client. Together, fit: a farm plot is refused when the ground under it varies more than this (cm). |
| `FarmPlotMaxOffsetCm` | `33` | Host+Client. Together, fit: how far a farm plot may float above / sink below any point of the ground under it (cm). |
| `FarmPlotZOffsetCm` | `35` | Host+Client. Together, fit: a farm plot's origin above the ground (cm); the game's own PlacementZOffset wins when loaded. |
| `FitPropMaxSlopeCm` | `8` | Host+Client. Together, fit: the same for chests, stations and other pieces standing on the ground outside the building (cm). |
| `FitPropMaxOffsetCm` | `40` | Host+Client. Together, fit: ... how far they may float / sink (cm). |
| `FitPropZOffsetCm` | `0` | Host+Client. Together, fit: ... their origin above the ground (cm). |
| `FitSampleInsetCm` | `15` | Host+Client. Together, fit: ground samples this far inside a footprint's edge (cm). |
| `FitSamples` | `9` | Host+Client. Together, fit: traces per footprint: 5 (centre + corners) or 9 (+ edge midpoints). |
| `FitSnapEpsCm` | `2` | Host+Client. Together, fit: height changes smaller than this count as "fits as it is" (cm). |
| `FitLiveBounds` | `true` | Host+Client. Together, fit: use the game's own piece sizes and placement offsets when loaded (exact sizes; depth and surface limits only tighten the ones above). |
| `FitFoundationNames` | `Foundation` | Host+Client. Together, fit: pieces whose names contain one of these are foundations. |
| `FitFarmPlotNames` | `FarmPlot` | Host+Client. Together, fit: ... farm plots. |
| `FitStructureNames` | `Wall,Floor,Roof,Stair,Door,Window,Pillar,Beam,Ceiling,Frame,Ladder,Railing,Column,Arch` | Host+Client. Together, fit: ... structure riding on the foundations (never checked against the ground). |
| `FitShapes` | `Foundation_Large_Triangle=300x300x300t,Foundation_Medium_Triangle=150x150x150t,Foundation_Large=300x300x300,Foundation_Medium=150x150x150,Foundation=300x300x300,Floor_Large=300x300,Floor_Medium=150x150,Floor=300x300,Stair=300x300,Wall=300x40,Roof=300x300,FarmPlot=240x240,Chest=120x80,*=100x100` | Host+Client. Together, fit: footprint sizes by name (`part=WIDTHxLENGTH[xDEPTH][t]` cm, first match wins; `t` = triangle). |
| `FitUnknownWaitSeconds` | `60` | Host. Together, fit: a build whose ground isn't loaded yet waits this long for it, then is refused (nothing built). |
| `FitBeginRetries` | `2` | Host. Together, fit: a build that doesn't fit any more is checked again this many times (2 s apart) before it is refused. |
| `FitServerTracesPerTick` | `150` | Host. Together, fit: line traces per server tick while a build checks its ground. |
| `FitServerMsPerTick` | `3` | Host. Together, fit: at most this many ms of fit traces per server tick (all checks and builds together). |
| `FitRequestCooldownSeconds` | `2` | Host. Together, fit: BUILD IT / MOVE / footprint requests from one player at most this often; one fit check at a time per player. |
| `FitPreviewHz` | `4` | Client. Together: fit checks per second while you place a totem. |
| `FitClientMs` | `1.5` | Client. Together: ms of ground sampling one check may take (a big template is checked over several). |
| `FitClientTraces` | `48` | Client. Together: line traces per check at most (the rest on the next check). |
| `FitPreviewLever` | `map` | Client. Together: how the game's own totem preview turns red when the template doesn't fit: `map`, `mpc` or `off`. |
| `FitPreviewRedState` | `9` | Client. Together: the placement state whose red the preview borrows (9 = inside a protected area). |
| `FitOverlay` | `true` | Client. Together: while placing a totem, draw its area ring and the template's footprint (green/red) on the ground (`/base survey` toggles). |
| `FitOverlayPosts` | `36` | Client. Together: posts around the area ring. |
| `FitOverlayMaxMarkers` | `96` | Client. Together: markers on screen at most. |
| `FitOverlayHideModes` | `Menu,FullScreen,Inventory,Map` | Client. Together: the overlay hides in input modes containing one of these. |
| `Characters` | `true` | Host. Together: realm characters, checked against the hub's record at every join (docs/CHARACTERS.md). |
| `CharsGate` | `true` | Host. Together: a joining character can't touch any inventory until it is checked. |
| `CharsHubDown` | `wait` | Host. Together: hub unreachable at a join: `wait` (stay gated) or `allow` (play unchecked). |
| `CharsScanEvery` | `30` | Host. Together: seconds between routine character checkpoints. |
| `CharsActivityScan` | `1` | Host. Together: a checkpoint this many seconds after an inventory change. |
| `CharsScansPerTick` | `2` | Host. Together: character scans per 100 ms tick, at most. |
| `CharsContextWindow` | `8` | Host. Together: seconds a source event explains an item gained (provenance). |
| `CharsXPRestore` | `true` | Host. Together: set skill XP back to the realm record (until proven live: off). |
| `CharsLeaveScan` | `true` | Host. Together: a last checkpoint on a clean exit. |
| `NativeChatMode` | `self` | Host. Notices every client must see (a refused character, an old mod) also go out as a chat line: `self` = from the player's own name (the chat shows only senders it knows), `zero` = no sender (not shown by the game), `off`. |
| `NativeClientMessage` | `true` | Host. ... and as the engine's ClientMessage. |
| `PublicHiscores` | `true` | Show public realm hiscores. |
| `ChatTranslate` | `false` | Opt in to incoming chat translation. |
| `ChatLanguage` | `en` | Reading language when chat translation is enabled. |
| `MinClientVersion` | `2.9.0` | Host, Together Worlds only. An older mod version is treated as no mod (players can only walk around) and told, as a game notification and a chat line, to update at rsence.com. Empty = any version. |
| `CharsKick` | `menu` | Host. Together: a refused character goes to the `menu` (with the reason), is `disconnect`ed, or stays gated (`none`); always after the reason stood on screen. |
| `CharsRefuseShowSeconds` | `12` | Host. Together: a refused character sees the reason (banner + notice) this long in the world before being sent back. |
| `CharsRefuseShowLegacySeconds` | `35` | Host. Together: the same for a client without the 2.1 banner (an older mod or none), which sees only the game's notice and a chat line. |
| `CharsRefuseWaitSeconds` | `60` | Host. Together: the refusal waits at most this long for the player's client to be in the world (no mod / stuck loading: sent back at once after it). |
| `CharsMaxCraftBonus` | `-1` | Host. Together: most bonus items a craft request may ask for (-1 = as many as it crafts). |
| `CharsAccount` | `netid` | Host. Together: where a joining player's platform account is read from: `displayname`, `log`, `netid` (probe P9). |
| `CharsServerLog` | `` | Host. Together: the server log `CharsAccount = log` reads (empty = this server's Saved/Logs/RSDragonwilds.log). |
| `CharsMaxYield` | `3` | Host. Together: largest farm harvest yield multiplier a client may send. |
| `Landmarks` | `true` | official Worlds: the base map's cells and protection zones are kept in sync with the hub and protected here (landmarks.lua). |
| `LandmarkPiecesPerTick` | `6` | Server: landmark pieces built/removed per 100 ms tick. |
| `LandmarkActorWaitSeconds` | `60` | Server: a base-map container the building manager holds but whose actor hasn't loaded is waited for this long, then counted as standing: never built a second time. |
| `LandmarkBuildNearCm` | `15000` | Server: a landmark is built, changed and checked only while a living player who has loaded in is within this many cm of it (live: the game drops pieces built more than ~200 m from the player). |
| `LandmarkSpillSettleSeconds` | `1` | Server: a map container an update takes away is emptied onto the ground first and taken down this many seconds later, so its items are never swept up as the removal's refund. |
| `LandmarkAuditSeconds` | `60` | Server: how often a standing landmark's pieces are counted (the hub repairs missing ones). |
| `LandmarkStrays` | `wait` | Server: pieces with no totem inside a landmark's footprint: wait (an admin decides) or build (build anyway). |
| `LandmarkLodestoneUnregisterFirst` | `false` | Server: LodestoneComponent:OnDestroyed() before a realm lodestone's deconstruct (probe 4: the deconstruct alone is clean). |
| `LandmarkPlates` | `true` | Client: a name plate over each nearby personal chest / realm landmark. |
| `LandmarkPlateRangeM` | `80` | Client: ... within this many metres. |
| `LandmarkBanner` | `true` | Client: an arrival banner and toast when you reach a personal chest / realm landmark. |
| `LandmarkCompass` | `true` | Client: a compass strip at the top with personal chests (your bank) ahead. |
| `LandmarkCompassRangeM` | `2000` | Client: ... within this many metres. |
| `LandmarkMapPins` | `false` | Server: personal chests / realm landmarks as pins on each player's game map (probe 5; off until live step 10 checks a session pin + a saved pin). |
| `LandmarkNorthYaw` | `-90` | Client: the world direction (yaw) that is north on the game's map, for "north-east" in the nearest-bank line (live check). |
| `BankDepositEquipment` | `false` | Server: DEPOSIT EQUIPMENT at personal chests (worn gear; off until the loadout probe). |
| `BaseWorld` | `true` | Server: camp pieces, the map's world items, overlap packs, /unstuck (baseworld.lua). |
| `BuildOnlyInAreas` | `true` | Server (official Worlds): players build only inside their own or a trusted totem area; camp pieces anywhere else. |
| `CampPieces` | `bedroll=2/24;campfire=2/6` | Server: piece name fragment = most per player outside areas / hours it lasts (live B8: BUILDPIECE_Interior_BedRoll #650, BUILDPIECE_Campfire #26; the game has no tent). |
| `PublicChestsOutside` | `true` | Server: a chest outside every totem area opens for everyone, as in the game (inside areas the access lists apply). |
| `CategoryChestsOwnAreaOnly` | `true` | Server: a category (bank) chest works only inside its owner's own totem area. |
| `BaseMapWaitMinutes` | `15` | Server: a World seeded from the map waits this long for the hub's cells (no local list), then allows building again (said loudly). |
| `BaseMapFailOpen` | `false` | Server: `false` (official Worlds): a World seeded from the map that has neither the hub's cells nor the local list keeps refusing every change except building in a player's own totem area, for good (ALERT every 5 min). `true`: after `BaseMapWaitMinutes` building opens again and the map is unprotected. |
| `BaseItemReachCm` | `1000` | Server: a map item that vanished with a player this close was taken (else it streamed out). |
| `BaseItemRetireMax` | `0.1` | Server: a base-map update that would retire more than this share of the map's world items is refused as a mismatch: nothing is removed (ALERT). |
| `BaseItemSuspectDays` | `7` | Server: a review flag (a player within reach when a map item was taken; nothing is removed from them) is dropped after this many days. |
| `CampMapGapCm` | `500` | Server: camp pieces keep this many cm from any piece of the base map (doorways, bridges, inside its houses). |
| `PersonalStorageButton` | `false` | Server: PERSONAL CHEST in the bank window opens the player's own storage (off until live probe B1 confirms the server-side open). |
| `PersonalStorageOpen` | `spell` | Server: how PERSONAL CHEST opens the player's own 20-slot storage: spell (no chest, like the game's ability) or manual (at the chest; LIVE PROBE B1b). |
| `NoNewPersonalChests` | `true` | Server (official Worlds): players can't place personal chests (the base map has them; each opens the bank). |
| `PersonalChestPieces` | `personalchest,personal_chest,personalstorage` | Name fragments of the personal chest piece/class (LIVE PROBE B1). |
| `PersonalChestZone` | `1500` | Server: cm around a personal chest nobody builds in. |
| `RealmBuffer` | `1000` | Server: cm a player's totem area keeps from the base map's protected areas, personal chests and protection zones. |
| `BaselineAuditSeconds` | `300` | Server: how often the base map's cells near a player are counted (missing pieces are put back by the hub). |
| `BaselineOverlapEvery` | `120` | Server: seconds between reports of one player base that reaches the base map's structures (the hub packs it). |
| `BaseItemMissingSeconds` | `30` | Server: a base-map world item missing this long (with a player near) is put back. |
| `BaseItemSeenCm` | `2500` | Server: ... a player within this many cm of it (live B11: the map's items exist only while a player is near). |
| `BaseItemPutBack` | `true` | Server: put missing base-map world items back (never one seen taken). |
| `BaseItemPutBacksPerDay` | `2` | Server: ... at most this many times a day per item (more: an admin alert, nothing created). |
| `DisplayPieces` | `display,rack,mannequin,mount,plaque` | Server (capture): name fragments of display pieces (locked). |
| `BaseMapName` | `Together-Map` | Server (capture): the base map's name in the manifest. |
| `Unstuck` | `true` | Server: /unstuck (stand still, then to the starting area, walking only for a while). |
| `UnstuckSpot` | `4913,189059,-3497` | Server: "x,y,z" /unstuck takes you to (live B9: the church spawn's PlayerStarts; its Lodestone 5065,189026,-3633). |
| `UnstuckSeconds` | `10` | Server: seconds to stand still. |
| `UnstuckMoveCm` | `75` | Server: moving more than this cancels. |
| `UnstuckCooldownMin` | `10` | Server: minutes between uses (kept across restarts). |
| `UnstuckWalkMin` | `2` | Server: minutes of walking only afterwards. |
| `UnstuckWalkSpeed` | `300` | Server: the walk speed held meanwhile (cm/s; LIVE PROBE B9). |
| `CapturePiecesPerTick` | `500` | Server: the base-map capture (console) writes this many pieces per tick; it runs over ticks. |
| `CaptureItemsPerTick` | `40` | Server: ... and reads this many world items per tick. |
| `UnstuckFightCm` | `1500` | Server: /unstuck: damage counts as fighting only with a creature in combat near or another player this close (thirst and hunger don't). |
| `NativeResetBlock` | `true` | Server: the game's own Esc > Hold to Reset Position is undone on Worlds with /unstuck (the player is put back and told to use /unstuck). |
| `Adventurers` | `false` | Server (dedicated only): AI Adventurers live on this World (`Scripts/adventurers.lua`, `docs/ADVENTURERS.md`). Off until the World's owner turns it on. |
| `AdventurerCount` | `4` | Server: how many Adventurers (0-50 per World). |
| `AdventurerNames` | `Alex,Sarah,Anders,Woogie` | Server: their names, shown as "Adventurer <Name>"; more than listed are drawn from a pool. |
| `AdventurerSpawn` | `(empty)` | Server: `x,y,z` where they first appear; empty = the World's PlayerStart. |
| `AdventurerChat` | `true` | Server: they talk through the brain service (`brain.py --forward` on the World host); `false` = instant reactions and emotes only. |
| `AdventurerMap` | `false` | Client: the World's AI Adventurers on the full-screen map (M) as gold dots with their names; the map's ADVENTURERS button (top right) switches it and Together settings keep it. |
| `UnifiedChat` | `true` | Client: one chat at the bottom of the screen with tabs (ALL, WORLD, LOCAL, PARTY, TRADE, SYSTEM): the game's own chat and Together's world, local and party chat, Adventurers and notices together. The game's chat box is hidden while it is on. `false`: the game's chat box and the old feed (bottom left), as before. |
| `ChatScale` | `100` | Client: the unified chat's size in % (80, 90, 100, 115, 130, 150). Together settings > NOTICES & MORE. |
| `ChatLines` | `8` | Client: message rows the unified chat shows (6, 8, 10, 12). |
| `ChatTimestamps` | `false` | Client: HH:MM before each chat line. |
| `ChatFilters` | `(empty)` | Client: the chat tabs' On / Filtered / Off states. Written by the chat itself (right-click a tab); empty = all On. |
| `ChatMuted` | `(empty)` | Client: names you muted from the chat. Written by the chat itself. |

Default keys: **F4** bank, **F6** party, **F7** trade, **F8** nearby land, **F9** auction house, **F10** Your Land
(and **F1** the Codex where it is installed). Two features set to the same key are reported in
`ue4ss/UE4SS.log` at start.

## Privacy and your data (Together Worlds)

Your own worlds never talk to the Together hub. On the Together Worlds, the World's game server
sends the hub what the features need, and the hub (`hub.rsence.com`) keeps:

- **Who you are:** your character's key (the game's character id), your character name, your
  platform display name (only to notice a changed account) and the name shown to others.
- **While you are online:** which World you're on and where you stand, to show you to players on
  other Worlds. Positions are only held in memory and are never written to disk. The hub remembers
  the last World it saw you on (to route party invites and World switches).
- **Chat:** world, local and party chat are passed on, not stored. Your last 20 lines are kept in
  memory so a `/report` can include them; a report stores the reporter, the reported player, the
  reason and those lines.
- **Game state you create:** your GP balance and its ledger (every change, kept permanently so
  balances can be audited), bank contents and bank operations, auction listings and deliveries,
  base templates (the building pieces you packed), parties and invites, dungeon loot lockouts and
  run times, your mutes, and moderation notes (bans, flags).
- **Your realm character record:** the items, skills and XP of each character as last confirmed
  by a Together World, a history of its joins and checkpoints, and where items came from
  (provenance), so items from elsewhere stay out and a character can be restored exactly.
- **Not collected:** players never connect to the hub (only game servers do), so it never sees
  players' IP addresses. No email, no payment details, no hardware ids.

Retention: active data (account, bank, templates, listings, character records) is kept while the
realm runs. The GP ledger is kept permanently (it is the audit trail). Item provenance is pruned
after 120 days (stackables) and 365 days (gear). Hub server logs are kept for at most 30 days,
database backups for 14 days.

Your choices: `/hide` stops players on other Worlds from seeing you (`/show` undoes it); `/anon`
hides your name from them (`/named` shows it again); `/mute name` hides a player's chat. The F1
Codex has the same summary under PRIVACY & SAFETY.

Deletion and questions: open an issue at https://github.com/Proxify/rsdw-together/issues with your
character name and World (nothing private in the issue). Your account (name, bank, templates,
party, listings, character record) is deleted; the ledger entries are kept without a name. The
full text: PRIVACY.md in the repository.

## Notes

- Up to 8 stacks per side per trade. Items bound to your character can't be traded.
- The receiving player needs enough free inventory slots, otherwise the trade fails and nothing
  is moved.
- Players without the mod see the raw `~T|...` trade lines in chat.

### Auction House listings (2.7.1)

SELL lists eligible items already deposited in your personal bank. Deposit at a Personal Chest first; items in your bag and other players' shared banks cannot be listed. The realm transfers the selected bank quantity into the listing atomically. Older clients must update to list items. Buying, cancellation and delivery retain their existing behavior.
