44 Commits

Author SHA1 Message Date
7f008fd1f3 docs(modules): the Carbon rig answers too, and its root is a different directory
R19's byte-identical plugin now carries protocol 5 on both frameworks:
`framework=oxide root=/home/container/oxide/config` on one rig and
`framework=carbon root=/home/container/carbon/configs` on the other, from the
same file. That is R18's amendment proven rather than argued — a literal
`oxide/config/` in this editor would have missed every config on half of all
installs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMH6bw1jXMgbyF3ZWGEzSM
2026-09-22 08:58:21 -05:00
82145d3b4a docs(modules): phase 7b as built — configuration from the site, and the undo that makes it safe
PROTOCOL.md §11 specifies protocol 5: the walk rooted at the framework's own
config directory, the version a write must present back, the set-shaped write,
the watched reload and the automatic restore. PLAN.md §21 is the phase as built
— four org-lead decisions, the float trap and what avoiding it cost, and four
defects a browser found that 179 green tests did not.

PLAYER_WALK.md gains the configuration walk, because the acceptance line needs
the sidecar and the game on one host and the rig cannot reach one yet.
INTEGRATION.md gains the four things an operator should know before they edit a
plugin's settings from a web page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMH6bw1jXMgbyF3ZWGEzSM
2026-09-22 08:55:39 -05:00
132205f0f4 Merge pull request 'docs(modules): phase 7 as built — the permission mirror, and the set arithmetic behind it' (#259) from docs/rust-phase-7 into main
Reviewed-on: #259
2026-09-22 06:53:00 +00:00
bba2ab04e0 docs(modules): phase 7 as built — the permission mirror, and the set arithmetic behind it
Protocol 4 (`PROTOCOL.md` §10), phase 7 as built (`PLAN.md` §20), what an operator
needs to know about it (`INTEGRATION.md`), and the in-game leg as a walk to run
(`PLAYER_WALK.md`).

**The spec.** One verb carrying the whole desired set, diffed by the plugin
against the live store; a report whose two interesting fields are the ways a push
looks like it worked and did not (`unresolved`, `pending`); drift as a report
rather than an action; and the permission hooks as a live SIGNAL rather than the
record — a hook that stops firing costs latency, not correctness.

**The finding the design turns on, written where it belongs.** A name in the store
that is not in the desired set is either something the site retired or something a
human granted, and those have opposite correct answers. The store records who
granted a permission nowhere, so only the website can tell them apart — which is
why it keeps a ledger of what it pushed, and why revoking a hand edit needed a
table of its own.

**§10.5 is a rule generalising.** "A wedged sidecar must never stall the game"
becomes "nothing the far side sends may cost the main thread unbounded work",
because `perm.sync` is the first command whose work is not bounded by its own
shape. Three bounds, each on the side that can say something useful when it is hit.

**§20.7 says plainly what is not proven**: the acceptance line needs a second,
non-admin Steam account on the rig, and nothing in the plugin has been compiled.
The walk doc carries the seven steps, including the two things to confirm on
Carbon rather than assume.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMH6bw1jXMgbyF3ZWGEzSM
2026-09-21 22:59:24 -05:00
4fe8864939 Merge pull request 'docs(modules): phase 6 as built — identity, and the sentence a player could not see' (#258) from docs/rust-phase-6 into main
Reviewed-on: #258
2026-09-21 22:24:42 +00:00
e35880e713 docs(modules): phase 6 as built — identity, and the sentence a player could not see
Protocol 3 in PROTOCOL.md §9, the identity walk in PLAYER_WALK.md, what an
operator needs in INTEGRATION.md, and PLAN.md §19.

Seven org-lead decisions (§19.0): /link is chat and its reply is private, codes
live in plugin memory as the UO bridge does, an alphabet with no O/0/I/1, a
Steam id another account holds is refused rather than moved, the website asks
EVERY server because a code does not say which one minted it, staff can sever a
link, and the activity-row overflow belongs to core.

§19.3 is the finding worth reading: a slot router is not registered under a tier,
so this repo own OpenAPI generator described two routes fewer than the module
serves — internally consistent, and wrong. The frozen-manifest job catches it,
which was verified by deleting the two paths and watching it fail.

§19.4 is what a browser found and 122 green tests did not. Core request
primitive reads data.message; this module has answered { error } since phase 1,
so every refusal this phase exists to write rendered as Service Unavailable.

The code-from-the-game half is written down rather than claimed: a code reaches
a player and nobody else, so no console can read one (D27).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMH6bw1jXMgbyF3ZWGEzSM
2026-09-21 09:06:51 -05:00
54b4059091 Merge pull request 'docs(modules): phase 5 as built — Android leg A, and the capability a client had to be given' (#257) from docs/rust-phase-5 into main
Reviewed-on: #257
2026-09-17 09:21:44 +00:00
dfdb0a3f63 docs(modules): phase 5 as built — Android leg A, and the capability a client had to be given
module-rust's surface gets its second client. `modules/rust/PLAN.md` §18 records
the phase; `android/PLAN.md` M14 records the app's half, as every Android
milestone does.

The decision worth the most words is D16. This module declared five capability
strings and every one named a SURFACE — `servers`, `killfeed`, `leaderboard`,
`presence`, `wipes` — while a client gating a navigation group needs one that
names the MODULE. Core flattens every started module's capabilities into a single
list, so `servers` is a word another module could declare tomorrow and silently
reveal these screens on a site that does not run Rust. Gating on the module `id`
was considered and rejected in as many words: `id` is a mount prefix, §2.9
forbids inferring a route from a capability, and letting a client gate on `id`
makes the two the same value in practice.

Also recorded: D17 (poll while RESUMED — the phone's Page Visibility gate), D18
(the Rust repositories move to `edge`, releases at the cutover), D19 (the drawer
badge, and NavPaths learning `/rust`), why D15's footer slot had to be translated
rather than copied, and §18.4's three defects — none of which a green suite of
644 could see, because each is about what a screen looks like or when a number is
re-read.

§18.6 is deliberately short and honest: the website's own pages have still not
been read at phone width, and the badge's non-zero case was shown with a seeded
count rather than by people playing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-17 03:45:01 -05:00
2f24236993 Merge pull request 'docs(modules): phase 4 as built — the first pages, and the four defects a browser walk found' (#256) from docs/rust-phase-4 into main
Reviewed-on: #256
2026-09-17 02:42:51 +00:00
788100e048 docs(modules): phase 4 as built — the first pages, and the four defects a browser walk found
Records PLAN.md section 17 and marks the phase row done. Four decisions (D12-D15),
what is on the pages, and the four defects only a live walk could find — two of
them in code phase 3 had already shipped: an unreachable refresh that erased the
server's description, and a "last reported" line reading the timestamp of our own
poll rather than of the server's last frame.

Also written down: why core's useAsync cannot poll, the real per-page cost of a
live count in the footer slot, and the test fake that was *nearly* core.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-16 21:40:39 -05:00
a221d4409b Merge pull request 'docs(rust-link): protocol 2 — the read path, and phase 3 as built' (#255) from docs/rust-protocol-2 into main
Reviewed-on: #255
2026-09-16 16:36:42 +00:00
f80b9f95c8 docs(modules): the ingest walk, and the two-writer trap it walked into
The module half exercised against the live rig rather than only its own tests:
the working tree installed into a running core, pointed at the workstation
sidecar with a real Rust server behind it. The fresh-install path logged
`cursor started at the feed tail`, a console banid/unban arrived as two
rust_events rows carrying the wipe id, and the wipe row was created by being
mentioned rather than by any "a wipe started" call.

Then the boundary on real rows: with both ban events in the table, the public
events route answered {"events":[]} — and answered the same when asked for
player.banned BY NAME.

The trap is worth more than the proof. The state row read as online=1 with
hostname=NULL, a shape no code path writes. Two cores shared one database: a
second instance still held the phase 2 release in memory, spoke protocol 1, was
refused 409, and rewrote the row every thirty seconds. Nothing was wrong with
either. What made it look like a defect was two SELECTs in two round trips
assuming the state did not move between them — the same mistake the Pterodactyl
work recorded, and a single atomic read caught the coherent row alternating with
the other writer's.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-16 08:52:48 -05:00
30e72adfcf docs(rust-link): protocol 2 — the read path, and phase 3 as built
The specification the other three repositories are held against, plus the phase
record.

`PROTOCOL.md` §8 is the new contract. Its centre is one field: every frame now
carries `type` — `event`, `snapshot`, `reply`, `control` — and the sidecar files
on that and nothing else. That is the dumb-forwarder property made structural
rather than intended: ten new event kinds are zero change in Rust-Link, and only
a version adding an indexed column touches it at all.

Also in §8: the fifteen-kind catalogue and what each frame carries; `wipeId`
derived by the plugin, which REVERSES §3.2's "deriving one is the website's job"
and says why; boards re-sent on connect and on a cadence; the aggregate rule (a
hook that can fire more than once a second per player is a counter, not an
event); the void rule that stops a read-path hook vetoing a death or a login; and
`GET /feed`, a cursor route separate from `/events` because one route with two
orderings serves the wrong one to every caller that forgets the parameter.

§8.5 is the part to read twice. The classification of a kind as public or staff
is NOT on the wire, deliberately: a boundary declared by the sender is one a
compromised or out-of-date game host can widen, so the module holds a
default-deny allowlist and this table is what its test holds it against.

§8.8 corrects a catalogue rather than a defect: PLAN.md §10 sources
`rust.login.denied` from `CanUserLogin`, and that hook fires on every attempt —
the only way to learn of a denial from it is to be the denier. A denial is the
absence of an approval, and protocol 2 emits both facts so phase 10 can pair them.

`PLAYER_WALK.md` is new, and it exists because half this catalogue cannot fire
without somebody holding a mouse. Ten steps, what each one should produce, and
what counts as a pass — written so the walk can be run without watching the
output live, and so the answer afterwards is readable as a transcript.

PLAN.md §16 is phase 3 as built: the four decisions, the two defects only a
server that BOOTED with the plugin could find (a wipe id that was null for every
real session, and a two-second main-thread stall on unload), what was proven and
how, and — stated plainly rather than implied — the three measurements still
queued on the org lead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-16 08:39:27 -05:00
ddf777fd8c Merge pull request 'docs(modules): phase 2 as built — packaging, release and the frozen manifest' (#254) from docs/rust-phase-2 into main
Reviewed-on: #254
2026-09-16 10:51:01 +00:00
5274d5a744 docs(modules): phase 2 as built — packaging, release and the frozen manifest
PLAN.md gains §15 and the phase-2 row is marked done.

What the phase found worth recording:

- The starting position was worse than the row implied: phase 1 built five
  guards and ran every one by hand, because the repo had no .gitea/workflows at
  all. So the org lead widened the phase to include the gate, not only the
  release (D4), and the frozen-manifest job shipped with it rather than waiting.
- That job answers a question §13 had to take on trust. Core mounts /status and
  /version at a tier root where the loader's collision probe cannot see them, so
  phase 1 could only check /rust by reading. Locally and in CI, against the same
  pinned core: 280 core routes, 6 added, all documented, none of core's moved.
- The bundle carries no node_modules (D5), and checkBundle.js asserts the
  emptiness rather than assuming it — the day a dependency appears is meant to
  be a loud day. Verified by breaking the include list.
- No Sonar for the three Rust repos until phase 19 (D6).
- The criterion is met. v0.1.0 published, downloaded, hashed independently
  (7296c76b… matches the manifest), and installed from its manifest URL through
  Admin → Modules into a core with the phase-1 directory and row torn down
  first. The volume received exactly the twenty files the include list names;
  the row reads started with a source and a sha where phase 1's had nulls; the
  public route answers 200, the player and admin tiers 401, and all five /rust
  paths merged into core's own spec.
- REGISTRY_TOKEN was already configured — the one prerequisite this work could
  not check for itself, since the bot can read no Actions secrets.
- One rig finding: Docker Desktop's Linux engine was found dead and answered
  every call with a bare 500, which presents as the website being broken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-16 05:42:36 -05:00
3c8b430fae Merge pull request 'docs(modules): module-rust supports Carbon too, ships a Pterodactyl egg, and the rigs move to the panel' (#253) from docs/rust-carbon-and-pterodactyl into main
Reviewed-on: #253
2026-09-16 02:54:23 +00:00
22159ec78f docs(modules): the Carbon rig, R19 proven, and one refuted claim
rust-carbon (id 18, 87fb1f67) is built on the same egg with FRAMEWORK=carbon,
a clean install rather than a converted one. Install 122s, boot 543s.

R19 is proven. The byte-identical RunicGateway.cs that runs on the Oxide rig,
with no conditional compilation in it at all, loaded on Carbon 2.0.259.0 and
behaved identically - same startup line, same no-stall retry against an absent
sidecar. That contract now holds on three platforms from one source file:
Windows/Mono, Linux/Oxide, Linux/Carbon.

R18's amendment is confirmed the best way it could have been. The plugin's own
config, written by the same Oxide-compat API on both rigs, landed at
oxide/config/RunicGateway.json on one and carbon/configs/RunicGateway.json on
the other. Had the R18 editor used a literal path it would not have found its
own plugin's config on half of all installs, and no test would have caught it.

One claim is REFUTED, and it was wrong about Oxide as well as Carbon. CARBON.md
said Oxide stores permissions as JSON and Carbon as Protobuf or SQLite. Both
rigs say otherwise: both store Protobuf, under IDENTICAL filenames
(oxide.users.data, oxide.groups.data), differing only in directory - Carbon
writes its own data into files named after Oxide. This strengthens R2's
API-only rule rather than weakening it: a file reader would have worked on both
rigs today and broken silently for the one operator who ran c.migrate_perms_sql.

Two things nobody had thought to claim, found by looking. Carbon auto-creates a
third default group, moderator, which R2's full-set push must tolerate or
report drift for ever. And c.plugins exposes per-plugin hook telemetry that is
most of section 6's fired-hook mechanism, free, and only on Carbon.

Also: a wrong console command is indistinguishable from success at the API.
Pterodactyl's command endpoint returns 204 either way and Carbon prints nothing
for an unknown command, so oxide.plugins on Carbon looks exactly like it
worked. Anything driving the console must read a log to know.

CARBON.md gains a scorecard (section 10) and drops its unproven banner.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 21:51:11 -05:00
069e715b1b docs(modules): the Pterodactyl rig as built, R22, and a correction
Section 14 records R21's first rig, made with the application key and driven
with the client key. Both work; neither can do the other's job, and there is
no egg-write endpoint at all, so a published egg is a JSON file a human
imports.

The tier-2 loop was run rather than described: phase 1's real RunicGateway.cs
pushed from the working tree, oxide.reload through the client API, the edit
observed in Oxide's own log, source restored. About ten seconds end to end.
Three things worked that were not certain to - files/write creates missing
parents, a plugin placed before Oxide exists survives Oxide arriving, and the
plugin compiles and loads on Linux, which no previous phase had established.

Two findings that change decisions. The image installs the framework on EVERY
boot, Carbon from the rolling production_build tag and Oxide from
releases/latest, so a restart is a framework upgrade and neither is pinnable
through the egg. And R20's "wrapper launches the sidecar then RustDedicated"
does not survive Carbon: the entrypoint prepends LD_PRELOAD to the whole
startup string, so the preload would land on the sidecar and the server would
start cleanly, report nothing, and be silently unmodded.

R22 (org lead): the sidecar's configuration moves into the egg's variables.
Nearly free - rust-link already reads all five keys from the environment with
env-over-file-over-defaults precedence - but the game bind must not be
operator-editable, the web bind must derive from an allocation, and the db
path must not be able to agree with REMOVE_FILES.

Also corrects an earlier claim in this branch. The client key listing zero
servers and includes returning empty were both CORRECT; the servers were
being deleted between reads. A differential diagnosis across two API calls
assumes the state did not move between them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 21:30:06 -05:00
a29cdf0fae docs(modules): record the Pterodactyl client key and its empty-server-list problem
The token file now carries both keys. The client key authenticates as the
admin owner and then lists zero servers, on every listing type and for both
the short identifier and the full UUID, so tier 2 of R21's deployment loop is
not usable yet. Reinstall and SFTP are unaffected.

Records the diagnosis rather than only the symptom, including one trap worth
not repeating: includes are independently broken on this panel, so
servers?include=user returns an empty list where the same route without the
include returns six. Nothing built on an include is evidence about ownership.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 21:08:15 -05:00
5890da633f docs(modules): module-rust supports Carbon too, and ships a Pterodactyl egg
Three new decisions of record, and a new reference for the second modding
framework.

R19 - the bridge plugin is framework-agnostic from now, not ported later.
Carbon is not a fork of Oxide but a separate loader shipping an Oxide
compatibility layer, so one .cs in the Oxide.Plugins namespace serves both,
with #if CARBON only where the APIs genuinely differ. Three existing
decisions take an amendment and none is reversed: R18's config walk roots at
Interface.Oxide.ConfigDirectory rather than a literal oxide/config (Carbon
uses carbon/configs AND lets an operator relocate every directory from the
command line); R2's permission store is Protobuf or SQLite on Carbon, which
permanently closes the file-reading shortcut it never planned to take, while
the PermissionExists pre-check survives because Carbon's bool return is the
one thing we cannot read portably; R4's doctor asks which framework rather
than whether Oxide, and gets a weaker "current enough" claim because Carbon
ships rolling release tags.

R20 - a Pterodactyl egg is a third supported deployment path beside the
installer and the hand install, derived from the community "Rust Autowipe"
egg, which already carries a FRAMEWORK variable offering vanilla/carbon/oxide.
The sidecar runs inside the game's container, which is what lets D2 stand
unchanged: a container's 127.0.0.1 is genuinely private, so the game link
stays loopback and stays unauthenticated. Lands in phase 18 beside the
installer.

R21 - both rigs move to the Pterodactyl panel, because Oxide and Carbon
cannot coexist in one install and so a single server cannot prove R19. Also
retires the wipe-day maintenance that dominated section 4, and makes the rig
Linux where every prior finding came from Windows and Mono.

New: modules/rust/CARBON.md, the difference list - file layout, the
permission store, the c. commands, 30 Carbon-only hooks, and 13 uMod names
Carbon's catalogue omits (at least two of which look like renames). Sourced
from Carbon's own published metadata and source at main, and labelled
throughout as not yet proven on a live Carbon server.

One outstanding request, recorded in section 3: the panel token on disk is an
application key and Pterodactyl puts files, power and console on the client
API, so iteration needs a ptlc_ key only the account holder can mint.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 20:59:23 -05:00
b4b05b4108 Merge pull request 'docs(modules): module-rust phase 1 as built — the transport, and three org-lead decisions' (#252) from docs/rust-phase-1 into main
Reviewed-on: #252
2026-09-16 01:29:48 +00:00
bd83b34614 docs(modules): module-rust phase 1 as built — the transport, and three org-lead decisions
Adds docs/rust-link/, the canonical spec for the Rust bridge: PROTOCOL.md (the
game link and the website API) and INTEGRATION.md (standing it up by hand, and
which of the three components is wrong when it does not work). A new top-level
directory mirroring link/, which is decision D1 below — it keeps the uo/link
symmetry and keeps module docs separate from bridge docs.

Records phase 1 in PLAN.md as section 13. Both criteria met: a server.hello
produced by the live Rust rig travelled game → sidecar → module → the public
website API, killing the sidecar left the game untouched, and all five guards are
green on the module skeleton.

Three org-lead decisions this phase needed, none settled by section 2:

* D1 — the bridge docs live at docs/rust-link/.
* D2 — loopback is the ONLY trust boundary on the game link, no token, exactly
  as on the ServUO bridge. Argued the other way on the grounds that Rust servers
  are far more often on GSPs; overruled, and the consequence is now written down
  as the mistake rather than defended against.
* D3 — the plugin reads Oxide's own config file, so it lands inside the phase-7b
  config editor for free. The argument against — that editing Host/Port from the
  website could cut the link carrying the edit — becomes that phase's guard
  rather than a reason for a second config mechanism.

Section 11.3 is corrected in place: it read module.json's "extensions" array as
held against reality by the loader in the way "mounts" is. Only half true. The
loader checks that a named slot EXISTS and never that the module filled it —
checkDeclared covers "mounts" alone — and only ONE of R13's two slots can be
declared there at all, because site.footer.status is a CLIENT slot and naming it
fails the load outright.

Section 13.3 records five defects a running server found that no test could,
including a bootId that regenerated on every plugin load rather than every server
start — which would have asked core to reconcile its whole ledger on every
oxide.reload, for a world that never moved.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 19:55:35 -05:00
80c7a9dcd1 Merge pull request 'docs(modules): module-rust phase 0 as built — the rig is current, and four plan claims were wrong' (#251) from docs/rust-phase-0 into main
Reviewed-on: #251
2026-09-15 21:42:57 +00:00
b12c6dfde4 docs(modules): phase 0 fully closed — both zone transitions observed live
The org lead connected, so the occupancy criterion is met: a zone created
on the player's own position reported OnEnterZone, occupancy=1 by name,
and OnExitZone. R17's "presence transitions as events" is verified, which
is what the participation ledger and advance conditions rest on.

The exit was produced by relocating the zone rather than walking the
player out — CreateOrUpdateZone on an existing id moves the trigger
volume and fires OnExitZone. Useful for testing presence unattended.

Two ceilings recorded, both constraining later phases:

- No console session can observe a gate (the !player || idiom).
- An admin account cannot see a refusal from most plugins either, and the
  bypass is NOT uniform. PopupNotifications (player.IsAdmin) and
  ZoneManager (authLevel > 0) hard-bypass; Kits' RequiredPermission gate
  is config-gated with a shipped default of false, and Kits' own IsAdmin
  is a permission rather than auth level. So phase 13 is demonstrable on
  this rig as it stands and phase 7 is not — phase 7 needs a second,
  non-admin Steam account.

Adds §12.6: R18's two trees as they actually look now the configs exist.
Its data/ inventory was exactly right, but config/ is FLAT on a fresh
base set — it is data/ that nests, i.e. the nesting R18 cites to justify
the recursive walk is currently only visible in the tree it must never
walk. Also: oxide/data/ holds Oxide's own permission store, so straying
one directory over would edit R2's mirror underneath itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 16:40:08 -05:00
98bed8ff3d docs(modules): re-install Oxide after an update is routine, not a finding
Org lead correction: every Rust host already updates the server and
re-installs Oxide together. Presenting that as something an operator
would be caught by talks down to the audience.

Keeps the one narrow consequence that is actually ours: app_update
leaves Oxide.Core.dll and the rest in place, so a phase-18 doctor check
that tests for oxide/ or for Oxide's assemblies passes on a server that
is mid-routine. Compare Assembly-CSharp.dll against the Oxide build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 16:04:23 -05:00
947e1c1c67 docs(modules): phase 0 as built — the rig is current, and four plan claims were wrong
Brings D:\rust to build 25230300 with Oxide 2.0.7716 and the four base
plugins loaded, and records what the rig disproved.

- §4: start.bat never updated anything. +force_install_dir must precede
  +login; the 2026-09-15 fix corrected the path and left the order, so
  every update run in the rig's history errored without updating. Also:
  app_update reverts Oxide's patched Assembly-CSharp.dll while leaving
  Oxide's own assemblies, producing a server that looks Oxided and loads
  no plugins. Phase 18's doctor should check for this.
- R2: permission.GrantUserPermission silently no-ops for an unregistered
  permission — void, no throw, no log. Since R2 recovers by re-pushing
  the full set on connect, a re-push into a server missing one plugin is
  a silent partial. Plus: grants and groups have different reach for a
  player who has never connected.
- R5: the Clans plugin raises nine hooks, not three, and three carry full
  member lists. The "exactly three, none a membership transition" claim
  was a grep artefact — the hook name is a const at the call site. The
  decision stands on a different reason; phase 17 gains event-driven
  leadership as a sharpening rather than a replacement.
- R17: EraseTemporaryZone's owner scoping refuses only a *different*
  owner. An unowned zone — every zone an operator made by hand — is
  erased by anyone and returns true. Phase 12 must gate on its own id map.
- §12.5: the zone-occupancy criterion stays open. A console command has no
  BasePlayer, so every plugin's permission check short-circuits to allowed
  and no console session can observe a gate closing; NPCs are excluded
  from zone player lists by construction. This is a standing property of
  the rig, relevant at phases 7 and 12.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 15:07:59 -05:00
cbf322b4d6 Merge pull request 'docs(modules): second contract pass over MODULE_API.md — restores a dropped reconcile, reprices R9' (#250) from docs/rust-plan-contract-pass2 into main
Reviewed-on: #250
2026-09-15 17:49:23 +00:00
dbc0455490 docs(modules): a second contract pass over MODULE_API.md, member by member
Section 7 audited the plan against the Integration Kit and the template. This
pass reads MODULE_API.md itself and enumerates every member rather than grepping
for registration names. It found one regression, one mispriced decision, one
missing declaration, and a set of ctx members the plan had never mentioned.

THE REGRESSION. ctx.events.reconcile() and an action's reconcile() appear
nowhere in the document. The twelve-phase first draft had them - phase 6,
reconcile and the boot-id watch - and the rewrite to twenty phases lost them.
That is a regression in the plan, not a decision. It matters MORE for Rust than
for the game the contract was written against: the kit rates reconcile the one
omission that is merely a lower standard rather than a broken promise, but that
assumes a world which persists. Rust wipes monthly and a wipe invalidates every
ledgered resource for that server at once, and core cannot tell a wedged sidecar
from a game that rebooted and lost everything - it sees ok:false retry:true
either way. It asks once at its own boot and otherwise waits to be told.
ctx.events.reconcile() is being told, and the trigger is a watch on the game's
boot id changing, which is also the only way to tell a game restart from a
sidecar reconnect. Restored to phase 13.

R9 WAS MISPRICED. It says the map's per-layer switches work through the existing
visibility framework, which reads as reuse. It is not reuse: section 6.3 records
shardVisibility as module-owned, and the tree confirms it - the util, both
models, the admin controller and its tests all live under module-uo/server/ and
there is nothing by that name left in website/server. Section 2.7 forbids a
module requiring outside its own directory, so module-rust cannot import a line
of it and builds its own. Not a reason to change the decision; phase 14 now
carries a visibility layer of its own rather than a configuration of somebody
else's.

A MISSING DECLARATION. R13 claims two extension slots and never says where they
are declared. module.json has an extensions array and the dry run's own manifest
carried it. Like mounts it is a statement of surface the loader holds against
reality, so phase 1 adds it.

THE CTX MEMBERS. ctx has 29 members and the plan named a handful. The ones that
change work: secretBox, because each configured server's sidecar token is a
secret at rest and core already has the posture for it; middleware.rateLimit,
which is the mechanism R1 asked for without naming; uploads, which is where R9's
map image actually lands - the plan described fetching it and never said where
it goes; activity.log, which both R2 and R18 owe an audit trail to; the three
ctx.teams calls, since Teams is more than the provider; ctx.posts behind the
announce leg and post hook; and the three send paths section 10's catalogue
implies.

Also records section 6.8, a constraint on phase 10 and on purge: a trigger, a
rule and an audience outlive the module that declared them.
engagement_rules.trigger_id is a plain VARCHAR with no foreign key and no
cascade, so a module can be removed and reinstalled without destroying an
operator's rules - and a rule whose trigger or audience is unregistered shows
DORMANT, never an error and never auto-deleted. An audience resolving to the
empty set is not the same answer as resolved to nobody and must not be rendered
as if it were. The failure that prevents is exact: an id that stops resolving
must never silently become a send to a different set of people.

And the two client lists in full, since section 7 said UI kit discipline without
saying what is in it; plus one confirmation for R10, that
/api/v1/public/modules returns only started modules with no state and no failure
reason, so a Rust module that failed to boot makes the app render a site without
those screens rather than one advertising screens that 503.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 12:46:36 -05:00
5bc038adf8 Merge pull request 'docs(modules): the module-rust plan — 18 decisions of record and a 21-phase schedule' (#249) from docs/rust-module-plan into main
Reviewed-on: #249
2026-09-15 17:41:15 +00:00
6392f39512 docs(modules): R18 discovery is a recursive walk, and it stops at oxide/config
Configuration is not one flat oxide/config/<Plugin>.json per plugin. Plugins
nest - oxide/config/<Mod>/whatever.json and deeper - and one plugin may own
several files. So discovery is a recursive walk and the UI groups by plugin
rather than assuming one file each. Four things follow, and the first is a
boundary rather than a detail.

oxide/data/ is NOT the settings surface and must not be walked into.
DataFileSystem writes there and that is live state, not configuration. The base
set makes the point by itself: Kits keeps Kits/kits_data.json and
Kits/player_data.json, ZoneManager keeps ZoneManager/zone_data.json, and Clans
keeps clan_data.json with a legacy clans_data.json beside it - which is also a
reminder that these names are not stable. Editing those from a web form edits
players' kit cooldowns and the live zone definitions, a running plugin
overwrites the change on its next save, and oxide.reload does not make most
plugins safely re-read them. Different problem, different answer, deliberately
out of scope.

The reload target cannot be inferred from the path. oxide/config/Foo/bar.json
may belong to plugin Foo or to something else; the folder name is convention,
not contract. So the target is an explicit field with the folder name as its
default guess. Infer it silently and the failure is the nastiest kind available
here: we reload the wrong plugin, observe OnPluginLoaded for IT, and report
success while the plugin that was actually edited never re-read anything.

A relative path from a web form is a path-traversal surface. Canonicalise the
resolved path, assert it is under the config root, reject absolute paths, reject
symlinks resolving outside. Before this amendment the feature addressed files by
plugin name; addressing them by path is exactly the change that introduces the
bug class.

And bound it: depth limit, file-count limit, per-file size cap - a pathological
tree must not be enumerated and a multi-megabyte JSON must not be loaded into a
form. Because one plugin can own several files, the backup and rollback operate
on the whole set a save touches rather than one file at a time.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 12:34:38 -05:00
82f2b0d18d docs(modules): R18 edits plugin configuration from the site, with a generated form and an auto-reload
An admin edits any loaded plugin's configuration from the website and it reloads
automatically. Base tier generates a form from the config VALUES themselves -
boolean to toggle, number to numeric field, string to text, array to list,
nested object to group - so it works for whatever plugins happen to be
installed, including ones added after we ship. Advanced tier is raw JSON.

Same posture as R2, the site as authority over the game host, but a different
SHAPE: R2 is continuously reconciled state pushed on connect, this is
request/reply on demand. It must not be built on the permission mirror.

The mechanics, all verified: configs at oxide/config/<Plugin>.json, oxide.reload
rereads one, and OnPluginLoaded / OnPluginUnloaded are real hooks in the Server
category - so whether a reload actually SUCCEEDED is observable rather than
assumed. That is what makes the feature safe.

The trap that would silently corrupt every float: JavaScript cannot tell 1 from
1.0, and Oxide configs deserialize into typed C# classes. JSON.parse of
{"Rate":1.0} yields the number 1 and JSON.stringify writes it back as 1, so a
naive read-modify-write rewrites every whole-numbered float as an integer, on
fields nobody touched. Newtonsoft may coerce it or may throw, and a throw at
load means the plugin does not come back. So never parse the whole document,
mutate and re-serialize - edit textually, or use a parser that preserves number
literals. The fields at risk are exactly the ones a Rust server tunes: gather
rates, multipliers, scales.

Five more limits of inferring a schema from values are recorded, since the
feature's whole promise is that it works without knowing the plugin: empty
arrays and null carry no type; enum-like strings are indistinguishable from free
text; there are no descriptions, minimums or maximums, so the key name is the
entire label; nested objects need recursion with a depth limit and a raw-JSON
fallback; and the file after a reload may not be what we wrote, because Oxide
merges missing defaults and saves.

Safety needs more than usual here, because a bad config does not fail the write,
it fails the next LOAD and the plugin stays down - and R6/R17 make four plugins
required, so a broken ZoneManager config takes event participation with it. The
write path is: read with a version and require it back on write so a concurrent
on-disk edit conflicts rather than being clobbered; validate it parses; back up,
write, reload; then watch for OnPluginLoaded within a window and, if it does not
arrive, restore the backup and reload again AUTOMATICALLY. That rollback is the
feature's real content - without it this is a web form that can take the shard's
plugins down one typo at a time.

Two more obligations. Plugin configs routinely hold API keys and Discord
webhooks, so a config reader hands those to anyone who can open the page: mask
values whose key matches key/token/secret/password/webhook and treat them
write-only, as the platform already treats the uo-link token. And gate it on its
own site permission with an audit trail of who changed which key from what to
what and whether the reload succeeded - it is an admin writing to the game
host's filesystem, the most powerful thing the site can do to a server.

One distinction kept explicit: editing a config FILE is not a lease. A lease
borrows a convar for a while and the game restores it on a deadline; this writes
a file and is permanent until someone changes it back. They look similar from a
web form and an event should never reach for this one.

Lands as phase 7b, beside permissions, since it shares the admin surface and the
gating.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 12:29:53 -05:00
1138fd36dd docs(modules): R17 makes ZoneManager a base plugin, and it settles two loose ends
ZoneManager (k1lly0u, 3.1.14, MIT, ~218k downloads) is a fourth REQUIRED plugin
rather than an optional one. It is what makes an event able to answer where a
player is, and reading its source changed two things this plan had been vague
about while promoting one action out of the optional tier.

Its API is private methods reached through Oxide's reflection Call() - no
HookMethod, no API_ prefix. That makes THREE conventions among the four base
plugins: Kits declares HookMethod, BetterChat uses API_ prefixed methods, and
ZoneManager uses plain private methods resolved by name. All are reached the
same way from our side, but only the first is greppable as a declared API, which
is worth knowing before someone goes hunting for one that is not there.

Participation stops being the hard part. EVENTS.md section H rates participation
the hard part for UO and substantially easier for Rust because hooks carry
attacker and victim. ZoneManager makes it exact rather than merely easier:
OnEnterZone and OnExitZone are presence transitions delivered as events, so the
participation ledger is fed from what happened rather than reconstructed from a
sweep. That is where an action's participants envelope member gets its content.

Advance conditions become expressible. A phase that waits until ten players are
at the monument is a real gate that reads zone membership, rather than distance
arithmetic against a point recomputed on a timer.

And rust.zone.open moves from the optional tier into the base catalogue with an
honest reversible: ledger. CreateOrUpdateTemporaryZone takes a Plugin owner and
EraseTemporaryZone is SCOPED to that owner, so ZoneManager already has a
first-class notion of a zone belonging to the plugin that made it. That is most
of the persisted ownership registry chapter 4 demands - we still keep our own
map from core's resource reference to the zone id, but we are borrowing a
concept rather than inventing one. Erasing a zone that is gone is a success,
which is what revert needs.

One trap recorded, chapter 4's rule meeting a chatty hook: OnEnterZone and
OnExitZone fire on the game thread and a large zone on a busy server produces a
great many. The emit path already enqueues and returns so the game cannot stall,
but the bridge should subscribe SELECTIVELY rather than forwarding every
transition in every zone - a zone no event cares about should cost nothing on
the wire. Decide the filter at phase 12 with the hooks in front of you, and
measure it: a sweep over GetPlayerZoneIDsNoAlloc is cheap and a flood of wire
traffic is not.

Also adds rust.options.zones, makes the rust.zone.minutes budget dimension real,
and takes phase 0's install step to four curls.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 12:23:13 -05:00
601ee4e05f docs(modules): the event catalogue and the engagement catalogue
Phases 12-13 described the event MECHANISM and never the CATALOGUE - one budget
and one lease as a proof of life, which is a skeleton rather than a product.
Same omission for engagement: R7 settled that the set ships and nothing said
what goes in it. Two new sections fix both.

EVENTS.md section H is a Rust/Oxide compatibility section that already sketched
the event half, and it should have been read before the phase list was written.
Its thesis is the one to design around: the lease is the primitive that travels,
not the spawn. Double gather rate for the weekend is the canonical Rust
community event and it is exactly lease-with-expiry. It also rates Rust the
EASIER case than UO, because Oxide's convars are live by default where ServUO's
are mostly cached at boot - an argument for expecting them to work, never a
substitute for verifying each key live.

Section 9 declares four budget dimensions, five option sources, seven leases and
four actions, taking section H's ids rather than inventing a parallel set. Two
things in it are load-bearing.

Caps are PER RUN, and R8 makes that matter: run.scope is part of a run's unique
key, so one definition fanning out to six servers is six separate budgets rather
than one shared pool. An operator setting a cap of 30 is setting it per server.

And rust.group.membership is the lease section H names that R16 did not - the
pair is the whole reward design. A permanent earned entitlement is an ACTION
with reversible: ledger (R16). A time-limited group is genuinely core.lease,
held with a deadline the game enforces on its own. Same permission mirror,
two shapes, and choosing wrong is the mistake: a weekend VIP implemented as a
grant is a VIP for ever if the website goes away.

Section 10 is the engagement catalogue - eleven triggers with their ceilings,
three audiences, and the seed grouping. The ceiling lattice is containment and
not size, so every ceiling is chosen against that rather than against a ladder.

rust.base.destroyed is the one that matters most and is most likely to be got
wrong. The offline raid alert is the single most-wanted notification in Rust and
its ceiling is OWNER - the player whose base it was. Ceilinged staff it is
useless to the person who needs it; ceilinged everyone it broadcasts base
locations to the server. Exactly the case the lattice exists for.

Three hooks carry data that must never widen: CanUserLogin and OnUserApproved
carry IP addresses, OnPlayerReported carries player reports. README.md section 5
already flags these as admin-channel-only on the live feed and the same
judgement binds their triggers.

One design note flagged rather than decided: PopupNotifications gives the module
an IN-GAME alert surface, which is not one of core's channels. An in-game popup
is the module publishing to its own surface off its own trigger, not a fourth
channel core learns about. A raid alert that reaches a phone and pops on screen
next login is two mechanisms and only one of them is core's.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 12:17:39 -05:00
43bf73bae5 docs(modules): R15 the optional tier with BetterChat, R16 rewards grant the right to redeem
R16 changes a design rather than adding to it. The reward action no longer calls
GiveKit; it grants the permission that GATES a kit, and the player redeems it
themselves in game. Kits already has exactly this model built in - every kit
carries a RequiredPermission, GiveKit's own path checks it, the in-game menu
renders an ungated kit as locked rather than hiding it, and GetKitInfo returns
the permission so the module can read which kits are gated.

What that removes is most of the hard part.

The offline-grant problem disappears. GiveKit needed a connected BasePlayer, so
an event firing at 2am rewarded only whoever was online; an entitlement waits.
That CLOSES the open question section 3 carried - no pending-grant queue, no
second at-most-once store.

It is the same machinery as R2 rather than a second mechanism: a reward becomes
a permission grant authored by the site and mirrored into Oxide, which phase 7
already builds. One permission authority, one drift story, one audit trail.

reversible: 'ledger' becomes honest where a direct grant could only ever be
'none'. revert revokes the permission, removing one that is not there is a
success, and it is idempotent by construction. A player who redeemed before the
revert keeps the items, and that is correct: the ledgered resource is the GRANT,
so reverting withdraws the entitlement rather than the consumption.

cost() counts grants and is exactly knowable before dispatch, which removes the
whole declare-the-maximum-because-you-cannot-know class of problem from chapter
5 section 4. And the idempotency key largely stops mattering: chapter 5 draws
the line itself - a key is for a write whose repetition would be a second
EFFECT, and a permission grant is a SET.

The earlier section arguing a kit grant can only be reversible: none is
rewritten rather than deleted, with the correction stated: it was right about a
direct grant, and the reusable part is that the action had been declared around
the wrong noun. What the event makes is not loot, it is an entitlement.

One design note carried into the option source: a kit with an EMPTY
RequiredPermission is open to everybody, so granting a permission for it rewards
nobody. The dropdown must surface which kits are gated and refuse or warn on one
that is not.

R15 opens an optional-integration tier, with BetterChat (LaserHydra, 5.2.15,
MIT, Universal) as the first member, for leaderboard-earned chat titles. Its
integration point is a PULL - API_RegisterThirdPartyTitle registers a callback
BetterChat invokes per player - so a title is a pure function of state we
already hold, with nothing written into it and no drift to reconcile. The trap
is chapter 4's rule applied to somebody else's callback: that getter runs
synchronously on the chat path and must be a cheap in-memory lookup, never a
socket call. Its API_AddGroup and API_SetGroupField pair naturally with R2's
site-authored groups, but that direction is a push and would need R2's drift
posture, so it is a phase 17 decision rather than a given.

Section 3 is now empty. Clans-in-the-base-set was confirmed complementary, and
the offline-grant question was dissolved rather than answered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 12:11:11 -05:00
5dcb8088ad docs(modules): R7-R14 close the audit, and the phase list roughly doubles
Every question the contract audit raised was answered the same day. Eight new
decisions of record, and the schedule goes from twelve phases to twenty.

R7 the notifications and engagement set ships in v1 - streams, triggers,
audiences, seeds, announce leg, post hook - as ONE phase because they are a
matched set in the template rather than three independent gaps. The three rules
it lives on: ceiling is required and is not a ladder (a staff ceiling does not
permit owner, because one person for a cheat-detection event is the player it
was detected on); subjectKey must name a declared variable or every subject
shares undefined; and a rule group is offered once, so a rule appended to an
existing group reaches fresh installs only.

R8 multi-server from the start - the dry run's finding 2 taken at face value.
R12 per-wipe detail plus all-time rollups, with the truncation as a runtime
route and never a schema statement, since the fragment replays every boot.
R14 /rust on all three tiers, chosen deliberately because prefixes share one
namespace with core's and the collision probe cannot see core's root-mounted
endpoints. R13 two extension slots. R11 a small read-only slash command set,
with ephemerality fixed at the deferral so a refusal must defer ephemeral.

R9 is the one that split in two. The map IMAGE is static content on the game
host regenerated only on a wipe - the ch.3 2b case, so request/reply, one in
flight, two stages, its own derivation version, and no import on boot - while
everything moving on it is live state down the ordinary read path. Every layer
is an operator switch, and that is a security boundary rather than a preference:
public player positions in Rust locate players and let anyone infer base
positions. Default is monuments and world events public, players and bases
admin-only. This is the ONLY asset-bridge work in scope; item icons and the
2,590 skin ids stay out of v1.

R10 the Android app is in this workstream, deciding its screens from
/api/v1/public/modules capabilities, with each leg trailing the website surface
it consumes by one phase. Records the two endpoints that are not this and are
easy to confuse with it: /api/v1/public/status is site mode plus a version
block, and /api/health is an internal liveness probe.

Section 7 now carries the phase each previously-unplanned element lands in, and
the honest cost: twelve phases, from reading the chapters that describe the game
bridge and treating the module as the thin part when the kit says in its first
paragraph that the module is most of the work.
2026-09-15 12:01:44 -05:00
b467156a1f Merge pull request 'docs(tree): sync website/PROJECT_TREE.md' (#246) from chore/sync-website-tree into main
Reviewed-on: #246
2026-09-15 17:00:49 +00:00
a4544ba5f2 docs(modules): audit the plan against the whole contract, not just the game-facing chapters
The first draft of the phase list was built from chapters 3-5 and under-planned
the website module by a wide margin. The template registers eight of the ten
non-event registrations; the plan covered three.

Unplanned and now recorded: registerExtension, registerNotificationStreams,
registerEventTriggers, registerAudiences, registerEngagementSeeds,
registerAnnounceLeg, registerPostHook, registerSlashCommands - with triggers,
audiences and seeds being a matched set rather than three independent gaps.
Also unplanned: purge.sql, mount prefix choice, the swagger fragment and its
staleness check, the vite alias/shim mechanism the kit calls the highest-risk
mechanical detail in the system, checkImports, and the entire packaging and
release path - there was no packaging phase at all.

On the client: declareModuleSlot, which the kit says is needed the moment a game
has anything like a guild, so it belongs in the Teams phase; registerFeatureProvider;
and the UI kit discipline that has caught this project twice already (PublicLayout
needs shell, PageHeader silently drops unknown props).

Beyond the module: the asset bridge, which Rust's item icons and 2,590 skin ids
fit exactly; the .profile landing page, owed whenever repos are added and three
just were; runicgateway.com, for which a second game is a headline change; and
the Android app, which feature-detects capabilities and must render a site whose
module it has never heard of.

Section 8 carries the eight questions the plan cannot answer for itself.
2026-09-15 11:45:04 -05:00
839e5d05a8 docs(modules): R6 names the base mod set, and reading Clans settles R5 the other way
The three repos exist and are named: Module-Rust, Rust-Link, Rust-Plugins. Notes
that a repository name is not a module id - Module-uo ships id `uo`, this ships
`rust`, and 2.1 requires id to equal the directory core loads it from.

R6 - the required base set is Kits 4.4.9, Clans 0.2.10 and PopupNotifications
0.2.1, all k1lly0u, all MIT, each with a direct .cs download, so phase 0's
install step is three curls rather than manual retrieval. Clans is listed as a
Universal plugin, written against Covalence, which is why its API takes IPlayer
rather than BasePlayer.

Kits is a good dependency: 23 HookMethods, including GiveKit for the reward
action, GetKitNames/GetAllKits for the authoring form's OPTION SOURCE so an
operator picks a kit from the live server instead of typing an identifier, and
per-player uses and cooldown for eligibility. It also raises OnKitRedeemed,
which the bridge can report as an ordinary event whoever triggered it.

Two traps in GiveKit, both found by reading it rather than reasoning about it.
It returns null on a failure path - `if (!player) return null` - and null is
Oxide's idiom for "no opinion", so the reflex of treating null as fine reports a
reward as delivered when there was no player to deliver it to. Success is the
literal true and a refusal is a message string, which drops straight into
chapter 5's `error`. And GiveKit takes a BasePlayer, so there is no offline
grant: an event rewarding participants at 2am rewards only whoever is online.
Phase 8 chooses between accepting online-only and keeping a persisted
pending-grant queue, which is a second at-most-once store and is not free.

R5 is settled far more firmly, and the other way round from how it was argued.
For Teams the Clans plugin is WORSE than first-party, not richer: it publishes
fifteen HookMethods and every one is a mutation, with no read API at all - no
GetClan, no GetClanMembers, no GetAllClans - and it raises exactly three hooks,
none of them a membership transition. It cannot answer any of core's three
provider questions from its published surface, while first-party clans answer
all three. So first-party is PERMANENT for the provider, not a first step. What
the plugin actually adds is alliances and clan/alliance chat - richer in
features, not in roster data - which is what phase 9 surfaces beside the
provider rather than under it. Reading its own data files is recorded as
deliberately not taken: that is another plugin's private storage, not an API.

Two questions left open in 3, neither blocking: whether Clans being in the base
set while the provider reads first-party is the intended reading (an
interpretation, not something stated), and the offline-grant choice, deferred to
phase 8 on purpose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 11:40:10 -05:00
7d589ff5f2 docs(modules): R4 the installer grows a game dimension, R5 Teams come from first-party clans
R4 - Rust reaches an operator through the shipped installer behind
--game servuo|rust, not a second binary and not a shared-core refactor. The
shape of the work is set by where the coupling already is: service.rs and
main.rs mention ServUO zero times, while install.rs, doctor.rs, overlay.rs and
tier.rs carry nearly all of it, plus the bundle manifest where OverlayComponent
and ServUoCompat name the game in the schema itself. So the game payload becomes
a variant and ServUoCompat a per-game compat block - a schema change on the
published bundles branch, which is the part to design before touching code. The
Rust payload is much simpler than the UO one (no source tree, no patches, no
patch tier - one .cs into oxide/plugins) and what it gains instead is an Oxide
prerequisite check, which is doctor's shape rather than a new concept.

R5 - Teams come from Rust's FIRST-PARTY clans; the uMod Clans plugin is the
richer optional tier in phase 9. Three distinctions that are easy to collapse
and expensive to get wrong: the seven first-party clan hooks are all "no return
behavior", which is exactly what a read-only bridge wants; Rust's first-party
TEAMS are a different system entirely (twelve mostly-vetoable hooks, the
transient squad rather than the persistent organisation) and are not what core's
Team provider should be fed; and the uMod Clans plugin's API is not in our
mirror at all, since HOOKS.md is the game's 477 hooks and a plugin's API is its
own documentation.

The gap R5 has to design around: the seven hooks carry created, disbanded,
added, kicked and left, but no promote or leader-changed event. So
getTeamLeaders reads leadership off LocalClan at snapshot time, which makes
phase 6 partly snapshot-driven where the dry run predicted fully event-driven.
Recorded as a correction to that document rather than silently.

Also records the start.bat fix on the rig: it now updates D:\rust rather than
C:\rustserver, the original is kept at start.bat.bak, and the appmanifest
already present at the same buildid means the first corrected run is a delta
rather than a 5.9 GB re-download.

Phases are now 0-11; the installer is phase 10.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 11:32:43 -05:00
a5881d5a55 docs(modules): the module-rust plan, its decisions of record and its rig
The dry run designed this module on paper and deliberately did not build it.
This is the document that builds it: eleven phases, three new repos, and the
three decisions the org lead settled on 2026-09-15.

R1 identity is an in-game link code for v1. There is still no
registerAuthProvider at MODULE_API_VERSION 1.10.0, so "Sign in with Steam" is
not reachable from a module. What changed since the dry run is the stakes, not
the options: the dry run rated this survivable because the module only read,
and R2/R3 make the site the author of who may do what and the thing that hands
out loot. A weak link is now a privilege-escalation path.

R2 site-authored permissions mirror into Oxide's own permission store, so every
third-party plugin honours them with no adapter and a wipe stops being a
data-loss event for permissions. This is a direction the Integration Kit has no
chapter for - not the read path, not a ledgered one-shot, but continuously
reconciled state where the website is authoritative. Its nearest relative is the
Team provider inverted. Whether that deserves a sixth chapter is phase 10's
question.

R3 the Kits reward action always registers and refuses with a reason in `error`,
rather than vanishing from the form or refusing to boot. Phase 8 must declare
reversible: 'none' honestly - there is no way to un-grant loot a player has
spent - and count cost() per kit actually granted.

The rig is D:\rust, which has been booted and carries a matched Oxide 2.0.7585.
Two traps recorded: its start.bat updates C:\rustserver and launches D:\rust, so
the server that boots has never been updated by its own script; and
C:\oxide_files is a 2025-04-23 Oxide whose bundled Assembly-CSharp.dll would
downgrade a real install.

One question left open: which plugins besides Kits are in the required base set.
oxide/plugins/ is empty, so all of it is a fresh install either way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 11:12:20 -05:00
c487b8fd8c Merge pull request 'docs(modules): mirror the uMod/Oxide ecosystem for module-rust' (#248) from docs/rust-oxide-api into main
Reviewed-on: #248
2026-09-15 15:20:49 +00:00
4e2c2dc439 docs(modules): mirror the rest of the Oxide ecosystem, and add a machine-readable set
Completes the uMod mirror beyond the Rust hook table, and adds agent/ — the
same facts in TSV/JSONL at ~46% of the tokens.

New prose:
- OXIDE_API.md: the 19 developer pages under umod.org/documentation/api/ —
  plugin structure, hooks, commands, IPlayer, permissions, config, data files,
  database, localization, timers, web requests, dependencies, integration,
  preprocessor directives, security, style guide, CI, review. This is the
  framework our plugin is a guest in, where HOOKS.md is what the game says.
- OPERATING.md: the 6 operator pages — installing Oxide on a server, then
  installing, configuring and permissioning plugins.

New machine-readable set (agent/):
- hooks.tsv    477 rows, ~31% of HOOKS.md
- items.tsv    678 rows, ~80% of DEFINITIONS.md's item table
- skins.tsv    104 rows covering 2,590 skins, ~77%
- api.jsonl    150 code examples, ~47% of the two prose docs
Generated in the same pass as the markdown, so the two cannot drift.

HOOKS.md gains the universal-hook split: 34 of the 477 are uMod's own
Covalence hooks, raised identically on every game uMod supports. Verified
against /documentation/games/universal in the same capture - all 34 are in
the Rust set and the Rust page adds none of its own, so the overlap is exact.
The distinction is architectural: a universal hook is the portable part of
the surface.

Two things worth recording from building it:
- The first skins.tsv was one row per skin and came out 11% LARGER than the
  markdown it replaces. Grouping it one row per item is what made it a
  saving. The token win is real for prose (3.2x on hooks) and small for
  tables that were already dense - agent/README.md says so plainly rather
  than claiming a flat number.
- Signature extraction by brace depth silently captured body lines (a nested
  '}' in OnUserConnected's example ended the block early). It now matches on
  the hook's own name; all 477 rows verified to carry a real signature.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 10:01:11 -05:00
8d31e497d2 docs(modules): add the Rust Oxide/uMod API reference for module-rust
Mirrors uMod's Rust game API into docs/modules/rust/ so the upcoming
module-rust can be designed against it without a round trip upstream.

- HOOKS.md: all 477 hooks in 20 categories, scraped verbatim from
  umod.org/documentation/games/rust. Each entry keeps its description,
  its return contract, its tags and every C# overload uMod publishes.
  Opens with a category table and a full alphabetical index
  (name -> category -> return contract).
- DEFINITIONS.md: 678 items (short name, item id, display name) and
  2,590 workshop skin ids across 104 items.
- README.md: why the reference exists, how an Oxide hook actually binds
  (by name and arity, by reflection - a typo is silently never called),
  the four return contracts, and how the bridge invariants restate
  against Oxide. Records provenance and the exact refresh procedure:
  the hooks JSON endpoint is not Cloudflare-gated even though the HTML
  page is, and the definitions page has to come out of a browser.

The mirror is reference only - uMod stays upstream and normative, and
nothing here is a Runic Gateway contract. Rust wipes monthly, so both
files carry their capture date (2026-09-15) and a re-capture note.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
2026-09-15 09:38:43 -05:00
runic-docs-bot
608f9824cd docs(tree): sync website/PROJECT_TREE.md from RunicGateway/website@efa9db7 [skip ci] 2026-09-15 10:20:56 +00:00
18 changed files with 22705 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ so they live in one place, independent of either codebase.
website/ docs from the website core (Node/Express + MariaDB + React/Vite)
modules/ docs for installable game modules — one directory per module id
link/ docs from the ServUO bridge (C# plugin + Rust sidecar + Node WS)
rust-link/ docs from the Rust bridge (Oxide plugin + Rust sidecar)
android/ docs from the native Android client (Kotlin + Jetpack Compose)
installer/ docs for the installer that deploys a shard's bridge components
ci/ cross-cutting CI/quality notes
@@ -56,6 +57,7 @@ particular game; a module is what makes it a site *for* one.
| [uo/API.md](modules/uo/API.md) · [uo/SCHEMA.md](modules/uo/SCHEMA.md) | module-uo's own route surface and the tables it owns |
| [kit-acceptance.md](modules/kit-acceptance.md) | The Integration Kit acceptance run — building a module by following the kit alone, and what it found |
| [rust-dryrun.md](modules/rust-dryrun.md) | A written, deliberately unimplemented `module-rust` — the test that the module contract generalises past the game it was extracted from |
| [rust/](modules/rust/README.md) | **Reference for the upcoming `module-rust`** — a mirror of the uMod/Oxide ecosystem, scraped from upstream: [HOOKS.md](modules/rust/HOOKS.md) (477 Rust hooks), [OXIDE_API.md](modules/rust/OXIDE_API.md) (the plugin framework), [DEFINITIONS.md](modules/rust/DEFINITIONS.md) (678 items, 2,590 skins), [OPERATING.md](modules/rust/OPERATING.md) (the operator's side), and [agent/](modules/rust/agent/README.md) — the same facts as TSV/JSONL at ~46% of the tokens |
### `link/`
| Doc | What it covers |
@@ -75,6 +77,18 @@ particular game; a module is what makes it a site *for* one.
| [link-README.md](link/link-README.md) | Snapshot of the link repo's README |
| [PROJECT_TREE.md](link/PROJECT_TREE.md) | Auto-generated snapshot of the repo's tracked file layout |
### `rust-link/`
The same pair of contracts as `link/`, for Rust rather than Ultima Online: an Oxide plugin that
dials out to a sidecar, and a sidecar the website reads. The two bridges are **independent** — they
share a shape and nothing else, so neither document is a fallback for the other.
| Doc | What it covers |
|---|---|
| [PROTOCOL.md](rust-link/PROTOCOL.md) | **Canonical** — the game link and the website API, the four declaration sites of the wire version, and what each protocol version defines: 1 the transport, 2 the read path |
| [INTEGRATION.md](rust-link/INTEGRATION.md) | Standing the bridge up by hand, and which of the three components is wrong when it does not work |
| [PLAYER_WALK.md](rust-link/PLAYER_WALK.md) | The half of the read path a console cannot reach: ten minutes on a rig with a player, step by step, with what each hook should produce |
### `android/`
| Doc | What it covers |
|---|---|

View File

@@ -1307,6 +1307,128 @@ push, and Play (M6M8) follow the designed app.
an inbox event link opening the app natively while a forum link still opened a Custom Tab; and
participation history self-scoped, proved by two accounts rather than asserted.
15. **M14 — the Rust module in the app** (post-v1; built 2026-09-17). The platform's **second game
module** reached its first public pages in `module-rust` phase 4
([`../modules/rust/PLAN.md`](../modules/rust/PLAN.md) §17), and this is phase 5 — the app's leg.
R10 has each Android leg trail the website surface it consumes by exactly one phase, so every
route here existed and answered before a line of Kotlin was written.
**Design of record: [`../modules/rust/PLAN.md`](../modules/rust/PLAN.md)**, §17 for the surface
this mirrors and §18 for this phase as built. The contract is normative there; this entry records
what the app does about it.
**No backend work beyond one word.** The five public routes were live. The one change is
Module-Rust#5, which adds `rust` to the module's `capabilities` — see the gate below.
#### Why this is not the shard screens with a different name
The two games have genuinely different shapes, and collapsing them would have cost the app the
thing that makes each legible. **UO is one shard: a place**, five drawer rows, a live SSE stream.
**Rust is a fleet**: a list, and one page beneath it with four tabs. The app grows a second route
tree rather than a second meaning for `shard/`, and both can be installed on one backend — in
which case both trees exist at once and neither row appears on a site without its module.
| Screen | Route | Reads |
| --- | --- | --- |
| **Rust servers** (the list) | `rust` | `GET /public/rust/servers` |
| **One server** (four tabs) | `rust/servers/{serverId}` | `…/:id`, `…/:id/events`, `…/leaderboard`, `…/online`, `…/wipes` |
#### Four decisions, taken by the org lead on 2026-09-16
- **D16 — the gate is a new capability, `rust`.** `module-uo`'s five shard rows all hang on one
string, `shard`, because that is the only question a capability can answer: *is the module
there*. `module-rust` declared five and every one named a **surface** — `servers`, `killfeed`,
`leaderboard`, `presence`, `wipes`. Core flattens every started module's capabilities into a
single list, so gating on `servers` would let another module declaring that word silently reveal
these screens on a site that does not run Rust. Gating on the module **id** was considered and
rejected: `id` is a mount prefix (§2.1 requires it to equal the directory core loads from), and
`MODULE_API.md` §2.9 forbids a client inferring a route from a capability — making the two the
same thing would quietly end that separation. So the module declares its own name as a sixth
string, asserted in its suite against `module.json`'s own `id` so the two cannot drift.
- **D17 — poll every 20s while the screen is RESUMED**, the phone's version of D14's Page
Visibility gate. Immediate refresh on return to the foreground; nothing at all while away.
- **D18 — the Rust repositories move to `edge`** for the rest of the workstream, with releases at
the cutover rather than per phase. `pr-checks.yml` in all four repositories already triggers on
`[main, edge]`, so this costs no CI — the trap that made all nine M12 phase PRs land unchecked
was closed in engagement Phase 8.
- **D19 — the drawer row carries a live player count**, and NavPaths learns `/rust`.
#### A refresh is not a load, and the app had only ever done loads
The app has had exactly one shape for a read since M1: set `Loading`, ask, replace. That is right
for opening a screen and wrong for a poll — a twenty-second refresh built on it clears the
killfeed, renders a spinner in its place and re-fills it, three times a minute, for ever. **The
website hit the same wall one tier along**, which is why `module-rust` bundles its own `usePolled`
instead of using core's `useAsync` (§17.3). `ui/Polling.kt` is that hook's other half:
- `refreshInto` — **a refresh is invisible when it succeeds and keeps the rows when it fails.** A
failure with rows on screen keeps them and reports the failure beside them; a failure with
nothing on screen is an ordinary error with a retry, because there is nothing to protect.
- `PollWhileResumed` — `repeatOnLifecycle(RESUMED)`, which buys three behaviours from one line: no
requests at all while backgrounded, an immediate refresh on return, and a pause behind a dialog
or the recents switcher. `STARTED` would keep polling for a reader who is not reading.
Only the **visible** live panel is polled. The leaderboard and the wipe list never are: a
leaderboard that re-sorted itself under a finger every twenty seconds would be worse than a stale
one. Changing the filter, the sort or the wipe **is** a different question, so that panel blanks
and loads — leaving the old rows up would show last wipe's killfeed under this wipe's heading.
#### The drawer badge is D15 translated, not D15 copied
D15 put a live count in core's `site.footer.status` slot, which works because every page of the
website renders the same footer. The app has no footer and no slot. What it has is a drawer row
per surface and, since engagement Phase 8, a precedent for a number beside one — the inbox's
unread badge, in the `NavigationDrawerItem` badge slot, with a `contentDescription` so a screen
reader says "42 players online" rather than "42". The count rides there, and keeps the website
version's three rules: **zero renders nothing** (an empty fleet is not a notification), a failed
read keeps the last number, and it never polls. It is asked for only where the module is
installed, so a UO site makes no request at all.
#### Verified
The app suite (**644 tests, 0 failures**), `lintDebug`, `assembleDebug`, and an emulator walk
against the phase-4 rig — a core with the module installed, one live server and one seeded fixture
that has never reported.
**Both halves of the phase criterion, directly.** With its server unreachable and reading
*Offline*, the page still rendered its map, size, seed, wipe date, killfeed, per-wipe and all-time
leaderboards, its last known presence board and its wipe history. The same app pointed at the UO
core showed Shard / Rules / Atlas / Leaderboards / Market and **no Rust row**.
Also proven rather than asserted: `refreshInto` against a genuinely dead backend (the core was
stopped with the list on screen; a poll tick later the rows were unchanged under one quiet line);
R12's arithmetic on a phone (all-time 59 = 41 + 18, and a player who appears only in the older
wipe **drops out** of it rather than reading zero); every `describe` branch from real rows,
including the fall that must not read as a kill by nobody; the calendar-day rule, filtering to the
August wipe and getting three rows six weeks old, each unmistakably dated; and the badge.
#### The walk found three defects, and 644 green tests found none of them
- **The drawer's live count resolved once per process.** It was keyed on the capability answer
alone, so it was read at connect and never again — which is not what *live* means on a row
somebody opens the drawer to look at. It now refreshes on resume, beside the unread badge.
- **Every card's text sat flush against its edge.** `ShardCard` is the themed `Card` and carries
no padding of its own; each caller pads its own content, and these four did not. On a phone the
first glyph of each line read as clipped.
- **A name touched its own kill count.** Five numeric columns beside an equal-weight name column
left *Brannock* and *50* reading as one field. The name now takes a wider share and ellipsizes,
and the **active sort is marked on the header** rather than by tinting a column of numbers — the
header is the control, and tinting the values says *these are special* instead of *this is what
the table is ordered by*.
#### The rig note worth keeping
The debug `network_security_config.xml` permits cleartext to **`127.0.0.1` and `localhost` only**
— not `10.0.2.2`. An emulator walk against a local core therefore needs
`adb reverse tcp:<port> tcp:<port>` and the loopback address; typed as `10.0.2.2` every request
fails with `UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted`, which the
connect screen reports — correctly, and indistinguishably from a core that is not running.
- **Excluded**, in the same class as every earlier milestone's exclusions: the Rust **admin**
surface. Server configuration, the sidecar token and the connection test are admin
*configuration*, which the app consumes and does not edit. Identity and permissions are legs B
and C (phases 8 and 11), and the map is leg D.
### Deferred (not a milestone)
- **Platform Teams in the app** — **deferred 2026-08-17, no app work scheduled.** The website is

378
modules/rust/CARBON.md Normal file
View File

@@ -0,0 +1,378 @@
# Carbon — the second modding framework, and where it differs from Oxide
**Carbon** is the other framework modded Rust servers run. It is not a fork of Oxide and it does not
load Oxide; it is a separate loader that ships an **Oxide compatibility layer** — the `Oxide.Core`,
`Oxide.Plugins` and `Oxide.Game.Rust` namespaces, reimplemented — so that a plugin written for Oxide
compiles and runs unchanged.
This document exists because [`PLAN.md`](PLAN.md) **R19** commits `module-rust` to supporting both.
It records the places the two frameworks are *not* the same, because those are the only places our
code has to care. Everything not listed here is identical by construction.
> **Provenance.** Facts below were taken on **2026-09-15** from Carbon's own published metadata —
> `api.carbonmod.gg/meta/carbon/{hooks,commands,convars,switches}.json` — and from the
> [`CarbonCommunity/Carbon`](https://github.com/CarbonCommunity/Carbon) source at `main`, with the
> narrative pages at [carbonmod.gg](https://carbonmod.gg) as the prose source. Carbon is upstream
> and wins any disagreement, exactly as uMod does for [`OXIDE_API.md`](OXIDE_API.md). Nothing here
> is a Runic Gateway contract.
>
> **Verified on a live Carbon server on 2026-09-15** — Carbon **2.0.259.0** `[2026.09.03.0]` on
> Linux, the `rust-carbon` rig (PLAN.md §14.5). Three of the four load-bearing claims held. **One was
> wrong, and it was wrong about Oxide as well as Carbon** — see §4. Corrected in place; §10 is the
> scorecard.
---
## 1. The one-sentence version
**A plugin in the `Oxide.Plugins` namespace deriving from `RustPlugin` is Carbon's own documented
first example**, so the bridge plugin is one `.cs` file that serves both frameworks. What diverges is
not the plugin API but **the things around it**: where files live, how the permission store is
persisted, what the console commands are called, and which extra hooks exist.
```csharp
// Carbon's own "first plugin" page shows this, unchanged from Oxide:
namespace Oxide.Plugins;
[Info("MyPlugin", "<author>", "1.0.0")]
public class MyPlugin : RustPlugin
{
private void OnServerInitialized() => Puts("Hello world!");
}
```
Carbon also offers a native shape — `namespace Carbon.Plugins` / `CarbonPlugin` — which we do not
use and should not: it is the one choice that would make the source Carbon-only.
---
## 2. Telling the two apart
### At compile time — `#if CARBON`
Carbon feeds the Roslyn compiler a set of conditional-compilation symbols. **Oxide defines no
equivalent**, so `#if CARBON` / `#if !CARBON` is the portable framework branch, and an Oxide
compiler simply evaluates the unknown symbol as false.
| Symbol | Meaning |
|---|---|
| `CARBON` | The framework is Carbon |
| `RUST` | The game is Rust |
| `OXIDE_PUBLICIZED` | Compiled against publicised Oxide assemblies |
| `WIN`, `UNIX` | Host operating system |
| `STAGING`, `AUX01`, `AUX02` | Rust branch |
| `RUST_ABV_<v>`, `RUST_BLW_<v>`, `RUST_IS_<v>` | Rust protocol above / below / exactly `<v>` |
| `CARBON_ABV_<YYYY_MM_DD>` | Carbon protocol above a date |
This works because the bridge plugin ships as **source** and is compiled by whichever framework
loaded it. It would not work for a precompiled DLL — a reason, among others, not to ship one.
**Confirmed on the live rig**: `carbon/config.json` reports
`"ConditionalCompilationSymbols": ["CARBON", "RUST", "OXIDE_PUBLICIZED"]`, and the list is an
operator-editable setting (`c.addconditional` adds to it), so treat the three above as the ones
present by default rather than the ones guaranteed.
### At run time
`#if` is decided when the file is compiled, which is what we want for API differences. Where a
*runtime* answer is needed — reporting which framework a server runs, in a `server.hello` say — ask
for the type rather than the file layout: `Carbon.Community` exists only under Carbon.
---
## 3. Where the files live — **the divergence that reaches the most decisions**
| Oxide | Carbon |
|---|---|
| `oxide/plugins/` | `carbon/plugins/` |
| `oxide/config/` | `carbon/configs/`**plural** |
| `oxide/data/` | `carbon/data/` |
| `oxide/lang/` | `carbon/lang/` |
| `oxide/logs/` | `carbon/logs/` |
| `oxide/extensions/`, plus `Oxide.Ext.*.dll` in `RustDedicated_Data/Managed` | `carbon/extensions/` only |
| — | `carbon/modules/`, `carbon/harmony/`, `carbon/developer/` |
**And none of those paths is fixed.** Carbon takes a command-line override for every single
directory — `-carbon.rootdir`, `-carbon.configdir`, `-carbon.datadir`, `-carbon.scriptdir`,
`-carbon.langdir`, `-carbon.logdir`, `-carbon.extdir`, `-carbon.moduledir`, `-carbon.modifierdir`,
`-carbon.profiledir`, `-carbon.carbonconfigdir`, `-carbon.sqlpermsdb`, `-harmonydir`. An operator
who has moved one is not doing anything unsupported.
**So the rule is: never compose a config or data path.** Carbon reimplements Oxide's own directory
accessors and populates them from its resolver:
```csharp
Interface.Oxide.ConfigDirectory // oxide/config or carbon/configs or wherever -carbon.configdir points
Interface.Oxide.DataDirectory
Interface.Oxide.PluginDirectory
Interface.Oxide.LangDirectory
Interface.Oxide.LogDirectory
Interface.Oxide.ExtensionDirectory
Interface.Oxide.RootDirectory
Interface.Oxide.InstanceDirectory
```
(`Carbon.Common/src/Oxide/OxideMod.cs` assigns each from `Defines.Get*Folder()`; `Interface.cs`
logs all eight at boot.) Asking the framework is both shorter and correct; hardcoding `oxide/config`
is wrong on Carbon and wrong on an Oxide server whose operator moved things.
**This is a direct amendment to R18.** The config editor's recursive walk is rooted at
`ConfigDirectory`, not at a literal `oxide/config/`; the directory it must refuse to walk is
`DataDirectory`, not a literal `oxide/data/`. The reasoning behind R18 is untouched — only the way
the two roots are obtained.
---
## 4. Permissions — same API, same format, different directory
Every member R2 depends on exists with the same name and the same argument shape
(`Carbon.Common/src/Oxide/Libraries/Permissions.cs`): `RegisterPermission`, `PermissionExists`,
`GrantUserPermission`, `RevokeUserPermission`, `GrantGroupPermission`, `RevokeGroupPermission`,
`CreateGroup`, `RemoveGroup`, `AddUserGroup`, `RemoveUserGroup`, `UserHasPermission`,
`GroupHasPermission`, `GetUserGroups`, `GetUserPermissions`, `GetGroupPermissions`,
`GetPermissionUsers`, `GetPermissionGroups`, `GetGroups`, `GetUsersInGroup`, `SetGroupParent`.
Two differences, and they pull in opposite directions.
**All of the member names above were confirmed present on the live Carbon rig**, which loaded and ran
our plugin against them unchanged.
**The return type differs, and the portable answer is the one we already chose.** Carbon's
`GrantUserPermission` returns `bool`; Oxide's returns `void` — which is
[§12.2](PLAN.md#122-four-rules-the-r2-permission-push-must-obey)'s finding, that a grant naming an
unregistered permission silently does nothing. Calling it as a statement compiles on both, so the
source stays single. But **the bool cannot be read portably**, so the `PermissionExists` pre-check
stays the mechanism on both frameworks rather than being replaced by a return value on one. Carbon
is the framework that *would* have told us, and we still cannot listen.
Carbon's signature also takes `BaseHookable` where Oxide's takes `Plugin`. Passing `this` is
correct on both; a variable typed `Plugin` is not.
### The store — **this section was wrong, and the truth is worse**
> **Corrected 2026-09-15 against both live rigs.** This document previously said *"Oxide persists to
> JSON; Carbon persists to Protobuf or SQLite"*, and offered that difference as the reason not to read
> the file. **Both halves were wrong.** The real shape is more dangerous than the one that was
> imagined, which is the only reason it is worth the space.
Read off the two running servers, byte for byte:
| | Oxide rig | Carbon rig |
|---|---|---|
| Path | `oxide/data/oxide.users.data`, `oxide.groups.data` | `carbon/data/oxide.users.data`, `oxide.groups.data` |
| First bytes | `0a 16 0a 07 64 65 66 61 75 6c 74 …` | `0a 17 0a 07 64 65 66 61 75 6c 74 …` |
| Format | **Protobuf** | **Protobuf** |
| Default groups | `default`, `admin` | `default`, `admin`, **`moderator`** |
**Neither framework writes JSON, and Carbon writes Carbon's data into files named after Oxide.** So
the trap is not "two formats you must tell apart". It is:
1. **The filename is identical and tells you nothing**, so a reader keyed on `oxide.users.data`
silently follows the wrong framework's file if it ever guesses the directory wrong.
2. **The format is an undocumented binary**, not the JSON the name and the `.data` extension suggest.
3. **Carbon can change it out from under you at run time** and Oxide cannot. `PermissionSerialization`
in `carbon/config.json` defaults to `0` (the Protobuf above); `c.migrate_perms_sql` moves the whole
store to SQLite at `server/identity/carbon.perms.db`, itself relocatable via `-carbon.sqlpermsdb`.
`Oxide Overrides/PermissionSql.cs` and `PermissionStoreless.cs` are those backends.
**R2's conclusion is unchanged and the argument for it is now much stronger.** A file reader would
have *worked* on both rigs today — same format, same names — and would break for the one operator
who ran a migrate command, with no error and no version marker to notice. **Drift detection reads the
API, or it does not work.**
**One more thing R2 has to accommodate: Carbon creates a third default group.** `carbon/config.json`
names `PlayerDefaultGroup`, `AdminDefaultGroup` and `ModeratorDefaultGroup`, all auto-granted by auth
level (`AutoGrantPlayerGroup` / `AutoGrantAdminGroup` / `AutoGrantModeratorGroup`, all `true`). A
site that pushes its *full* group set on connect must not treat `moderator` as drift to be reported,
nor delete it — the framework will simply recreate it, and the site will report drift for ever.
**Carbon does give R2 something Oxide's docs do not advertise: fourteen permission hooks**, a
`Permissions` category of its own — `OnUserPermissionGranted`, `OnUserPermissionRevoked`,
`OnUserGroupAdded`, `OnUserGroupRemoved`, `OnGroupCreated`, `OnGroupDeleted`, `OnGroupParentSet`,
`OnGroupRankSet`, `OnGroupTitleSet`, `OnGroupPermissionGranted`, `OnGroupPermissionRevoked`,
`OnPermissionRegistered`, `OnPermissionsUnregistered`, `OnUserNameUpdated`. Our uMod mirror carries
most of these as universal hooks too, so drift may be **observable as it happens** on both rather
than only diffable on connect. Phase 7 should test that rather than assume it; a hook that fires on
our *own* push is a feedback loop to suppress, not a bonus.
---
## 5. Console commands — `c.` not `oxide.`
Carbon's 129 published commands are `c.`-prefixed. The ones with Oxide counterparts:
| Oxide | Carbon |
|---|---|
| `oxide.grant` / `oxide.revoke` | `c.grant` / `c.revoke` |
| `oxide.group` | `c.group` |
| `oxide.usergroup` | `c.usergroup` |
| `oxide.load` / `oxide.unload` / `oxide.reload` | `c.load` / `c.unload` / `c.reload` |
| `oxide.plugins` | `c.plugins` |
Carbon can be configured to alias the old prefix, so an operator's muscle memory survives — but an
alias is opt-in and **we must never depend on one**. **Confirmed on the live rig:** `c.version`,
`c.plugins`, `c.grant` and `c.group` all answered; **`oxide.plugins` produced no output at all**. Note
the shape of that failure — Pterodactyl's `command` endpoint returns `204` either way, and Carbon
prints nothing for an unknown command, so *a wrong prefix looks exactly like a command that worked.*
`c.plugins` is also worth knowing about for a reason unrelated to permissions: **it reports per-plugin
`hook fires`, `hook time`, `hook memory`, `hook lag` and `hook exceptions`**, which is most of the
"log which of its expected hooks have fired at least once" mechanism [`PLAN.md`](PLAN.md) §6 requires
— for free, and only on Carbon. Useful when debugging *on* Carbon; **not a substitute for the
plugin's own counter**, which has to work on both. Our plugin appears there as
`Runic Gateway RunicGateway v0.1.0 … 2367ms [1077ms]`, under `Scripts`, with `failed plugins (0)`.
**Where this reaches us is narrow but real.** R2 and R18 both act through the plugin API, not the
console, so neither cares. The two that do care are **documentation** — every operator-facing
instruction naming `oxide.grant` needs its Carbon line — and **any place we drive a reload by
console string**, which R18's write path does. Resolve the reload through the framework rather than
by composing a command, or branch it on `#if CARBON`.
---
## 6. Hooks — Carbon is a superset, with thirteen names it does not list
Carbon publishes **894 hook entries, 774 unique names, in 42 categories**, against the **476** on
uMod's Rust hooks page that [`HOOKS.md`](HOOKS.md) mirrors. The larger number is not more game
coverage; Carbon documents patched methods our mirror's audience never sees.
Carbon flags every entry for compatibility. **30 are Carbon-only. Zero are marked Oxide-only.**
### The 30 Carbon-only hooks
| Hook | Category | What it is |
|---|---|---|
| `CanAcceptBackpackItem` | Global | Whether to accept a backpack item |
| `CanPatrolHeliSeePlayer` | Global | Patrol-helicopter line of sight to a player |
| `CanPickupAllFromRack` | Global | Taking every weapon from a rack |
| `CanPickupFromRack` | Global | Taking one weapon from a rack |
| `CanPlaceOnRack` | Global | Placing on a rack |
| `OnPickupFromRack` | Global | Controls taking items from a rack |
| `CanPlayerInheritNetworkGroup` | Global | Network-group inheritance |
| `OnChairComfort` | Global | Chair comfort |
| `OnChickenScared` | Global | A chicken is scared |
| `OnGrowableUpdate` | Global | A growable updates |
| `OnConsoleCommand` | Global | A console command is executed |
| `OnNativeCommandHasPermission` | Global | Permission check on a native console command |
| `OnEntitySpawn` | Global | An entity spawns — **not** Oxide's `OnEntitySpawned`, which exists on both |
| `OnJackieChan` | Global | Undescribed upstream |
| `OnCarbonBanPlayer`, `OnCarbonUnbanPlayer`, `OnCarbonKickPlayer`, `OnCarbonMutePlayer` | Player | Carbon admin-module moderation actions |
| `OnCarbonBlinded`, `OnCarbonUnblinded`, `OnCarbonSpectateStart`, `OnCarbonSpectateEnd` | Player | Carbon admin-module spectate and blind actions |
| `OnCarbonPrivateMessage`, `OnCarbonEmpowerPlayerStats`, `OnCarbonLockPlayerContainer` | Player | Carbon admin-module player actions |
| `OnCompilationFail`, `OnConstructorFail` | Engine | Plugin compile / constructor failure |
| `OnPluginCompileFailure`, `OnPluginOutdated` | Plugin | Plugin lifecycle |
| `OnMarketplaceTerminalPurchase` | Vending | Marketplace terminal purchase |
**None of them is load-bearing for us and none should become so.** The `OnCarbon*` family is the
Carbon admin module's own audit trail — tempting for a staff-actions feed, and exactly the kind of
convenience that quietly makes Carbon the required framework. If we ever want that feed, it has to
have an Oxide answer first.
### The 13 uMod names Carbon's catalogue does not carry
| Hook | Category | uMod's description |
|---|---|---|
| `CanNpcAttack` | Entity | An NPC attempts to attack another entity |
| `CanPushBoat` | Player | Cancelling a boat push |
| `CanUnlockTechTreeNode` | TechTree | Unlocking a blueprint in a tech tree |
| `CanUnlockTechTreeNodePath` | TechTree | …after the path check |
| `OnFrame` | Server | Each frame |
| `OnHelicopterKilled` | Entity | A CH47 is going to be killed |
| `OnNpcDestinationSet` | Entity | Cancelling an NPC destination change |
| `OnNpcPlayerResume` | Entity | Cancelling `TryForceToNavmesh` |
| `OnNpcStopMoving` | Entity | Denying an NPC move stop |
| `OnPlayerCorpse` | Player | A non-null corpse has spawned |
| `OnQuarryEnabled` | Resource | A mining quarry is turned on |
| `OnTeamInvite` | Team | Cancelling a team invitation |
| `OnTeamPromote` | Team | Cancelling a promotion |
**Absent from a catalogue is not the same as absent from the framework**, and two of these look like
renames rather than holes: Carbon lists `OnTeamMemberInvite` and `OnTeamMemberPromote` in its `Team`
category, which is `OnTeamInvite` and `OnTeamPromote` under different names. Carbon's `Team`
category also carries visible duplicates and both tenses of the same event (`OnTeamCreate` *and*
`OnTeamCreated`, `OnTeamUpdate` *and* `OnTeamUpdated`, `OnTeamMemberInvite` twice), which says the
catalogue is generated rather than curated.
So this table is **a list of things to check on a live Carbon server**, not a list of losses. The
practical protection is one we already committed to in [`PLAN.md`](PLAN.md) §6: *hooks bind by name
and arity through reflection with no compile-time check*, so the plugin logs which of its expected
hooks have fired at least once. That mechanism was written for Facepunch renaming a hook on wipe
day; it answers this question too, on either framework, without us having to trust either catalogue.
**None of the 13 is currently in a phase.** R5 settled Teams on Rust's **first-party clans**, not
first-party Teams, so `OnTeamInvite`/`OnTeamPromote` are outside the plan as written.
---
## 7. Convars — a Carbon-only set exists, and leases must not reach for it
Carbon publishes 23 convars of its own, several of them precisely the kind of live, gameplay-shaped
value [`PLAN.md`](PLAN.md) §9 wants to lease — `c.recycletickmultiplier`,
`c.safezonerecycletickmultiplier`, `c.researchdurationmultiplier` and so on, most flagged
`ForceModded`.
**A lease over one of those would work on Carbon and be undeclarable on Oxide.** Lease keys are
advertised to the event authoring form, and a key that silently does not exist on half of installs
is the failure `EVENTS.md` §H's *verify every key live* rule exists to prevent. So: **the lease
catalogue is drawn from the game's own convars, which both frameworks expose identically.** If a
Carbon-only key is ever worth the cost, it is advertised conditionally on the connected server's
framework, and that is a deliberate decision rather than an oversight.
---
## 8. Operating differences that reach deployment
- **They cannot coexist.** Oxide ships a patched `Assembly-CSharp.dll`; Carbon requires
Facepunch's vanilla one and patches in memory through Harmony. One install runs one framework, so
**one rig cannot prove both** — which is why [`PLAN.md`](PLAN.md) R21 moves the rigs to
Pterodactyl and runs two.
- **Carbon migrates an Oxide install on first boot** — it copies config, data, lang, user and group
files across and relocates `Oxide.Ext.*.dll` out of `RustDedicated_Data/Managed`. Useful for an
operator; a hazard for a test rig, because a Carbon rig built by converting an Oxide one starts
with the Oxide one's state and proves less than a clean install.
- **Carbon self-updates and its releases are rolling tags**, not versioned ones:
`production_build` (v2.0.259 at the time of writing, 2026-09-06), plus `edge_build`,
`experimental_build` and per-branch Rust builds. Oxide publishes an incrementing build number.
**So "which Carbon is this" is not answerable the way "which Oxide is this" is**, and R4's
`doctor` prerequisite check has to accept that — it can establish *that* Carbon is installed and
report the build it reports, but "current enough" is a weaker claim on Carbon than on Oxide.
- **Carbon patches hooks only when a plugin subscribes**, so an unsubscribed hook costs nothing.
That rewards the selective subscription R17 already requires for ZoneManager's chatty zone
transitions, on Carbon more than on Oxide.
---
## 9. What this costs us, in one table
| Decision | Change |
|---|---|
| **R2** permissions | None to the design. The store is API-only on Carbon *by construction* rather than by choice, and `PermissionExists` stays the check because the useful return value is Carbon-only |
| **R4** installer | `doctor` detects *which* framework, not *whether Oxide*; the payload drops into `PluginDirectory`; "current enough" is weaker on Carbon (rolling tags) |
| **R18** config editor | Roots come from `Interface.Oxide.ConfigDirectory` / `DataDirectory`, never literals; the reload is resolved through the framework, not by composing `oxide.reload` |
| **R6/R17** base mods | Unchanged — Kits, Clans, PopupNotifications and ZoneManager are Oxide plugins and Oxide plugins run on Carbon |
| **§9** event leases | Keys come from the game's convars; Carbon's own convars are out of the catalogue unless advertised conditionally |
| Everything else | Unchanged |
The honest summary: **Carbon costs three amendments and one extra rig, not a second codebase.**
---
## 10. Scorecard — what the live rig confirmed and what it corrected
Run 2026-09-15 against `rust-carbon` (Carbon **2.0.259.0** `[2026.09.03.0]` `21063e8`, Linux,
`production_build`, Rust 103/2633.288.1), with the Oxide rig alongside for comparison.
| Claim | Verdict | Evidence |
|---|---|---|
| An `Oxide.Plugins` / `RustPlugin` source file loads unchanged | **CONFIRMED** | The byte-identical `RunicGateway.cs` that runs on the Oxide rig loaded as `Runic Gateway v0.1.0` in `2367ms`, printed the same startup line, and retried the absent sidecar the same way |
| The framework root is `carbon/`, config dir is `configs` (plural) | **CONFIRMED** | `/carbon/{configs,data,lang,logs,plugins,extensions,modules,managed,native,modifiers,temp,tools}`; **no `/oxide` directory at all** |
| `Interface.Oxide.ConfigDirectory` resolves there | **CONFIRMED, indirectly and decisively** | The plugin's own config was written to **`/carbon/configs/RunicGateway.json`** by the same code that writes `/oxide/config/RunicGateway.json` on the Oxide rig. A literal path in R18 would not have found it |
| Console prefix is `c.`, `oxide.` is not aliased | **CONFIRMED** | `c.version` / `c.plugins` / `c.grant` / `c.group` answered; `oxide.plugins` produced nothing |
| `#if CARBON` is defined | **CONFIRMED** | `carbon/config.json``ConditionalCompilationSymbols: ["CARBON", "RUST", "OXIDE_PUBLICIZED"]` — and two symbols this document had not known about |
| Carbon self-updates | **CONFIRMED** | `SelfUpdating.Enabled: true`, plus the egg refetching `production_build` every boot |
| *"Oxide stores JSON, Carbon stores Protobuf or SQLite"* | **WRONG — see §4** | **Both** store Protobuf, under **identical filenames**, differing only in directory. The refutation strengthens R2 rather than weakening it |
| The 13 uMod hook names missing from Carbon's catalogue | **NOT YET TESTED** | None is in a phase; the plugin's own fired-hook log is the standing answer either way |
**Two things this document did not know to claim**, both found by looking rather than reading:
Carbon ships a **third default group** (`moderator`) that R2's push must tolerate, and `c.plugins`
exposes per-plugin hook telemetry Oxide has no equivalent for.

3830
modules/rust/DEFINITIONS.md Normal file

File diff suppressed because it is too large Load Diff

9319
modules/rust/HOOKS.md Normal file

File diff suppressed because one or more lines are too long

371
modules/rust/OPERATING.md Normal file
View File

@@ -0,0 +1,371 @@
# Running Oxide: the operator's side
What a **server owner** does — install the mod framework onto a game server, then install,
configure and permission plugins. This is the surface our own deployment story has to sit on top
of, the way [`installer/INSTALL.md`](../../installer/INSTALL.md) sits on top of ServUO.
> **Mirrored verbatim from uMod on 2026-09-15** — 6 pages. uMod is upstream and normative.
---
## Contents
- [Getting Started](#getting-started-getting-started) — Installing uMod/Oxide onto a game server
- [Plugins - Getting Started](#plugins-getting-started-plugins-getting-started) — What a plugin is, from the server owner's side
- [Plugin installation](#plugin-installation-plugins-installation) — Installing, updating and removing a plugin
- [Plugin configuration](#plugin-configuration-plugins-configuration) — Editing a plugin's config file
- [Data Files](#data-files-plugins-data-files) — Where plugin data lives on disk
- [Permissions](#permissions-plugins-permissions) — Granting permissions and managing groups in-game
---
<a id="getting-started-getting-started"></a>
## Getting Started
<sub>Source: <https://umod.org/documentation/getting-started></sub>
---
### Installation
### Server requirements
The Oxide platform requirements vary depending on the game server.
More information about Oxide support for specific games may be found on the [Game Support](https://umod.org/documentation/umod/game-support) page.
### Installing Oxide
**Via Direct Download**
1. Download the Oxide version [specific to your game](https://umod.org/games).
2. Copy the files over your existing server installation
### Plugins
Plugins are self-contained bits of code which modify game server behavior.
For more information about plugins, view the [Plugins - Getting Started](https://umod.org/documentation/umod/plugins/getting-started) page.
[View all available plugins](https://umod.org/plugins)
### Extensions
Extensions are generally large projects which add functionality to Oxide or make substantial changes to a server.
[View all available extensions](https://umod.org/extensions)
---
<a id="plugins-getting-started-plugins-getting-started"></a>
## Plugins - Getting Started
<sub>Source: <https://umod.org/documentation/plugins/getting-started></sub>
Plugins are self-contained bits of code which modify game server behavior.
---
### Code files
Plugins are code files distributed as CSharp (C#) files and will have a `.cs` file extension.
#### Installing a code file
More information about installing plugins may be found at [Plugins - Installation](https://umod.org/documentation/umod/plugins/installation).
### Configuring a plugin
Many plugins generate a `JSON` configuration file that a server administrator may use to change how the plugin works.
More information about configuring plugins may be found at [Plugins - Configuration](https://umod.org/documentation/umod/plugins/configuration).
### Plugin permissions
Many plugins have permissions which must be assigned in order to use plugin features.
More information about access control may be found at [Plugins - Permissions](https://umod.org/documentation/umod/plugins/permissions).
### Plugin commands
Many plugins have commands that may be used by players or server administrators. Not every game will have both console commands and chat commands (check [Game Support](https://umod.org/documentation/game-support) for availability of commands). By default commands should be available by console and in-game.
#### Console commands
A console command is a command which is run from...
1. In-game console (if game has one)
2. Server application window (if platform supports it)
3. RCON console (if game supports RCON)
#### Chat commands
Chat commands are prefixed with a `/` and run by players using in-game chat.
For example: `/help`
---
<a id="plugin-installation-plugins-installation"></a>
## Plugin installation
<sub>Source: <https://umod.org/documentation/plugins/installation></sub>
Installing Oxide plugins usually only takes a few mouse clicks.
---
### Server requirements
To install the plugin on the server, the server provider must support Oxide 2.0 or higher, else the plugins will not load or do anything.
If the server is not online, start it. Then, check that Oxide is fully installed by testing the `oxide.version` chat or console command.
### Download the source code
Download a plugin from the [plugins page](https://umod.org/plugins);
> **Warning.**
> **Do **not** rename the plugin or change the file extension.**
### Remote server
If the server is not hosted locally, connect to the server via an FTP client. If unsure of the FTP details, please contact the server host.
### Plugins directory
Find the `plugins` folder which is located by default at `oxide/plugins` if it has not been changed by the server host
### Upload the source code
Upload the plugin file into the "plugins" folder and it will be loaded automatically if Oxide is currently installed
Continue to [configuring the plugin](https://umod.org/documentation/umod/plugins/configuration)...
### Updating
If a plugin is already installed and an update is available simply overwrite the original (.cs) file and the new version will be loaded automatically.
---
<a id="plugin-configuration-plugins-configuration"></a>
## Plugin configuration
<sub>Source: <https://umod.org/documentation/plugins/configuration></sub>
Most plugins will generate a JSON configuration file once loaded. With this file, a server owner may change how a plugin works.
---
### Config directory
Configuration files are found in the `config` folder which is located by default in `oxide/config` (unless the server host has moved it).
### File name
A plugin configuration file will have the same name as the plugin itself.
For example, a plugin that is installed as `MyPlugin.cs` (if it is configurable) will be accompanied by a JSON file named `MyPlugin.json`
> **Warning.**
> **Do **not** rename the configuration file or change the file extension.**
If a plugin is installed but not configurable, no configuration file will be present.
If a plugin is configurable but no configuration file is available, the plugin may be broken; in this case, check the log files under the `oxide/logs` directory for errors.
### Valid JSON
All plugin configuration files are saved as JSON (JavaScript Object Notation). Configuration files *must* be valid JSON. Use a validator such as [jsonlint.com](https://jsonlint.com) to ensure the configuration is valid JSON.
### Applying changes
After making changes to a plugin configuration file, reload the plugin in the server console by using the `oxide.reload` command. For example:
```
oxide.reload MyPlugin
```
Continue to [setting permissions](https://umod.org/documentation/umod/plugins/permissions)...
---
<a id="data-files-plugins-data-files"></a>
## Data Files
<sub>Source: <https://umod.org/documentation/plugins/data-files></sub>
Data files are `JSON` files that plugins may use to store arbitrary data.
### Data directory
Data files may be found in the `data` folder which located by default in `oxide/data` (unless the server host has moved it).
### File names
Data files do not follow any naming convention, a plugin author may specify any name when creating a data file.
It is recommended to plugin authors, when creating a large number of data files, to create them in a subdirectory specific to their plugin.
### Valid JSON
All plugin data files are saved as JSON (JavaScript Object Notation). Data files *must* be valid JSON. If editing a data file manually, use a validator such as [jsonlint.com](https://jsonlint.com) to ensure the data file is valid JSON.
---
<a id="permissions-plugins-permissions"></a>
## Permissions
<sub>Source: <https://umod.org/documentation/plugins/permissions></sub>
Permissions allows server owners to give players unique abilities and benefits on their servers.
---
Administering permissions is easy; simply enter the desired command and you're done! If your server does not have a console, you can use any compatible RCON tool or remote console to send the commands to the server. Most Oxide-supported games also support the permission commands in the chat, or will soon.
For this guide, the permission `epicstuff.use` will be used as an example. Keep in mind that permissions only exist if provided by a plugin or Oxide itself.
By default, the groups that are created by Oxide are: admin and default. These can be changed by editing those under the oxide.config.json file. The admin group will automatically be assigned to players that are recognized as admin (via ownerid) by the server. The "default" group will automatically be assigned to ALL players that connect to the server.
### Players
#### Grant a permission to an individual player
```
oxide.grant user Wulf epicstuff.use
```
#### Revoke a permission from an individual player
```
oxide.revoke user Wulf epicstuff.use
```
#### Show a player's permissions
```
oxide.show user Wulf
```
#### Showing which player or group has a permission
Sometimes this command is helpful when tracking down who has a permission.
```
oxide.show perm epicstuff.use
```
### Groups
#### Grant a permission to an entire group
```
oxide.grant group admin epicstuff.use
```
#### Revoke a permission from a group
```
oxide.revoke group admin epicstuff.use
```
#### Adding a player to an existing group
Adding a player to a group will give them all of the permissions assigned to that group.
```
oxide.usergroup add Wulf admin
```
#### Removing a player from an existing group
Removing a player from a group will remove from them all of the permissions assigned to that group.
```
oxide.usergroup remove Wulf admin
```
#### Adding an entirely new group
```
oxide.group add vip
```
```
oxide.group add vip VIP 0
```
#### Removing an existing group
```
oxide.group remove vip
```
#### Setting the title or rank of a group
The group title is usually a short description of a group, sometimes used for chat titles. The rank is a number which sorts a group based on its importance.
```
oxide.group set vip "[VIP Member]"
```
```
oxide.group set vip "[VIP Member]" 1
```
#### Setting the parent group of another group
A group will inherit all permissions from its parent group.
```
oxide.group parent admin default
```
#### Showing a group's members and permissions
```
oxide.show group admin
```
### Showing all groups or permissions
To show all of the permission groups, simple use the command below.
```
oxide.show groups
```
The show all of the registered permissions from plugins and Oxide, use the command below.
```
oxide.show perms
```
### Using wildcards
A wildcard is something that covers multiple things at once time. For permissions, this is the * symbol. You can use the wildcard (*) to grant multiple permissions at one time. This can be done with all permissions or per plugin based on prefix.
```
oxide.grant group admin *
```
```
oxide.grant user Wulf oxide.*
```
### Conclusion
The same commands are also available with the "o." prefix (ex. "o.grant").
That's the basics to permissions for Oxide. Permissions give you a fantastic way to manage staff without worrying about them abusing powers from the game's admin functionality (such as flight, noclip, super speed, etc.) so they can still enjoy the game but also help monitor your server at the same time.
---
<sub>Mirrored from uMod, 2026-09-15.</sub>

2072
modules/rust/OXIDE_API.md Normal file

File diff suppressed because it is too large Load Diff

3215
modules/rust/PLAN.md Normal file

File diff suppressed because it is too large Load Diff

251
modules/rust/README.md Normal file
View File

@@ -0,0 +1,251 @@
# Rust — the modding-framework reference
Reference material for **`module-rust`**: a mirror of the uMod/Oxide documentation — the Rust game
API *and* the game-independent plugin framework around it — captured here so the module can be
designed and built against it without a round trip to umod.org on every question.
The mirrored material was **scraped verbatim from uMod on 2026-09-15**. One file,
[`CARBON.md`](CARBON.md), covers the *other* framework modded Rust servers run: PLAN.md **R19**
commits this module to supporting Oxide and Carbon both, and that file records only where the two
differ.
## The mirror
| Doc | What it holds |
|---|---|
| [`HOOKS.md`](HOOKS.md) | **What Rust will tell you.** All **477 hooks** in 20 categories — description, return contract, tags, every C# overload. The 34 *universal* hooks are marked. |
| [`OXIDE_API.md`](OXIDE_API.md) | **How a plugin is built.** The 19 developer pages — plugin structure, hooks, commands, `IPlayer`, permissions, config, data files, database, localization, timers, web requests, dependencies, CI, review. |
| [`DEFINITIONS.md`](DEFINITIONS.md) | **What things are called.** 678 items (short name, id, display name) and 2,590 workshop skin ids across 104 items. |
| [`OPERATING.md`](OPERATING.md) | **How it gets run.** The 6 operator pages — installing Oxide on a server, then installing, configuring and permissioning plugins. |
| [`agent/`](agent/README.md) | The same facts in **machine shape** — TSV and JSONL, ~46% of the tokens. Generated in the same pass, so it cannot drift. |
| [`CARBON.md`](CARBON.md) | **The other framework.** Where Carbon diverges from Oxide and nowhere else — file layout, the permission store, the `c.` commands, 30 Carbon-only hooks and 13 uMod names its catalogue omits. Sourced from Carbon's own metadata and source, and **proven on a live Carbon 2.0.259.0 server** — R19 at phase 0, and the whole read path at phase 3. |
**The one file here that is ours:** [`PLAN.md`](PLAN.md) — the schedule and the decisions of record
for actually building `module-rust`. Everything else in this directory is copied from uMod; that one
is written by this project and is where the phases, the settled decisions and the local test rig are
recorded.
> **This is a mirror, not a specification we own.** uMod is upstream and wins any disagreement; the
> point of copying it is availability and grep-ability, not authority. Nothing here may be cited as a
> Runic Gateway contract — our contracts are [`MODULE_API.md`](../../website/MODULE_API.md) and
> [`docs/link/`](../../link/).
---
## 1. Why this exists
The website core is game-agnostic; a **module** is what makes it a site for one particular game
([`MODULE_SYSTEM.md`](../../website/MODULE_SYSTEM.md)). `module-uo` was the first. A Rust module is
the second, and it was already designed once on paper —
[`../rust-dryrun.md`](../rust-dryrun.md) is that dry run, written deliberately *without*
implementing it, to find out whether the module contract generalises past Ultima Online.
The dry run's central structural fact is the thing this reference serves:
> A ServUO shard is C# **source** the operator compiles into their own server, so our bridge plugin
> can be anything we want. **A Rust server is a binary nobody outside Facepunch patches.** The only
> way in is a mod — hooking the game's own events through a modding framework.
The dry run named that framework as Oxide, and **R19 corrected it: there are two.** Carbon runs an
Oxide compatibility layer, so one plugin serves both and the ceiling below is the same ceiling —
but *which* framework an operator installed is their choice, not ours. [`CARBON.md`](CARBON.md) is
the difference list.
Two consequences, and they are the two halves of this directory:
1. **We can only emit what Oxide already hands us.** [`HOOKS.md`](HOOKS.md) is the hard ceiling on
what a Rust module can ever know about a live server. If a fact is not reachable from one of
those 477 hooks (or from a game type one of them hands you), the bridge cannot report it. That
makes it the input to the Rust sidecar's event catalogue — the analogue of
[`docs/link/PLAN.md`](../../link/PLAN.md) §5 on the UO side.
2. **We are a guest in someone else's plugin framework** — and we do not get to pick which one. Our
plugin is compiled, loaded, permissioned and configured by Oxide or by Carbon, on its terms. [`OXIDE_API.md`](OXIDE_API.md) is that rulebook, and
[`OPERATING.md`](OPERATING.md) is what the server owner has to do — which is the surface our
deployment story has to sit on, the way
[`installer/INSTALL.md`](../../installer/INSTALL.md) sits on top of ServUO.
---
## 2. How an Oxide hook actually binds
The one thing to understand before reading [`HOOKS.md`](HOOKS.md), because it is not in the table
itself:
**Oxide binds hooks by name and arity, by reflection, at runtime.** There is no interface to
implement and no compile-time check. A method whose name is misspelled, or whose parameter types do
not match, is simply **never called** — silently, with no warning at load. This is the single most
common way a Rust plugin "does nothing".
The consequence for us: **every hook name a module relies on is an untyped string constant against a
moving upstream.** Facepunch renames and removes hooks on wipes. A Rust sidecar should log which of
its expected hooks have actually fired at least once, so a hook that quietly stopped existing is
visible rather than mysterious.
### The return contract
[`HOOKS.md`](HOOKS.md) reproduces uMod's return line for every hook and it is the load-bearing part:
| uMod's wording | Code in [`agent/hooks.tsv`](agent/hooks.tsv) | What it means |
|---|---|---|
| *No return behavior* | `none` | A **notification**. Declare `void`. Nothing you return is read. |
| *Returning a non-null value overrides default behavior* | `nonnull` | A **veto with a payload**. Declare `object`; return `null` to let the game proceed, anything else to cancel it. |
| *Returning true or false overrides default behavior* | `bool` | A **veto**. Declare `object`; `null` abstains — returning `false` is *not* the same as abstaining. |
| *Returning a string will kick…* | `data` | The value is **consumed as data**, not merely as a veto. |
Two cautions that apply across the whole table:
- Never return non-`null` from a hook documented as *no return behavior*; on some hooks Oxide will
still read it as a veto.
- When several plugins hook the same veto, the **first non-`null` return wins** and the rest are not
consulted. Abstain with `null` unless you mean to decide. A bridge plugin should be a **reader**,
and must return `null` from every veto hook it listens on — see §5.
Three hooks (`OnEntityTakeDamage`, `OnExcavatorSuppliesRequested`, `OnPhoneCallStarted`) state no
return behaviour upstream at all; both the markdown and the TSV mark those *(not stated upstream)* /
`?` rather than guessing.
---
## 3. What is in the 477
| Category | Hooks | What it covers |
|---|---:|---|
| Server | 17 | Process lifecycle, tick/frame, save and restart, RCON and console commands |
| Player | 138 | Connect, chat, command, craft, loot, build, die, respawn |
| Entity | 140 | The generic `BaseEntity` graph — spawn, kill, damage, mount, loot, flags |
| Item | 43 | Item stacks and containers |
| Vehicle | 22 | Boats, cars, horses, helicopters, trains, submarines |
| Vending | 16 | Vending machines, the shop/trade flow, marketplace and drone deliveries |
| Weapon | 16 | Firing, reloading, throwing, melee, projectiles and traps |
| Structure | 15 | Placement, upgrade, demolish, stability, doors and locks |
| Resource | 12 | Gathering and node dispensers |
| Team | 12 | Rust's built-in team/party system |
| Phone | 12 | In-game telephones |
| Permission | 8 | uMod's own permission/group system (Covalence) |
| Clan | 7 | The first-party clan system, distinct from Team |
| Fishing · Plugin · TechTree | 4 each | |
| Sign | 3 | |
| Electronic | 2 | |
| Terrain · World | 1 each | |
**Player and Entity are 58% of the surface between them.** [`HOOKS.md`](HOOKS.md) opens with a full
alphabetical index (name → category → universal → return contract), which is the fastest way in when
you already know the hook's name.
### Universal vs. Rust-specific
**34 of the 477 are not Rust's.** They are uMod's own *universal* (Covalence) hooks — `Init`,
`Loaded`, `Unload`, `OnUserConnected`, the whole `OnGroup*`/`OnUserPermission*` family — which uMod
raises identically on every game it supports. They appear on the Rust page because they fire on Rust
too. Verified against <https://umod.org/documentation/games/universal> in the same capture: all 34
are in the Rust set, and the Rust page adds none of its own, so the overlap is exact.
The distinction is architectural, not trivia: **a universal hook is the portable part of the
surface.** Code written against one would carry to any other uMod-supported game; code written
against a Rust-specific hook would not. They are marked in `HOOKS.md` and flagged `1` in
[`agent/hooks.tsv`](agent/hooks.tsv).
Two notes on the data, both faithful to upstream:
- `OnShopCompleteTrade` appears **twice** — two separate records. Both are kept; the second carries
the anchor `#onshopcompletetrade-1`.
- Twelve hooks document **more than one overload** (e.g. `CanUpdateSign` takes either a `Signage` or
a `PhotoFrame`). Every code block is reproduced.
---
## 4. Reading the machine copy
[`agent/`](agent/README.md) holds the same facts as TSV and JSONL, at ~46% of the tokens — a real
3.2× saving on the hooks, 2.1× on the API prose, and only ~1.25× on the item and skin tables, which
were already dense. Reach for it when you want to *find* something; read the markdown when you want
the reasoning, which is deliberately not in there. [`agent/README.md`](agent/README.md) has the
column definitions and an honest account of where the saving is and is not.
---
## 5. Where this meets our architecture
The bridge invariants the platform already holds ([`ARCHITECTURE.md`](../../website/ARCHITECTURE.md),
[`docs/link/PLAN.md`](../../link/PLAN.md)) are game-independent, and a Rust module inherits all of
them. Restated against Oxide:
- **The game server is never network-reachable.** The Rust sidecar listens; the Oxide plugin dials
out to it, exactly as `BridgeLink.cs` does on the UO side.
- **A wedged or absent sidecar must never stall the server.** Oxide hooks run on Rust's main thread.
An emit must be an enqueue onto a bounded drop-oldest queue that returns immediately — never a
socket write, never a blocking call, and never anything expensive inside `OnTick`/`OnFrame`.
Oxide's own `timer` and `NextFrame` helpers ([`OXIDE_API.md` § Timers](OXIDE_API.md#timers)) are
the tools for deferring work off a hot hook.
- **The bridge plugin decides nothing.** It returns `null` from every veto hook it subscribes to.
Access control and audience scoping live on the website
([`SHARD_VISIBILITY.md`](../../website/SHARD_VISIBILITY.md)), not in the game plugin — the same
rule that makes the uo-link sidecar a dumb forwarder.
- **Sensitive events never reach the public stream.** Rust raises plenty that must not: `CanUserLogin`
and `OnUserApproved` carry IP addresses, `OnPlayerReported` carries player reports. These belong on
the admin channel only.
Reading order for someone picking the module up: [`../rust-dryrun.md`](../rust-dryrun.md) for the
design, [`MODULE_API.md`](../../website/MODULE_API.md) for the contract it must satisfy,
[`OXIDE_API.md`](OXIDE_API.md) for the framework we are a guest in, then [`HOOKS.md`](HOOKS.md) for
what the game can actually tell us.
---
## 6. Provenance and refreshing
| | |
|---|---|
| Captured | **2026-09-15** |
| Hooks | <https://umod.org/documentation/games/rust> · <https://umod.org/documentation/games/universal> |
| Definitions | <https://umod.org/documentation/games/rust/definitions> |
| Developer API | <https://umod.org/documentation/api/> — 19 pages |
| Operator docs | <https://umod.org/documentation/> — 6 pages |
| Content | 477 hooks (34 universal) · 678 items · 2,590 skins · 25 prose pages · 150 code examples |
**Rust wipes monthly and the hook list moves with it.** Re-capture before any significant work on
the module, and update the date in every file — they all carry it.
### How to capture it
Three different routes, because uMod serves these three ways. Cloudflare gates the HTML pages but
**not** the JSON endpoints:
**1. Hooks — a plain `curl`, no browser needed.** The page renders client-side from an endpoint that
is not gated. One request returns everything (`per_page` is 9999, so there is no paging):
```bash
curl -A "Mozilla/5.0" -H "Accept: application/json" \
"https://umod.org/documentation/hooks/rust.json" -o all_rust_hooks.json
curl -A "Mozilla/5.0" -H "Accept: application/json" \
"https://umod.org/documentation/hooks/universal.json" -o all_universal_hooks.json
```
Each record carries `name`, `subcategory`, `tags`, `description` (HTML `<ul>`) and `example` (a
markdown-fenced C# block). A `?subcategory=Server` query narrows it.
**2. Definitions — a real browser.** No JSON endpoint, and the HTML *is* gated. Load
`/documentation/games/rust/definitions`, then read the `Rust Items` table and the per-item
`Rust Skins` tables out of the rendered DOM.
**3. The prose pages — a real browser, throttled.** Also gated. Fetch each page same-origin from an
already-loaded uMod tab and take `document.querySelector('.documentation')`, dropping the
`.table-of-contents` child. **Pause ~1s between pages** — uMod returns `429 Too Many Requests` on a
tight loop, and a 429 is easy to mistake for a real page because it still returns 200-shaped HTML
with a title.
The pages mirrored here, in the order they appear:
- `api/` — overview, getting-started, hooks, commands, player, permissions, configuration,
data-files, database, localization, timers, web-requests, dependencies, integration,
preprocessor-directives, security, style-guide, continuous-integration, approval-guide
- operator — getting-started, plugins/getting-started, plugins/installation, plugins/configuration,
plugins/data-files, plugins/permissions
### Deliberately not mirrored
- **The other games** uMod supports (Hurtworld, 7 Days to Die, Reign of Kings, The Forest). Not our
ecosystem. `api/preprocessor-directives` lists their compile symbols if that ever changes.
- **Community pages** — contributing, community guidelines, reporting issues, getting help. Process,
not API.
- **The `/documentation/umod/*` paths**, which are aliases of the same pages.

View File

@@ -0,0 +1,114 @@
# `agent/` — the same reference, in machine shape
The four files here carry **the same facts** as the markdown one directory up, stripped of prose and
formatting so a coding agent can load or grep them cheaply. They are generated from the same scrape,
in the same pass — they are not a separate capture and cannot drift from it.
| File | Rows | Replaces | ~tokens | vs. the markdown |
|---|---:|---|---:|---:|
| [`hooks.tsv`](hooks.tsv) | 477 | [`../HOOKS.md`](../HOOKS.md) | ~19.6k | **31%** |
| [`items.tsv`](items.tsv) | 678 | [`../DEFINITIONS.md`](../DEFINITIONS.md) § Items | ~6.9k | 80% |
| [`skins.tsv`](skins.tsv) | 104 | [`../DEFINITIONS.md`](../DEFINITIONS.md) § Skins | ~17.9k | 77% |
| [`api.jsonl`](api.jsonl) | 150 | [`../OXIDE_API.md`](../OXIDE_API.md) + [`../OPERATING.md`](../OPERATING.md) | ~7.8k | **47%** |
| **Total** | | | **~52k** | **46%** |
Token counts are `len(chars)/4` estimates, not a real tokenizer — accurate enough to choose a file,
not to budget a context window.
> **Be honest about where the win is.** It is large for hooks (3.2×) and the API prose (2.1×),
> because both are mostly explanation. It is modest for the item and skin tables (~1.25×), because
> `DEFINITIONS.md` is *already* a dense table — there was not much ceremony left to strip. The first
> attempt at `skins.tsv` was one row per skin and came out **11% larger** than the markdown it was
> meant to replace; grouping it one row per item is what made it a saving at all.
---
## Which file to reach for
- **"Which hook fires when X happens?"** → `hooks.tsv`. It is the whole catalogue; grep the
description column.
- **"What exactly does this hook give me, and what may I return?"** → `hooks.tsv` answers both in
the `signatures` and `returns` columns. Only go to `../HOOKS.md` for the worked example body.
- **"How do I do <Oxide thing> in a plugin?"** → `api.jsonl`, grep `section` or `code`. It is every
code example uMod publishes, addressed by page and heading.
- **"What is this item's id / short name?"** → `items.tsv`.
- **"What skins exist for this item?"** → `skins.tsv`, one grep, one line.
Read the markdown instead when you want the *reasoning* — the return-contract rules, the callouts,
the cautions. Those are deliberately not in here.
---
## Formats
All files are UTF-8 with LF endings and a header line. TSV fields are **tab-separated with no
quoting and no escaping** — tabs and newlines are stripped from values at generation time, so a
naive `split('\t')` is always correct.
### `hooks.tsv`
```
name category universal returns signatures description
```
- **`category`** — one of the 20 uMod subcategories (`Server`, `Player`, `Entity`, …).
- **`universal`** — `1` for the 34 uMod *universal* (Covalence) hooks, which fire identically on
every game uMod supports; empty for Rust-specific ones. This is the portable/non-portable split.
- **`returns`** — the return contract, normalised to one of five codes:
| Code | uMod's wording | What to declare |
|---|---|---|
| `none` | *No return behavior* | `void`. Nothing you return is read. |
| `nonnull` | *Returning a non-null value overrides default behavior* | `object`. `null` proceeds; anything else cancels. |
| `bool` | *Returning true or false overrides default behavior* | `object`. `null` abstains — `false` is **not** abstaining. |
| `data` | *Returning a string will kick…*, and similar | The value is consumed as data, not just as a veto. |
| `?` | upstream states no return behaviour at all | 3 hooks. Not a guess — genuinely absent. |
- **`signatures`** — every declaration uMod publishes for the hook, joined by ` ;; `. Twelve hooks
have more than one (overloads); the rest have exactly one. Extracted by matching the hook's own
name, so no body line is ever mistaken for a signature.
- **`description`** — the descriptive bullets, joined by `; `, with the return-behaviour bullet
moved into `returns`.
### `items.tsv`
```
shortname item_id display_name
```
Sorted by short name. **`shortname` is the only key safe to persist** — see
[`../DEFINITIONS.md`](../DEFINITIONS.md) § Which key to use.
### `skins.tsv`
```
item_shortname skins (id=name;id=name;...)
```
**One row per item, not per skin** — 104 rows covering 2,590 skins. A `;` inside a skin name is
replaced with `,` so the field splits cleanly.
### `api.jsonl`
One JSON object per line, one object per code example uMod publishes:
```json
{"page":"api/timers","section":"Single timer","lang":"csharp","code":"timer.Once(1f, () =>\n{\n Puts(\"Hello world!\");\n});"}
```
- **`page`** — the uMod path, e.g. `api/permissions`. Prefix with `https://umod.org/documentation/`
for the source.
- **`section`** — the nearest heading above the example.
- **`lang`** — `csharp`, `json` or `text`.
This is the *examples only*. The prose that explains them is in `../OXIDE_API.md` and
`../OPERATING.md`, which is exactly the trade that makes it 47% of the size.
---
## Regenerating
These are build outputs, not hand-edited files. Re-capture and regenerate together —
[`../README.md`](../README.md) § Provenance and refreshing has the procedure. **Never edit a file
here by hand:** it will be silently overwritten on the next capture, and it would put the machine
copy out of step with the markdown, which is the one thing this directory promises cannot happen.

View File

@@ -0,0 +1,150 @@
{"page":"api/getting-started","section":"Getting Started","lang":"csharp","code":"namespace Oxide.Plugins\n{\n [Info(\"Epic Stuff\", \"Unknown Author\", \"0.1.0\")]\n [Description(\"Makes epic stuff happen\")]\n class EpicStuff : CovalencePlugin\n {\n private void Init()\n {\n Puts(\"A baby plugin is born!\");\n }\n\n // The rest of the code magic\n\n // TODO (you): Make more epic stuff\n }\n}"}
{"page":"api/getting-started","section":"Namespace","lang":"csharp","code":"namespace Oxide.Plugins"}
{"page":"api/getting-started","section":"Title","lang":"csharp","code":"\"Epic Stuff\""}
{"page":"api/getting-started","section":"Author","lang":"csharp","code":"\"Unknown Author\""}
{"page":"api/getting-started","section":"Version","lang":"csharp","code":"\"0.1.0\""}
{"page":"api/getting-started","section":"Description","lang":"csharp","code":"[Description(\"Makes epic stuff happen\")]"}
{"page":"api/getting-started","section":"Class Name","lang":"csharp","code":"class EpicStuff"}
{"page":"api/getting-started","section":"Plugin Type","lang":"csharp","code":"class EpicStuff : CovalencePlugin"}
{"page":"api/hooks","section":"Basic example","lang":"csharp","code":"private bool CanUserLogin(string name, string id, string ip)\n{\n Puts(\"No one can connect\");\n return false; // By returning false, no players may connect to this server\n}"}
{"page":"api/hooks","section":"Calling a hook from a plugin reference","lang":"csharp","code":"bool result = EpicStuff.CallHook<bool>(\"CanDoSomething\");\nif (result)\n{\n Puts(\"Player can do the thing!\");\n}"}
{"page":"api/hooks","section":"Calling a hook globally","lang":"csharp","code":"bool result = Interface.CallHook<bool>(\"CanDoSomething\");\nif (result)\n{\n Puts(\"Player can do the thing!\");\n}"}
{"page":"api/hooks","section":"Unsubscribe from hook","lang":"csharp","code":"bool chatFeatureEnabled = false;\n\nvoid Init()\n{\n if (!chatFeatureEnabled)\n {\n Unsubscribe(\"OnUserChat\");\n }\n}\n\nobject OnUserChat(IPlayer player, string message)\n{\n // Do stuff\n}"}
{"page":"api/hooks","section":"Subscribe to hook","lang":"csharp","code":"[Command(\"test\")]\nprivate void TestCommand(IPlayer player, string command, string[] args)\n{\n if (player.IsAdmin)\n {\n Puts(\"Enabling chat behavior\");\n Subscribe(\"OnUserChat\");\n }\n}"}
{"page":"api/hooks","section":"Hook overloading","lang":"csharp","code":"int EpicNumber = 42;\nstring EpicString = \"Whoa\";\n\nInterface.CallHook(\"EpicHook\", EpicNumber);\nInterface.CallHook(\"EpicHook\", EpicNumber, EpicString);"}
{"page":"api/hooks","section":"Hook overloading","lang":"csharp","code":"private void EpicHook(int epicNumber)\n{\n Puts($\"Received a number '{epicNumber}'\");\n}\n\nprivate void EpicHook(int epicNumber, string epicString)\n{\n Puts($\"Received a number '{epicNumber}' AND string '{epicString}'\");\n}"}
{"page":"api/commands","section":"Chat commands","lang":"csharp","code":"[Command(\"test\")]\nprivate void TestCommand(IPlayer player, string command, string[] args)\n{\n player.Reply(\"Test successful!\");\n}"}
{"page":"api/commands","section":"Console commands","lang":"csharp","code":"[Command(\"epicstuff.test\")]\nprivate void TestCommand(IPlayer player, string command, string[] args)\n{\n player.Reply(\"Test successful!\");\n}"}
{"page":"api/commands","section":"Command permissions","lang":"csharp","code":"[Command(\"test\"), Permission(\"epicstuff.use\")]\nprivate void TestCommand(IPlayer player, string command, string[] args)\n{\n player.Reply(\"Test successful!\");\n}"}
{"page":"api/player","section":"Name","lang":"csharp","code":"string name = player.Name;"}
{"page":"api/player","section":"Id","lang":"csharp","code":"string id = player.Id;"}
{"page":"api/player","section":"Address","lang":"csharp","code":"string address = player.Address;"}
{"page":"api/player","section":"Ping","lang":"csharp","code":"int ping = player.Ping;"}
{"page":"api/player","section":"Language","lang":"csharp","code":"CultureInfo language = player.Language;"}
{"page":"api/player","section":"IsConnected","lang":"csharp","code":"if (player.IsConnected)\n{\n player.Reply(\"You are connected\");\n}"}
{"page":"api/player","section":"IsServer","lang":"csharp","code":"if (player.IsServer)\n{\n player.Reply(\"You are the server\");\n}"}
{"page":"api/player","section":"IsAdmin","lang":"csharp","code":"if (player.IsAdmin)\n{\n player.Reply(\"You are an admin\");\n}"}
{"page":"api/player","section":"IsBanned","lang":"csharp","code":"if (player.IsBanned)\n{\n player.Reply(\"You are banned\");\n}"}
{"page":"api/player","section":"BanTimeRemaining","lang":"csharp","code":"TimeSpan banTimeRemaining = player.BanTimeRemaining;"}
{"page":"api/player","section":"Ban","lang":"csharp","code":"player.Ban(\"reason\"); // Ban player indefinitely\nplayer.Ban(\"reason\", new TimeSpan(2, 0, 0)); // Ban player for 2 hours"}
{"page":"api/player","section":"Unban","lang":"csharp","code":"player.Unban();"}
{"page":"api/player","section":"Kick","lang":"csharp","code":"player.Kick(\"reason\");"}
{"page":"api/player","section":"Health","lang":"csharp","code":"float health = player.Health;\nplayer.Health = 100f;"}
{"page":"api/player","section":"MaxHealth","lang":"csharp","code":"float maxHealth = player.MaxHealth;\nplayer.MaxHealth = 50f;"}
{"page":"api/player","section":"Heal","lang":"csharp","code":"player.Heal(100f);"}
{"page":"api/player","section":"Hurt","lang":"csharp","code":"player.Hurt(50f);"}
{"page":"api/player","section":"Kill","lang":"csharp","code":"player.Kill();"}
{"page":"api/player","section":"Rename","lang":"csharp","code":"player.Rename(\"EpicName\");"}
{"page":"api/player","section":"Teleport","lang":"csharp","code":"float x = 1;\nfloat y = 2;\nfloat z = 3;\nplayer.Teleport(x, y, z);\n\nGenericPosition position = new GenericPosition(x, y, z);\nplayer.Teleport(position);"}
{"page":"api/player","section":"Position","lang":"csharp","code":"GenericPosition position = player.Position();"}
{"page":"api/player","section":"Message","lang":"csharp","code":"player.Message(\"hello world\");"}
{"page":"api/player","section":"Reply","lang":"csharp","code":"player.Reply(\"hello world\");"}
{"page":"api/player","section":"Command","lang":"csharp","code":"player.Command(\"command\", arg1, arg2 /* , ... */ );"}
{"page":"api/player","section":"HasPermission","lang":"csharp","code":"if (player.HasPermission(\"epicstuff.use\"))\n{\n player.Reply(\"You have the epic permission\");\n}"}
{"page":"api/player","section":"GrantPermission","lang":"csharp","code":"player.GrantPermission(\"epicstuff.use\");"}
{"page":"api/player","section":"RevokePermission","lang":"csharp","code":"player.RevokePermission(\"epicstuff.use\");"}
{"page":"api/player","section":"BelongsToGroup","lang":"csharp","code":"if (player.BelongsToGroup(\"admin\"))\n{\n player.Reply(\"You are in the admin group\");\n}"}
{"page":"api/player","section":"AddToGroup","lang":"csharp","code":"player.AddToGroup(\"admin\");"}
{"page":"api/player","section":"RemoveFromGroup","lang":"csharp","code":"player.RemoveFromGroup(\"admin\");"}
{"page":"api/permissions","section":"Basic usage","lang":"csharp","code":"namespace Oxide.Plugins\n{\n [Info(\"Epic Stuff\", \"Unknown Author\", \"0.1.0\")]\n [Description(\"Makes epic stuff happen\")]\n class EpicStuff : CovalencePlugin\n {\n private void Init()\n {\n permission.RegisterPermission(\"epicstuff.use\", this);\n }\n\n private void OnUserConnected(IPlayer player)\n {\n if (player.HasPermission(\"epicstuff.use\"))\n {\n // Player has permission, do special stuff for them\n }\n }\n }\n}"}
{"page":"api/permissions","section":"Get all groups","lang":"csharp","code":"string[] groups = permission.GetGroups();"}
{"page":"api/permissions","section":"Check if group exists","lang":"csharp","code":"bool GroupExists = permission.GroupExists(\"GroupName\");"}
{"page":"api/permissions","section":"Create a group","lang":"csharp","code":"bool GroupCreated = permission.CreateGroup(\"GroupName\", \"Group Title\", 0);"}
{"page":"api/permissions","section":"Remove a group","lang":"csharp","code":"bool GroupRemoved = permission.RemoveGroup(\"GroupName\");"}
{"page":"api/permissions","section":"Check if group has a permission","lang":"csharp","code":"bool GroupHasPermission = permission.GroupHasPermission(\"GroupName\", \"epicstuff.use\");"}
{"page":"api/permissions","section":"Grant permission to a group","lang":"csharp","code":"permission.GrantGroupPermission(\"GroupName\", \"epicstuff.use\", this);"}
{"page":"api/permissions","section":"Revoke permission from a group","lang":"csharp","code":"permission.RevokeGroupPermission(\"GroupName\", \"epicstuff.use\");"}
{"page":"api/permissions","section":"Get the rank for a group","lang":"csharp","code":"int GroupRank = permission.GetGroupRank(\"GroupName\");"}
{"page":"api/permissions","section":"Get the title for a group","lang":"csharp","code":"string GroupTitle = permission.GetGroupTitle(\"GroupName\");"}
{"page":"api/permissions","section":"Get parent group for a group","lang":"csharp","code":"string GroupParent = permission.GetGroupParent(\"GroupName\");"}
{"page":"api/permissions","section":"Get permissions for a group","lang":"csharp","code":"string[] permissions = permission.GetGroupPermissions(\"GroupName\", false);"}
{"page":"api/permissions","section":"Migrate group","lang":"csharp","code":"permission.MigrateGroup(\"OldGroupName\", \"NewGroupName\");"}
{"page":"api/permissions","section":"Get permissions granted to player","lang":"csharp","code":"string[] UserPermissions = permission.GetUserPermissions(\"playerID\");"}
{"page":"api/permissions","section":"Check if player has a permission","lang":"csharp","code":"bool UserHasPermission = permission.UserHasPermission(\"playerID\", \"epicstuff.use\");"}
{"page":"api/permissions","section":"Add player to a group","lang":"csharp","code":"permission.AddUserGroup(\"playerID\", \"GroupName\");"}
{"page":"api/permissions","section":"Remove player from a group","lang":"csharp","code":"permission.RemoveUserGroup(\"playerID\", \"GroupName\");"}
{"page":"api/permissions","section":"Check if player is in a group","lang":"csharp","code":"bool UserHasGroup = permission.UserHasGroup(\"playerID\", \"GroupName\");"}
{"page":"api/permissions","section":"Grant permission to a player","lang":"csharp","code":"permission.GrantUserPermission(\"playerID\", \"epicstuff.use\", this);"}
{"page":"api/permissions","section":"Revoke permission from a player","lang":"csharp","code":"permission.RevokeUserPermission(\"playerID\", \"epicstuff.use\");"}
{"page":"api/permissions","section":"Get all registered permissions","lang":"csharp","code":"string[] permissions = permission.GetPermissions();"}
{"page":"api/permissions","section":"Check if a permission exists","lang":"csharp","code":"bool PermissionExists = permission.PermissionExists(\"epicstuff.use\", this);"}
{"page":"api/permissions","section":"Register a permission","lang":"csharp","code":"permission.RegisterPermission(\"epicstuff.use\", this);"}
{"page":"api/configuration","section":"Creating","lang":"csharp","code":"protected override void LoadDefaultConfig()\n{\n LogWarning(\"Creating a new configuration file\");\n Config[\"ShowJoinMessage\"] = true;\n Config[\"ShowLeaveMessage\"] = true;\n Config[\"JoinMessage\"] = \"Welcome to this server\";\n Config[\"LeaveMessage\"] = \"Goodbye\";\n}"}
{"page":"api/configuration","section":"Updating","lang":"csharp","code":"[Command(\"test\")]\nprivate void TestCommand(IPlayer player, string command, string[] args)\n{\n Config[\"ShowJoinMessage\"] = !(bool)Config[\"ShowJoinMessage\"];\n SaveConfig();\n}"}
{"page":"api/configuration","section":"Advanced configuration","lang":"csharp","code":"private class PluginConfig\n{\n public bool ShowJoinMessage;\n public bool ShowLeaveMessage;\n public string JoinMessage;\n public string LeaveMessage;\n}"}
{"page":"api/configuration","section":"Updating","lang":"csharp","code":"private void SaveConfig()\n{\n Config.WriteObject(config, true);\n}"}
{"page":"api/configuration","section":"Loading","lang":"csharp","code":"private PluginConfig config;\n\nprivate void Init()\n{\n config = Config.ReadObject<PluginConfig>();\n}\n\nprotected override void LoadDefaultConfig()\n{\n Config.WriteObject(GetDefaultConfig(), true);\n}\n\nprivate PluginConfig GetDefaultConfig()\n{\n return new PluginConfig\n {\n ShowJoinMessage = true,\n ShowLeaveMessage = true,\n JoinMessage = \"Welcome to this server\",\n LeaveMessage = \"Goodbye\"\n };\n}"}
{"page":"api/data-files","section":"Creating/saving the file","lang":"csharp","code":"DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetDatafile(\"MyDataFile\");\n\ndataFile[\"EpicString\"] = \"EpicValue\";\ndataFile[\"EpicNumber\"] = 42;\n\ndataFile.Save();"}
{"page":"api/data-files","section":"Creating/saving the file","lang":"json","code":"{\n \"EpicString\" : \"EpicValue\",\n \"EpicNumber\" : 42\n}"}
{"page":"api/data-files","section":"Accessing data by key","lang":"csharp","code":"// Check if the EpicString exists\nif (dataFile[\"EpicString\"] != null)\n{\n Puts(dataFile[\"EpicString\"]); // Outputs: EpicValue\n}\n\n// Check if the EpicNumber exists\nif (dataFile[\"EpicNumber\"] != null)\n{\n Puts(dataFile[\"EpicNumber\"]); // Outputs: 42\n}"}
{"page":"api/data-files","section":"Removing a key","lang":"csharp","code":"dataFile.Remove(\"EpicString\");\ndataFile.Save();"}
{"page":"api/data-files","section":"Removing a key","lang":"json","code":"{\n \"EpicNumber\" : 42\n}"}
{"page":"api/data-files","section":"Clearing the entire file","lang":"csharp","code":"dataFile.Clear();"}
{"page":"api/data-files","section":"Write nested key","lang":"csharp","code":"dataFile[\"EpicCategory\", \"EpicString\"] = \"EpicValue\";"}
{"page":"api/data-files","section":"Write nested key","lang":"json","code":"{\n \"EpicCategory\" : {\n \"EpicString\" : \"EpicValue\"\n }\n}"}
{"page":"api/data-files","section":"Read nested key","lang":"csharp","code":"if (dataFile[\"EpicCategory\", \"EpicString\"] != null)\n{\n Puts(dataFile[\"EpicCategory\", \"EpicString\"]); // Outputs: EpicValue\n}"}
{"page":"api/data-files","section":"Checking if a file exists","lang":"csharp","code":"if (Interface.Oxide.DataFileSystem.ExistsDatafile(\"MyDataFile\"))\n{\n Puts(\"MyDataFile exists!\");\n}\nelse\n{\n Puts(\"MyDataFile does not exist\");\n}"}
{"page":"api/data-files","section":"Loading a data object","lang":"csharp","code":"private class StoredData\n{\n public HashSet<PlayerInfo> Players = new HashSet<PlayerInfo>();\n\n public StoredData()\n {\n }\n}\n\nprivate class PlayerInfo\n{\n public string Id;\n public string Name;\n\n public PlayerInfo()\n {\n }\n\n public PlayerInfo(IPlayer player)\n {\n Id = player.Id;\n Name = player.Name;\n }\n}\n\nprivate StoredData storedData;\n\nprivate void Init()\n{\n storedData = Interface.Oxide.DataFileSystem.ReadObject<StoredData>(\"MyDataFile\");\n}"}
{"page":"api/data-files","section":"Saving a data object","lang":"csharp","code":"[Command(\"test\")]\nprivate void TestCommand(IPlayer player, string command, string[] args)\n{\n PlayerInfo info = new PlayerInfo(player);\n if (storedData.Players.Contains(info))\n {\n player.Reply(\"Your data has already been added to the file\");\n }\n else\n {\n storedData.Players.Add(info);\n player.Reply(\"Saving your data to the file...\");\n Interface.Oxide.DataFileSystem.WriteObject(\"MyDataFile\", storedData);\n }\n}"}
{"page":"api/data-files","section":"Advanced data","lang":"csharp","code":"private DataFileSystem dataFile;\n\nprivate void Init()\n{\n dataFile = new DataFileSystem($\"{Interface.Oxide.DataDirectory}\\\\player_info\");\n}\n\nprivate PlayerInfo LoadPlayerInfo(string playerId)\n{\n return dataFile.ReadObject<PlayerInfo>($\"playerInfo_{playerId}\");\n}\n\nprivate void SavePlayerInfo(string playerId, PlayerInfo playerInfo)\n{\n dataFile.WriteObject<PlayerInfo>($\"playerInfo_{playerId}\", playerInfo);\n}"}
{"page":"api/database","section":"Open a connection","lang":"csharp","code":"Core.MySql.Libraries.MySql sqlLibrary = Interface.Oxide.GetLibrary<Core.MySql.Libraries.MySql>();\nConnection sqlConnection = sqlLibrary.OpenDb(\"localhost\", 3306, \"umod\", \"username\", \"password\", this);"}
{"page":"api/database","section":"Close the connection","lang":"csharp","code":"sqlLibrary.CloseDb(sqlConnection);"}
{"page":"api/database","section":"Query the database","lang":"csharp","code":"string sqlQuery = \"SELECT `id`, `field1`, `field2` FROM example_table\";\nSql selectCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery);\n\nsqlLibrary.Query(selectCommand, sqlConnection, list =>\n{\n if (list == null)\n {\n return; // Empty result or no records found\n }\n\n StringBuilder newString = new StringBuilder();\n newString.AppendLine(\" id\\tfield1\\tfield2\");\n\n // Iterate through resulting records\n foreach (Dictionary<string, object> entry in list)\n {\n newString.AppendFormat(\" {0}\\t{1}\\t{2}\\n\", entry[\"id\"], entry[\"field1\"], entry[\"field2\"]);\n }\n\n Puts(newString.ToString());\n});"}
{"page":"api/database","section":"Insert query","lang":"csharp","code":"string sqlQuery = \"INSERT INTO example_table (`field1`, `field2`) VALUES (@0, @1);\";\nSql insertCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, \"field1 value\", \"field2 value\");\n\nsqlLibrary.Insert(insertCommand, sqlConnection, rowsAffected =>\n{\n if (rowsAffected > 0)\n {\n Puts(\"New record inserted with ID: {0}\", sqlConnection.LastInsertRowId);\n }\n});"}
{"page":"api/database","section":"Update query","lang":"csharp","code":"int exampleId = 2;\nstring sqlQuery = \"UPDATE example_table SET `field1` = @0, `field2` = @1 WHERE `id` = @2;\";\nSql updateCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, \"field1 value\", \"field2 value\", exampleId);\n\nsqlLibrary.Update(updateCommand, sqlConnection, rowsAffected =>\n{\n if (rowsAffected > 0)\n {\n Puts(\"Record successfully updated!\");\n }\n});"}
{"page":"api/database","section":"Delete query","lang":"csharp","code":"int exampleId = 2;\nstring sqlQuery = \"DELETE FROM example_table WHERE `id` = @0;\";\nSql deleteCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, exampleId);\n\nsqlLibrary.Delete(deleteCommand, sqlConnection, rowsAffected =>\n{\n if (rowsAffected > 0)\n {\n Puts(\"Record successfully deleted!\");\n }\n});"}
{"page":"api/database","section":"Non-query","lang":"csharp","code":"int exampleId = 2;\nstring sqlQuery = \"UPDATE example_table SET `field1` = @0, `field2` = @1 WHERE `id` = @3;\";\nSql sqlCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, \"field1 value\", \"field2 value\", exampleId);\n\nsqlLibrary.ExecuteNonQuery(sqlCommand, sqlConnection);"}
{"page":"api/localization","section":"Registering messages","lang":"csharp","code":"protected override void LoadDefaultMessages()\n{\n lang.RegisterMessages(new Dictionary<string, string>\n {\n [\"EpicThing\"] = \"An epic thing has happened\",\n [\"EpicTimes\"] = \"An epic thing has happened: {0} time(s)\"\n }, this);\n}"}
{"page":"api/localization","section":"Get all messages","lang":"csharp","code":"Dictionary<string, string> messages = lang.GetMessages(\"en\", this);\n\nPuts($\"Messages for {Title}:\");\nforeach(KeyValuePair<string, string> message in messages)\n{\n Puts($\"{message.Key}: {message.Value}\");\n}"}
{"page":"api/localization","section":"Get a single message","lang":"csharp","code":"[Command(\"epicstuff.message\")]\nprivate void TestMessageCommand(IPlayer player)\n{\n string message = lang.GetMessage(\"EpicThing\", this, player.Id);\n Puts(message);\n}"}
{"page":"api/localization","section":"Formatting a message","lang":"csharp","code":"int amount = 0;\n\n[Command(\"epicstuff.amount\")]\nprivate void TestAmountCommand(IPlayer player)\n{\n amount++;\n string message = lang.GetMessage(\"EpicTimes\", this, player.Id);\n Puts(string.Format(message, amount.ToString()));\n}"}
{"page":"api/localization","section":"Get player language","lang":"csharp","code":"[Command(\"epicstuff.language\")]\nprivate void TestLanguageCommand(IPlayer player)\n{\n Puts(lang.GetLanguage(player.Id));\n // Will output (by default): en\n}"}
{"page":"api/localization","section":"Set player language","lang":"csharp","code":"[Command(\"epicstuff.french\")]\nprivate void TestUpdateCommand(IPlayer player)\n{\n lang.SetLanguage(\"fr\", player.Id);\n Puts(\"Merci bien! Votre langue est le français\");\n}"}
{"page":"api/localization","section":"Get plugin languages","lang":"csharp","code":"string[] languages = lang.GetLanguages(this);\n\nPuts($\"Supported languages for {Title}:\");\nforeach(string language in languages)\n{\n Puts(language);\n}"}
{"page":"api/localization","section":"Get server language","lang":"csharp","code":"Puts(lang.GetServerLanguage()); // Will output (by default): en"}
{"page":"api/localization","section":"Set server language","lang":"csharp","code":"lang.SetServerLanguage(\"fr\"); // Will set language to \"fr\""}
{"page":"api/timers","section":"Single timer","lang":"csharp","code":"timer.Once(1f, () =>\n{\n Puts(\"Hello world!\");\n});"}
{"page":"api/timers","section":"Continuous timer","lang":"csharp","code":"timer.Every(3f, () =>\n{\n Puts(\"Hello world!\");\n});"}
{"page":"api/timers","section":"Repeating timer","lang":"csharp","code":"timer.Repeat(5f, 0, () =>\n{\n Puts(\"Hello world!\");\n});"}
{"page":"api/timers","section":"Immediate timer","lang":"csharp","code":"NextFrame(() =>\n{\n Puts(\"Hello world!\");\n});"}
{"page":"api/timers","section":"Destroying timer","lang":"csharp","code":"Timer myTimer = timer.Every(3f, () =>\n{\n Puts(\"Hello world!\");\n});\n\nmyTimer.Destroy();\nif (myTimer.Destroyed)\n{\n Puts(\"Timer destroyed!\");\n}"}
{"page":"api/web-requests","section":"GET web request","lang":"csharp","code":"webrequest.Enqueue(\"http://www.google.com/search?q=umod\", null, (code, response) =>\n{\n if (code != 200 || response == null)\n {\n Puts($\"Couldn't get an answer from Google!\");\n return;\n }\n Puts($\"Google answered: {response}\");\n}, this, RequestMethod.GET);"}
{"page":"api/web-requests","section":"Advanced GET request","lang":"csharp","code":"[Command(\"get\")]\nprivate void GetRequest(IPlayer player, string command, string[] args)\n{\n // Set a custom timeout (in milliseconds)\n float timeout = 200f;\n\n // Set some custom request headers (eg. for HTTP Basic Auth)\n Dictionary<string, string> headers = new Dictionary<string, string> { { \"header\", \"value\" } };\n\n webrequest.Enqueue(\"http://www.google.com/search?q=umod\", null, (code, response) =>\n GetCallback(code, response, player), this, RequestMethod.GET, headers, timeout);\n}\n\nprivate void GetCallback(int code, string response, IPlayer player)\n{\n if (response == null || code != 200)\n {\n Puts($\"Error: {code} - Couldn't get an answer from Google for {player.Name}\");\n return;\n }\n\n Puts($\"Google answered for {player.Name}: {response}\");\n}"}
{"page":"api/web-requests","section":"POST web request","lang":"csharp","code":"webrequest.Enqueue(\"http://www.google.com/search?q=umod\", \"param1=value1\", (code, response) =>\n{\n if (code != 200 || response == null)\n {\n Puts($\"Couldn't get an answer from Google!\");\n return;\n }\n Puts($\"Google answered: {response}\");\n}, this, RequestMethod.POST);"}
{"page":"api/web-requests","section":"PUT web request","lang":"csharp","code":"webrequest.Enqueue(\"http://www.google.com/search?q=umod\", null, (code, response) =>\n{\n if (code != 200 || response == null)\n {\n Puts($\"Couldn't get an answer from Google!\");\n return;\n }\n Puts($\"Google answered: {response}\");\n}, this, RequestMethod.PUT);"}
{"page":"api/web-requests","section":"POST and PUT body","lang":"csharp","code":"Dictionary<string,string> parameters = new Dictionary<string,string>();\n\nparameters.Add(\"param1\", \"value1\");\nparameters.Add(\"param2\", \"value2\");\n\nstring[] body = string.Join(\"&\", parameters.Cast<string>().Select(key => string.Format(\"{0}={1}\", key, source[key]));\nwebrequest.Enqueue(\"http://www.google.com/search?q=umod\", body, (code, response) =>\n{\n if (code != 200 || response == null)\n {\n Puts($\"Couldn't get an answer from Google!\");\n return;\n }\n Puts($\"Google answered: {response}\");\n}, this, RequestMethod.POST);"}
{"page":"api/web-requests","section":"Using a method callback","lang":"csharp","code":"[Command(\"get\")]\nprivate void GetRequest(IPlayer player, string command, string[] args)\n{\n webrequest.EnqueueGet(\"http://www.google.com/search?q=umod\", (code, response) => GetCallback(code, response, player), this);\n}\n\nprivate void GetCallback(int code, string response, IPlayer player)\n{\n if (response == null || code != 200)\n {\n Puts($\"Error: {code} - Couldn't get an answer from Google for {player.Name}\");\n return;\n }\n\n Puts($\"Google answered for {player.Name}: {response}\");\n}"}
{"page":"api/dependencies","section":"Basic plugin reference","lang":"csharp","code":"[PluginReference]\nprivate Plugin EpicStuff;\n\nprivate void Loaded()\n{\n if (EpicStuff != null)\n {\n EpicStuff.Call(\"SomeMethod\");\n }\n}"}
{"page":"api/dependencies","section":"Required dependencies","lang":"csharp","code":"private void Loaded()\n{\n if (EpicStuff == null)\n {\n LogError(\"Epic Stuff is not loaded, get it at https://umod.org\");\n }\n}"}
{"page":"api/dependencies","section":"Hard dependencies","lang":"csharp","code":"// Requires: EpicStuff"}
{"page":"api/dependencies","section":"Hard dependencies","lang":"csharp","code":"// EpicStuff may now be referenced directly\nEpicStuff EpicStuff;\n\nprivate void Loaded()\n{\n EpicStuff = (EpicStuff)Manager.GetPlugin(\"EpicStuff\");\n}"}
{"page":"api/integration","section":"Plugin dependencies","lang":"csharp","code":"[PluginReference]\nprivate Plugin EpicStuff;"}
{"page":"api/integration","section":"Call method","lang":"csharp","code":"private void Loaded()\n{\n if (EpicStuff != null) // check if plugin is loaded\n {\n EpicStuff.Call(\"SomeMethod\", \"argument1\", \"argument2\");\n }\n}"}
{"page":"api/integration","section":"Call method","lang":"csharp","code":"bool someResponse = EpicStuff.Call<bool>(\"SomeMethod\", \"argument1\", \"argument2\");\nif(someResponse)\n{\n Puts(\"SomeMethod Response: True\");\n}"}
{"page":"api/integration","section":"Call method","lang":"csharp","code":"// In EpicStuff.cs\nprivate bool SomeMethod(string argument1, string argument2)\n{\n Puts($\"Do stuff: {argument1} {argument2}\");\n return true;\n}"}
{"page":"api/integration","section":"Hook conflicts","lang":"csharp","code":"bool CanUserLogin (string name, string id, string ip)\n{\n if (EpicPlugin != null)\n {\n var result = EpicPlugin.Call (\"CanUserLogin\", name, id, ip);\n if (result is bool)\n {\n return (bool)result;\n }\n }\n\n Puts(\"No conflict, do plugin stuff here\");\n\n return true;\n}"}
{"page":"api/integration","section":"Custom hooks","lang":"csharp","code":"bool result = Interface.Oxide.CallHook<bool>(\"CanCreateBackpack\", player);\nif (!result)\n{\n return;\n}\n\n// Create backpack"}
{"page":"api/integration","section":"Custom hooks","lang":"csharp","code":"private object CanCreateBackpack(IPlayer player)\n{\n if (IsInArena(player))\n {\n return false;\n }\n\n return null;\n}"}
{"page":"api/preprocessor-directives","section":"Basic usage","lang":"csharp","code":"private bool CanUserLogin(string name, string id, string ip)\n{\n#if RUST\n // Do Rust-specific code\n#elif HURTWORLD\n // Do Hurtworld-specific code\n#endif\n}"}
{"page":"api/preprocessor-directives","section":"Example","lang":"csharp","code":"#if DEBUG\n Puts(\"Some test related info\");\n#endif"}
{"page":"api/preprocessor-directives","section":"Example","lang":"csharp","code":"#define DEBUG\n\nusing System;"}
{"page":"plugins/configuration","section":"Applying changes","lang":"text","code":"oxide.reload MyPlugin"}
{"page":"plugins/permissions","section":"Grant a permission to an individual player","lang":"text","code":"oxide.grant user Wulf epicstuff.use"}
{"page":"plugins/permissions","section":"Revoke a permission from an individual player","lang":"text","code":"oxide.revoke user Wulf epicstuff.use"}
{"page":"plugins/permissions","section":"Show a player's permissions","lang":"text","code":"oxide.show user Wulf"}
{"page":"plugins/permissions","section":"Showing which player or group has a permission","lang":"text","code":"oxide.show perm epicstuff.use"}
{"page":"plugins/permissions","section":"Grant a permission to an entire group","lang":"text","code":"oxide.grant group admin epicstuff.use"}
{"page":"plugins/permissions","section":"Revoke a permission from a group","lang":"text","code":"oxide.revoke group admin epicstuff.use"}
{"page":"plugins/permissions","section":"Adding a player to an existing group","lang":"text","code":"oxide.usergroup add Wulf admin"}
{"page":"plugins/permissions","section":"Removing a player from an existing group","lang":"text","code":"oxide.usergroup remove Wulf admin"}
{"page":"plugins/permissions","section":"Adding an entirely new group","lang":"text","code":"oxide.group add vip"}
{"page":"plugins/permissions","section":"Adding an entirely new group","lang":"text","code":"oxide.group add vip VIP 0"}
{"page":"plugins/permissions","section":"Removing an existing group","lang":"text","code":"oxide.group remove vip"}
{"page":"plugins/permissions","section":"Setting the title or rank of a group","lang":"text","code":"oxide.group set vip \"[VIP Member]\""}
{"page":"plugins/permissions","section":"Setting the title or rank of a group","lang":"text","code":"oxide.group set vip \"[VIP Member]\" 1"}
{"page":"plugins/permissions","section":"Setting the parent group of another group","lang":"text","code":"oxide.group parent admin default"}
{"page":"plugins/permissions","section":"Showing a group's members and permissions","lang":"text","code":"oxide.show group admin"}
{"page":"plugins/permissions","section":"Showing all groups or permissions","lang":"text","code":"oxide.show groups"}
{"page":"plugins/permissions","section":"Showing all groups or permissions","lang":"text","code":"oxide.show perms"}
{"page":"plugins/permissions","section":"Using wildcards","lang":"text","code":"oxide.grant group admin *"}
{"page":"plugins/permissions","section":"Using wildcards","lang":"text","code":"oxide.grant user Wulf oxide.*"}

View File

@@ -0,0 +1,478 @@
name category universal returns signatures description
CanAcceptItem Item data ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, int targetPos) Called when attempting to put an item in a container
CanAdministerVending Vending bool bool CanAdministerVending(BasePlayer player, VendingMachine machine) Called when a player attempts to administer a vending machine
CanAffordToPlace Player bool bool CanAffordToPlace(BasePlayer player, Planner planner, Construction construction) Useful for ignoring resource requirements for placement
CanAffordUpgrade Player bool bool CanAffordUpgrade(BasePlayer player, BuildingBlock block, BuildingGrade.Enum grade) Called when the resources for an upgrade are checked
CanAssignBed Player nonnull object CanAssignBed(BasePlayer player, SleepingBag bag, ulong targetPlayerId) Called when a player attempts to assign a bed or sleeping bag to another player
CanBeTargeted Player bool bool CanBeTargeted(BaseCombatEntity player, MonoBehaviour behaviour) Called when an autoturret, flame turret, shotgun trap, or helicopter turret is attempting to target the player
CanBeWounded Player bool bool CanBeWounded(BasePlayer player, HitInfo info) Called when any damage is attempted on player
CanBradleyApcTarget Entity bool bool CanBradleyApcTarget(BradleyAPC apc, BaseEntity entity) Called when an APC targets an entity
CanBuild Player nonnull object CanBuild(Planner planner, Construction prefab, Construction.Target target) Called when the player tries to build something
CanBypassQueue Player data bool CanBypassQueue(Network.Connection connection) Called before the player is added to the connection queue
CanCatchFish Fishing bool bool? CanCatchFish(BasePlayer player, BaseFishingRod rod, Item item) Called before a fish is caught
CanChangeCode Player nonnull object CanChangeCode(BasePlayer player, CodeLock codeLock, string newCode, bool isGuestCode) Called when a player tries to change the code on a codelock
CanChangeGrade Player bool bool CanChangeGrade(BasePlayer player, BuildingBlock block, BuildingGrade.Enum grade) Called when a player tries to change a building grade
CanCheckFuel Vehicle bool object CanCheckFuel(EntityFuelSystem fuelSystem, StorageContainer fuelContainer, BasePlayer player) Called when a player tries to loot a vehicle's fuel container
CanClientLogin Player data object CanClientLogin(Network.Connection connection) Called when the player is attempting to login
CanCombineDroppedItem Item nonnull object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem) Called when an item is dropped on another item
CanCraft Player bool bool CanCraft(ItemCrafter itemCrafter, ItemBlueprint bp, int amount) ;; bool CanCraft(PlayerBlueprints playerBlueprints, ItemDefinition itemDefinition, int skinItemId) Called when the player attempts to craft an item
CanCreateWorldProjectile Weapon nonnull object CanCreateWorldProjectile(HitInfo info, ItemDefinition itemDef) Called when the item creates a projectile in the world
CanDemolish Player bool bool CanDemolish(BasePlayer player, BuildingBlock block, BuildingGrade.Enum grade) Called when a player tries to demolish a building block
CanDeployItem Player nonnull object CanDeployItem(BasePlayer player, Deployer deployer, NetworkableId entityId) Useful for denying items' deployment
CanDismountEntity Player nonnull object CanDismountEntity(BasePlayer player, BaseMountable entity) Called when the player attempts to dismount an entity
CanDropActiveItem Item bool bool CanDropActiveItem(BasePlayer player) Called when a player attempts to drop their active item
CanEntityBeHostile Entity nonnull object CanEntityBeHostile(BaseCombatEntity entity) Useful for overriding hostility of an entity
CanEquipItem Player bool bool CanEquipItem(PlayerInventory inventory, Item item, int targetPos) Called when the player attempts to equip an item
CanExplosiveStick Weapon nonnull object CanExplosiveStick(TimedExplosive explosive, BaseEntity entity) Called when a Timed Explosive is attempting to stick to another entity
CanHackCrate Player nonnull object CanHackCrate(BasePlayer player, HackableLockedCrate crate) Called when a player starts hacking a locked crate
CanHelicopterDropCrate Entity bool bool CanHelicopterDropCrate(CH47HelicopterAIController heli) Called when a CH47 helicopter attempts to drop a crate
CanHelicopterStrafe Entity bool bool CanHelicopterStrafe(PatrolHelicopterAI heli) Called when a patrol helicopter attempts to strafe
CanHelicopterStrafeTarget Entity bool bool CanHelicopterStrafeTarget(PatrolHelicopterAI entity, BasePlayer target) Called when a patrol helicopter attempts to target a player to attack while strafing
CanHelicopterTarget Entity bool bool CanHelicopterTarget(PatrolHelicopterAI heli, BasePlayer player) Called when a patrol helicopter attempts to target a player to attack
CanHelicopterUseNapalm Entity bool bool CanHelicopterUseNapalm(PatrolHelicopterAI heli) Called when a patrol helicopter attempts to use napalm
CanHideStash Player nonnull object CanHideStash(BasePlayer player, StashContainer stash) Called when a player tries to hide a stash
CanLock Player nonnull object CanLock(BasePlayer player, BaseLock baseLock) Useful for canceling the lock action
CanLockerAcceptItem Entity bool object CanLockerAcceptItem(Locker locker, Item item, int targetPos) Called before an item is attempted to be placed inside a locker
CanLootEntity Player nonnull object CanLootEntity(BasePlayer player, DroppedItemContainer container) ;; object CanLootEntity(BasePlayer player, LootableCorpse corpse) ;; object CanLootEntity(BasePlayer player, ResourceContainer container) ;; object CanLootEntity(BasePlayer player, BaseRidableAnimal animal) ;; object CanLootEntity(BasePlayer player, StorageContainer container) Called when the player starts looting a DroppedItemContainer, LootableCorpse, ResourceContainer, BaseRidableAnimal, or StorageContainer entity
CanLootPlayer Player bool bool CanLootPlayer(BasePlayer target, BasePlayer looter) Called when the player attempts to loot another player
CanMountEntity Player nonnull object CanMountEntity(BasePlayer player, BaseMountable entity) Called when the player attempts to mount an entity
CanMoveItem Item nonnull object CanMoveItem(Item item, PlayerInventory playerLoot, ItemContainerId targetContainer, int targetSlot, int amount, ItemMoveModifier itemMoveModifier) Called when moving an item from one inventory slot to another
CanNetworkTo Entity bool bool CanNetworkTo(BaseNetworkable entity, BasePlayer target) Called when an entity attempts to network with a player; For better performance, avoid using heavy calculations in this hook.
CanNpcAttack Entity bool bool CanNpcAttack(BaseNpc npc, BaseEntity target) Called when a NPC attempts to attack another entity
CanNpcEat Entity bool bool CanNpcEat(BaseNpc npc, BaseEntity target) Called when a NPC attempts to eat another entity
CanPickupEntity Player bool bool CanPickupEntity(BasePlayer player, BaseEntity entity) Called when a player attempts to pickup a deployed entity (AutoTurret, BaseMountable, BearTrap, DecorDeployable, Door, DoorCloser, ReactiveTarget, SamSite, SleepingBag, SpinnerWheel, StorageContainer, etc.)
CanPickupLock Player bool bool CanPickupLock(BasePlayer player, BaseLock baseLock) Called when a player attempts to pickup a lock
CanPushBoat Player nonnull object CanPushBoat(BasePlayer player, MotorRowboat boat) Useful for canceling boat push
CanReceiveCall Phone bool object CanReceiveCall(PhoneController receiverPhone) Called when a player tries to place a phone call
CanRecycle Entity bool bool CanRecycle(Recycler recycler, Item item) Called when the recycler attempts to recycle an item
CanRenameBed Player nonnull object CanRenameBed(BasePlayer player, SleepingBag bed, string bedName) Called when the player attempts to rename a bed or sleeping bag
CanResearchItem Player nonnull object CanResearchItem(BasePlayer player, Item targetItem) Called when the player attempts to research an item
CanSamSiteShoot Entity nonnull object CanSamSiteShoot(SamSite samSite) Useful for canceling the shoot of SamSite
CanSeeStash Player nonnull object CanSeeStash(BasePlayer player, StashContainer stash) Called when a player is looking at a hidden stash
CanSetBedPublic Player nonnull object CanSetBedPublic(BasePlayer player, SleepingBag bed) Called when a player tries to set a bed public
CanSetRelationship Player bool bool? CanSetRelationship(BasePlayer player, BasePlayer otherPlayer, RelationshipManager.RelationshipType relationshipType, int weight) Called when a player's relationship with another is about to be updated
CanSpectateTarget Player nonnull object CanSpectateTarget(BasePlayer player, string filter) Called when spectate target is attempting to update
CanStackItem Item bool bool CanStackItem(Item item, Item targetItem) Called when moving an item onto another item
CanSwapToSeat Entity bool bool CanSwapToSeat(BasePlayer player, BaseMountable mountable) Called when a player tries to switch seats, to determine whether each seat is eligible to be swapped to
CanTakeCutting Resource nonnull object CanTakeCutting(BasePlayer player, GrowableEntity entity) Called when a player is trying to take a cutting (clone) of a GrowableEntity
CanUnlock Player nonnull object CanUnlock(BasePlayer player, BaseLock baseLock) Called when the player tries to unlock a keylock or codelock
CanUnlockTechTreeNode TechTree bool object CanUnlockTechTreeNode(BasePlayer player, TechTreeData.NodeInstance node, TechTreeData techTree) Called when a player is attempting to unlock a blueprint in a tech tree; Useful for bypassing unlock requirements or disallowing particular blueprints from being unlocked
CanUnlockTechTreeNodePath TechTree bool object CanUnlockTechTreeNodePath(BasePlayer player, TechTreeData.NodeInstance node, TechTreeData techTree) Called when a player is attempting to unlock a blueprint in a tech tree, after the `CanUnlockTechTreeNode` hook, when determining whether they have the prerequisite blueprints unlocked; Useful for customizing prerequisites without conflicting with the `CanPlayerUnlock` hook
CanUpdateSign Player bool bool CanUpdateSign(BasePlayer player, Signage sign) ;; bool CanUpdateSign(BasePlayer player, PhotoFrame photoFrame) Called when the player attempts to change the text on a sign or lock it, or update a photo frame
CanUseFuel Vehicle bool object CanUseFuel(EntityFuelSystem fuelSystem, StorageContainer fuelContainer, float currentSeconds, float fuelPerSecond) Called before a vehicle fuel system consumes fuel
CanUseGesture Player bool bool? CanUseGesture(BasePlayer player, GestureConfig gesture) Called when a player attempts to use a gesture
CanUseHelicopter Vehicle nonnull object CanUseHelicopter(BasePlayer player, CH47HelicopterAIController helicopter) Useful for denying to mount a CH47 helicopter
CanUseLockedEntity Player bool bool CanUseLockedEntity(BasePlayer player, BaseLock baseLock) Called when the player tries to use an entity that is locked
CanUseMailbox Player bool bool CanUseMailbox(BasePlayer player, Mailbox mailbox) Called when the player tries to use a mailbox
CanUserLogin Player 1 data object CanUserLogin(string name, string id, string ipAddress) Called when a player is attempting to connect to the server
CanUseUI Player nonnull object CanUseUI(BasePlayer player, string json) Called when the player attempts to use a custom UI
CanUseVending Vending bool bool CanUseVending(BasePlayer player, VendingMachine machine) Called when a player attempts to use a vending machine
CanUseWires Player nonnull object CanUseWires(BasePlayer player) Useful for allowing or preventing a player from using wires
CanVendingAcceptItem Vending bool bool CanVendingAcceptItem(VendingMachine vending, Item item, int targetPos) Called when a player attempts to administer a vending machine
CanWearItem Player nonnull object CanWearItem(PlayerInventory inventory, Item item, int targetSlot) Called when the player attempts to equip an item
Init Server 1 none void Init() Called when a plugin is being initialized; Other plugins may or may not be present, dependant on load order
LoadDefaultConfig Plugin 1 none protected override void LoadDefaultConfig() Called when the config for a plugin should be initialized; Only called if the config file does not already exist
LoadDefaultMessages Plugin 1 none protected override void LoadDefaultMessages() Called when the localization for a plugin should be registered
Loaded Plugin 1 none void Loaded() Called when a plugin has finished loading; Other plugins may or may not be present, dependant on load order
OnActiveItemChange Player nonnull object OnActiveItemChange(BasePlayer player, Item oldItem, ItemId newItemId) Called when active item is attempting to update
OnActiveItemChanged Player none void OnActiveItemChanged(BasePlayer player, Item oldItem, Item newItem) Called when active item was changed
OnAddVendingOffer Vending none void OnAddVendingOffer(VendingMachine machine, ProtoBuf.VendingMachine.SellOrder sellOrder) Called when a sell order/offer is added to a vending machine
OnAirdrop Entity none void OnAirdrop(CargoPlane plane, Vector3 dropPosition) Called when an airdrop has been called
OnAmmoSwitch Weapon nonnull object OnAmmoSwitch(BaseProjectile weapon, BasePlayer player) Called when the player starts to switch the ammo in a weapon
OnAmmoUnload Weapon nonnull object OnAmmoUnload(BaseProjectile projectile, Item item, BasePlayer player) Called when a player is trying to unload ammo
OnAnalysisComplete Player none void OnAnalysisComplete(SurveyCrater surveyCrater, BasePlayer player) Called right after a player completes a survey crater analysis
OnBackpackDrop Item data object OnBackpackDrop(Item backpack, BasePlayer player) Called just before a backpack is dropped from a player on death.
OnBigWheelLoss Entity none void OnBigWheelLoss(BigWheelGame wheel, Item item) Called when a specific item is lost on the big wheel game
OnBigWheelWin Entity data object OnBigWheelWin(BigWheelGame bigWheel, Item scrap, BigWheelBettingTerminal terminal, int multiplier) Called before multiplier is applied.
OnBoatPathGenerate Vehicle data List<Vector3> OnBoatPathGenerate() Called when generating ocean patrol path for CargoShip
OnBonusItemDrop Item nonnull object OnBonusItemDrop(Item item, BasePlayer player) Called when a loot container is about to drop bonus scrap for a player who has a corresponding tea buff
OnBonusItemDropped Item none void OnBonusItemDropped(Item item, BasePlayer player) Called after a loot container has dropped bonus scrap for a player who has a corresponding tea buff
OnBookmarkAdd Entity nonnull object OnBookmarkAdd(ComputerStation computerStation, BasePlayer player, string bookmarkName) Called when a player tries to add a bookmark at a computer station
OnBookmarkControl Entity nonnull object OnBookmarkControl(ComputerStation computerStation, BasePlayer player, string bookmarkName, IRemoteControllable remoteControllable) Called when a player tries to select a bookmark at a computer station
OnBookmarkControlEnd Entity nonnull object OnBookmarkControlEnd(ComputerStation computerStation, BasePlayer player, BaseEntity controlledEntity) Called when a player tries to stop viewing/controlling an entity at a computer station
OnBookmarkControlEnded Entity none void OnBookmarkControlEnded(ComputerStation computerStation, BasePlayer player, BaseEntity controlledEntity) Called after a player has stopped viewing/controlling an entity at a computer station
OnBookmarkControlStarted Entity none void OnBookmarkControlStarted(ComputerStation computerStation, BasePlayer player, string bookmarkName, IRemoteControllable remoteControllable) Called after a player has selected a bookmark at a computer station
OnBookmarkDelete Entity nonnull object OnBookmarkDelete(ComputerStation computerStation, BasePlayer player, string bookmarkName) Called when a player tries to delete a bookmark at a computer station
OnBookmarkInput Entity nonnull object OnBookmarkInput(ComputerStation computerStation, BasePlayer player, InputState inputState) Called when input is received from a player who is using a computer station with a bookmark selected
OnBookmarksSendControl Entity nonnull object OnBookmarksSendControl(ComputerStation computerStation, BasePlayer player, string bookmarks) Called when a player is being sent a list of bookmarks for a computer station
OnBradleyApcHunt Entity nonnull object OnBradleyApcHunt(BradleyAPC apc) Called when an APC starts hunting
OnBradleyApcInitialize Entity nonnull object OnBradleyApcInitialize(BradleyAPC apc) Called when an APC initializes
OnBradleyApcPatrol Entity nonnull object OnBradleyApcPatrol(BradleyAPC apc) Called when an APC is starts patrolling
OnBroadcastCommand Player nonnull object OnBroadcastCommand(string command, object[] args) Called before a command is broadcasted to all connected clients
OnBuildingPrivilege Entity data BuildingPrivlidge OnBuildingPrivilege(BaseEntity entity, OBB obb) Useful for overriding a building privilege on specific entities and etc.
OnBuildingSplit Structure none void OnBuildingSplit(BuildingManager.Building building, uint newBuildingId) Called when a building is split into two
OnButtonPress Entity nonnull object OnButtonPress(PressButton button, BasePlayer player) Called when a player is trying to press a button
OnBuyVendingItem Vending nonnull object OnBuyVendingItem(VendingMachine machine, BasePlayer player, int sellOrderId, int numberOfTransactions) Called when a player buys an item from a vending machine
OnCardSwipe Item nonnull object OnCardSwipe(CardReader cardReader, Keycard card, BasePlayer player) Called when a player is trying to swipe a card
OnCargoPlaneSignaled Entity none void OnCargoPlaneSignaled(CargoPlane cargoPlane, SupplySignal supplySignal) Called right after a supply signal has called a cargo plane
OnCCTVDirectionChange Entity nonnull object OnCCTVDirectionChange(CCTV_RC camera, BasePlayer player) Called when a player attempts to change the direction of a CCTV camera to face them
OnCentralizedBanCheck Player nonnull object OnCentralizedBanCheck(Network.Connection connection) Called when a player is about to be checked in the centralized ban database
OnClanColorChanged Clan none void OnClanColorChanged(LocalClan clan, Color32 color, ulong steamId) Called after a player changes a clan color
OnClanCreated Clan none void OnClanCreated(LocalClan clan, ulong steamId) Called after a player has created a clan
OnClanDisbanded Clan none void OnClanDisbanded(LocalClan clan, ulong steamId) Called after a player disbands a clan
OnClanLogoChanged Clan none void OnClanLogoChanged(LocalClan clan, byte[] logo, ulong steamId) Called after a player changes a clan logo
OnClanMemberAdded Clan none void OnClanMemberAdded(long clanId, ulong steamId) Called after a player has accepted a clan invite
OnClanMemberKicked Clan none void OnClanMemberKicked(LocalClan clan, ulong steamId, ulong bySteamId) Called after a player has kicked another player from a clan
OnClanMemberLeft Clan none void OnClanMemberLeft(LocalClan clan, ulong steamId) Called after a player has voluntarily left a clan
OnClientAuth Player none void OnClientAuth(Connection connection) Called when the player is giving server connection authorization information
OnClientCommand Player nonnull object OnClientCommand(Connection connection, string command) Useful for intercepting players' commands before their handling; Called before OnPlayerCommand and OnUserCommand
OnCodeEntered Structure nonnull object OnCodeEntered(CodeLock codeLock, BasePlayer player, string code) Called when the player has entered a code in a codelock
OnCollectiblePickup Resource nonnull object OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) Called when the player collects an item
OnConstructionPlace Structure nonnull object OnConstructionPlace(BaseEntity entity, Construction component, Construction.Target constructionTarget, BasePlayer player) Called when a player tries to place a building block
OnContainerDropItems Entity nonnull object OnContainerDropItems(ItemContainer container) Called when a container is destroyed and all items are about to be dropped
OnCorpsePopulate Player data BaseCorpse OnCorpsePopulate(BasePlayer npcPlayer, BaseCorpse corpse) Called when an NPC player corpse is about to be populated with loot
OnCounterModeToggle Entity nonnull object OnCounterModeToggle(PowerCounter counter, BasePlayer player, bool mode) Called when a player ties to toggle a power counter between modes
OnCounterTargetChange Entity nonnull object OnCounterTargetChange(PowerCounter counter, BasePlayer player, int targetNumber) Called when a player tries to change the target number of a power counter
OnCrateDropped Entity none void OnCrateDropped(HackableLockedCrate crate) Called when a locked crate from the CH47 (Chinook) has dropped
OnCrateHack Entity none void OnCrateHack(HackableLockedCrate crate) Called when a player starts hacking a locked crate
OnCrateHackEnd Entity none void OnCrateHackEnd(HackableLockedCrate crate) Called when a player stops hacking a locked crate
OnCrateLanded Entity none void OnCrateLanded(HackableLockedCrate crate) Called when a locked crate from the CH47 (Chinook) has landed
OnCupboardAuthorize Structure nonnull object OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer player) Called when a cupboard attempts to authorize a player
OnCupboardClearList Structure nonnull object OnCupboardClearList(BuildingPrivlidge privilege, BasePlayer player) Called when an attempt is made to clear a cupboard authorized list
OnCupboardDeauthorize Structure nonnull object OnCupboardDeauthorize(BuildingPrivlidge privilege, BasePlayer player) Called when a cupboard attempts to deauthorize a player
OnDefaultItemsReceive Player nonnull object OnDefaultItemsReceive(PlayerInventory inventory) Called when a player is about to receive default items
OnDefaultItemsReceived Player nonnull void OnDefaultItemsReceived(PlayerInventory inventory) Called after a player has received default items
OnDeleteVendingOffer Vending none void OnDeleteVendingOffer(VendingMachine machine, int offerId) Called when a sell order/offer is deleted from a vending machine
OnDemoRecordingStart Player nonnull object OnDemoRecordingStart(string filename, BasePlayer player) Called right before a demo of a player starts recording
OnDemoRecordingStarted Player none void OnDemoRecordingStarted(string filename, BasePlayer player) Called after a demo of a player has started recording
OnDemoRecordingStop Player nonnull object OnDemoRecordingStop(string filename, BasePlayer player) Called right before a demo of a player stops recording
OnDemoRecordingStopped Player none void OnDemoRecordingStopped(string filename, BasePlayer player) Called after a demo of a player has stopped recording
OnDestroyUI Player none void OnDestroyUI(BasePlayer player, string json) Called when a custom UI is destroyed for the player
OnDieselEngineToggle Entity nonnull object OnDieselEngineToggle(DieselEngine engine, BasePlayer player) Called when a player is trying to toggle diesel engine
OnDieselEngineToggled Entity none void OnDieselEngineToggled(DieselEngine engine) Called when diesel engine is toggled
OnDispenserBonus Resource data void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item) Called before the player is given a bonus item for gathering
OnDispenserGather Resource nonnull object OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item) Called before the player is given items from a resource
OnDoorClosed Structure none void OnDoorClosed(Door door, BasePlayer player) Called when the player closed a door
OnDoorKnocked Structure none void OnDoorKnocked(Door door, BasePlayer player) Called when the player knocks on a door
OnDoorOpened Structure none void OnDoorOpened(Door door, BasePlayer player) Called when the player opened a door
OnElevatorButtonPress Entity nonnull object OnElevatorButtonPress(ElevatorLift lift, BasePlayer player, Elevator.Direction direction, bool toTopOrBottom) Called when a player presses a button on an elevator lift
OnElevatorCall Entity nonnull object OnElevatorCall(Elevator elevator, Elevator topElevator) Called when an elevator lift is called to a specific floor by electricity
OnElevatorMove Entity nonnull object OnElevatorMove(Elevator topElevator, int targetFloor) Called right before an elevator starts moving to the target floor
OnEngineLoadoutRefresh Entity nonnull object OnEngineLoadoutRefresh(EngineStorage storage) Called before engine loadout data is refreshed
OnEngineStart Vehicle nonnull object OnEngineStart(BaseVehicle vehicle, BasePlayer driver) Called when a player tries to start a vehicle engine
OnEngineStarted Vehicle none void OnEngineStarted(BaseVehicle vehicle, BasePlayer driver) Called right after a vehicle engine has started
OnEngineStatsRefresh Vehicle nonnull object OnEngineStatsRefresh(VehicleModuleEngine engineModule, EngineStorage engineStorage) Called right before the stats of a modular car engine are refreshed
OnEngineStatsRefreshed Vehicle none void OnEngineStatsRefreshed(VehicleModuleEngine engineModule, EngineStorage engineStorage) Called right after the stats of a modular car engine are refreshed
OnEngineStop Vehicle nonnull object OnEngineStop(BaseVehicle vehicle) Called when a vehicle engine is about to stop
OnEngineStopped Vehicle none void OnEngineStopped(BaseVehicle vehicle) Called right after a vehicle engine has stopped
OnEntityBuilt Structure none void OnEntityBuilt(Planner plan, GameObject go) Called when any structure is built (walls, ceilings, stairs, etc.)
OnEntityControl Entity bool object OnEntityControl(IRemoteControllable entity) Called when a player tries to remote control an entity
OnEntityDeath Entity none void OnEntityDeath(BaseCombatEntity entity, HitInfo info) HitInfo might be null, check it before use; Editing hitInfo has no effect because the death has already happened
OnEntityDestroy Entity nonnull object OnEntityDestroy(BaseCombatEntity entity) Called right before a CH47Helicopter or BradleyAPC is destroyed
OnEntityDismounted Entity none void OnEntityDismounted(BaseMountable entity, BasePlayer player) Called when an entity is dismounted by a player
OnEntityEnter Entity none void OnEntityEnter(TriggerBase trigger, BaseEntity entity) Called when an entity enters a trigger (water area, radiation zone, hurt zone, etc.)
OnEntityFlagsNetworkUpdate Entity nonnull object OnEntityFlagsNetworkUpdate(BaseEntity entity) Called after an entity's flags have been updated on the server, before they are sent over the network
OnEntityGroundMissing Entity nonnull object OnEntityGroundMissing(BaseEntity entity) Called when an entity (sleepingbag, sign, furnace,...) is going to be destroyed because the buildingblock it is on was removed
OnEntityKill Entity nonnull object OnEntityKill(BaseNetworkable entity) Called when an entity is destroyed
OnEntityLeave Entity none void OnEntityLeave(TriggerBase trigger, BaseEntity entity) Called when an entity leaves a trigger (water area, radiation zone, hurt zone, etc.)
OnEntityMarkHostile Entity nonnull object OnEntityMarkHostile(BaseCombatEntity entity, float duration) Useful for denying marking the entity hostile
OnEntityMounted Entity none void OnEntityMounted(BaseMountable entity, BasePlayer player) Called when an entity is mounted by a player
OnEntitySaved Entity none void OnEntitySaved(BaseNetworkable entity, BaseNetworkable.SaveInfo saveInfo) Called after a BaseNetworkable has been saved to a ProtoBuf object and is about to be serialized to a network stream or network cache
OnEntitySnapshot Entity nonnull object OnEntitySnapshot(BaseNetworkable entity, Connection connection) Called when an entity snapshot is about to be sent to a client connection
OnEntitySpawned Entity none void OnEntitySpawned(BaseNetworkable entity) Called after any networked entity has spawned (including trees)
OnEntityStabilityCheck Entity nonnull object OnEntityStabilityCheck(StabilityEntity entity) Called when stability of an entity is checked
OnEntityTakeDamage Entity ? object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) Alternatively, modify the HitInfo object to change the damage; It should be okay to set the damage to 0, but if you don't return non-null, the player's client will receive a damage indicator (if entity is a BasePlayer); HitInfo has all kinds of useful things in it, such as Weapon, damageProperties or damageTypes
OnExcavatorGather Entity nonnull object OnExcavatorGather(ExcavatorArm arm, Item item) Called right before moving gathered resource to container
OnExcavatorMiningToggled Entity none void OnExcavatorMiningToggled(ExcavatorArm arm) Called when excavator mining arm is toggled
OnExcavatorResourceSet Entity nonnull object OnExcavatorResourceSet(ExcavatorArm arm, string resourceName, BasePlayer player) Called when a player is trying to set a new resource target
OnExcavatorSuppliesRequest Electronic data object OnExcavatorSuppliesRequest(ExcavatorSignalComputer computer, BasePlayer player) Called just after the excavator supply computer is triggered, before the plane is spawned.
OnExcavatorSuppliesRequested Electronic ? void OnExcavatorSuppliesRequested(ExcavatorSignalComputer computer, BasePlayer player, BaseEntity cargoPlane) Called after the excavator signal computer was triggered, just after the supply plane is spawned.
OnExperimentEnd Player nonnull object OnExperimentEnd(Workbench workbench) Called when an experiment is about to end
OnExperimentEnded Player none void OnExperimentEnded(Workbench workbench) Called after the experiment has finished
OnExperimentStart Player nonnull object OnExperimentStart(Workbench workbench, BasePlayer player) Called when the player attempts to experiment with at a workbench
OnExperimentStarted Player none void OnExperimentStarted(Workbench workbench, BasePlayer player) Called after the experimentation has started
OnExplosiveDropped Weapon none void OnExplosiveDropped(BasePlayer player, BaseEntity entity, ThrownWeapon item) Called when the player drops an explosive item (C4, grenade, ...)
OnExplosiveDud Weapon nonnull object OnExplosiveDud(DudTimedExplosive explosive) Called when explosive tries to become dud
OnExplosiveFuseSet Weapon nonnull object OnExplosiveFuseSet(TimedExplosive explosive, float fuseLength) Called when a fuse of an explosive is set
OnExplosiveThrown Weapon none void OnExplosiveThrown(BasePlayer player, BaseEntity entity, ThrownWeapon item) Called when the player throws an explosive item (C4, grenade, ...)
OnFindBurnable Item data Item OnFindBurnable(BaseOven oven) Called when looking for fuel for the oven
OnFindSpawnPoint Player data void OnFindSpawnPoint(BasePlayer player) Useful for controlling player spawnpoints (like making all spawns occur in a set area)
OnFireBallDamage Entity none void OnFireBallDamage(FireBall fire, BaseCombatEntity entity, HitInfo info) Called when a fire ball does damage to another entity
OnFireBallSpread Entity none void OnFireBallSpread(FireBall ball, BaseEntity fire) Called when a fire ball fire spreads
OnFishCatch Fishing nonnull Item OnFishCatch(Item item, BaseFishingRod rod, BasePlayer player) Called after a fish is caught, before the item is given
OnFishCaught Fishing none void OnFishCaught(ItemDefinition definition, BaseFishingRod rod, BasePlayer player) Called after a fish is caught
OnFishingStopped Fishing none void OnFishingStopped(BaseFishingRod rod, BaseFishingRod.FailReason reason) Called just after the fishing minigame has been stopped.
OnFlameExplosion Entity none void OnFlameExplosion(FlameExplosive explosive, BaseEntity flame) Called when a flame explodes
OnFlameThrowerBurn Weapon none void OnFlameThrowerBurn(FlameThrower thrower, BaseEntity flame) Called when the burn from a flame thrower spreads
OnFrame Server 1 none void OnFrame() Called each frame
OnFuelAmountCheck Vehicle data object OnFuelAmountCheck(EntityFuelSystem fuelSystem, Item fuelItem) Called when the amount of fuel in a vehicle is being determined
OnFuelCheck Vehicle bool object OnFuelCheck(EntityFuelSystem fuelSystem) Called when determining whether a vehicle has sufficient fuel
OnFuelConsume Item nonnull object OnFuelConsume(BaseOven oven, Item fuel, ItemModBurnable burnable) Called right before fuel is used (furnace, lanterns, camp fires, etc.)
OnFuelConsumed Item none void OnFuelConsumed(BaseOven oven, Item fuel, ItemModBurnable burnable) Called after fuel is used (furnace, lanterns, camp fires, etc.)
OnFuelItemCheck Vehicle data object OnFuelItemCheck(EntityFuelSystem fuelSystem, StorageContainer fuelContainer) Called when determining which item should be used to fuel a vehicle
OnGiveSoldItem Vending nonnull object OnGiveSoldItem(NPCVendingMachine vending, Item soldItem, BasePlayer buyer) ;; object OnGiveSoldItem(VendingMachine vending, Item soldItem, BasePlayer buyer) Called before a sold item is given
OnGroupCreated Permission 1 none void OnGroupCreated(string name) Called when a group has been created successfully
OnGroupDeleted Permission 1 none void OnGroupDeleted(string name) Called when a group has been deleted successfully
OnGroupParentSet Permission 1 none void OnGroupParentSet(string name, string parent) Called when a group parent has been updated
OnGroupPermissionGranted Permission 1 none void OnGroupPermissionGranted(string name, string perm) Called when a permission has been granted to a group
OnGroupPermissionRevoked Permission 1 none void OnGroupPermissionRevoked(string name, string perm) Called when a permission has been revoked from a group
OnGroupRankSet Permission 1 none void OnGroupRankSet(string name, int rank) Called when a group rank has been updated
OnGroupTitleSet Permission 1 none void OnGroupTitleSet(string name, string title) Called when a group title has been updated
OnGrowableGather Resource nonnull object OnGrowableGather(GrowableEntity plant, BasePlayer player) Called when the player gathers a growable entity
OnGrowableGathered Resource none void OnGrowableGathered(GrowableEntity plant, Item item, BasePlayer player) Called before the player receives an item from gathering a growable entity
OnHammerHit Structure nonnull object OnHammerHit(BasePlayer player, HitInfo info) Called when the player has hit something with a hammer
OnHealingItemUse Item nonnull object OnHealingItemUse(MedicalTool tool, BasePlayer player) Called when a player attempts to use a medical tool
OnHelicopterAttack Entity nonnull object OnHelicopterAttack(CH47HelicopterAIController heli) Called when a CH47 helicopter is being attacked
OnHelicopterDropCrate Entity nonnull object OnHelicopterDropCrate(CH47HelicopterAIController heli) Called when a CH47 helicopter is dropping a crate
OnHelicopterDropDoorOpen Entity nonnull object OnHelicopterDropDoorOpen(CH47HelicopterAIController heli) Called when a CH47 helicopter is opening its drop door
OnHelicopterKilled Entity nonnull object OnHelicopterKilled(CH47HelicopterAIController heli) Called when a CH47 helicopter is going to be killed
OnHelicopterOutOfCrates Entity bool bool? OnHelicopterOutOfCrates(CH47HelicopterAIController heli) Called when a CH47 helicopter runs out of crates
OnHelicopterRetire Entity nonnull object OnHelicopterRetire(PatrolHelicopterAI helicopter) Called before the patrol helicopter starts leaving the map.
OnHelicopterStrafeEnter Entity nonnull object OnHelicopterStrafeEnter(PatrolHelicopterAI helicopter, Vector3 strafePosition) Called when helicopter is entering strafe
OnHelicopterTarget Entity nonnull object OnHelicopterTarget(HelicopterTurret turret, BaseCombatEntity entity) Called when a helicopter turret attempts to target an entity
OnHorseHitch Entity nonnull object OnHorseHitch(RidableHorse horse, HitchTrough hitch) Called just before setting the hitch
OnHorseLead Entity nonnull object OnHorseLead(BaseRidableAnimal animal, BasePlayer player) Called when a player tries to lead a horse
OnHotAirBalloonToggle Vehicle nonnull object OnHotAirBalloonToggle(HotAirBalloon balloon, BasePlayer player) Called when a player tries to toggle a hot air balloon on or off
OnHotAirBalloonToggled Vehicle none void OnHotAirBalloonToggled(HotAirBalloon balloon, BasePlayer player) Called right after a player has toggled a hot air balloon on or off
OnIngredientsCollect Item nonnull bool? OnIngredientsCollect(ItemCrafter itemCrafter, ItemBlueprint blueprint, ItemCraftTask task, int amount, BasePlayer player) Called when ingredients are about to be collected for crafting an item
OnInputUpdate Entity nonnull object OnInputUpdate(IOEntity entity, int inputAmount, int slot) Called when an input of IOEntity is updated
OnInventoryNetworkUpdate Player nonnull object OnInventoryNetworkUpdate(PlayerInventory inventory, ItemContainer container, ProtoBuf.UpdateItemContainer updateItemContainer, PlayerInventory.Type type, PlayerInventory.PlayerInventory.NetworkInventoryMode networkInventoryMode) Called after a player's inventory contents have changed, before it is sent over the network to one or more clients
OnIORefCleared Entity none void OnIORefCleared(IOEntity.IORef ioRef, IOEntity ioEntity) Called after a wire has been disconnected from an electrical entity, such as when its connected entity was destroyed or when a player removed the wire
OnItemAction Item nonnull object OnItemAction(Item item, string action, BasePlayer player) Called when a button is clicked on an item in the inventory (drop, unwrap, ...)
OnItemAddedToContainer Item none void OnItemAddedToContainer(ItemContainer container, Item item) Called right after an item was added to a container; An entire stack has to be created, not just adding more wood to a wood stack for example
OnItemCraft Item bool object OnItemCraft(ItemCraftTask task, BasePlayer player, Item item) Called just before an item is added to the crafting queue
OnItemCraftCancelled Item none void OnItemCraftCancelled(ItemCraftTask task) Called before an item has been crafted
OnItemCraftFinished Item none void OnItemCraftFinished(ItemCraftTask task, Item item) Called right after an item has been crafted
OnItemDeployed Item none void OnItemDeployed(Deployer deployer, BaseEntity entity, BaseEntity slotEntity) Called right after an item has been deployed
OnItemDropped Item none void OnItemDropped(Item item, BaseEntity entity) Called right after an item has been dropped
OnItemLock Item nonnull object OnItemLock(Item item) Called right before an item is locked, such as in a modular car inventory
OnItemPickup Item nonnull object OnItemPickup(Item item, BasePlayer player) Called right after an item has been picked up
OnItemRecycle Entity nonnull object OnItemRecycle(Item item, Recycler recycler) Called when an item is recycled in a recycler
OnItemRefill Item nonnull object OnItemRefill(Item item, BasePlayer player) Called right before an item such as a diving tank is repaired without using a repair bench
OnItemRemove Item data object OnItemRemove(Item item) ;; void OnItemRemove(Item item) Called before an item is destroyed
OnItemRemovedFromContainer Item none void OnItemRemovedFromContainer(ItemContainer container, Item item) Called right after an item was removed from a container; The entire stack has to be removed for this to be called, not just a little bit
OnItemRepair Item nonnull object OnItemRepair(BasePlayer player, Item item) Called right before an item is repaired
OnItemResearch Item none void OnItemResearch(ResearchTable table, Item targetItem, BasePlayer player) Called right before a player begins to research an item
OnItemResearched Item data float OnItemResearched(ResearchTable table, float chance) Called right before a player finishes researching an item
OnItemSplit Item data Item OnItemSplit(Item item, int amount) Called right before an item is split into multiple stacks
OnItemStacked Item none void OnItemStacked(Item destinationItem, Item sourceItem, ItemContainer destinationContainer) Called after an item has been stacked
OnItemSubmit Item nonnull object OnItemSubmit(Item item, Mailbox mailbox, BasePlayer player) Called when a player submits an item into a mailbox or dropbox
OnItemUnlock Item nonnull object OnItemUnlock(Item item) Called right before an item is unlocked, such as in a modular car inventory
OnItemUpgrade Item none void OnItemUpgrade(Item item, Item upgraded, BasePlayer player) Called right before an item is upgraded
OnItemUse Item data int OnItemUse(Item item, int amountToUse) Called when an item is used
OnLiftUse Entity nonnull object OnLiftUse(Lift lift, BasePlayer player) ;; object OnLiftUse(ProceduralLift lift, BasePlayer player) Called when a player calls a lift or procedural lift
OnLiquidVesselFill Entity nonnull object OnLiquidVesselFill(BaseLiquidVessel liquidVessel, BasePlayer player, LiquidContainer facingLiquidContainer) Called when a player is attempting to fill a liquid vessel
OnLockerSwap Entity data object OnLockerSwap(Locker locker, int startIndex, BasePlayer player) Called when a player clicks the "Swap" button while viewing a locker interface
OnLootEntity Player none void OnLootEntity(BasePlayer player, BaseEntity entity) Called when the player starts looting an entity
OnLootEntityEnd Player none void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) Called when the player stops looting an entity
OnLootItem Player none void OnLootItem(PlayerLoot playerLoot, Item item) Called when the player starts looting an item
OnLootNetworkUpdate Player nonnull object OnLootNetworkUpdate(PlayerLoot loot) Called when a player is trying to loot a container or a container they are looting has changed its contents
OnLootPlayer Player none void OnLootPlayer(BasePlayer player, BasePlayer target) Called when the player starts looting another player
OnLootSpawn Entity nonnull object OnLootSpawn(LootContainer container) Called when loot spawns in a container
OnLoseCondition Item none void OnLoseCondition(Item item, ref float amount) Called right before the condition of the item is modified
OnMagazineReload Weapon nonnull object OnMagazineReload(BaseProjectile weapon, IAmmoContainer desiredAmount, BasePlayer player) Called when the player reloads a magazine
OnMapImageUpdated Item none void OnMapImageUpdated() Called when player updates map item's image; Useful for executing any action when map image is updated
OnMapMarkerAdd Player nonnull object OnMapMarkerAdd(BasePlayer player, MapNote note) Called when trying to add a marker
OnMapMarkerAdded Player none void OnMapMarkerAdded(BasePlayer player, MapNote note) Called after a marker was added
OnMapMarkerRemove Player nonnull object OnMapMarkerRemove(BasePlayer player, MapNote note) Called when trying to remove a marker
OnMapMarkersClear Player nonnull object OnMapMarkersClear(BasePlayer player, List<MapNote> notes) Called when trying to clear map markers
OnMapMarkersCleared Player none void OnMapMarkersCleared(BasePlayer player, List<MapNote> notes) Called after markers were cleared
OnMaxStackable Item data int OnMaxStackable(Item item) Called when an items max stackable is calculated
OnMeleeAttack Player nonnull object OnMeleeAttack(BasePlayer player, HitInfo info) Useful for canceling melee attacks
OnMeleeThrown Weapon none void OnMeleeThrown(BasePlayer player, Item item) Called when the player throws a melee item (axe, rock, ...)
OnMessagePlayer Server nonnull object OnMessagePlayer(string message, BasePlayer player) Useful for intercepting server messages before they get to their intended target
OnMlrsFire Entity nonnull object OnMlrsFire(MLRS mlrs, BasePlayer player) Called just before the MLRS is fired.
OnMlrsFired Entity none void OnMlrsFired(MLRS mlrs, BasePlayer player) Called just after the MLRS has been fired.
OnNetworkGroupEntered Player none void OnNetworkGroupEntered(BasePlayer player, Network.Visibility.Group group) Called after a player has entered a network group
OnNetworkGroupLeft Player none void OnNetworkGroupLeft(BasePlayer player, Network.Visibility.Group group) Called after a player has left a network group
OnNetworkSubscriptionsUpdate Entity nonnull object OnNetworkSubscriptionsUpdate(Network.Networkable networkable, List<Network.Visibility.Group> groupsToAdd, List<Network.Visibility.Group> groupsToRemove) Called after the Rust has determined which network groups to subscribe a player to (`groupsToAdd`), and which network groups to unsubscribe the player from (`groupsToRemove`); This hook is useful for situations where you want to subscribe a player to a network group that is outside their network range -- To do so, you can prevent Rust from automatically unsubscribing them by removing that group from the `groupsToRemove` list
OnNewSave Server none void OnNewSave(string filename) Called when a new savefile is created (usually when map has wiped)
OnNpcConversationEnded Player none void OnNpcConversationEnded(NPCTalking npcTalking, BasePlayer player) Called right after a player has ended an NPC conversation
OnNpcConversationRespond Player nonnull object OnNpcConversationRespond(NPCTalking npcTalking, BasePlayer player, ConversationData conversationData, ConversationData.ResponseNode responseNode) Called when a player chooses an NPC conversation response
OnNpcConversationResponded Player none void OnNpcConversationResponded(NPCTalking npcTalking, BasePlayer player, ConversationData conversationData, ConversationData.ResponseNode responseNode) Called right after a player's chosen NPC conversation response has been processed
OnNpcConversationStart Player nonnull object OnNpcConversationStart(NPCTalking npcTalking, BasePlayer player, ConversationData conversationData) Called when a player tries to start a conversation with an NPC
OnNpcDestinationSet Entity nonnull object OnNpcDestinationSet(NPCPlayerApex npc, Vector3 newPosition) Useful for canceling the destination change on NPCs
OnNpcGiveSoldItem Vending nonnull object OnNpcGiveSoldItem(NPCVendingMachine machine, Item soldItem, BasePlayer buyer) Called before a non-player controlled vending machine (at outpost etc.) gives the player the item they purchased.
OnNpcPlayerResume Entity nonnull object OnNpcPlayerResume(NPCPlayerApex npc) Useful for canceling the invoke of TryForceToNavmesh
OnNpcStopMoving Entity nonnull object OnNpcStopMoving(NPCPlayerApex npc) Useful for denying the move stop of NPCs
OnNpcTarget Entity nonnull object OnNpcTarget(BaseEntity npc, BaseEntity entity) Called when an NPC targets another entity
OnNpcTargetSense Entity nonnull object OnNpcTargetSense(BaseEntity owner, BaseEntity entity, AIBrainSenses brainSenses) Called when an NPC becomes aware of another entity
OnOpenVendingAdmin Vending none void OnOpenVendingAdmin(VendingMachine machine, BasePlayer player) Called when a player opens the admin ui for a vending machine
OnOutputUpdate Entity nonnull object OnOutputUpdate(IOEntity entity) Called when outputs of IOEntity are updated
OnOvenCook Entity nonnull object OnOvenCook(BaseOven oven, Item item) Called before an oven cooks an item
OnOvenCooked Entity none void OnOvenCooked(BaseOven oven, Item item, BaseEntity slot) Called after an oven cooks an item
OnOvenToggle Entity nonnull object OnOvenToggle(BaseOven oven, BasePlayer player) Called when an oven (Campfire, Furnace,...) is turned on or off
OnPayForPlacement Player nonnull object OnPayForPlacement(BasePlayer player, Planner planner, Construction construction) Called when a player is paying for placement. Useful for preventing paying for placing deployables, building blocks and etc
OnPayForUpgrade Player nonnull object OnPayForUpgrade(BasePlayer player, BuildingBlock block, ConstructionGrade gradeTarget) Called when player is paying for an upgrade. Useful for preventing paying for block upgrade
OnPermissionRegistered Permission 1 none void OnPermissionRegistered(string name, Plugin owner) Called when a permission has been registered
OnPhoneAnswer Phone nonnull object OnPhoneAnswer(PhoneController receiverPhone, PhoneController callerPhone) Called when a player tries to answer a phone call
OnPhoneAnswered Phone none void OnPhoneAnswered(PhoneController receiverPhone, PhoneController callerPhone) Called right after a player has answered a phone call
OnPhoneCallStart Phone nonnull object OnPhoneCallStart(PhoneController phone, PhoneController otherPhone, BasePlayer player) Called after a phone has been answered, right before voice communication is established
OnPhoneCallStarted Phone ? void OnPhoneCallStarted(PhoneController phone, PhoneController otherPhone, BasePlayer player) Called right after a phone call has been answered and voice communication has been established
OnPhoneDial Phone nonnull object OnPhoneDial(PhoneController callerPhone, PhoneController receiverPhone, BasePlayer player) Called when a player places a phone call
OnPhoneDialFail Phone nonnull object OnPhoneDialFail(PhoneController phone, Telephone.DialFailReason reason, BasePlayer player) Called when a phone call is about to end or fail to start
OnPhoneDialFailed Phone none void OnPhoneDialFailed(PhoneController phone, Telephone.DialFailReason reason, BasePlayer player) Called after a phone call has ended or failed to start
OnPhoneDialTimedOut Phone none void OnPhoneDialTimedOut(PhoneController callerPhone, PhoneController receiverPhone, BasePlayer player) Called right after a phone was automatically hung up because the receiver phone wasn't answered in time
OnPhoneDialTimeout Phone nonnull object OnPhoneDialTimeout(PhoneController callerPhone, PhoneController receiverPhone, BasePlayer player) Called when a phone is about to automatically hang up because the receiver phone wasn't answered in time
OnPhoneNameUpdate Phone nonnull object OnPhoneNameUpdate(PhoneController phoneController, string name, BasePlayer player) Called when a player tries to update a phone name
OnPhoneNameUpdated Phone none void OnPhoneNameUpdated(PhoneController phoneController, string name, BasePlayer player) Called after a player has updated a phone name
OnPlayerAddModifiers Player nonnull object OnPlayerAddModifiers(BasePlayer player, Item item, ItemModConsumable consumable) Called after a player consumes an item such as tea that is about to apply modifiers
OnPlayerAssist Player nonnull object OnPlayerAssist(BasePlayer target, BasePlayer player) Called when a player tries to assist target player (when target is wounded)
OnPlayerAttack Player nonnull object OnPlayerAttack(BasePlayer attacker, HitInfo info) Useful for modifying an attack before it goes out; hitInfo.HitEntity should be the entity that this attack would hit
OnPlayerBanned Player none void OnPlayerBanned(string name, ulong id, string address, string reason) Called when the player is banned (Facepunch, EAC, server ban, etc.)
OnPlayerChat Player nonnull object OnPlayerChat(BasePlayer player, string message, Chat.ChatChannel channel) Called when the player sends chat to the server
OnPlayerCommand Player nonnull object OnPlayerCommand(BasePlayer player, string command, string[] args) Useful for intercepting players' commands before their handling
OnPlayerConnected Player none void OnPlayerConnected(BasePlayer player) Called after the player object is created, but before the player has spawned
OnPlayerCorpse Player none void OnPlayerCorpse(BasePlayer player, BaseCorpse corpse) Called when a non-null corpse has just been spawned
OnPlayerCorpseSpawn Player nonnull object OnPlayerCorpseSpawn(BasePlayer player) Called when a non-null corpse is about to spawn
OnPlayerCorpseSpawned Player none void OnPlayerCorpseSpawned(BasePlayer player, PlayerCorpse corpse) Called when a non-null corpse has just been spawned
OnPlayerDeath Player nonnull object OnPlayerDeath(BasePlayer player, HitInfo info) Called when the player is about to die; HitInfo may be null sometimes
OnPlayerDisconnected Player none void OnPlayerDisconnected(BasePlayer player, string reason) Called after the player has disconnected from the server
OnPlayerDropActiveItem Player none void OnPlayerDropActiveItem(BasePlayer player, Item item) Called when the player drops their active held item
OnPlayerHealthChange Player nonnull object OnPlayerHealthChange(BasePlayer player, float oldValue, float newValue) Called just before the player's health changes
OnPlayerInput Player none void OnPlayerInput(BasePlayer player, InputState input) Called when input is received from a connected client
OnPlayerKeepAlive Player nonnull object OnPlayerKeepAlive(BasePlayer player, BasePlayer target) Called before a player is kept alive (Example: You started "helping" player, it keeps him alive for at least 10 seconds more to be sure he won't die until you finish picking him up)
OnPlayerKicked Player none void OnPlayerKicked(BasePlayer player, string reason) Called after the player is kicked from the server
OnPlayerLand Player nonnull object OnPlayerLand(BasePlayer player, float num) Called just before the player lands on the ground
OnPlayerLanded Player none void OnPlayerLanded(BasePlayer player, float num) Called when the player landed on the ground
OnPlayerLootEnd Player none void OnPlayerLootEnd(PlayerLoot inventory) Called when the player stops looting
OnPlayerMetabolize Player none void OnPlayerMetabolize(PlayerMetabolism metabolism, BaseCombatEntity entity, float delta) Called after the player's metabolism has been changed
OnPlayerRecover Player nonnull object OnPlayerRecover(BasePlayer player) Called when the player is about to recover from the 'wounded' state
OnPlayerRecovered Player none void OnPlayerRecovered(BasePlayer player) Called when the player was recovered
OnPlayerReported Player none void OnPlayerReported(BasePlayer reporter, string targetName, string targetId, string subject, string message, string type) Called when a player has reported someone via F7
OnPlayerRespawn Player data object OnPlayerRespawn(BasePlayer player, BasePlayer.SpawnPoint spawnPoint) ;; object OnPlayerRespawn(BasePlayer player, SleepingBag sleepingBag) Called when a player is attempting to respawn
OnPlayerRespawned Player none void OnPlayerRespawned(BasePlayer player) Called when the player has respawned (specifically when they click the "Respawn" button); ONLY called after the player has transitioned from dead to not-dead, so not when they're waking up; This means it's possible for the player to connect and disconnect from a server without OnPlayerRespawned ever triggering for them
OnPlayerRevive Player nonnull object OnPlayerRevive(BasePlayer reviver, BasePlayer player) Called before the recover after reviving with a medical tool; Useful for canceling the reviving
OnPlayerSetInfo Player none void OnPlayerSetInfo(Connection connection, string key, string value) Called when setting player's information *(aka console variables)*
OnPlayerSleep Player nonnull object OnPlayerSleep(BasePlayer player) Called when the player is about to go to sleep
OnPlayerSleepEnded Player none void OnPlayerSleepEnded(BasePlayer player) Called when the player awakes
OnPlayerSpawn Player data object OnPlayerSpawn(BasePlayer player) Called when a player is attempting to spawn for the first time
OnPlayerSpectate Player nonnull object OnPlayerSpectate(BasePlayer player, string spectateFilter) Called when the player starts spectating
OnPlayerSpectateEnd Player nonnull object OnPlayerSpectateEnd(BasePlayer player, string spectateFilter) Called when the player stops spectating
OnPlayerTick Player nonnull object OnPlayerTick(BasePlayer player, PlayerTick msg, bool wasPlayerStalled)
OnPlayerViolation Player nonnull object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount) Called when the player triggers an anti-hack violation
OnPlayerVoice Player nonnull object OnPlayerVoice(BasePlayer player, Byte[] data) Called when the player uses the in-game voice chat
OnPlayerWound Player nonnull object OnPlayerWound(BasePlayer player, HitInfo info) Called when the player is about to go down to the 'wounded' state; source might be null, check it before use
OnPluginLoaded Server 1 none void OnPluginLoaded(Plugin plugin) Called when any plugin has been loaded; Not to be confused with [`Loaded`](#loaded)
OnPluginUnloaded Server 1 none void OnPluginUnloaded(Plugin plugin) Called when any plugin has been unloaded; Not to be confused with [`Unload`](#unload)
OnProjectileRicochet Weapon nonnull object OnProjectileRicochet(BasePlayer player, PlayerProjectileRicochet ricochet) Called when a player's weapon projectile ricochets
OnQuarryEnabled Resource none void OnQuarryEnabled(MiningQuarry quarry) Called when a mining quarry is turned on/enabled
OnQuarryGather Resource none void OnQuarryGather(MiningQuarry quarry, Item item) Called before items are gathered from a quarry
OnQuarryToggled Resource none void OnQuarryToggled(MiningQuarry quarry, BasePlayer player) Called when a quarry has just been toggled
OnRconCommand Server none void OnRconCommand(IPAddress ip, string command, string[] args) Called when an RCON command is run
OnRconConnection Server nonnull object OnRconConnection(IPAddress ip) Called when a new RCON connection is opened
OnReactiveTargetReset Entity none void OnReactiveTargetReset(ReactiveTarget target) Called after the reactive target is reset
OnRecyclerToggle Entity nonnull object OnRecyclerToggle(Recycler recycler, BasePlayer player) Called when a recycler is turned on or off
OnRefreshVendingStock Vending none void OnRefreshVendingStock(VendingMachine machine, Item item) Called when the stock on a vending machine is updated
OnRemoveDying Resource nonnull object OnRemoveDying(GrowableEntity plant, BasePlayer player) Called when a player is trying to harvest a dying growable entity
OnResearchCostDetermine Item data object OnResearchCostDetermine(Item item, ResearchTable researchTable) ;; object OnResearchCostDetermine(ItemDefinition itemDefinition) Called when an item is being scrapped at a research table or when a blueprint is being unlocked in a tech tree
OnResourceDepositCreated Entity none void OnResourceDepositCreated(ResourceDepositManager.ResourceDeposit deposit) Called when a resource deposit has been created
OnRespawnInformationGiven Player none void OnRespawnInformationGiven(BasePlayer player, RespawnInformation respawnInformation) Called when a player is about to be sent respawn information
OnRfBroadcasterAdd Entity nonnull object OnRfBroadcasterAdd(IRFObject obj, int frequency) Called right before an object starts broadcasting an RF frequency
OnRfBroadcasterAdded Entity none void OnRfBroadcasterAdded(IRFObject obj, int frequency) Called right after an object has started broadcasting an RF frequency
OnRfBroadcasterRemove Entity nonnull object OnRfBroadcasterRemove(IRFObject obj, int frequency) Called right before an object stops broadasting an RF frequency
OnRfBroadcasterRemoved Entity none void OnRfBroadcasterRemoved(IRFObject obj, int frequency) Called right after an object has stopped broadcasting an RF frequency
OnRfFrequencyChange Entity nonnull object OnRfFrequencyChange(IRFObject obj, int frequency, BasePlayer player) Called when a player tries to change the frequency of an RF broadcaster or receiver; Useful for preventing particular reserved frequencies from being selected
OnRfFrequencyChanged Entity none void OnRfFrequencyChanged(IRFObject obj, int frequency, BasePlayer player) Called after a player has changed the frequency of an RF broadcaster or receiver
OnRfListenerAdd Entity nonnull object OnRfListenerAdd(IRFObject obj, int frequency) Called right before an object starts listening to an RF frequency
OnRfListenerAdded Entity none void OnRfListenerAdded(IRFObject obj, int frequency) Called right after an object has started listening to an RF frequency
OnRfListenerRemove Entity nonnull object OnRfListenerRemove(IRFObject obj, int frequency) Called right before an object stops listening to an RF frequency
OnRfListenerRemoved Entity none void OnRfListenerRemoved(IRFObject obj, int frequency) Called right after an object has stopped listening to an RF frequency
OnRidableAnimalClaim Entity nonnull object OnRidableAnimalClaim(BaseRidableAnimal animal, BasePlayer player) Called when a player tries to claim a horse
OnRidableAnimalClaimed Entity none void OnRidableAnimalClaimed(BaseRidableAnimal animal, BasePlayer player) Called after a player has claimed a horse
OnRocketLaunched Weapon none void OnRocketLaunched(BasePlayer player, BaseEntity entity) Called when the player launches a rocket
OnRotateVendingMachine Vending nonnull object OnRotateVendingMachine(VendingMachine machine, BasePlayer player) Called when a player attempts to rotate a vending machine
OnRunPlayerMetabolism Player nonnull object OnRunPlayerMetabolism(PlayerMetabolism metabolism, BasePlayer player, float delta) Called before a metabolism update occurs for the specified player; Metabolism update consists of managing the player's temperature, health etc.; You can use this to turn off or change certain aspects of the metabolism, either by editing values before returning, or taking complete control of the method
OnSamSiteTarget Entity nonnull object OnSamSiteTarget(SamSite samSite, BaseCombatEntity target) Called before last target visible time is updated
OnSaveLoad Server nonnull object OnSaveLoad(Dictionary<BaseEntity, ProtoBuf.Entity> entities) Called when a save file is loaded
OnSendCommand Player nonnull object OnSendCommand(List<Connection> connections, string command, object[] args) ;; object OnSendCommand(Connection connection, string command, object[] args) Called before a command is sent from the server to a player (or a group of players); Usually commands aren't sent to a group of players, so in most cases it's safe to use only OnSendCommand with a single Connection.
OnServerCommand Server nonnull object OnServerCommand(ConsoleSystem.Arg arg) Useful for intercepting commands before they get to their intended target
OnServerInformationUpdated Server none void OnServerInformationUpdated() Called after all steam information for the server has has been updated
OnServerInitialized Server 1 none void OnServerInitialized(bool initial) Called after the server startup has been completed and is awaiting connections; Also called for plugins that are hotloaded while the server is already started running; Boolean parameter, false if called on plugin hotload and true if called on server initialization
OnServerMessage Server data object OnServerMessage(string message, string playerName, string color, ulong playerId) ;; void OnServerMessage(string message, string playerName, string color, ulong playerId) Called before a SERVER message is sent to a player
OnServerRestartInterrupt Server nonnull object OnServerRestartInterrupt() Called when a server restart is being cancelled
OnServerSave Server 1 none void OnServerSave() Called before the server saves
OnServerShutdown Server none void OnServerShutdown() Useful for saving something / etc on server shutdown
OnShopAcceptClick Entity nonnull object OnShopAcceptClick(ShopFront entity, BasePlayer player) Called when a player is trying to accept a trade in ShopFront
OnShopCancelClick Entity nonnull object OnShopCancelClick(ShopFront entity, BasePlayer player) Called when a player is cancelling a trade
OnShopCompleteTrade Entity nonnull object OnShopCompleteTrade(ShopFront entity) Called before the trade is completed in ShopFront
OnShopCompleteTrade Entity nonnull object OnShopCompleteTrade(ShopFront shop, BasePlayer customer) Called when a shopfront trade is complete
OnSignLocked Sign none void OnSignLocked(Signage sign, BasePlayer player) ;; void OnSignLocked(PhotoFrame photoFrame, BasePlayer player) Called after the player has locked a sign or photo frame
OnSignUpdated Sign none void OnSignUpdated(Signage sign, BasePlayer player, int textureIndex) ;; void OnSignUpdated(PhotoFrame photoFrame, BasePlayer player) ;; void OnSignUpdated(CarvablePumpkin pumpkin, BasePlayer player) Called after the player has changed the text on a sign or updated a photo frame
OnSleepingBagDestroy Entity nonnull object OnSleepingBagDestroy(SleepingBag sleepingBag, BasePlayer player) Called when a player tries to remove a sleeping bag from their respawn screen
OnSleepingBagDestroyed Entity none void OnSleepingBagDestroyed(SleepingBag sleepingBag, BasePlayer player) Called after a player removes a sleeping bag from their respawn screen
OnSleepingBagValidCheck Entity bool bool? OnSleepingBagValidCheck(SleepingBag bag, ulong targetPlayerID, bool ignoreTimers) Called when determining if a sleeping bag is a valid respawn location for a player; Useful in conjunction with OnRespawnInformationGiven since a custom sleeping bag will need to pass this check
OnSolarPanelSunUpdate Entity nonnull object OnSolarPanelSunUpdate(SolarPanel panel, int currentEnergy) Called when a solar panel updates the amount of energy it is getting from the sun
OnSpinWheel Sign none void OnSpinWheel(BasePlayer player, SpinnerWheel wheel) Called when the player spins a spinner wheel
OnStashExposed Player none void OnStashExposed(StashContainer stash, BasePlayer player) Called when a player reveals a hidden stash
OnStashHidden Player none void OnStashHidden(StashContainer stash, BasePlayer player) Called when a player hides a stash
OnStructureDemolish Structure nonnull object OnStructureDemolish(BaseCombatEntity entity, BasePlayer player, bool immediate) Called when the player selects Demolish or DemolishImmediate from the BuildingBlock or BaseCombatEntity menu
OnStructureRepair Structure nonnull object OnStructureRepair(BaseCombatEntity entity, BasePlayer player) Called when the player repairs a BuildingBlock or BaseCombatEntity
OnStructureRotate Structure nonnull object OnStructureRotate(BaseCombatEntity entity, BasePlayer player) Called when the player rotates a BuildingBlock or BaseCombatEntity
OnStructureUpgrade Structure nonnull object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) Called when the player upgrades the grade of a BuildingBlock or BaseCombatEntity
OnSupplyDropDropped Entity none void OnSupplyDropDropped(SupplyDrop supplyDrop, CargoPlane cargoPlane) Called right after a cargo plane has dropped a supply drop
OnSupplyDropLanded Entity none void OnSupplyDropLanded(SupplyDrop entity) Called after Supply Drop has landed
OnSurveyGather Resource none void OnSurveyGather(SurveyCharge survey, Item item) Called before items are gathered from a survey charge
OnSwitchToggle Entity nonnull object OnSwitchToggle(IOEntity entity, BasePlayer player) Called when a player tries to switch and ElectricSwitch or FuelGenerator
OnSwitchToggled Entity none void OnSwitchToggled(IOEntity entity, BasePlayer player) Called right after a player switches an ElectricSwitch or FuelGenerator
OnTakeCurrencyItem Vending nonnull object OnTakeCurrencyItem(VendingMachine vending, Item item) Called before currency item is taken
OnTeamAcceptInvite Team nonnull object OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player) Useful for canceling team invitation acceptation
OnTeamCreate Team nonnull object OnTeamCreate(BasePlayer player) Useful for canceling team creation
OnTeamCreated Team none void OnTeamCreated(BasePlayer player, RelationshipManager.PlayerTeam team) Called after a team was created
OnTeamDisband Team nonnull object OnTeamDisband(RelationshipManager.PlayerTeam team) Useful for canceling team disbandment
OnTeamDisbanded Team none void OnTeamDisbanded(RelationshipManager.PlayerTeam team) Called when the team was disbanded
OnTeamInvite Team nonnull object OnTeamInvite(BasePlayer inviter, BasePlayer target) Useful for canceling an invitation
OnTeamKick Team nonnull object OnTeamKick(RelationshipManager.PlayerTeam team, BasePlayer player, ulong target) Useful for canceling kick of the player from the team
OnTeamLeave Team nonnull object OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player) Useful for canceling the leave from the team
OnTeamPromote Team nonnull object OnTeamPromote(RelationshipManager.PlayerTeam team, BasePlayer newLeader) Useful for canceling player's promotion in the team
OnTeamRejectInvite Team nonnull object OnTeamRejectInvite(BasePlayer rejector, RelationshipManager.PlayerTeam team) Useful for canceling the invitation rejection
OnTeamUpdate Team nonnull object OnTeamUpdate(ulong currentTeam, ulong newTeam, BasePlayer player) Called when player's team is updated
OnTeamUpdated Team nonnull object OnTeamUpdated(ulong currentTeam, PlayerTeam playerTeam, BasePlayer player) Called before sending team info to player
OnTechTreeNodeUnlock TechTree nonnull object OnTechTreeNodeUnlock(Workbench workbench, TechTreeData.NodeInstance node, BasePlayer player) Called when a player is attempting to unlock a blueprint in a tech tree, after the `CanUnlockTechTreeNode` and `CanUnlockTechTreeNodePath` hooks, before the player is charged scrap; Useful for replacing the default behavior to charge the player a different currency, or to unlock multiple blueprints at once (such as those leading up to the one selected)
OnTechTreeNodeUnlocked TechTree none void OnTechTreeNodeUnlocked(Workbench workbench, TechTreeData.NodeInstance node, BasePlayer player) Called after a player has unlocked a blueprint in a tech tree; Useful for automatically unlocking blueprints for team members
OnTerrainInitialized Terrain none void OnTerrainInitialized() Called after the terrain generation process has completed
OnThreatLevelUpdate Player nonnull object OnThreatLevelUpdate(BasePlayer player) Called when a player's threat level is about to be updated
OnTick Server none void OnTick() Called every tick (defined by the tick rate of the server); For better performance, avoid using heavy calculations in this hook.
OnToggleVendingBroadcast Vending none void OnToggleVendingBroadcast(VendingMachine machine, BasePlayer player) Called when a player toggles the broadcasting of the vending machine
OnTrapArm Item nonnull object OnTrapArm(BearTrap trap, BasePlayer player) Called when the player arms a bear trap
OnTrapDisarm Item nonnull object OnTrapDisarm(Landmine trap, BasePlayer player) Called when the player disarms a land mine
OnTrapSnapped Item none void OnTrapSnapped(BaseTrapTrigger trap, GameObject go) Called when a trap is triggered by a game object
OnTrapTrigger Item nonnull object OnTrapTrigger(BaseTrap trap, GameObject go) Called when a trap is triggered by a game object
OnTreeMarkerHit Resource bool bool? OnTreeMarkerHit(TreeEntity tree, HitInfo info) Called when a player hits a tree with a tool (rock, hatchet, etc.)
OnTurretAssign Entity nonnull object OnTurretAssign(AutoTurret turret, ulong targetId, BasePlayer initiator) Called when a player attempts to authorize another player on a turret
OnTurretAssigned Entity none void OnTurretAssigned(AutoTurret turret, ulong targetId, BasePlayer initiator) Called when a player has been authorized on a turret by another player
OnTurretAuthorize Entity nonnull object OnTurretAuthorize(AutoTurret turret, BasePlayer player) Called when a player attempts to authorize on a turret
OnTurretClearList Entity nonnull object OnTurretClearList(AutoTurret turret, BasePlayer player) Called when a player attempts to clear an autoturret's authorized list
OnTurretDeauthorize Entity nonnull object OnTurretDeauthorize(AutoTurret turret, BasePlayer player) Called when a player is deauthorized on an autoturret
OnTurretModeToggle Entity none void OnTurretModeToggle(AutoTurret turret) Called when the mode of an autoturrent is toggled
OnTurretRotate Entity nonnull object OnTurretRotate(AutoTurret turret, BasePlayer player) Called when a player tries to rotate an auto turret
OnTurretShutdown Entity nonnull object OnTurretShutdown(AutoTurret turret) Called when an autoturret is shut down
OnTurretStartup Entity nonnull object OnTurretStartup(AutoTurret turret) Called when an autoturret starts up
OnTurretTarget Entity nonnull object OnTurretTarget(AutoTurret turret, BaseCombatEntity entity) Called when an autoturret attempts to target an entity
OnTurretToggle Entity nonnull object OnTurretToggle(AutoTurret turret) Called when an autoturret toggles powerstate (on/off)
OnUserApprove Player nonnull object OnUserApprove(Network.Connection connection) Used by RustCore and abstracted into CanClientLogin
OnUserApproved Player 1 none void OnUserApproved(string name, string id, string ipAddress) Called after a player is approved to connect to the server
OnUserBanned Player 1 none void OnUserBanned(string name, string id, string ipAddress, string reason) Called when a player has been banned from the server; Will have reason available if provided
OnUserChat Player 1 data object OnUserChat(IPlayer player, string message) Called when a player sends a chat message to the server
OnUserCommand Player 1 nonnull object OnUserCommand(IPlayer player, string command, string[] args) Useful for intercepting players' commands before their handling
OnUserConnected Player 1 none void OnUserConnected(IPlayer player) Called after a player has been approved and has connected to the server
OnUserDisconnected Player 1 none void OnUserDisconnected(IPlayer player) Called after a player has disconnected from the server
OnUserGroupAdded Player 1 none void OnUserGroupAdded(string id, string groupName) Called when a player has been added to a group
OnUserGroupRemoved Player 1 none void OnUserGroupRemoved(string id, string groupName) Called when a player has been removed from a group
OnUserKicked Player 1 none void OnUserKicked(IPlayer player, string reason) Called when a player has been kicked from the server
OnUserNameUpdated Player 1 none void OnUserNameUpdated(string id, string oldName, string newName) Called when a player's stored nickname has been changed
OnUserPermissionGranted Player 1 none void OnUserPermissionGranted(string id, string permName) Called when a permission has been granted to a player
OnUserPermissionRevoked Player 1 none void OnUserPermissionRevoked(string id, string permName) Called when a permission has been revoked from a player
OnUserRespawn Player 1 none void OnUserRespawn(IPlayer player) Called when a player is respawning
OnUserRespawned Player 1 none void OnUserRespawned(IPlayer player) Called after a player has respawned
OnUserUnbanned Player 1 none void OnUserUnbanned(string name, string id, string ipAddress) Called when a player has been unbanned from the server
OnVehicleModuleDeselected Vehicle none void OnVehicleModuleDeselected(ModularCarGarage carLift, BasePlayer player) Called right after a player deselects a vehicle module item in a car's inventory
OnVehicleModuleMove Vehicle nonnull object OnVehicleModuleMove(BaseVehicleModule module, BaseModularVehicle vehicle, BasePlayer player) Called when a player tries to move a vehicle module item that is currently on a vehicle
OnVehicleModulesAssign Vehicle nonnull object OnVehicleModulesAssign(ModularCar car, ItemModVehicleModule[] modulePreset) Called right after a modular car has spawned, but before module items are added to its inventory from a preset
OnVehicleModulesAssigned Vehicle none void OnVehicleModulesAssigned(ModularCar car, ItemModVehicleModule[] modulePreset) Called right after a car has spawned and its module inventory has been filled with module items from a preset
OnVehicleModuleSelect Vehicle nonnull object OnVehicleModuleSelect(Item moduleItem, ModularCarGarage carLift, BasePlayer player) Called right after a player has selected a vehicle module item in a car inventory, but before they are shown the corresponding storage container
OnVehicleModuleSelected Vehicle none void OnVehicleModuleSelected(Item moduleItem, ModularCarGarage carLift, BasePlayer player) Called right after a player has selected a vehicle module item in a car's inventory, and after they have been shown the corresponding storage container if applicable
OnVehiclePush Vehicle nonnull object OnVehiclePush(BaseVehicle vehicle, BasePlayer player) Called when a player tries to push a vehicle
OnVendingShopOpened Vending none void OnVendingShopOpened(VendingMachine machine, BasePlayer player) Called when a player opens the customer ui for a vending machine
OnVendingShopRename Vending nonnull object OnVendingShopRename(VendingMachine vending, string newName, BasePlayer player) Called when a player tries to rename vending shop
OnVendingTransaction Vending bool bool OnVendingTransaction(VendingMachine machine, BasePlayer buyer, int sellOrderId, int numberOfTransactions) Called when a player attempts to buy an item from a vending machine
OnWaterCollect Entity nonnull object OnWaterCollect(WaterCatcher waterCatcher) Called when a water catcher is about to collect water
OnWaterPurified Entity none void OnWaterPurified(WaterPurifier waterPurifier, float timeCooked) Called after salt water has been converted to fresh water in a water purifier
OnWaterPurify Entity nonnull object OnWaterPurify(WaterPurifier waterPurifier, float timeCooked) Called when salt water is about to be converted to fresh water in a water purifier
OnWeaponFired Weapon none void OnWeaponFired(BaseProjectile projectile, BasePlayer player, ItemModProjectile mod, ProtoBuf.ProjectileShoot projectiles) Called when the player fires a weapon
OnWeaponReload Weapon nonnull object OnWeaponReload(BaseProjectile weapon, BasePlayer player) Called when the player reloads a weapon
OnWireClear Entity nonnull object OnWireClear(BasePlayer player, IOEntity entity1, int connected, IOEntity entity2, bool flag) Useful for preventing clearing wires
OnWireConnect Entity nonnull object OnWireConnect(BasePlayer player, IOEntity entity1, int inputs, IOEntity entity2, int outputs) Useful for preventing a wire to connect
OnWorldPrefabSpawned World none void OnWorldPrefabSpawned(GameObject gameObject, string category) Called when a world prefab was spawned
OnWorldProjectileCreate Weapon nonnull object OnWorldProjectileCreate(HitInfo hitInfo, Item item) Called when a projectile is created
Unload Plugin 1 none void Unload() Called when a plugin is being unloaded
Can't render this file because it contains an unexpected character in line 255 and column 129.

View File

@@ -0,0 +1,679 @@
shortname item_id display_name
abovegroundpool 1840570710 Above Ground Pool
ammo.grenadelauncher.buckshot 1055319033 40mm Shotgun Round
ammo.grenadelauncher.he 349762871 40mm HE Grenade
ammo.grenadelauncher.smoke 915408809 40mm Smoke Grenade
ammo.handmade.shell 588596902 Handmade Shell
ammo.nailgun.nails -2097376851 Nailgun Nails
ammo.pistol 785728077 Pistol Bullet
ammo.pistol.fire 51984655 Incendiary Pistol Bullet
ammo.pistol.hv -1691396643 HV Pistol Ammo
ammo.rifle -1211166256 5.56 Rifle Ammo
ammo.rifle.explosive -1321651331 Explosive 5.56 Rifle Ammo
ammo.rifle.hv 1712070256 HV 5.56 Rifle Ammo
ammo.rifle.incendiary 605467368 Incendiary 5.56 Rifle Ammo
ammo.rocket.basic -742865266 Rocket
ammo.rocket.fire 1638322904 Incendiary Rocket
ammo.rocket.hv -1841918730 High Velocity Rocket
ammo.rocket.sam -384243979 SAM Ammo
ammo.rocket.smoke -17123659 Smoke Rocket WIP!!!!
ammo.shotgun -1685290200 12 Gauge Buckshot
ammo.shotgun.fire -1036635990 12 Gauge Incendiary Shell
ammo.shotgun.slug -727717969 12 Gauge Slug
ammo.snowballgun 550753330
antiradpills -1432674913 Anti-Radiation Pills
apple 1548091822 Apple
apple.spoiled 352130972 Rotten Apple
arcade.machine.chippy 359723196 Chippy Arcade Game
arrow.bone 215754713 Bone Arrow
arrow.fire 14241751 Fire Arrow
arrow.hv -1023065463 High Velocity Arrow
arrow.wooden -1234735557 Wooden Arrow
attire.banditguard -1622110948 Bandit Guard Gear
attire.bunny.onesie -1266045928 Bunny Onesie
attire.bunnyears -1004426654 Bunny Ears
attire.hide.boots 794356786 Hide Boots
attire.hide.helterneck 3222790 Hide Halterneck
attire.hide.pants 1722154847 Hide Pants
attire.hide.poncho 980333378 Hide Poncho
attire.hide.skirt -1773144852 Hide Skirt
attire.hide.vest 196700171 Hide Vest
attire.nesthat 1081315464 Nest Hat
attire.reindeer.headband -324675402 Reindeer Antlers
autoturret -2139580305 Auto Turret
axe.salvaged -262590403 Salvaged Axe
bandage -2072273936 Bandage
barrelcostume -1215166612 A Barrel Costume
barricade.concrete -1950721390 Concrete Barricade
barricade.metal 1655650836 Metal Barricade
barricade.sandbags -559599960 Sandbag Barricade
barricade.stone 15388698 Stone Barricade
barricade.wood 866889860 Wooden Barricade
barricade.wood.cover 1373240771 Wooden Barricade Cover
barricade.woodwire 1382263453 Barbed Wooden Barricade
battery.small 609049394 Battery - Small
bbq 1099314009 Barbeque
beachchair -321431890 Beach Chair
beachparasol -1621539785 Beach Parasol
beachtable 657352755 Beach Table
beachtowel -8312704 Beach Towel
bearmeat -1520560807 Raw Bear Meat
bearmeat.burned -989755543 Burnt Bear Meat
bearmeat.cooked 1873897110 Cooked Bear Meat
bed -1273339005 Bed
black.berry 1771755747 Black Berry
black.raspberries 1931713481 Black Raspberries
bleach 1553078977 Bleach
blood 1776460938 Blood
blue.berry 1112162468 Blue Berry
blueberries -586342290 Blueberries
blueprintbase -996920608 Blueprint
bone.armor.suit 1746956556 Bone Armor
bone.club 1711033574 Bone Club
bone.fragments 1719978075 Bone Fragments
boogieboard -1478094705 Boogie Board
boots.frog -1000573653 Frog Boots
botabag 613961768 Bota Bag
bow.compound 884424049 Compound Bow
bow.hunting 1443579727 Hunting Bow
box.repair.bench 803222026 Repair Bench
box.wooden -180129657 Wood Storage Box
box.wooden.large 833533164 Large Wood Box
bucket.helmet 850280505 Bucket Helmet
bucket.water 1424075905 Water Bucket
building.planner 1525520776 Building Plan
burlap.gloves 1366282552 Leather Gloves
burlap.gloves.new 21402876 Burlap Gloves
burlap.headwrap 1877339384 Burlap Headwrap
burlap.shirt 602741290 Burlap Shirt
burlap.shoes -761829530 Burlap Shoes
burlap.trousers 1992974553 Burlap Trousers
cactusflesh 1783512007 Cactus Flesh
cakefiveyear 1973165031 Birthday Cake
campfire 1946219319 Camp Fire
can.beans -700591459 Can of Beans
can.beans.empty 1655979682 Empty Can Of Beans
can.tuna -1941646328 Can of Tuna
can.tuna.empty -1557377697 Empty Tuna Can
candycane 1121925526 Candy Cane
candycaneclub 1789825282 Candy Cane Club
car.key 946662961 Car Key
carburetor1 656371028 Low Quality Carburetor
carburetor2 656371027 Medium Quality Carburetor
carburetor3 656371026 High Quality Carburetor
cctv.camera 634478325 CCTV Camera
ceilinglight 1142993169 Ceiling Light
chainsaw 1104520648 Chainsaw
chair 1534542921 Chair
charcoal -1938052175 Charcoal
chicken.burned 1973684065 Burnt Chicken
chicken.cooked -1848736516 Cooked Chicken
chicken.raw -1440987069 Raw Chicken Breast
chicken.spoiled -751151717 Spoiled Chicken
chineselantern -1916473915 Chinese Lantern
chocholate 363467698 Chocolate Bar
clatter.helmet 968019378 Clatter Helmet
clone.black.berry 122783240 Black Berry Clone
clone.blue.berry 838831151 Blue Berry Clone
clone.corn -778875547 Corn Clone
clone.green.berry -1305326964 Green Berry Clone
clone.hemp -886280491 Hemp Clone
clone.potato 1512054436 Potato Clone
clone.pumpkin 1898094925 Pumpkin Plant Clone
clone.red.berry 2133269020 Red Berry Clone
clone.white.berry 1533551194 White Berry Clone
clone.yellow.berry 390728933 Yellow Berry Clone
cloth -858312878 Cloth
coal 204391461 Coal :(
coffeecan.helmet -803263829 Coffee Can Helmet
coffin.storage 573676040 Coffin
composter -1488398114 Composter
computerstation -1588628467 Computer Station
corn 1367190888 Corn
crankshaft1 1158340334 Low Quality Crankshaft
crankshaft2 1158340331 Medium Quality Crankshaft
crankshaft3 1158340332 High Quality Crankshaft
cratecostume 1189981699 Crate Costume
crossbow 1965232394 Crossbow
crude.oil -321733511 Crude Oil
cupboard.tool -97956382 Tool Cupboard
cursedcauldron 1242522330 Cursed Cauldron
deer.skull.mask -1903165497 Bone Helmet
deermeat.burned -78533081 Burnt Deer Meat
deermeat.cooked -1509851560 Cooked Deer Meat
deermeat.raw 1422530437 Raw Deer Meat
diesel_barrel 1568388703 Diesel Fuel
diving.fins 296519935 Diving Fins
diving.mask -113413047 Diving Mask
diving.tank -2022172587 Diving Tank
diving.wetsuit -1101924344 Wetsuit
door.closer 1409529282 Door Closer
door.double.hinged.metal 1390353317 Sheet Metal Double Door
door.double.hinged.toptier 1221063409 Armored Double Door
door.double.hinged.wood -1336109173 Wood Double Door
door.hinged.industrial.a 818733919 Industrial Door
door.hinged.metal -2067472972 Sheet Metal Door
door.hinged.toptier 1353298668 Armored Door
door.hinged.wood 1729120840 Wooden Door
door.key -1112793865 Door Key
dragondoorknocker -854270928 Dragon Door Knocker
dropbox -1519126340 Drop Box
drumkit -1330640246 Junkyard Drum Kit
ducttape 1401987718 Duct Tape
easter.bronzeegg 844440409 Bronze Egg
easter.goldegg -1002156085 Gold Egg
easter.paintedeggs -126305173 Painted Egg
easter.silveregg 1757265204 Silver Egg
easterbasket 1856217390 Egg Basket
easterdoorwreath -979302481 Easter Door Wreath
electric.andswitch 1171735914 AND Switch
electric.audioalarm 2100007442 Audio Alarm
electric.battery.rechargable.large 553270375 Large Rechargable Battery
electric.battery.rechargable.medium 2023888403 Medium Rechargable Battery
electric.battery.rechargable.small -692338819 Small Rechargable Battery
electric.blocker -690968985 Blocker
electric.button -1778897469 Button
electric.cabletunnel 1835946060 Cable Tunnel
electric.counter -216999575 Counter
electric.doorcontroller -502177121 Door Controller
electric.flasherlight -939424778 Flasher Light
electric.fuelgenerator.small 1849887541 Small Generator
electric.generator.small -295829489 Test Generator
electric.hbhfsensor -1507239837 HBHF Sensor
electric.heater -784870360 Electric Heater
electric.igniter -44876289 Igniter
electric.laserdetector -798293154 Laser Detector
electric.orswitch -1286302544 OR Switch
electric.pressurepad -2049214035 Pressure Pad
electric.random.switch 492357192 RAND Switch
electric.rf.broadcaster -1044468317 RF Broadcaster
electric.rf.receiver 888415708 RF Receiver
electric.simplelight -282113991 Simple Light
electric.sirenlight 762289806 Siren Light
electric.solarpanel.large 2090395347 Large Solar Panel
electric.splitter -563624462 Splitter
electric.sprinkler -781014061 Sprinkler
electric.switch 1951603367 Switch
electric.teslacoil 1371909803 Tesla Coil
electric.timer 665332906 Timer
electric.xorswitch 1293102274 XOR Switch
electrical.branch -1448252298 Electrical Branch
electrical.combiner -458565393 Root Combiner
electrical.memorycell -746647361 Memory Cell
elevator 1177596584 Elevator
explosive.satchel -1878475007 Satchel Charge
explosive.timed 1248356124 Timed Explosive Charge
explosives -592016202 Explosives
fat.animal -1018587433 Animal Fat
fertilizer -930193596 Fertilizer
fireplace.stone -1535621066 Stone Fireplace
firework.boomer.blue 1744298439 Blue Boomer
firework.boomer.champagne 1324203999 Champagne Boomer
firework.boomer.green -656349006 Green Boomer
firework.boomer.orange -7270019 Orange Boomer
firework.boomer.red -1553999294 Red Boomer
firework.boomer.violet -280223496 Violet Boomer
firework.romancandle.blue -515830359 Blue Roman Candle
firework.romancandle.green -1306288356 Green Roman Candle
firework.romancandle.red -1486461488 Red Roman Candle
firework.romancandle.violet -99886070 Violet Roman Candle
firework.volcano 261913429 White Volcano Firework
firework.volcano.red -454370658 Red Volcano Firework
firework.volcano.violet -1538109120 Violet Volcano Firework
fish.cooked 1668129151 Cooked Fish
fish.minnows -542577259 Minnows
fish.raw 989925924 Raw Fish
fish.troutsmall -1878764039 Small Trout
fishingrod.handmade 1569882109 Handmade Fishing Rod
fishtrap.small 559147458 Survival Fish Trap
flamethrower -1215753368 Flame Thrower
flameturret 528668503 Flame Turret
flare 304481038 Flare
flashlight.held -196667575 Flashlight
floor.grill 936496778 Floor grill
floor.ladder.hatch 1948067030 Ladder Hatch
floor.triangle.grill 1983621560 Floor triangle grill
floor.triangle.ladder.hatch 2041899972 Triangle Ladder Hatch
fluid.combiner -265292885 Fluid Combiner
fluid.splitter -1166712463 Fluid Splitter
fluid.switch 443432036 Fluid Switch & Pump
fogmachine -1973785141 Fogger-3000
fridge 1413014235 Fridge
fun.bass -2107018088 Shovel Bass
fun.cowbell -1049881973 Cowbell
fun.flute -2040817543 Pan Flute
fun.guitar -2124352573 Acoustic Guitar
fun.jerrycanguitar -979951147 Jerry Can Guitar
fun.tambourine -1379036069 Canbourine
fun.trumpet 273172220 Plumber's Trumpet
fun.tuba 1784406797 Sousaphone
furnace -1999722522 Furnace
furnace.large -1992717673 Large Furnace
fuse -629028935 Electric Fuse
gates.external.high.stone -691113464 High External Stone Gate
gates.external.high.wood -335089230 High External Wooden Gate
gears 479143914 Gears
geiger.counter 999690781 Geiger Counter
generator.wind.scrap -1819763926 Wind Turbine
ghostsheet -1043618880 Ghost Costume
giantcandycanedecor -695124222 Giant Candy Decor
giantlollipops 282103175 Giant Lollipop Decor
gloweyes -690276911 Glowing Eyes
glue -1899491405 Glue
granolabar -746030907 Granola Bar
gravestone 809199956 Gravestone
green.berry 858486327 Green Berry
grenade.beancan 1840822026 Beancan Grenade
grenade.f1 143803535 F1 Grenade
grenade.smoke 1263920163 Smoke Grenade
gun.water 722955039 Water Gun
gunpowder -265876753 Gun Powder
guntrap 352499047 Shotgun Trap
habrepair -1759188988 Hab Repair
halloween.candy -888153050 Halloween Candy
halloween.lootbag.large 479292118 Large Loot Bag
halloween.lootbag.medium 1899610628 Medium Loot Bag
halloween.lootbag.small 1319617282 Small Loot Bag
halloween.mummysuit 277730763 Mummy Suit
halloween.surgeonsuit -1785231475 Surgeon Scrubs
hammer 200773292 Hammer
hammer.salvaged -1506397857 Salvaged Hammer
hat.beenie 1675639563 Beenie Hat
hat.boonie -23994173 Boonie Hat
hat.candle 1714496074 Candle Hat
hat.cap -1022661119 Baseball Cap
hat.dragonmask -22883916 Dragon Mask
hat.miner -1539025626 Miners Hat
hat.ratmask 271048478 Rat Mask
hat.wolf -1478212975 Wolf Headdress
hatchet -1252059217 Hatchet
hazmatsuit 1266491000 Hazmat Suit
hazmatsuit.spacesuit -560304835 Space Suit
hazmatsuit_scientist -253079493 Scientist Suit
hazmatsuit_scientist_peacekeeper -1958316066 Scientist Suit
healingtea -929092070 Basic Healing Tea
healingtea.advanced -2123125470 Advanced Healing Tea
healingtea.pure -1677315902 Pure Healing Tea
heavy.plate.helmet 1181207482 Heavy Plate Helmet
heavy.plate.jacket -1102429027 Heavy Plate Jacket
heavy.plate.pants -1778159885 Heavy Plate Pants
hitchtroughcombo 1160881421 Hitch & Trough
hobobarrel -1442559428 Hobo Barrel
hoodie 1751045826 Hoodie
horse.armor.roadsign 60528587 Roadsign Horse Armor
horse.armor.wood 1659447559 Wooden Horse Armor
horse.saddle -1997543660 Horse Saddle
horse.saddlebag 1400460850 Saddle bag
horse.shoes.advanced 1989785143 High Quality Horse Shoes
horse.shoes.basic -1211268013 Basic Horse Shoes
horsedung -1579932985 Horse Dung
horsemeat.burned 1917703890 Burnt Horse Meat
horsemeat.cooked -1162759543 Cooked Horse Meat
horsemeat.raw -1130350864 Raw Horse Meat
hosetool 363163265 Hose Tool
hq.metal.ore -1982036270 High Quality Metal Ore
humanmeat.burned -682687162 Burnt Human Meat
humanmeat.cooked 1536610005 Cooked Human Meat
humanmeat.raw -1709878924 Raw Human Meat
humanmeat.spoiled 1272768630 Spoiled Human Meat
icepick.salvaged -1780802565 Salvaged Icepick
innertube -697981032 Inner Tube
innertube.horse 185586769 Inner Tube
innertube.unicorn 2052270186 Inner Tube
jacket -1163532624 Jacket
jacket.snow -48090175 Snow Jacket
jackhammer 1488979457 Jackhammer
jackolantern.angry 1242482355 Jack O Lantern Angry
jackolantern.happy -1824943010 Jack O Lantern Happy
jar.pickle 286193827 Pickles
kayak 190184021 Kayak
keycard_blue -484206264 Blue Keycard
keycard_green 37122747 Green Keycard
keycard_red -1880870149 Red Keycard
knife.bone 1814288539 Bone Knife
knife.butcher -194509282 Butcher Knife
knife.combat 2040726127 Combat Knife
ladder.wooden.wall -316250604 Wooden Ladder
lantern 1658229558 Lantern
largecandles -489848205 Large Candle Set
largemedkit 254522515 Large Medkit
leather 1381010055 Leather
lmg.m249 -2069578888 M249
lock.code 1159991980 Code Lock
lock.key -850982208 Key Lock
locker -110921842 Locker
longsword -1469578201 Longsword
lowgradefuel -946369541 Low Grade Fuel
lunar.firecrackers -1961560162 Firecracker String
mace -1966748496 Mace
machete -1137865085 Machete
mailbox -586784898 Mail Box
map 696029452 Paper Map
mask.balaclava -2012470695 Improvised Balaclava
mask.bandana -702051347 Bandana Mask
maxhealthtea -1184406448 Basic Max Health Tea
maxhealthtea.advanced 603811464 Advanced Max Health Tea
maxhealthtea.pure 1712261904 Pure Max Health Tea
meat.boar 621915341 Raw Pork
meat.pork.burned 1391703481 Burnt Pork
meat.pork.cooked -242084766 Cooked Pork
metal.facemask -194953424 Metal Facemask
metal.fragments 69511070 Metal Fragments
metal.ore -4031221 Metal Ore
metal.plate.torso 1110385766 Metal Chest Plate
metal.refined 317398316 High Quality Metal
metalblade 1882709339 Metal Blade
metalpipe 95950017 Metal Pipe
metalspring -1021495308 Metal Spring
minihelicopter.repair 1426574435 MC repair
mining.pumpjack -1130709577 Pump Jack
mining.quarry 1052926200 Mining Quarry
mixingtable 1259919256 Mixing Table
modularcarlift 1696050067 Modular Car Lift
movembermoustache -2047081330 Movember Moustache
movembermoustachecard 3380160 Card Movember Moustache
multiplegrenadelauncher -1123473824 Multiple Grenade Launcher
mushroom -1962971928 Mushroom
newyeargong -961457160 New Year Gong
nightvisiongoggles -1518883088 Night Vision Goggles
note 1414245162 Note
oretea 1480022580 Basic Ore Tea
oretea.advanced 2063916636 Advanced Ore Tea
oretea.pure 1729374708 Pure Ore Tea
paddle 1491189398 Paddle
paddlingpool -733625651 Paddling Pool
pants 237239288 Pants
pants.shorts -1695367501 Shorts
paper -1779183908 Paper
partyhat -575744869 Party Hat
photo 62577426 Photograph
photoframe.landscape 1697996440 Landscape Photo Frame
photoframe.large 1205084994 Large Photo Frame
photoframe.portrait 1729712564 Portrait Photo Frame
piano 1272430949 Wheelbarrow Piano
pickaxe -1302129395 Pickaxe
pistol.eoka -75944661 Eoka Pistol
pistol.m92 -852563019 M92 Pistol
pistol.nailgun 1953903201 Nailgun
pistol.python 1373971859 Python Revolver
pistol.revolver 649912614 Revolver
pistol.semiauto 818877484 Semi-Automatic Pistol
pistol.water -1815301988 Water Pistol
piston1 1883981798 Low Quality Pistons
piston2 1883981801 Medium Quality Pistons
piston3 1883981800 High Quality Pistons
pitchfork 1090916276 Pitchfork
planter.large 1581210395 Large Planter Box
planter.small 1903654061 Small Planter Box
plantfiber -804769727 Plant Fiber
pookie.bear -1651220691 Pookie Bear
potato -2086926071 Potato
powered.water.purifier -365097295 Powered Water Purifier
propanetank -1673693549 Empty Propane Tank
pumpkin -567909622 Pumpkin
pumpkinbasket 1346158228 Pumpkin Bucket
radiationremovetea -496584751 Rad. Removal Tea
radiationremovetea.advanced 2021351233 Advanced Rad. Removal Tea
radiationremovetea.pure 1905387657 Pure Rad. Removal Tea
radiationresisttea -487356515 Anti-Rad Tea
radiationresisttea.advanced -1729415579 Adv. Anti-Rad Tea
radiationresisttea.pure -33009419 Pure Anti-Rad Tea
red.berry 1272194103 Red Berry
research.table -1861522751 Research Table
researchpaper -544317637 Research Paper
rf.detonator 596469572 RF Transmitter
rf_pager -566907190 RF Pager
rifle.ak 1545779598 Assault Rifle
rifle.bolt 1588298435 Bolt Action Rifle
rifle.l96 -778367295 L96 Rifle
rifle.lr300 -1812555177 LR-300 Assault Rifle
rifle.m39 28201841 M39 Rifle
rifle.semiauto -904863145 Semi-Automatic Rifle
riflebody 176787552 Rifle Body
riot.helmet 671063303 Riot Helmet
roadsign.gloves -699558439 Roadsign Gloves
roadsign.jacket -2002277461 Road Sign Jacket
roadsign.kilt 1850456855 Road Sign Kilt
roadsigns 1199391518 Road Signs
rock 963906841 Rock
rocket.launcher 442886268 Rocket Launcher
rope 1414245522 Rope
rug -1985799200 Rug
rug.bear -1104881824 Rug Bear Skin
rustige_egg_a -173268129 Rustigé Egg - Red
rustige_egg_b -173268132 Rustigé Egg - Blue
rustige_egg_c -173268131 Rustigé Egg - Purple
rustige_egg_d -173268126 Rustigé Egg - Ivory
salvaged.cleaver -1978999529 Salvaged Cleaver
salvaged.sword 1326180354 Salvaged Sword
samsite -1009359066 SAM Site
santabeard 2126889441 Santa Beard
santahat -575483084 Santa Hat
scarecrow 177226991 Scarecrow
scarecrow.suit 273951840 Scarecrow Suit
scarecrowhead 809942731 Scarecrow Wrap
scientistsuit_heavy -1772746857 Heavy Scientist Suit
scrap -932201673 Scrap
scraptea 263834859 Basic Scrap Tea
scraptea.advanced 524678627 Advanced Scrap Tea
scraptea.pure 2024467711 Pure Scrap Tea
scraptransportheli.repair -1884328185 ScrapTransportHeliRepair
searchlight 2087678962 Search Light
secretlabchair 567871954 Secret Lab Chair
seed.black.berry 1911552868 Black Berry Seed
seed.blue.berry 803954639 Blue Berry Seed
seed.corn 998894949 Corn Seed
seed.green.berry -1776128552 Green Berry Seed
seed.hemp -237809779 Hemp Seed
seed.potato -2084071424 Potato Seed
seed.pumpkin -1511285251 Pumpkin Seed
seed.red.berry 830839496 Red Berry Seed
seed.white.berry -992286106 White Berry Seed
seed.yellow.berry -520133715 Yellow Berry Seed
semibody 573926264 Semi Automatic Body
sewingkit 1234880403 Sewing Kit
sheetmetal -1994909036 Sheet Metal
shelves 1950721418 Salvaged Shelves
shirt.collared -2025184684 Shirt
shirt.tanktop 1608640313 Tank Top
shoes.boots -1549739227 Boots
shotgun.double -765183617 Double Barrel Shotgun
shotgun.pump 795371088 Pump Shotgun
shotgun.spas12 -41440462 Spas-12 Shotgun
shotgun.waterpipe -1367281941 Waterpipe Shotgun
shutter.metal.embrasure.a -1199897169 Metal horizontal embrasure
shutter.metal.embrasure.b -1199897172 Metal Vertical embrasure
shutter.wood.a -1023374709 Wood Shutters
sickle -1368584029 Sickle
sign.hanging 1205607945 Two Sided Hanging Sign
sign.hanging.banner.large 23352662 Large Banner Hanging
sign.hanging.ornate -1647846966 Two Sided Ornate Hanging Sign
sign.neon.125x125 1305578813 Small Neon Sign
sign.neon.125x215 -1423304443 Medium Neon Sign
sign.neon.125x215.animated 42535890 Medium Animated Neon Sign
sign.neon.xl 866332017 Large Neon Sign
sign.neon.xl.animated 1643667218 Large Animated Neon Sign
sign.pictureframe.landscape -845557339 Landscape Picture Frame
sign.pictureframe.portrait -1370759135 Portrait Picture Frame
sign.pictureframe.tall 121049755 Tall Picture Frame
sign.pictureframe.xl -996185386 XL Picture Frame
sign.pictureframe.xxl 98508942 XXL Picture Frame
sign.pole.banner.large 2070189026 Large Banner on pole
sign.post.double 1521286012 Double Sign Post
sign.post.single 1542290441 Single Sign Post
sign.post.town -1832422579 One Sided Town Sign Post
sign.post.town.roof 826309791 Two Sided Town Sign Post
sign.wooden.huge -143132326 Huge Wooden Sign
sign.wooden.large 1153652756 Large Wooden Sign
sign.wooden.medium -1819233322 Medium Wooden Sign
sign.wooden.small -1138208076 Small Wooden Sign
skull.human 996293980 Human Skull
skull.trophy -769647921 Skull Trophy
skull.trophy.jar 971362526 Skull Trophy
skull.trophy.jar2 -924959988 Skull Trophy
skull.trophy.table -156748077 Skull Trophy
skull.wolf 2048317869 Wolf Skull
skull_fire_pit 553887414 Skull Fire Pit
skulldoorknocker -216116642 Skull Door Knocker
skullspikes -1073015016 Skull Spikes
skullspikes.candles -25740268 Skull Spikes
skullspikes.pumpkin -1078639462 Skull Spikes
sled -333406828 Sled
sled.xmas -135252633 Sled
sleepingbag -1754948969 Sleeping Bag
small.oil.refinery -1293296287 Small Oil Refinery
smallcandles -2058362263 Small Candle Set
smallwaterbottle -1039528932 Small Water Bottle
smart.alarm -695978112 Smart Alarm
smart.switch 988652725 Smart Switch
smg.2 1796682209 Custom SMG
smg.mp5 1318558775 MP5A4
smg.thompson -1758372725 Thompson
smgbody 1230323789 SMG Body
snowball -363689972 Snowball
snowballgun 1103488722 Snowball Gun
snowmachine 1358643074 Snow Machine
snowman 1629293099 Snowman
sofa -555122905 Sofa
sparkplug1 -89874794 Low Quality Spark Plugs
sparkplug2 -493159321 Medium Quality Spark Plugs
sparkplug3 1072924620 High Quality Spark Plugs
spear.stone 1602646136 Stone Spear
spear.wooden 1540934679 Wooden Spear
spiderweb 882559853 Spider Webs
spikes.floor -92759291 Wooden Floor Spikes
spinner.wheel -1100422738 Spinning wheel
spookyspeaker 1885488976 Spooky Speaker
stash.small -369760990 Small Stash
sticks 642482233 Sticks
stocking.large -465682601 SUPER Stocking
stocking.small 1668858301 Small Stocking
stone.pickaxe 171931394 Stone Pickaxe
stonehatchet -1583967946 Stone Hatchet
stones -2099697608 Stones
storage.monitor 1149964039 Storage Monitor
strobelight 2104517339 Strobe Light
sulfur -1581843485 Sulfur
sulfur.ore -1157596551 Sulfur Ore
sunglasses 352321488 Sunglasses
sunglasses02black 1258768145 Sunglasses
sunglasses02camo -2103694546 Sunglasses
sunglasses02red 1557173737 Sunglasses
sunglasses03black -176608084 Sunglasses
sunglasses03chrome -1997698639 Sunglasses
sunglasses03gold -1408336705 Sunglasses
supply.signal 1397052267 Supply Signal
surveycharge 1975934948 Survey Charge
syringe.medical 1079279582 Medical Syringe
table 593465182 Table
tactical.gloves -1108136649 Tactical Gloves
target.reactive -1736356576 Reactive Target
targeting.computer 1523195708 Targeting Computer
tarp 2019042823 Tarp
techparts 73681876 Tech Trash
telephone 1234878710 Telephone
tool.binoculars -1262185308 Binoculars
tool.camera -1316706473 Camera
tool.instant_camera -2001260025 Instant Camera
toolgun 1803831286 Garry's Mod Tool Gun
torch 795236088 Torch
trap.bear -582782051 Snap Trap
trap.landmine -1663759755 Land Mine
tshirt 223891266 T-Shirt
tshirt.long 935692442 Longsleeve T-Shirt
tunalight -1478445584 Tuna Can Lamp
twitch.headset -1569700847 Headset
twitchsunglasses 20489901 Purple Sunglasses
valve1 1330084809 Low Quality Valves
valve2 926800282 Medium Quality Valves
valve3 -1802083073 High Quality Valves
vehicle.1mod.cockpit -1501451746 Cockpit Vehicle Module
vehicle.1mod.cockpit.armored 1874610722 Armored Cockpit Vehicle Module
vehicle.1mod.cockpit.with.engine 170758448 Cockpit With Engine Vehicle Module
vehicle.1mod.engine 1559779253 Engine Vehicle Module
vehicle.1mod.flatbed -1880231361 Flatbed Vehicle Module
vehicle.1mod.passengers.armored -1615281216 Armored Passenger Vehicle Module
vehicle.1mod.rear.seats 1376065505 Rear Seats Vehicle Module
vehicle.1mod.storage 268565518 Storage Vehicle Module
vehicle.1mod.taxi -626174997 Taxi Vehicle Module
vehicle.2mod.flatbed -1693832478 Large Flatbed Vehicle Module
vehicle.2mod.fuel.tank 1186655046 Fuel Tank Vehicle Module
vehicle.2mod.passengers 895374329 Passenger Vehicle Module
vehicle.chassis 1770744540 Generic vehicle chassis
vehicle.chassis.2mod -44066600 Small Chassis
vehicle.chassis.3mod -44066823 Medium Chassis
vehicle.chassis.4mod -44066790 Large Chassis
vehicle.module 878301596 Generic vehicle module
vending.machine 198438816 Vending Machine
wall.external.high 99588025 High External Wooden Wall
wall.external.high.ice -985781766 High Ice Wall
wall.external.high.stone -967648160 High External Stone Wall
wall.frame.cell -1429456799 Prison Cell Wall
wall.frame.cell.gate -956706906 Prison Cell Gate
wall.frame.fence -1117626326 Chainlink Fence
wall.frame.fence.gate 1451568081 Chainlink Fence Gate
wall.frame.garagedoor -148794216 Garage Door
wall.frame.netting 1516985844 Netting
wall.frame.shopfront -796583652 Shop Front
wall.frame.shopfront.metal -148229307 Metal Shop Front
wall.graveyard.fence -1679267738 Graveyard Fence
wall.ice.wall 1327005675 Short Ice Wall
wall.window.bars.metal -819720157 Metal Window Bars
wall.window.bars.toptier 671706427 Reinforced Glass Window
wall.window.bars.wood -1183726687 Wooden Window Bars
wall.window.glass.reinforced -1614955425 Strengthened Glass Window
watchtower.wood -463122489 Watch Tower
water -1779180711 Water
water.barrel -1863559151 Water Barrel
water.catcher.large -1100168350 Large Water Catcher
water.catcher.small -132247350 Small Water Catcher
water.purifier 2114754781 Water Purifier
water.salt -277057363 Salt Water
waterjug -119235651 Water Jug
waterpump -1284169891 Water Pump
weapon.mod.8x.scope 174866732 16x Zoom Scope
weapon.mod.flashlight 952603248 Weapon flashlight
weapon.mod.holosight 442289265 Holosight
weapon.mod.lasersight -132516482 Weapon Lasersight
weapon.mod.muzzleboost -1405508498 Muzzle Boost
weapon.mod.muzzlebrake 1478091698 Muzzle Brake
weapon.mod.silencer -1850571427 Silencer
weapon.mod.simplesight -855748505 Simple Handmade Sight
weapon.mod.small.scope 567235583 8x Zoom Scope
white.berry 854447607 White Berry
wiretool -144417939 Wire Tool
wolfmeat.burned 1827479659 Burnt Wolf Meat
wolfmeat.cooked 813023040 Cooked Wolf Meat
wolfmeat.raw -395377963 Raw Wolf Meat
wolfmeat.spoiled -1167031859 Spoiled Wolf Meat
wood -151838493 Wood
wood.armor.helmet -2094954543 Wood Armor Helmet
wood.armor.jacket 418081930 Wood Chestplate
wood.armor.pants 832133926 Wood Armor Pants
woodcross 699075597 Wooden Cross
woodtea -649128577 Basic Wood Tea
woodtea.advanced -541206665 Advanced Wood Tea
woodtea.pure -557539629 Pure Wood Tea
workbench1 1524187186 Work Bench Level 1
workbench2 -41896755 Work Bench Level 2
workbench3 -1607980696 Work Bench Level 3
wrappedgift 204970153 Wrapped Gift
wrappingpaper 1094293920 Wrapping Paper
xmas.decoration.baubels -1667224349 Decorative Baubels
xmas.decoration.candycanes -209869746 Decorative Plastic Candy Canes
xmas.decoration.gingerbreadmen 1686524871 Decorative Gingerbread Men
xmas.decoration.lights 1723747470 Tree Lights
xmas.decoration.pinecone -129230242 Decorative Pinecones
xmas.decoration.star -1331212963 Star Tree Topper
xmas.decoration.tinsel 2106561762 Decorative Tinsel
xmas.door.garland 674734128 Festive Doorway Garland
xmas.lightstring 1058261682 Christmas Lights
xmas.lightstring.advanced -151387974 Deluxe Christmas Lights
xmas.present.large -1622660759 Large Present
xmas.present.medium 756517185 Medium Present
xmas.present.small -722241321 Small Present
xmas.tree 794443127 Christmas Tree
xmas.window.garland -1379835144 Festive Window Garland
xmasdoorwreath 2009734114 Christmas Door Wreath
xylophone -211235948 Xylobone
yellow.berry 1660145984 Yellow Berry
1 shortname item_id display_name
2 abovegroundpool 1840570710 Above Ground Pool
3 ammo.grenadelauncher.buckshot 1055319033 40mm Shotgun Round
4 ammo.grenadelauncher.he 349762871 40mm HE Grenade
5 ammo.grenadelauncher.smoke 915408809 40mm Smoke Grenade
6 ammo.handmade.shell 588596902 Handmade Shell
7 ammo.nailgun.nails -2097376851 Nailgun Nails
8 ammo.pistol 785728077 Pistol Bullet
9 ammo.pistol.fire 51984655 Incendiary Pistol Bullet
10 ammo.pistol.hv -1691396643 HV Pistol Ammo
11 ammo.rifle -1211166256 5.56 Rifle Ammo
12 ammo.rifle.explosive -1321651331 Explosive 5.56 Rifle Ammo
13 ammo.rifle.hv 1712070256 HV 5.56 Rifle Ammo
14 ammo.rifle.incendiary 605467368 Incendiary 5.56 Rifle Ammo
15 ammo.rocket.basic -742865266 Rocket
16 ammo.rocket.fire 1638322904 Incendiary Rocket
17 ammo.rocket.hv -1841918730 High Velocity Rocket
18 ammo.rocket.sam -384243979 SAM Ammo
19 ammo.rocket.smoke -17123659 Smoke Rocket WIP!!!!
20 ammo.shotgun -1685290200 12 Gauge Buckshot
21 ammo.shotgun.fire -1036635990 12 Gauge Incendiary Shell
22 ammo.shotgun.slug -727717969 12 Gauge Slug
23 ammo.snowballgun 550753330
24 antiradpills -1432674913 Anti-Radiation Pills
25 apple 1548091822 Apple
26 apple.spoiled 352130972 Rotten Apple
27 arcade.machine.chippy 359723196 Chippy Arcade Game
28 arrow.bone 215754713 Bone Arrow
29 arrow.fire 14241751 Fire Arrow
30 arrow.hv -1023065463 High Velocity Arrow
31 arrow.wooden -1234735557 Wooden Arrow
32 attire.banditguard -1622110948 Bandit Guard Gear
33 attire.bunny.onesie -1266045928 Bunny Onesie
34 attire.bunnyears -1004426654 Bunny Ears
35 attire.hide.boots 794356786 Hide Boots
36 attire.hide.helterneck 3222790 Hide Halterneck
37 attire.hide.pants 1722154847 Hide Pants
38 attire.hide.poncho 980333378 Hide Poncho
39 attire.hide.skirt -1773144852 Hide Skirt
40 attire.hide.vest 196700171 Hide Vest
41 attire.nesthat 1081315464 Nest Hat
42 attire.reindeer.headband -324675402 Reindeer Antlers
43 autoturret -2139580305 Auto Turret
44 axe.salvaged -262590403 Salvaged Axe
45 bandage -2072273936 Bandage
46 barrelcostume -1215166612 A Barrel Costume
47 barricade.concrete -1950721390 Concrete Barricade
48 barricade.metal 1655650836 Metal Barricade
49 barricade.sandbags -559599960 Sandbag Barricade
50 barricade.stone 15388698 Stone Barricade
51 barricade.wood 866889860 Wooden Barricade
52 barricade.wood.cover 1373240771 Wooden Barricade Cover
53 barricade.woodwire 1382263453 Barbed Wooden Barricade
54 battery.small 609049394 Battery - Small
55 bbq 1099314009 Barbeque
56 beachchair -321431890 Beach Chair
57 beachparasol -1621539785 Beach Parasol
58 beachtable 657352755 Beach Table
59 beachtowel -8312704 Beach Towel
60 bearmeat -1520560807 Raw Bear Meat
61 bearmeat.burned -989755543 Burnt Bear Meat
62 bearmeat.cooked 1873897110 Cooked Bear Meat
63 bed -1273339005 Bed
64 black.berry 1771755747 Black Berry
65 black.raspberries 1931713481 Black Raspberries
66 bleach 1553078977 Bleach
67 blood 1776460938 Blood
68 blue.berry 1112162468 Blue Berry
69 blueberries -586342290 Blueberries
70 blueprintbase -996920608 Blueprint
71 bone.armor.suit 1746956556 Bone Armor
72 bone.club 1711033574 Bone Club
73 bone.fragments 1719978075 Bone Fragments
74 boogieboard -1478094705 Boogie Board
75 boots.frog -1000573653 Frog Boots
76 botabag 613961768 Bota Bag
77 bow.compound 884424049 Compound Bow
78 bow.hunting 1443579727 Hunting Bow
79 box.repair.bench 803222026 Repair Bench
80 box.wooden -180129657 Wood Storage Box
81 box.wooden.large 833533164 Large Wood Box
82 bucket.helmet 850280505 Bucket Helmet
83 bucket.water 1424075905 Water Bucket
84 building.planner 1525520776 Building Plan
85 burlap.gloves 1366282552 Leather Gloves
86 burlap.gloves.new 21402876 Burlap Gloves
87 burlap.headwrap 1877339384 Burlap Headwrap
88 burlap.shirt 602741290 Burlap Shirt
89 burlap.shoes -761829530 Burlap Shoes
90 burlap.trousers 1992974553 Burlap Trousers
91 cactusflesh 1783512007 Cactus Flesh
92 cakefiveyear 1973165031 Birthday Cake
93 campfire 1946219319 Camp Fire
94 can.beans -700591459 Can of Beans
95 can.beans.empty 1655979682 Empty Can Of Beans
96 can.tuna -1941646328 Can of Tuna
97 can.tuna.empty -1557377697 Empty Tuna Can
98 candycane 1121925526 Candy Cane
99 candycaneclub 1789825282 Candy Cane Club
100 car.key 946662961 Car Key
101 carburetor1 656371028 Low Quality Carburetor
102 carburetor2 656371027 Medium Quality Carburetor
103 carburetor3 656371026 High Quality Carburetor
104 cctv.camera 634478325 CCTV Camera
105 ceilinglight 1142993169 Ceiling Light
106 chainsaw 1104520648 Chainsaw
107 chair 1534542921 Chair
108 charcoal -1938052175 Charcoal
109 chicken.burned 1973684065 Burnt Chicken
110 chicken.cooked -1848736516 Cooked Chicken
111 chicken.raw -1440987069 Raw Chicken Breast
112 chicken.spoiled -751151717 Spoiled Chicken
113 chineselantern -1916473915 Chinese Lantern
114 chocholate 363467698 Chocolate Bar
115 clatter.helmet 968019378 Clatter Helmet
116 clone.black.berry 122783240 Black Berry Clone
117 clone.blue.berry 838831151 Blue Berry Clone
118 clone.corn -778875547 Corn Clone
119 clone.green.berry -1305326964 Green Berry Clone
120 clone.hemp -886280491 Hemp Clone
121 clone.potato 1512054436 Potato Clone
122 clone.pumpkin 1898094925 Pumpkin Plant Clone
123 clone.red.berry 2133269020 Red Berry Clone
124 clone.white.berry 1533551194 White Berry Clone
125 clone.yellow.berry 390728933 Yellow Berry Clone
126 cloth -858312878 Cloth
127 coal 204391461 Coal :(
128 coffeecan.helmet -803263829 Coffee Can Helmet
129 coffin.storage 573676040 Coffin
130 composter -1488398114 Composter
131 computerstation -1588628467 Computer Station
132 corn 1367190888 Corn
133 crankshaft1 1158340334 Low Quality Crankshaft
134 crankshaft2 1158340331 Medium Quality Crankshaft
135 crankshaft3 1158340332 High Quality Crankshaft
136 cratecostume 1189981699 Crate Costume
137 crossbow 1965232394 Crossbow
138 crude.oil -321733511 Crude Oil
139 cupboard.tool -97956382 Tool Cupboard
140 cursedcauldron 1242522330 Cursed Cauldron
141 deer.skull.mask -1903165497 Bone Helmet
142 deermeat.burned -78533081 Burnt Deer Meat
143 deermeat.cooked -1509851560 Cooked Deer Meat
144 deermeat.raw 1422530437 Raw Deer Meat
145 diesel_barrel 1568388703 Diesel Fuel
146 diving.fins 296519935 Diving Fins
147 diving.mask -113413047 Diving Mask
148 diving.tank -2022172587 Diving Tank
149 diving.wetsuit -1101924344 Wetsuit
150 door.closer 1409529282 Door Closer
151 door.double.hinged.metal 1390353317 Sheet Metal Double Door
152 door.double.hinged.toptier 1221063409 Armored Double Door
153 door.double.hinged.wood -1336109173 Wood Double Door
154 door.hinged.industrial.a 818733919 Industrial Door
155 door.hinged.metal -2067472972 Sheet Metal Door
156 door.hinged.toptier 1353298668 Armored Door
157 door.hinged.wood 1729120840 Wooden Door
158 door.key -1112793865 Door Key
159 dragondoorknocker -854270928 Dragon Door Knocker
160 dropbox -1519126340 Drop Box
161 drumkit -1330640246 Junkyard Drum Kit
162 ducttape 1401987718 Duct Tape
163 easter.bronzeegg 844440409 Bronze Egg
164 easter.goldegg -1002156085 Gold Egg
165 easter.paintedeggs -126305173 Painted Egg
166 easter.silveregg 1757265204 Silver Egg
167 easterbasket 1856217390 Egg Basket
168 easterdoorwreath -979302481 Easter Door Wreath
169 electric.andswitch 1171735914 AND Switch
170 electric.audioalarm 2100007442 Audio Alarm
171 electric.battery.rechargable.large 553270375 Large Rechargable Battery
172 electric.battery.rechargable.medium 2023888403 Medium Rechargable Battery
173 electric.battery.rechargable.small -692338819 Small Rechargable Battery
174 electric.blocker -690968985 Blocker
175 electric.button -1778897469 Button
176 electric.cabletunnel 1835946060 Cable Tunnel
177 electric.counter -216999575 Counter
178 electric.doorcontroller -502177121 Door Controller
179 electric.flasherlight -939424778 Flasher Light
180 electric.fuelgenerator.small 1849887541 Small Generator
181 electric.generator.small -295829489 Test Generator
182 electric.hbhfsensor -1507239837 HBHF Sensor
183 electric.heater -784870360 Electric Heater
184 electric.igniter -44876289 Igniter
185 electric.laserdetector -798293154 Laser Detector
186 electric.orswitch -1286302544 OR Switch
187 electric.pressurepad -2049214035 Pressure Pad
188 electric.random.switch 492357192 RAND Switch
189 electric.rf.broadcaster -1044468317 RF Broadcaster
190 electric.rf.receiver 888415708 RF Receiver
191 electric.simplelight -282113991 Simple Light
192 electric.sirenlight 762289806 Siren Light
193 electric.solarpanel.large 2090395347 Large Solar Panel
194 electric.splitter -563624462 Splitter
195 electric.sprinkler -781014061 Sprinkler
196 electric.switch 1951603367 Switch
197 electric.teslacoil 1371909803 Tesla Coil
198 electric.timer 665332906 Timer
199 electric.xorswitch 1293102274 XOR Switch
200 electrical.branch -1448252298 Electrical Branch
201 electrical.combiner -458565393 Root Combiner
202 electrical.memorycell -746647361 Memory Cell
203 elevator 1177596584 Elevator
204 explosive.satchel -1878475007 Satchel Charge
205 explosive.timed 1248356124 Timed Explosive Charge
206 explosives -592016202 Explosives
207 fat.animal -1018587433 Animal Fat
208 fertilizer -930193596 Fertilizer
209 fireplace.stone -1535621066 Stone Fireplace
210 firework.boomer.blue 1744298439 Blue Boomer
211 firework.boomer.champagne 1324203999 Champagne Boomer
212 firework.boomer.green -656349006 Green Boomer
213 firework.boomer.orange -7270019 Orange Boomer
214 firework.boomer.red -1553999294 Red Boomer
215 firework.boomer.violet -280223496 Violet Boomer
216 firework.romancandle.blue -515830359 Blue Roman Candle
217 firework.romancandle.green -1306288356 Green Roman Candle
218 firework.romancandle.red -1486461488 Red Roman Candle
219 firework.romancandle.violet -99886070 Violet Roman Candle
220 firework.volcano 261913429 White Volcano Firework
221 firework.volcano.red -454370658 Red Volcano Firework
222 firework.volcano.violet -1538109120 Violet Volcano Firework
223 fish.cooked 1668129151 Cooked Fish
224 fish.minnows -542577259 Minnows
225 fish.raw 989925924 Raw Fish
226 fish.troutsmall -1878764039 Small Trout
227 fishingrod.handmade 1569882109 Handmade Fishing Rod
228 fishtrap.small 559147458 Survival Fish Trap
229 flamethrower -1215753368 Flame Thrower
230 flameturret 528668503 Flame Turret
231 flare 304481038 Flare
232 flashlight.held -196667575 Flashlight
233 floor.grill 936496778 Floor grill
234 floor.ladder.hatch 1948067030 Ladder Hatch
235 floor.triangle.grill 1983621560 Floor triangle grill
236 floor.triangle.ladder.hatch 2041899972 Triangle Ladder Hatch
237 fluid.combiner -265292885 Fluid Combiner
238 fluid.splitter -1166712463 Fluid Splitter
239 fluid.switch 443432036 Fluid Switch & Pump
240 fogmachine -1973785141 Fogger-3000
241 fridge 1413014235 Fridge
242 fun.bass -2107018088 Shovel Bass
243 fun.cowbell -1049881973 Cowbell
244 fun.flute -2040817543 Pan Flute
245 fun.guitar -2124352573 Acoustic Guitar
246 fun.jerrycanguitar -979951147 Jerry Can Guitar
247 fun.tambourine -1379036069 Canbourine
248 fun.trumpet 273172220 Plumber's Trumpet
249 fun.tuba 1784406797 Sousaphone
250 furnace -1999722522 Furnace
251 furnace.large -1992717673 Large Furnace
252 fuse -629028935 Electric Fuse
253 gates.external.high.stone -691113464 High External Stone Gate
254 gates.external.high.wood -335089230 High External Wooden Gate
255 gears 479143914 Gears
256 geiger.counter 999690781 Geiger Counter
257 generator.wind.scrap -1819763926 Wind Turbine
258 ghostsheet -1043618880 Ghost Costume
259 giantcandycanedecor -695124222 Giant Candy Decor
260 giantlollipops 282103175 Giant Lollipop Decor
261 gloweyes -690276911 Glowing Eyes
262 glue -1899491405 Glue
263 granolabar -746030907 Granola Bar
264 gravestone 809199956 Gravestone
265 green.berry 858486327 Green Berry
266 grenade.beancan 1840822026 Beancan Grenade
267 grenade.f1 143803535 F1 Grenade
268 grenade.smoke 1263920163 Smoke Grenade
269 gun.water 722955039 Water Gun
270 gunpowder -265876753 Gun Powder
271 guntrap 352499047 Shotgun Trap
272 habrepair -1759188988 Hab Repair
273 halloween.candy -888153050 Halloween Candy
274 halloween.lootbag.large 479292118 Large Loot Bag
275 halloween.lootbag.medium 1899610628 Medium Loot Bag
276 halloween.lootbag.small 1319617282 Small Loot Bag
277 halloween.mummysuit 277730763 Mummy Suit
278 halloween.surgeonsuit -1785231475 Surgeon Scrubs
279 hammer 200773292 Hammer
280 hammer.salvaged -1506397857 Salvaged Hammer
281 hat.beenie 1675639563 Beenie Hat
282 hat.boonie -23994173 Boonie Hat
283 hat.candle 1714496074 Candle Hat
284 hat.cap -1022661119 Baseball Cap
285 hat.dragonmask -22883916 Dragon Mask
286 hat.miner -1539025626 Miners Hat
287 hat.ratmask 271048478 Rat Mask
288 hat.wolf -1478212975 Wolf Headdress
289 hatchet -1252059217 Hatchet
290 hazmatsuit 1266491000 Hazmat Suit
291 hazmatsuit.spacesuit -560304835 Space Suit
292 hazmatsuit_scientist -253079493 Scientist Suit
293 hazmatsuit_scientist_peacekeeper -1958316066 Scientist Suit
294 healingtea -929092070 Basic Healing Tea
295 healingtea.advanced -2123125470 Advanced Healing Tea
296 healingtea.pure -1677315902 Pure Healing Tea
297 heavy.plate.helmet 1181207482 Heavy Plate Helmet
298 heavy.plate.jacket -1102429027 Heavy Plate Jacket
299 heavy.plate.pants -1778159885 Heavy Plate Pants
300 hitchtroughcombo 1160881421 Hitch & Trough
301 hobobarrel -1442559428 Hobo Barrel
302 hoodie 1751045826 Hoodie
303 horse.armor.roadsign 60528587 Roadsign Horse Armor
304 horse.armor.wood 1659447559 Wooden Horse Armor
305 horse.saddle -1997543660 Horse Saddle
306 horse.saddlebag 1400460850 Saddle bag
307 horse.shoes.advanced 1989785143 High Quality Horse Shoes
308 horse.shoes.basic -1211268013 Basic Horse Shoes
309 horsedung -1579932985 Horse Dung
310 horsemeat.burned 1917703890 Burnt Horse Meat
311 horsemeat.cooked -1162759543 Cooked Horse Meat
312 horsemeat.raw -1130350864 Raw Horse Meat
313 hosetool 363163265 Hose Tool
314 hq.metal.ore -1982036270 High Quality Metal Ore
315 humanmeat.burned -682687162 Burnt Human Meat
316 humanmeat.cooked 1536610005 Cooked Human Meat
317 humanmeat.raw -1709878924 Raw Human Meat
318 humanmeat.spoiled 1272768630 Spoiled Human Meat
319 icepick.salvaged -1780802565 Salvaged Icepick
320 innertube -697981032 Inner Tube
321 innertube.horse 185586769 Inner Tube
322 innertube.unicorn 2052270186 Inner Tube
323 jacket -1163532624 Jacket
324 jacket.snow -48090175 Snow Jacket
325 jackhammer 1488979457 Jackhammer
326 jackolantern.angry 1242482355 Jack O Lantern Angry
327 jackolantern.happy -1824943010 Jack O Lantern Happy
328 jar.pickle 286193827 Pickles
329 kayak 190184021 Kayak
330 keycard_blue -484206264 Blue Keycard
331 keycard_green 37122747 Green Keycard
332 keycard_red -1880870149 Red Keycard
333 knife.bone 1814288539 Bone Knife
334 knife.butcher -194509282 Butcher Knife
335 knife.combat 2040726127 Combat Knife
336 ladder.wooden.wall -316250604 Wooden Ladder
337 lantern 1658229558 Lantern
338 largecandles -489848205 Large Candle Set
339 largemedkit 254522515 Large Medkit
340 leather 1381010055 Leather
341 lmg.m249 -2069578888 M249
342 lock.code 1159991980 Code Lock
343 lock.key -850982208 Key Lock
344 locker -110921842 Locker
345 longsword -1469578201 Longsword
346 lowgradefuel -946369541 Low Grade Fuel
347 lunar.firecrackers -1961560162 Firecracker String
348 mace -1966748496 Mace
349 machete -1137865085 Machete
350 mailbox -586784898 Mail Box
351 map 696029452 Paper Map
352 mask.balaclava -2012470695 Improvised Balaclava
353 mask.bandana -702051347 Bandana Mask
354 maxhealthtea -1184406448 Basic Max Health Tea
355 maxhealthtea.advanced 603811464 Advanced Max Health Tea
356 maxhealthtea.pure 1712261904 Pure Max Health Tea
357 meat.boar 621915341 Raw Pork
358 meat.pork.burned 1391703481 Burnt Pork
359 meat.pork.cooked -242084766 Cooked Pork
360 metal.facemask -194953424 Metal Facemask
361 metal.fragments 69511070 Metal Fragments
362 metal.ore -4031221 Metal Ore
363 metal.plate.torso 1110385766 Metal Chest Plate
364 metal.refined 317398316 High Quality Metal
365 metalblade 1882709339 Metal Blade
366 metalpipe 95950017 Metal Pipe
367 metalspring -1021495308 Metal Spring
368 minihelicopter.repair 1426574435 MC repair
369 mining.pumpjack -1130709577 Pump Jack
370 mining.quarry 1052926200 Mining Quarry
371 mixingtable 1259919256 Mixing Table
372 modularcarlift 1696050067 Modular Car Lift
373 movembermoustache -2047081330 Movember Moustache
374 movembermoustachecard 3380160 Card Movember Moustache
375 multiplegrenadelauncher -1123473824 Multiple Grenade Launcher
376 mushroom -1962971928 Mushroom
377 newyeargong -961457160 New Year Gong
378 nightvisiongoggles -1518883088 Night Vision Goggles
379 note 1414245162 Note
380 oretea 1480022580 Basic Ore Tea
381 oretea.advanced 2063916636 Advanced Ore Tea
382 oretea.pure 1729374708 Pure Ore Tea
383 paddle 1491189398 Paddle
384 paddlingpool -733625651 Paddling Pool
385 pants 237239288 Pants
386 pants.shorts -1695367501 Shorts
387 paper -1779183908 Paper
388 partyhat -575744869 Party Hat
389 photo 62577426 Photograph
390 photoframe.landscape 1697996440 Landscape Photo Frame
391 photoframe.large 1205084994 Large Photo Frame
392 photoframe.portrait 1729712564 Portrait Photo Frame
393 piano 1272430949 Wheelbarrow Piano
394 pickaxe -1302129395 Pickaxe
395 pistol.eoka -75944661 Eoka Pistol
396 pistol.m92 -852563019 M92 Pistol
397 pistol.nailgun 1953903201 Nailgun
398 pistol.python 1373971859 Python Revolver
399 pistol.revolver 649912614 Revolver
400 pistol.semiauto 818877484 Semi-Automatic Pistol
401 pistol.water -1815301988 Water Pistol
402 piston1 1883981798 Low Quality Pistons
403 piston2 1883981801 Medium Quality Pistons
404 piston3 1883981800 High Quality Pistons
405 pitchfork 1090916276 Pitchfork
406 planter.large 1581210395 Large Planter Box
407 planter.small 1903654061 Small Planter Box
408 plantfiber -804769727 Plant Fiber
409 pookie.bear -1651220691 Pookie Bear
410 potato -2086926071 Potato
411 powered.water.purifier -365097295 Powered Water Purifier
412 propanetank -1673693549 Empty Propane Tank
413 pumpkin -567909622 Pumpkin
414 pumpkinbasket 1346158228 Pumpkin Bucket
415 radiationremovetea -496584751 Rad. Removal Tea
416 radiationremovetea.advanced 2021351233 Advanced Rad. Removal Tea
417 radiationremovetea.pure 1905387657 Pure Rad. Removal Tea
418 radiationresisttea -487356515 Anti-Rad Tea
419 radiationresisttea.advanced -1729415579 Adv. Anti-Rad Tea
420 radiationresisttea.pure -33009419 Pure Anti-Rad Tea
421 red.berry 1272194103 Red Berry
422 research.table -1861522751 Research Table
423 researchpaper -544317637 Research Paper
424 rf.detonator 596469572 RF Transmitter
425 rf_pager -566907190 RF Pager
426 rifle.ak 1545779598 Assault Rifle
427 rifle.bolt 1588298435 Bolt Action Rifle
428 rifle.l96 -778367295 L96 Rifle
429 rifle.lr300 -1812555177 LR-300 Assault Rifle
430 rifle.m39 28201841 M39 Rifle
431 rifle.semiauto -904863145 Semi-Automatic Rifle
432 riflebody 176787552 Rifle Body
433 riot.helmet 671063303 Riot Helmet
434 roadsign.gloves -699558439 Roadsign Gloves
435 roadsign.jacket -2002277461 Road Sign Jacket
436 roadsign.kilt 1850456855 Road Sign Kilt
437 roadsigns 1199391518 Road Signs
438 rock 963906841 Rock
439 rocket.launcher 442886268 Rocket Launcher
440 rope 1414245522 Rope
441 rug -1985799200 Rug
442 rug.bear -1104881824 Rug Bear Skin
443 rustige_egg_a -173268129 Rustigé Egg - Red
444 rustige_egg_b -173268132 Rustigé Egg - Blue
445 rustige_egg_c -173268131 Rustigé Egg - Purple
446 rustige_egg_d -173268126 Rustigé Egg - Ivory
447 salvaged.cleaver -1978999529 Salvaged Cleaver
448 salvaged.sword 1326180354 Salvaged Sword
449 samsite -1009359066 SAM Site
450 santabeard 2126889441 Santa Beard
451 santahat -575483084 Santa Hat
452 scarecrow 177226991 Scarecrow
453 scarecrow.suit 273951840 Scarecrow Suit
454 scarecrowhead 809942731 Scarecrow Wrap
455 scientistsuit_heavy -1772746857 Heavy Scientist Suit
456 scrap -932201673 Scrap
457 scraptea 263834859 Basic Scrap Tea
458 scraptea.advanced 524678627 Advanced Scrap Tea
459 scraptea.pure 2024467711 Pure Scrap Tea
460 scraptransportheli.repair -1884328185 ScrapTransportHeliRepair
461 searchlight 2087678962 Search Light
462 secretlabchair 567871954 Secret Lab Chair
463 seed.black.berry 1911552868 Black Berry Seed
464 seed.blue.berry 803954639 Blue Berry Seed
465 seed.corn 998894949 Corn Seed
466 seed.green.berry -1776128552 Green Berry Seed
467 seed.hemp -237809779 Hemp Seed
468 seed.potato -2084071424 Potato Seed
469 seed.pumpkin -1511285251 Pumpkin Seed
470 seed.red.berry 830839496 Red Berry Seed
471 seed.white.berry -992286106 White Berry Seed
472 seed.yellow.berry -520133715 Yellow Berry Seed
473 semibody 573926264 Semi Automatic Body
474 sewingkit 1234880403 Sewing Kit
475 sheetmetal -1994909036 Sheet Metal
476 shelves 1950721418 Salvaged Shelves
477 shirt.collared -2025184684 Shirt
478 shirt.tanktop 1608640313 Tank Top
479 shoes.boots -1549739227 Boots
480 shotgun.double -765183617 Double Barrel Shotgun
481 shotgun.pump 795371088 Pump Shotgun
482 shotgun.spas12 -41440462 Spas-12 Shotgun
483 shotgun.waterpipe -1367281941 Waterpipe Shotgun
484 shutter.metal.embrasure.a -1199897169 Metal horizontal embrasure
485 shutter.metal.embrasure.b -1199897172 Metal Vertical embrasure
486 shutter.wood.a -1023374709 Wood Shutters
487 sickle -1368584029 Sickle
488 sign.hanging 1205607945 Two Sided Hanging Sign
489 sign.hanging.banner.large 23352662 Large Banner Hanging
490 sign.hanging.ornate -1647846966 Two Sided Ornate Hanging Sign
491 sign.neon.125x125 1305578813 Small Neon Sign
492 sign.neon.125x215 -1423304443 Medium Neon Sign
493 sign.neon.125x215.animated 42535890 Medium Animated Neon Sign
494 sign.neon.xl 866332017 Large Neon Sign
495 sign.neon.xl.animated 1643667218 Large Animated Neon Sign
496 sign.pictureframe.landscape -845557339 Landscape Picture Frame
497 sign.pictureframe.portrait -1370759135 Portrait Picture Frame
498 sign.pictureframe.tall 121049755 Tall Picture Frame
499 sign.pictureframe.xl -996185386 XL Picture Frame
500 sign.pictureframe.xxl 98508942 XXL Picture Frame
501 sign.pole.banner.large 2070189026 Large Banner on pole
502 sign.post.double 1521286012 Double Sign Post
503 sign.post.single 1542290441 Single Sign Post
504 sign.post.town -1832422579 One Sided Town Sign Post
505 sign.post.town.roof 826309791 Two Sided Town Sign Post
506 sign.wooden.huge -143132326 Huge Wooden Sign
507 sign.wooden.large 1153652756 Large Wooden Sign
508 sign.wooden.medium -1819233322 Medium Wooden Sign
509 sign.wooden.small -1138208076 Small Wooden Sign
510 skull.human 996293980 Human Skull
511 skull.trophy -769647921 Skull Trophy
512 skull.trophy.jar 971362526 Skull Trophy
513 skull.trophy.jar2 -924959988 Skull Trophy
514 skull.trophy.table -156748077 Skull Trophy
515 skull.wolf 2048317869 Wolf Skull
516 skull_fire_pit 553887414 Skull Fire Pit
517 skulldoorknocker -216116642 Skull Door Knocker
518 skullspikes -1073015016 Skull Spikes
519 skullspikes.candles -25740268 Skull Spikes
520 skullspikes.pumpkin -1078639462 Skull Spikes
521 sled -333406828 Sled
522 sled.xmas -135252633 Sled
523 sleepingbag -1754948969 Sleeping Bag
524 small.oil.refinery -1293296287 Small Oil Refinery
525 smallcandles -2058362263 Small Candle Set
526 smallwaterbottle -1039528932 Small Water Bottle
527 smart.alarm -695978112 Smart Alarm
528 smart.switch 988652725 Smart Switch
529 smg.2 1796682209 Custom SMG
530 smg.mp5 1318558775 MP5A4
531 smg.thompson -1758372725 Thompson
532 smgbody 1230323789 SMG Body
533 snowball -363689972 Snowball
534 snowballgun 1103488722 Snowball Gun
535 snowmachine 1358643074 Snow Machine
536 snowman 1629293099 Snowman
537 sofa -555122905 Sofa
538 sparkplug1 -89874794 Low Quality Spark Plugs
539 sparkplug2 -493159321 Medium Quality Spark Plugs
540 sparkplug3 1072924620 High Quality Spark Plugs
541 spear.stone 1602646136 Stone Spear
542 spear.wooden 1540934679 Wooden Spear
543 spiderweb 882559853 Spider Webs
544 spikes.floor -92759291 Wooden Floor Spikes
545 spinner.wheel -1100422738 Spinning wheel
546 spookyspeaker 1885488976 Spooky Speaker
547 stash.small -369760990 Small Stash
548 sticks 642482233 Sticks
549 stocking.large -465682601 SUPER Stocking
550 stocking.small 1668858301 Small Stocking
551 stone.pickaxe 171931394 Stone Pickaxe
552 stonehatchet -1583967946 Stone Hatchet
553 stones -2099697608 Stones
554 storage.monitor 1149964039 Storage Monitor
555 strobelight 2104517339 Strobe Light
556 sulfur -1581843485 Sulfur
557 sulfur.ore -1157596551 Sulfur Ore
558 sunglasses 352321488 Sunglasses
559 sunglasses02black 1258768145 Sunglasses
560 sunglasses02camo -2103694546 Sunglasses
561 sunglasses02red 1557173737 Sunglasses
562 sunglasses03black -176608084 Sunglasses
563 sunglasses03chrome -1997698639 Sunglasses
564 sunglasses03gold -1408336705 Sunglasses
565 supply.signal 1397052267 Supply Signal
566 surveycharge 1975934948 Survey Charge
567 syringe.medical 1079279582 Medical Syringe
568 table 593465182 Table
569 tactical.gloves -1108136649 Tactical Gloves
570 target.reactive -1736356576 Reactive Target
571 targeting.computer 1523195708 Targeting Computer
572 tarp 2019042823 Tarp
573 techparts 73681876 Tech Trash
574 telephone 1234878710 Telephone
575 tool.binoculars -1262185308 Binoculars
576 tool.camera -1316706473 Camera
577 tool.instant_camera -2001260025 Instant Camera
578 toolgun 1803831286 Garry's Mod Tool Gun
579 torch 795236088 Torch
580 trap.bear -582782051 Snap Trap
581 trap.landmine -1663759755 Land Mine
582 tshirt 223891266 T-Shirt
583 tshirt.long 935692442 Longsleeve T-Shirt
584 tunalight -1478445584 Tuna Can Lamp
585 twitch.headset -1569700847 Headset
586 twitchsunglasses 20489901 Purple Sunglasses
587 valve1 1330084809 Low Quality Valves
588 valve2 926800282 Medium Quality Valves
589 valve3 -1802083073 High Quality Valves
590 vehicle.1mod.cockpit -1501451746 Cockpit Vehicle Module
591 vehicle.1mod.cockpit.armored 1874610722 Armored Cockpit Vehicle Module
592 vehicle.1mod.cockpit.with.engine 170758448 Cockpit With Engine Vehicle Module
593 vehicle.1mod.engine 1559779253 Engine Vehicle Module
594 vehicle.1mod.flatbed -1880231361 Flatbed Vehicle Module
595 vehicle.1mod.passengers.armored -1615281216 Armored Passenger Vehicle Module
596 vehicle.1mod.rear.seats 1376065505 Rear Seats Vehicle Module
597 vehicle.1mod.storage 268565518 Storage Vehicle Module
598 vehicle.1mod.taxi -626174997 Taxi Vehicle Module
599 vehicle.2mod.flatbed -1693832478 Large Flatbed Vehicle Module
600 vehicle.2mod.fuel.tank 1186655046 Fuel Tank Vehicle Module
601 vehicle.2mod.passengers 895374329 Passenger Vehicle Module
602 vehicle.chassis 1770744540 Generic vehicle chassis
603 vehicle.chassis.2mod -44066600 Small Chassis
604 vehicle.chassis.3mod -44066823 Medium Chassis
605 vehicle.chassis.4mod -44066790 Large Chassis
606 vehicle.module 878301596 Generic vehicle module
607 vending.machine 198438816 Vending Machine
608 wall.external.high 99588025 High External Wooden Wall
609 wall.external.high.ice -985781766 High Ice Wall
610 wall.external.high.stone -967648160 High External Stone Wall
611 wall.frame.cell -1429456799 Prison Cell Wall
612 wall.frame.cell.gate -956706906 Prison Cell Gate
613 wall.frame.fence -1117626326 Chainlink Fence
614 wall.frame.fence.gate 1451568081 Chainlink Fence Gate
615 wall.frame.garagedoor -148794216 Garage Door
616 wall.frame.netting 1516985844 Netting
617 wall.frame.shopfront -796583652 Shop Front
618 wall.frame.shopfront.metal -148229307 Metal Shop Front
619 wall.graveyard.fence -1679267738 Graveyard Fence
620 wall.ice.wall 1327005675 Short Ice Wall
621 wall.window.bars.metal -819720157 Metal Window Bars
622 wall.window.bars.toptier 671706427 Reinforced Glass Window
623 wall.window.bars.wood -1183726687 Wooden Window Bars
624 wall.window.glass.reinforced -1614955425 Strengthened Glass Window
625 watchtower.wood -463122489 Watch Tower
626 water -1779180711 Water
627 water.barrel -1863559151 Water Barrel
628 water.catcher.large -1100168350 Large Water Catcher
629 water.catcher.small -132247350 Small Water Catcher
630 water.purifier 2114754781 Water Purifier
631 water.salt -277057363 Salt Water
632 waterjug -119235651 Water Jug
633 waterpump -1284169891 Water Pump
634 weapon.mod.8x.scope 174866732 16x Zoom Scope
635 weapon.mod.flashlight 952603248 Weapon flashlight
636 weapon.mod.holosight 442289265 Holosight
637 weapon.mod.lasersight -132516482 Weapon Lasersight
638 weapon.mod.muzzleboost -1405508498 Muzzle Boost
639 weapon.mod.muzzlebrake 1478091698 Muzzle Brake
640 weapon.mod.silencer -1850571427 Silencer
641 weapon.mod.simplesight -855748505 Simple Handmade Sight
642 weapon.mod.small.scope 567235583 8x Zoom Scope
643 white.berry 854447607 White Berry
644 wiretool -144417939 Wire Tool
645 wolfmeat.burned 1827479659 Burnt Wolf Meat
646 wolfmeat.cooked 813023040 Cooked Wolf Meat
647 wolfmeat.raw -395377963 Raw Wolf Meat
648 wolfmeat.spoiled -1167031859 Spoiled Wolf Meat
649 wood -151838493 Wood
650 wood.armor.helmet -2094954543 Wood Armor Helmet
651 wood.armor.jacket 418081930 Wood Chestplate
652 wood.armor.pants 832133926 Wood Armor Pants
653 woodcross 699075597 Wooden Cross
654 woodtea -649128577 Basic Wood Tea
655 woodtea.advanced -541206665 Advanced Wood Tea
656 woodtea.pure -557539629 Pure Wood Tea
657 workbench1 1524187186 Work Bench Level 1
658 workbench2 -41896755 Work Bench Level 2
659 workbench3 -1607980696 Work Bench Level 3
660 wrappedgift 204970153 Wrapped Gift
661 wrappingpaper 1094293920 Wrapping Paper
662 xmas.decoration.baubels -1667224349 Decorative Baubels
663 xmas.decoration.candycanes -209869746 Decorative Plastic Candy Canes
664 xmas.decoration.gingerbreadmen 1686524871 Decorative Gingerbread Men
665 xmas.decoration.lights 1723747470 Tree Lights
666 xmas.decoration.pinecone -129230242 Decorative Pinecones
667 xmas.decoration.star -1331212963 Star Tree Topper
668 xmas.decoration.tinsel 2106561762 Decorative Tinsel
669 xmas.door.garland 674734128 Festive Doorway Garland
670 xmas.lightstring 1058261682 Christmas Lights
671 xmas.lightstring.advanced -151387974 Deluxe Christmas Lights
672 xmas.present.large -1622660759 Large Present
673 xmas.present.medium 756517185 Medium Present
674 xmas.present.small -722241321 Small Present
675 xmas.tree 794443127 Christmas Tree
676 xmas.window.garland -1379835144 Festive Window Garland
677 xmasdoorwreath 2009734114 Christmas Door Wreath
678 xylophone -211235948 Xylobone
679 yellow.berry 1660145984 Yellow Berry

View File

@@ -0,0 +1,105 @@
item_shortname skins (id=name;id=name;...)
fun.guitar 809801196=Addicted Guitarist;826914904=Army Acoustic Guitar;809938266=Black Acoustic Guitar;844914652=No War Guitar
door.hinged.toptier 1228341388=Apocalypse Door;1206145767=Aristocratic Armored Door;1114020299=Armored Concrete;1402412287=Armored Mason Door;1414795168=Armored Scrapper Door;930478674=Armored Vault Door;1395469801=Blast Armored Door;948938468=Bunker Door;1557857999=Cargo Ship Security Door;869475498=Clockwork Portal;1176460121=Cobalt Graffiti Door;804286931=Corroded Bronze Door;911652483=Green Armored Container Door;1477263064=HellBunker Door;1376526519=Hellfire Portal;801889927=High Voltage;801937986=Incarceration Armored Door;933057923=Keep Out Armored Door;801831553=Laboratory Armored Door;1605324677=Mainframe Door;839925176=Military Armored Door;1999927543=Molten Visage Armored Door;809638761=No Escape;807729959=Radioactive Armored Door;1092678229=Safe Room Door;1135412861=TacCom Security Door;885928673=Urban Armored Door;2288730131=Weather Armored Door
door.double.hinged.toptier 1911994581=Charitable Rust 2019 Double Door;2318482252=Christmas Bunker Double Door;2254750609=Crypt Armored Double Door;1874611109=Hell Walker Double Armored Door;1925748582=Jester Armoured Double Door
rifle.ak 849047662=Agony Yellow;887494035=Aircraft Parts AK47;1359893925=AK Royale;1202410378=AK-47 From Hell;1372945520=AK-47 Victoria;859845460=Alien Red;1259716979=Anubis Ak47;1826520371=Apocalyptic Knight AK;1750654242=Azul AK47;2249370680=Basebreaker AR;809212871=Battle Scarred AK47;809190373=Battle-Scarred AKS47;1435827815=Beast of Industry;1112904406=Betty Lou AK47;2128372674=Blackout AR;1385673487=Brass Lion;1679665505=BullDozer AK47;2245084157=Candy Hunter AR;2041629387=Capitan's AR;2101560738=Cardboard AR;924020531=Cartagena AK47;1349512142=Caution AK47;2248879512=Chained Spirits AR;937864743=Checkpoint AK47;1196676446=Chivalry AK47;875130056=Claw AK47;1915393587=Cobalt Security AR;1174389582=Cobra;1583542371=Cold Hunter AK;1102750231=Conquerer AK47;840477492=Crimson King;1306351416=Crypt of Death AK47;885146172=Dark Flames;1137915903=Dead Pirate Rifle;1245563496=Death in Spades AK47;1349324364=Demonic AK47;1929819581=Desert Hawk AK47;1092674304=Diesel AK47;10135=Digital Camo AK47;615766181=Digital Camo AK47;2017002938=Doodle AK47;920472848=Doombringer AK47;2075372682=Dreamland AR;1804885723=Dynasty AK47;928950425=Epidemic AK47;1448221547=Etherya AK47;2319710097=Evil Snowman AR;939180121=Farseer AK47;940035827=Fate Destroyer;903882218=Frost Wolf;1476966011=Gearlord AK47;1588206436=Gingerbread AK;1167207039=Glorious AK;889710179=Glory AK47;1362212220=Gold Rush AK;1265322092=Golden Drake AK47;1364985829=Green Dragon AK47;1993279809=Heartbreaker AR;1599157678=Hell's Dogs;1575397458=Huntsman AK47;1886272847=Jack O Lantern - AK47;925720043=Jaws AK47;1272989639=King of the Jungle AK47;1434027951=Last Phoenix;908297014=Lonewolf AK47 - Blue;1213092632=Mandrill;1428980348=Marrakesh;1983066869=Memories AR;1457951707=Midnight Dream;10137=Military Camo AK47;618543834=Military Camo AK47;2085083014=Monument Memories AR;1338305091=Mystic AK47;2179386526=Neanderthal AR;1118706219=Night Howler AK47;1539318940=Nightmare AK47;1760078043=No Mercy AK47;1161844853=Panther AK47;1522034435=Phantom AK;1120500163=Piranha AK47;1685375084=Playmaker AK47;1549426268=Polymer AK47;2304993742=Porcelain AR;1907342157=Poseidon - AK47;2172715245=PulsAR;1870705926=Punkish AK47;911726740=Rabble Rouser AK47;2012334520=Rainbow AR;2059352465=Rainbow Pony AR;2108685486=Raptor AR;1252554814=Rebellion Assault Rifle;895307805=Retro Car Parts AK47;2268418002=Retrowave AR;1352844155=REX;1746886322=Royal AK47;1288866247=Rumble AK47;654502185=Rustpunk AK47;934891737=Sandstorm AK47;1175238674=Santa Muerte;1539409946=Scarecrow AK47;1372566409=Scorpion AK47;1277707212=Scrapper AK47;1396630285=Smolder;1076214414=Soul Taker AK47;1882821847=Sticker Pack AK47;1850236015=Sunken Treasure AK;2109182691=Sweet Poison AR;1539007965=T-Bone AK47;1230963555=Talon AK47;10138=Tempered AK47;566540646=Tempered AK47;1088459232=The Beast AK47;1129886223=The Beast Of The East;1124932043=The Reptile;1467269924=Toxic;2006878490=Training AR;1659781652=Troll Daddy AK;1402320927=Trophy Pirate AK47;2323019876=Trust In Rust 3 AR;2242791041=Underworld AR;1324932956=Urban Ice AK47;1140366289=War Machine AK47;2240088463=Wild Spirit AR;1159593268=Wyrm Rifle;1309470544=X-RAY AK47;2352506845=xQc Assault Rifle
mask.bandana 820870847=Beast Bandana;10061=Black Bandana;10060=Blue Bandana;1438048628=Burlap Bandit Bandana;10067=Checkered Bandana;2093051075=Creepy Bandana;10104=Creepy Clown Bandana;533328361=Creepy Clown Bandana;10066=Desert Camo Bandana;2051174405=Easter Bandit;1710737837=Egg Thief;10063=Forest Camo Bandana;10059=Green Bandana;903595865=Jawboy;10065=Red Skull Bandana;1323640876=Road Raider Bandana;1685873480=Salvaged Hazmat Bandana;1185794212=Santa Bandana;10064=Skull Bandana;10062=Snow Camo Bandana;10079=Wizard Bandana;521069222=Wizard Bandana
hat.cap 10029=Blue Cap;1565217605=Charitable Rust 2018 Cap;10027=Forest Camo Cap;10055=Friendly Cap;494030776=Friendly Cap;10030=Green Cap;10026=Grey Cap;1760269295=Jockey Cap;1137628492=Oxums Employee Cap;10028=Red Cap;10045=Rescue Cap;495026469=Rescue Cap;2276035673=Taxi Cap;890772638=Toothy Hat;893188334=Top Cap
beachchair 13000=Camo;13001=Flamingo;13002=Leaves;13003=Pizza;13004=Target;13005=Tarp;13006=ZenLabs
beachparasol 13007=Camo;13008=Flamingo;13009=Leaves;13010=Pizza;13011=Target;13012=Tarp;13013=ZenLabs
beachtowel 13014=Brown Stripes;13015=Brown Stripes;13016=Dyed;13017=Fish;13018=Shell;13019=Stripes;13020=Waves
hat.beenie 14180=Black Beenie Hat;10018=Blue Beenie Hat;10017=Green Beenie Hat;594202145=Gunner Beanie;10040=Rasta Beenie;501159601=Rasta Beenie;10016=Red Beenie Hat;10085=Winter Deers;519469651=Winter Deers
rifle.bolt 1852284996=Apocalyptic Knight Rifle;818403150=Army Bolt Rifle;1795984246=Azul Bolt Rifle;1535660827=Beauty Kills;1517933342=Bolt From Hell;1581664321=Caution Bolt Rifle;897023403=Deadly Rose BAR;10117=Dreamcatcher;516383225=Dreamcatcher;10115=Ghost Bolt Rifle;526539536=Ghost Bolt Rifle;933509449=Glory BAR;1687042408=Glory Rifle;1587273896=Granny's Bolt;875259050=Great War Service Rifle;943036098=Hunter's Bolt;2024514125=No Mercy Bolt Rifle;840105253=Polymer BAR;819149392=Rustpunk Rifle;972020573=Sandwar BAR;1592946955=Shark Rifle;947954942=Smuggler's BAR;1119629516=Steel and Brass BAR;1161165984=Survivor BAR;10116=Tundra Bolt Rifle;518199212=Tundra Bolt Rifle
bone.club 1557788243=Bone Scepter;810156739=Carved Club;2156399984=Ice Cream Club;791109245=Little Friend;2242052737=Little Nightmare;888839261=Maracas Bone Club;945026868=Sacrificial Club
deer.skull.mask 784259585=Demonic Deer Skull;1935631950=Rudolph Skull Mask;882204381=The Plague Doctor;837166252=Uprising Deer Skull Mask
knife.bone 808955868=Etched Edge Bone Knife;1277364396=Flesh Knife;909612594=Paititi Bone Knife;945031477=Sacrificial Knife;933322251=Studded Bone Knife
boogieboard 13021=Corrugated;13022=Crash Test;13023=Flames;13024=Marbled;13025=Shark;13026=Stars
hat.boonie 1438050325=Burlap Bandit Hat;1754286779=Cowboy Hat;1760060421=Cowboy Sheriff Hat;10058=Farmer Hat;503202816=Farmer Hat;2037650796=Farmer Straw Hat;587812040=Fisherman Boonie Hat;844289539=Flower Hat;2255866690=Gentleman's Fedora;1185551523=Hunted Hat;865054618=Leather Boonie Hat;833565406=PVC Hat
shoes.boots 1839313604=Apocalyptic Knight Boots;1100926907=Arctic Wolf Boots;882570089=Armored Boots;869090082=Army Armored Boots;826587881=Army Black Boots;10080=Army Boots;507940691=Army Boots;1406796292=Badboy Boots;2199934989=Bee Cosplay Boots;2009426933=Bio Integrity Boots;10023=Black Boots;2090776132=Blackout Boots;10088=Bloody Boots;513629119=Bloody Boots;1441308562=Brony Boots;1432967312=Cajun Boots;899942107=Caravanner Boots;838205144=Combat Boots;2075527039=Cow Moo Flage Boots;1960694026=Doodle Boots;919261524=Explorer Boots;1657109993=Glory Boots;784559403=Hazard Move Boots;1196740980=Loot Leader Boots;1395755190=Marsh Lurker Boots;1106548545=Metalhunter Boots;920390242=Muddy Boots;2304198263=No Mercy Boots;10034=Punk Boots;493534620=Punk Boots;1864539854=Punkish Boots;1995685684=Road Romeo Boots;613481881=Rock Star Boots;10044=Scavenged Sneaker Boots;493064563=Scavenged Sneaker Boots;1111680681=Sky Seal Boots;962503020=Stalker Boots;809586899=Tactical Boots;1915397286=Tactical Combat Boots;1084392788=Tailgunner Boots;10022=Tan Boots;1915955573=Training Boots;961096730=Wasteland Hunter Boots;944997041=Yellow Race Boots
bucket.helmet 831798567=Graffiti Bucket Helmet;926313433=Green Riveted Bucket Helmet;10127=Medic Helmet;570784227=Medic Helmet;1197730661=Punk Bucket;964461549=Road Cone Helmet;1073904216=Roasted Bucket Helmet;867605376=Rusty Bucket Helmet;784438982=Smilin' Jack;949889936=Sunrise Bucket Helmet;885450077=Super Happy Bucket;889767601=The King's Bucket;564826303=Wooden Bucket
burlap.headwrap 942098139=Anarchy;1691834772=Bandit Headwrap;896506958=Brotherhood Headwrap;861551572=Crimson Headwrap;2255857422=Death Mask;1694253807=Minicopter Pilot Helmet;868014709=Outlaw Headwrap;785890135=SandPrince;822358002=Shinobi Cowl
burlap.shirt 849866944=Biker Dad;1127407306=Blacksmith Shirt;809909900=Burlap and Leather Vest;1438049725=Burlap Bandit Shirt;654502725=Captain's Vest and Shirt;899941622=Caravanner Shirt;1755124648=Cowboy Shirt;926478499=Desert Outlaw Burlap Shirt;2039984110=Farmer Overalls Top;2255869247=Gentleman's Shirt;1294811936=It is Wednesday, my dudes;1394039696=Junkyard King Shirt;1354670586=Leopard Skin Shirt;1380044819=Pirate Shirt;10136=Pirate Vest & Shirt;585386820=Pirate Vest & Shirt;1145786859=Rioter's Jacket;1323654151=Road Raider Shirt;1229561297=Santa's Helper Shirt;882451685=Sleazy Rider;1294812700=Whens Whip?
burlap.shoes 906443871=Broken Ankles Cast;790679533=Burlap Ninja Slippers;2215057317=Fish Shoes
burlap.trousers 1127409880=Blacksmith Pants;1438049211=Burlap Bandit Pants;1755140135=Cowboy Pants;921250017=Desert Outlaw Burlap Pants;2039988322=Farmer Overalls Bottom;2255871111=Gentleman's Pants;1394040054=Junkyard King Pants;1354675665=Leopard Skin Pants;1380047706=Pirate Pants;809968188=Recycled Tarp Pants;1145780081=Rioter's Pants;1323664071=Road Raider Pants
chair 875258235=Antique Dining Chair;871339422=Danger Chair;1260443731=Glory Throne;897656037=Muerto Chair;2024586973=Night Sky Chair;871271807=Red Leather Chair;1147170604=Rusty Iron Throne;1154498476=Yellow Ornate Chair
coffeecan.helmet 848645884=Apocalypse Helmet;1797478191=Apocalyptic Knight Helmet;914060966=Army Armored Helmet;1759479029=Azul Helmet;2120618167=Blackout Helmet;2350097716=Bombing Helmet;1865208631=Bombshell Helmet;2296710564=Cardboard Helmet;1342122459=Caution Helmet;2142393198=Centurion Helmet;1445131741=Chaos Helmet;1121458604=Cobalt Armor Helmet;1251411840=Defender Helmet;938020581=Desert Patrol Helmet;1332335200=Dominator Helmet;1986043465=Doodle Helmet;1349946203=Dwarf Helmet;955675586=Epidemic Helmet;1349166206=Full Metal Helmet;1129809202=Funhouse Helmet;1380023142=Heavenly Legion Helmet;1740061403=Heavy Machinery Helmet;1944168755=Iceman Helmet;970583835=Junkyard Samurai Helmet;843676357=Lizard Skull;1269589560=Loot Leader Helmet;1974807032=Lunar Armor Helmet;1154453278=Mad Helmet;1894381558=Metal Zombie Helmet;1174375607=Metalhunter Can Helmet;2320222274=Mr. Gingerbread Helmet;1539575334=Night Stalker Helmet;2076260082=No Mercy Helmet;891592450=Nordic Beast Helmet;2199783358=Opulent Helmet;1438088592=Ornate Helmet;2147200135=Oxums Racing Team Helmet;1441850738=Peacemaker Helmet;1743856800=Phantom Helmet;1104118217=Plywood Helmet;948491992=Roadsign Warrior Helmet;806212029=Rusty Coffee Can Helmet;1151227603=Saboteur's Can Helmet;1248435433=Samurai Kabuto;1539650632=Scary Helmet;974321420=Scrap Hazard Helmet;1202978872=Scrapper Helmet;784910461=Skull Hazard;1388417865=Snap Turtle Helmet;1804649832=Solar Panel Helmet;814098474=Spare Parts;919595880=Sunrise Helmet;1906527802=Training Helmet;1130589746=Utilizer Helmet;1400824309=Vandal Graffiti Helmet;1442169133=Viking Helmet;809816871=Warboy Helmet;854460770=Welding Helmet
knife.combat 1730634130=Bronze Raven Knife;1706788762=Carbon Elite;1719795241=Combat Knife from Hell;1910941833=Dread Lord Knife;1738307827=Emerald Knife;1707332381=Emperor's Knife;1702783691=Glory Knife;1706692846=Nuke Combat Knife;1702530691=Phantom Knife;1739818618=Razor Knife;2187058228=Tea Ceremony Knife;1715608877=Thug Knife;1952506333=Toothed Knife
barricade.concrete 828182621=Metal Barricade;846663258=Military Barricade;924112225=Outpost Concrete Barricade;939333522=Railway Barricade;791070521=Road Barrier
crossbow 2136580235=Abyss Crossbow;915855989=Ancient Artifact Crossbow;2178956071=Blackout Crossbow;1565444858=Caution Crossbow;874268567=Chrome Crossbow;1961541693=Cloud Shot Crossbow;1772979668=Cold Hunter Crossbow;1242702498=Dead Man Crossbow;1390284445=Deep Water Crossbow;883141682=Doomwing Crossbow;818070371=Engraved Crossbow;1349337546=Gold Spirit Crossbow;1181976746=Gurkha Crossbow;1291686117=Hawk Crossbow;809964230=HazardCross;1466387739=Heart Shot;1699027694=Holy Trapper Crossbow;1428614422=Hunter's crossbow;1365706569=Huntsman Crossbow;1127389810=Lone Wulf Crossbow;1115959202=Mad Crossbow;1865294019=Mad Rider Crossbow;1421675342=Makeshift Crossbow;1184318659=Marauder;1739935284=Metal Lord Crossbow;1097642159=Northwind Crossbow;2059058861=One Shot Crossbow;2288242320=Phantom Crossbow;1269230939=Phoenix Crossbow;1089558546=POP Crossbow;1206661880=Primal Crossbow;2024146764=Rainbow Pony Crossbow;2193672354=Retrowave Crossbow;1328219905=Ronin;1701173429=Scrapper Crossbow;856029421=Tank Crossbow;1766369967=Tiki Crossbow;1559298697=Tooth Monster Crossbow;1367933148=Tribal Crossbow;1408631840=Trophy Pirate Crossbow;1810999666=Vampire Crossbow;1383105648=Victoria Crossbow;2316783823=Xmas Candy Crossbow
smg.2 1329096680=Afterburn SMG;820350952=Alien Relic SMG;820402694=Anarchy SMG;866745136=Bandito SMG;1081305198=Bone Shaman SMG;2186437441=Cloudshot SMG;1128840196=Dark Flames SMG;931547202=Engineer SMG;1185311263=Finish Line SMG;816728172=Firestarter Custom SMG;1839296742=Flyboy SMG;1805101270=Goldthorn SMG;897099822=Hailstorm SMG;892212957=Hunter SMG;904964438=Looter's SMG;1597038037=Metalhead SMG;2172135020=No Mercy SMG;1446184061=Pathogenesis;1961720552=Peacemaker SMG;1685722307=Phantom SMG;1198145190=Polymer SMG;1753609137=Poseidon SMG;1987573278=Rainbow Pony SMG;1114032911=Safari SMG;1107572641=Survivor SMG;854914986=Tank SMG;1523699528=Tempered SMG;2281845451=Toy SMG;822943156=tRUSTy Friend;970682025=Warpaint SMG
shotgun.double 916790605=Aircraft Parts DBS;865019380=Bespoke DBS;1448142776=Blunderbuss;1660175523=Brotherhood DBS;2059815527=Canned DBS;1119662164=Caution DBS;2118688615=DD Inc DBS;1680595474=Double Oil Pipe;1213074188=Double Trouble DBS;1378519774=Geartooth DBS;948113632=Grandfather DBS;1818232860=Happiness DBS;854987948=Heat Double Shotgun;1260964187=Hellion DBS;1522902588=Hippie Blaster;860153737=Industrial DBS;1414878365=Last Blast Twins;1295701369=Last Hero DBS;2107885378=Lighthouse DBS;1408050439=Mad DBS;1174675399=Military Boomstick;858957151=Nitro-Maniac DBS;1910558629=Pipeline DBS;1465627520=Predator DBS;1341524782=Protector DBS;1127266590=Quick Death DBS;1441939951=Raider's Shotgun;1870693079=Rat King DBS;1282137884=Saboteur DBS;1590495543=Santa's Blaster;1229950256=Santa's Boomstick;1277558450=Steam DBS;2249169000=Toy Blaster;1225880743=Vigilante DBS;1247696065=Whopper DBS;1616108563=Witchhunter DBS;1569952704=СМЭРТЬ
pistol.eoka 856053892=Banana Eoka;898387222=Birch Eoka;2032782073=Flare Eoka;1171935313=Flintlock;1174673119=Gurkha Eoka;926184643=Japanese Tanegashima;1413731110=Last Blast;920310954=Nordic Relic;857750032=Primal Gun
grenade.f1 836745325=Fire and Brimstone Grenade;936182773=Smile Grenade;1163186435=Unholy Grenade;815252048=Voodoo Grenade
fridge 869398873=Aircraft Parts Fridge;864918396=Biohazard Fridge;1759824768=Cobalt Cola Fridge;1927006810=Concert Speaker Fridge;2156206373=Ice Cream Freezer;1968311805=Portable Toilet;873612402=Urban Fridge;886416273=Victorian Food Vault
furnace 1260546874=Ancient Furnace;1335598661=Ancient Gods Furnace;1448350353=Ancient Totem Furnace;1247357204=Angry Furnace;1408433814=Artist's Furnace;1241065527=Aztec Furnace;2060469349=Bee Hive;1949401987=Bio Integrity Furnace;1645019295=Birch Furnace;1230386524=Blacksmith Furnace;1305332196=Brutal Furnace;1230680321=Cannibal Furnace;1701971555=Chocolate Bunny Furnace;1230975843=Christmas Furnace;1935093227=Cookie Maker Furnace;1457061230=Cursed Soul Furnace;1805182793=Deep Sea Furnace;1775718906=Demon Furance;1892656766=Demonic Stone Furnace;1384844042=Dragon Furnace;1975322284=Eastern Dragon Furnace;1632040649=Furious Volcano;1723387671=Furnace from Hell;1230272984=Furnace of the Shaman;1539005624=Ghostly Flame;2031915217=Greek Furnace;1652555216=Hearts Furnace;1865321291=Hell Forge;1391109786=Hellfire Furnace;1588458946=Home Sweet Home;2179924680=HQM Furnace;1260305347=Hydraulic Furnace;1427551950=Iron Calamity;1277616284=Iron Forge;2253998989=Jack-o'-lantern Furnace;1335260783=Junkyard Furnace;1583218948=Last Friend;1421455358=Mad Iron Furnace;1387619038=Marble Furnace;1992130386=Master's Furnace;1354629493=Medieval Fresco Furnace;2138871357=Metal Furnace;1377346304=Metalwork Flux Furnace;1320779999=Military Furnace;1354714819=Miner's Furnace;1630511618=Monster Furnace;1277183788=Mosaic Furnace;1936112920=Mr. Gingerbread;1810979800=Night Sky Furnace;1640730462=Octo Furnace;1636919294=Personal Lighthouse;1239083962=Potbelly Furnace;1356581838=Rainbow Furnace;1305743950=Ritual Furnace;1772650961=Royal Furnace;1587226587=Santa Furnace;1373663659=Scrap Face Furnace;1529559770=Sea Devil Furnace;2288536484=Shippy & Friends Furnace;2316854479=Silent Night;1230539924=Snowboy;1349367380=Soul Burner;1559242743=Spider Furnace;1539436979=Spooky Slime Furnace;2115314246=Sulfur Furnace;2198708104=Tiger Crown Furnace;1282172459=Totem Furnace;1458047080=Toxic Furnace;1367939983=Treasure Furnace;1575177513=Tribe Furnace;1261530424=Urban Furnace;1231071505=Victorian Furnace;1467078851=Wild Furnace;2193152729=Yummy Furnace;1587959070=Сhristmas Night
wall.frame.garagedoor 2317872477=Advent Calendar Garage Door;1398568170=Bandit Garage Door;1415167317=Brutal Jaws Garage Door;1334974046=Cargo Truck Garage Door;1772483395=Castle Gate;1617613419=Caution Garage Door;2010495833=CCTV Garage Door;2289421450=Charitable Rust 2020 Garage Door;1209586977=Checkpoint Door;2156585400=Chill Zone Garage Door;1180981036=Chop Shop Garage Door;1935858699=Christmas Tree Garage Door;1529742943=Cobalt Cargo Door;1805270622=Cobalt Quarantine;1186351868=Cobalt Space Door;1926583818=Concert Curtains;1415079530=Cursed Pirate Garage Door;1523814360=Danger Garage Door;2323315927=Dead Moroz;1788350229=Deep Sea Garage Door;1180968592=Defense Garage Door;1886876765=Dia De Los Muertos Garage Door;1649777840=Egiptu Garage Door;1575268855=Electro Garage Door;2238632740=Elevator Garage Door;1238292260=Factory Rolling Door;2041819488=Fresh Produce Garage Door;2222230165=Garage Door from Hell;1380090862=GNH-315;1529558717=Gun Lord Door;2123310382=HappyLand Garage Door;1539143998=House of Horror;2186094580=Laboratory Rolling Door;1465843732=Longtail Garage Door;1856195647=Love Nest;1968391406=Marine Blast Door;2146118486=Mechanic Garage Door;1871289078=Military Bunker Door;1871289078=Military Bunker Door;1645407409=Minicopter Hangar Door;1461027316=Monster Garage Door;1819106723=Morexo Garage Door;2255437587=Neon Pumpkin Garage Door;2014975420=Pixel Garage Door;2351178062=Pokimane Garage Door;2155588318=Raider's Cove Garage Door;1309406283=Reactor Room 3 of 10;1804915784=Resist Garage Door;2006000003=Revolution Garage Door;1183127702=Rolling Exit Door;1733848365=Royal Garage Door;1759641728=Rust Rider Door;1358030533=Sailor's Garage Door;1826250647=Shippy Garage Door;1747024635=Steer Clear;1839473397=Street Meat Door;1973756459=Street Rat;2101163537=Toxic Garage Door;1306203844=Trash Garage Door;2111916381=uMod Fundraiser Garage Door;1846000839=Vandalized Shop Door;1428456080=War Door;1680120997=ZENLABS Garage Door
hammer 1249500235=Aztec Jade Hammer;1539336419=Braineater Hammer;938806184=Builders Guild Hammer;2115359138=Building Block Hammer;1457914371=Calamity Hammer;1128710439=Dead Hammer;1208606722=Frost Hammer;1858261101=Fuel Hammer;1116103194=God Of Builders Hammer;1652017472=Heart of the Creator;1120977731=Kitchen Tile Hammer;1916000340=Morganite Hammer;1125995819=Museum Raider Hammer;1720644451=Mystic Hammer;1876980303=Night Sky Hammer;1884786335=Pumpkin Hammer;1095969830=Riveted Hammer;833423263=Scorched Hammer;2076299603=Silver Leaf Hammer;1586965130=Snowman Hammer;961294045=Trap Base Weaver;2138245748=Watermelon Ice Cream Hammer;822539548=Welded Hammer
hatchet 892263562=Ancient Artifact Hatchet;2068589541=Apocalyptic Hatchet;1145547996=Beast Hunter Hatchet;2124287244=Chaos Hatchet;1546404025=Cursed Treasure Hatchet;1143274085=Damascus Steel Hatchet;1911293067=Dragon Claw Hatchet;1171956705=Eater Hatchet;1987865546=Emerald Relic Hatchet;1320099240=Fenrir Hatchet;814630559=Firefighter Hatchet;1252014044=Full Metal Hatchet;824552943=Golden Axe;1290169302=Hatchet of Antiquities;1407875352=Hazard Hatchet;950020589=Hunter Hatchet;2328580814=Hunting Hatchet;924242197=Iron Jaws Hatchet;915910717=Iron Wing;1082302323=Leather Hatchet;1095577423=Macbeth Hatchet;1466664834=Machinery Hatchet;2242722277=Meteorite Hatchet;816715928=Military Hatchet;962959509=Modern Lumberjack Hatchet;2093114444=Norse Hatchet;967413298=Notorious Hatchet;944497252=Ornate Axe;1435214632=Pharon Hatchet;1076337199=Polynesian War Axe;1150815053=Prospector's Hatchet;1108554409=Raider Hatchet;2171464647=Rainbow Pony Hatchet;1422179740=Raventale Hatchet;1448232793=Reaper Hatchet;910196839=Red Chopper;953186726=Refined Hatchet;1414446668=Regal Hatchet;912857899=Replacement Blade Hatchet;1379766114=Road Hatchet;1553321287=Runic Hatchet;1242774466=Scrapper Hatchet;1378023158=Secret Zone Hatchet;1838326907=Shadow of Death Hatchet;1291775183=Shinobi Hatchet;1220880032=Siege Breaker;1247701169=Snow Valley Hatchet;1152712210=Soul Collector Hatchet;1193102490=Soulburn Hatchet;1362737705=Spec Ops Hatchet;1107210636=Spider King Hatchet;1710517158=Spring Hatchet;1870596204=Strange Fury Hatchet;928879549=Sunrise Hatchet;1137482995=Survivor Hatchet;1359120832=Survivor's Hatchet;1772892883=Tactical Hatchet;1572398539=Taurus Hatchet;1617000027=Tiki Hatchet;1121515438=Tomb Hatchet;1962083351=Toothed Hatchet;1092131816=Tribal Hatchet;826402867=Veteran Hatchet;814713259=Vikings Tomahawk;825033005=Vintage Hatchet;1325481133=Virulent Hatchet;1620492374=Virus Hatchet;1900587737=Warlord Hatchet;1258108678=Widowmaker Hatchet
hazmatsuit 10180=Spacesuit
twitch.headset 13055=Purple Headset
attire.hide.boots 785347695=Native American Hide Shoes;1230633097=Rudolph Slippers;837175591=Uprising Hide Shoes
attire.hide.helterneck 798669794=Caution Tape Top;845019310=Leopard Top
attire.hide.pants 1269154354=Tribesman Hide Pants;837179220=Uprising Hide Pants
attire.hide.poncho 833524594=Camo Netting;788732722=Grey Wolf Hide Poncho;825459163=Toymaker Poncho;1269162578=Tribesman Poncho;837191793=Uprising Hide Poncho
attire.hide.skirt 831920129=Blue Tarp Skirt;793180528=Irish Kilt
attire.hide.vest 878319804=Celtic Hide Shirt;1269172413=Tribesman Hide Shirt
hoodie 1660290744=Airman Hoodie;1787216403=Apocalyptic Knight Hoodie;1100931254=Arctic Wolf Hoodie;897890977=Army Armored Hoodie;2351687115=AuronPlay Hoodie;1961464025=Azul Hoodie;1408832378=Badboy Hoodie;2282178792=Base Invaders Hoodie;10142=BCHILLZ! Hoodie;626133126=BCHILLZ! Hoodie;2192919905=Bee Cosplay Hoodie;1997532879=Bio Integrity Hoodie;14179=Black Hoodie;2080975449=Blackout Hoodie;10052=Bloody Hoodie;492800372=Bloody Hoodie;14178=Blue Hoodie;2295666190=Bombing Hoodie;2293185782=Bombshell Hoodie;1373714814=Brony Hoodie;1968538819=Buscador Hoodie;1432964453=Cajun Hoodie;2000507925=Caution Hoodie;1552703337=CCSC Hoodie;1209453497=Charitable Rust 2017 Hoodie;1564974974=Charitable Rust 2018 Hoodie;1911980598=Charitable Rust 2019 Hoodie;2289427434=Charitable Rust 2020 Hoodie;1371314541=Checkpoint Hoodie;1305321596=Chekist's Hoodie;1587744366=Christmas Gang Hoodie;1150818496=Conquistador Hoodie;2099705103=Conspiracy Nut Hoodie;2067569919=Cow Moo Flage Hoodie;1766644324=Cowboy Sheriff Hoodie;10133=Cuda87 Hoodie;619935833=Cuda87 Hoodie;904963081=Denim Studded Hoodie;889718910=Desert Conqueror Hoodie;1950853975=Doodle Hoodie;2200988844=Dragon Hoodie;1581817010=Electrician Hoodie;2131784896=Elite Forest Camo Hoodie;1234693807=Explorer Hoodie;1296608954=Firefighter Hoodie;954392337=Gang Leader Hoodie;2147365537=Garage Master Hoodie;14072=Green Hoodie;2176988889=Hobo Hoodie;959900137=Huntsman Hoodie;1768733505=Jockey Hoodie;2215209664=Kayak Hoodie;895065994=Leather Strapped Hoodie;1196751864=Loot Leader Hoodie;914621940=Looter's Hoodie;2349487658=Ludwig Hoodie;1368417352=Lumberjack Hoodie;1448343881=Mad Rider Hoodie;1894585931=Maniac Hoodie;1385322661=Marsh Lurker Hoodie;1106582025=Metalhunter Hoodie;1700935391=Minicopter Pilot Jacket;1740562395=No Mercy Hoodie;939604165=Nordic Beast Hoodie;1328751626=Northern Forester Hoodie;797128321=Official Vertiigo Hoodie;1784482745=Operator Hoodie;2207288699=Opulent Hoodie;1356328924=Outlaws Hoodie;2022463110=Phantom Hoodie;1810592176=Playmaker Hoodie;2124528682=Poison Hoodie;1150760640=Predator Hoodie;1274163900=Prospector's Hoodie;1858310941=Punkish Hoodie;1638742127=Railway Engineer Hoodie;661319427=Ranger's Vest;919353761=Regulator's Hoodie;1282111884=Revolution Hoodie;10132=Rhinocrunch Hoodie;612956053=Rhinocrunch Hoodie;1993891915=Road Romeo Jacket;1927124747=Rocker Jacker;971807764=Rocket Factory Crew Hoodie;2256109331=Rusteratu Hoodie;1936131747=Rustmas PJ Hoodie;10129=Safety Crew;539943199=Safety Crew;1170989053=Savage Jacket;1292091712=Scrapper Hoodie;835836079=Scudpunk Hoodie;1356748246=Seaman Hoodie;2349484905=Shroud Hoodie;10086=Skeleton Hoodie;519147220=Skeleton Hoodie;1111669350=Sky Seal Hoodie;2138199381=Snow Warrior Hoodie;959641236=Stalker Hoodie;1623185000=Survivor Jacket;1883624383=Tactical Hoodie;975500312=Tailgunner Hoodie;677636990=Tank Crew Hoodie;1703216433=Tough Bunny Hoodie;1740503746=Training Hoodie;2182271278=Trust in Rust Hoodie;803249256=Unknown Territory Hoodie;2076428294=Uproar Hoodie;1317554978=Urban Ice Hoodie;961066582=Wasteland Hunter Hoodie;2329780962=Winter Hoodie;954947279=Worker Hoodie;941172099=Yellow Police Jacket;926162531=Yellow Racer Hoodie
bow.hunting 2108510511=Abyss Bow;2192571819=Blackout Bow;1773297889=Bushi Zhe Hunting Bow;2046137724=Chocolate Hunter Bow;1988012822=Cloud Shot Bow;2275810551=Dragon Bow;1926862937=Dread Lord Hunting Bow;1846220912=Golden Leaf Bow;1818588701=Heavy Machinery Bow;1793915047=Hunting Bow from Hell;2341845629=Jade Bow;1747542198=Metalhead Bow;1729920243=Native Hunting Bow;1759967280=Northwind Bowmaster;2032574584=One Shot Bow;1729629485=Phantom Bow;1984690140=Pink Death Bow;1734427277=Resin Bow;2229211780=Retrowave Bow;2312049369=Rising Moon Bow;1729683309=Scrapper Bow;2085489622=Seafarer Hunting Bow;1883523860=Sunken Treasure Bow;1885852817=The Bone Bow;2164997891=Tribe Hunting Bow;1974088369=Triumph Bow;1876857585=Vampire Bow;2185750735=Venomous Bow;1788414884=War Story Bow
mask.balaclava 843976918=Burglar Mask;539536877=Burlap Brains Balaclava;10069=Desert Camo Balaclava;10071=Double Yellow Balaclava;884484239=Executioner Latex;10068=Forest Camo Balaclava;1175131736=Frankenstein Mask;813561728=Knitted Balaclava;858156568=Meat Mask;10057=Murica Balaclava;503161493=Murica Balaclava;856403207=Nerd Glasses;10075=Nightmare Balaclava;506771831=Nightmare Balaclava;10070=Red Check Balaclava;10054=Rorschach Skull;502924129=Rorschach Skull;1174877663=Rotten Scalp;807719156=Santa Balaclava;10090=Skin Balaclava;507590678=Skin Balaclava;539562549=Stitched Skin;10084=The Rust Knight;519942815=The Rust Knight;851779943=Toupee;10139=Valentine Balaclava;613057784=Valentine Balaclava;10111=Zipper Face;535666265=Zipper Face
innertube 13027=Camo;13028=Donut;13029=Horse;13030=Tire;13031=Unicorn;13032=Watermelon;13033=Zebra
jacket 2137516645=Blackout Jacket;10011=Blue Jacket;10012=Desert Jacket;834233801=Fire jacket;10009=Green Jacket;10015=Hunting Jacket;2350426469=Lilypichu Jacket;10013=Multicam Jacket;2296376871=No Mercy Jacket;10072=Provocateur Jacket;505424331=Provocateur Jacket;10010=Red Jacket;10008=Snowcamo Jacket;10014=Urban Camo Jacket;1317555901=Urban Ice Jacket
box.wooden.large 813269955=Ammo Box;1915836108=Ammo Crate;10124=Ammo Wooden Box;566336757=Ammo Wooden Box;1285113124=Aztec Gold Chest;1206100969=Aztec Trunk;2157494407=Beach Crate;1320924107=Bone Collector Box;1196352289=Box from Hell;1651859603=Box of Hearts;892062620=Cabin Chest;1261541803=Captain's Treasure;2108972947=Cargo Heli Large Box;1315566388=Carpenter's Chest;1362394666=Caution Crate;2012513964=CCTV Storage;1209454231=Charitable Rust 2017 Relief Crate;1565532295=Charitable Rust 2018 Box;1911972056=Charitable Rust 2019 Box;2289415427=Charitable Rust 2020 Box;1277330503=Childhood Toolbox;810383121=Christmas Holiday LWB;10122=Christmas Storage;571495390=Christmas Storage;854002617=Components Storage;1539262307=Creepy Box;1394363785=Cursed Pirate Treasure Chest;1740339091=Cursed Soul Chest;576569265=D.O.A Trunk;1199632980=Danger Box;1673157060=Dead Man's Chest;1116497962=Dead Pirates Chest;1753777701=Deep Sea Storage;1443958473=Defender Box;1627583152=Digital Security Box;1466559128=Divinity Chest;2248888457=Doodle Large Wooden Box;1617361106=Egiptu Box;1251062707=Eisensheet Box;798455489=Explosives Box;2320069344=Fairy Tale Box;2040458769=Farming Storage Box;942678679=Fire Hose Box;10123=First Aid Green;565253186=First Aid Green;882223700=First Aid Large Box;809975811=Food Box Large;1067191615=Forgotten Temple Box;1686299197=Freight Crate;2256347841=Ghostly Flame Box;1582501552=Gingerbread Box;2156384652=Glacial Visage Large Box;10141=Gun Box;624269671=Gun Box;1102266445=Hazard Crate;2106939007=Hieroglyphic Large Box;1766238308=Horseshoe Box;1306240898=Ichtaca Treasure Box;1192724938=Idolized Toolbox;2350415758=Jacksepticeye Storage;1524018833=Labyrinth Box;2165312390=Large Stickered Toy Car;797422750=Large Stone Box;1575872461=Large Suitcase;969292267=Leather Bound Trunk;1680678559=Leprechaun's Loot;1204070852=Lone Wolf Chest;904962497=Long Hauler's Trunk;1135412156=Loot Coffer;2144339321=Mechanic Tool Box;851053322=Medieval Box;928502682=Metropolitan Trunk;1882223552=Midnight Box;842083350=Military Crate;942917320=Mini Nuke Case;1900496901=Molten Visage Large Box;1630549771=Monster Box;1825978701=Morexo Tool Box;1212838382=Muertos Chest;2212102023=Nautical Storage Box;1795321839=Night Sky Large Box;1517816237=Oathbreaker Box;1557427113=Open Stone Box;1356773002=Ordnance Box;932160919=Padded Armor Trunk;1282838099=Pandora's box;1535990243=Peacemaker Box;1456233168=Pharaoh Mummy Box;1353721544=Ragnarok Trunk;1342462175=Railway Box;1973015940=Rat Chest;878850459=Recyclables Box;2172084040=Reprocessing Box;1727351952=Royal Loot;881249489=Royal Wooden Box;1169231428=Salvaged Cargo Box;1853539864=Scrap Heli Box;1269932286=Scrapper Storage Chest;1877231477=Shippy Crate;2249242717=Spirit Board Box;1886917011=Spooky Large Box;1840296976=Sunrise Box;2068850952=Supplies Box;2185190213=Tea Cargo Box;1447962258=Toxic Box;1936186181=Toy Box;978112601=Trash Box;1382429236=Trophy Pirate Chest;2323036838=Trust In Rust 3 Box;1926650593=Turntable Box;890915277=Urban Large Wood Storage;1119263507=Vaccine box;1547157690=Varangian Chest;854718942=Weapons Box;2311523302=Weather Large Wood Box;1159589238=Wyrm Chest;2012101320=XPOINT Ammo;2023776102=XPOINT Armor;2023770995=XPOINT Clothes;2017867878=XPOINT Components;2023780547=XPOINT Electrical;2017869441=XPOINT Medical;2049364586=XPOINT Metal Fragments;2031688330=XPOINT Misc;2039982308=XPOINT Stone;2049362180=XPOINT Sulfur;2012102778=XPOINT Tools;2012098446=XPOINT Weapons;2031113316=XPOINT Wood
burlap.gloves 1839312425=Apocalyptic Knight Leather Gloves;1100928373=Arctic Wolf Gloves;874488180=Army Armored Gloves;1406800025=Badboy Gloves;2199937414=Bee Cosplay Gloves;2009427605=Bio Integrity Gloves;816473273=Black Alligator;2090790324=Blackout Gloves;10128=Boxer's Bandages;565678598=Boxer's Bandages;883476299=Bruiser Gloves;1432966221=Cajun Gloves;904961862=Caravanner Gloves;1552705918=CCSC Gloves;2075536045=Cow Moo Flage Gloves;1960696487=Doodle Gloves;661317919=Duelist Gloves;1296614997=Firefighter Gloves;1633859273=Glory Gloves;938394833=Junklord Gloves;1394040487=Junkyard King Gloves;1196737780=Loot Leader Gloves;1368419860=Lumberjack Gloves;1448347837=Mad Rider Gloves;1395757825=Marsh Lurker Gloves;921030333=Merciless Gloves;1106600389=Metalhunter Gloves;610098458=Motorcycle Gloves;2304196579=No Mercy Gloves;1727356926=Playmaker Gloves;1864540635=Punkish Gloves;1993913813=Road Romeo Gloves;1111677889=Sky Seal Gloves;949616124=Space Rocket Work Gloves;962495909=Stalker Gloves;1623175153=Survivor Gloves;1865178625=Tactical Leather Gloves;1084390180=Tailgunner Gloves;1915956499=Training Gloves;961103399=Wasteland Hunter Gloves
locker 879343335=Army Locker;2058696685=Cargo Heli Locker;1328242213=Carpenter's Locker;1935027646=Christmas Locker;1901223959=Cobalt Personal Locker;1138218408=Cobalt Security Locker;879533969=Grid Locker;881997061=Muertos Locker;881411749=Permanent Detention;2242254710=Toxic Locker
tshirt.long 10047=Aztec Long T-Shirt;493015260=Aztec Long T-Shirt;801204141=Battle Worn Long TShirt;10004=Black Longsleeve T-Shirt;808300545=Christmas Elf;512107102=Christmas Jumper;10106=Creepy Jack;534635471=Creepy Jack;10050=Frankensteins Sweater;493860728=Frankensteins Sweater;10032=Green Checkered Shirt;500940007=Green Checkered Shirt;10005=Grey Longsleeve T-Shirt;566893368=Lawman;10118=Merry Reindeer;564242686=Merry Reindeer;10051=Nightmare Sweater;492980527=Nightmare Sweater;10006=Orange Longsleeve T-Shirt;1416787006=Rust Goalkeeper Shirt;10036=Sign Painter;492923278=Sign Painter;2351253871=Sykkuno Longsleeve TShirt;10042=Varsity Jacket;494178127=Varsity Jacket;10007=Yellow Longsleeve T-Shirt
longsword 1222939471=Aztec Macuahuitl;825169057=Danger Fork;796733487=Hot-tempered Longsword;831965423=Kryss Longsword;855009078=Wakizashi;825008040=Xtreme Sword
rifle.lr300 1621894466=Badlands LR-300;2100059186=Basebreaker LR;1741459108=Black Pearl LR300;2151920583=Blackout LR;1535995784=Bogeyman LR300;1239079767=Bone Grinder LR-300;1569062511=BullDozer LR300;1173523145=Bulletstorm;1553359638=Cold Hunter LR 300;1812045814=Cutesy LR300;1174458060=Daemon Strike;1604879931=Dead Ringer LR300;1225499752=Deathcore LR300;2304318648=Doodle LR;1725240606=Dynasty LR300;1883559335=Flyboy LR;1419392688=Fury Ex Red;1700177871=Holographic LR300;1612152593=Icarus LR300;1578816958=Ice Marine LR300;1660691287=Jungle Fighter LR-300 Stockless;1173459827=LR300 - Wild;1644715625=Marked for Death;1177273104=Mercenary Rifle;1264358358=Midway LR300;2092965663=Monster LR;1953108368=No Mercy LR300;2122513705=Optimist LR;2146248175=OVERDRIVE LR;2229046238=Paintball LR;1671985039=Phantom LR-300;1652362426=Pink Death LR300;1308037543=Polymer LR300;1779949198=Poseidon LR300;1635559091=Prancing Pony LR-300;1787012455=Project White Light;1176479716=Survivor LR-300;2319796265=Sweet Gift LR;2058268475=Talon LR;1481478360=Tempered Steel LR300;1967805281=Toy Blast LR;2195318269=Tween LR;2016313108=Uproar LR300;1282171260=Warhead LR300;1203322875=Wildfire LR-300;1906355162=Winter Ops LR
lmg.m249 1719536313=Bombshell M249;1740639585=CHROMA FLAIR;1707973294=Guerilla M249;1992981006=Love Machine;1831294069=Playmaker M249;1712378771=The Beast M249
rifle.m39 1708343082=Desert Warrior;1708365495=Devourer M39;1736532811=Metalhead M39;1720530850=Ornate M39;1707880195=Skull Seeker
metal.plate.torso 1805322456=Apocalyptic Knight Chest Plate;1787198707=Azul Metal Chest Plate;2229279338=Bee Cosplay Chestplate;1581353262=Berserk Chest Plate;2105505757=Blackout Chestplate;2304445825=Bombing Chest Plate;1969743263=Bombshell Chestplate;1711048020=Carrot Power Chestplate;832233112=Chainmail;842577956=Chest Resistance;1270065959=Conquistador Chest Plate;2092488087=Cow Moo Flage Chestplate;1753699785=Dead Souls Chest Plate;2005709642=Doodle Metal Chestplate;2226598382=Dread Chestplate;1335770974=Dwarf Chestplate;1993774875=Eat Me Chestplate;924019814=Engineer's Chest Plate;1886179838=Evil Pumpkin Chest;1934946028=Evil Snowman Chestplate;796728308=Flak Vest - Green;1349989767=Flyer Vest;794169855=Forest Camo Chest Plate;2013723517=Forsaken Era Chest Plate;2252998412=Franken-Chestplate;1771804406=Frostwulf Armor;1638812721=Glory Armor Chest;823132085=Hazardous Grater Chest Plate;944835223=Hornet Chestplate;1886922099=Horror Chest Plate;1575392727=Huntsman Chest Plate;2215911873=Kayak Vest;895066686=Looter's Chain and Plate;828888000=Machina Plate;817022417=Metal Barrel Chest Plate;1094522474=Metalhunter Chest Plate;2296501936=Monument Memories Chestplate;2352188221=Myth Chestplate;1586132318=Naughty Gingerbread Chestplate;2242200040=No Mercy Chestplate;1777967326=Northwind Chestplate;819160334=Oil Barrel Chest Plate;2193157606=Opulent Chest Plate;797410767=Plate Carrier - Black;1693641239=Playmaker Chest Plate;2100740608=Poison Armor Plate;1388861988=Precious Antiques Chestplate;798736321=Press Vest;1900842357=Punkish Chestplate;799657859=Racing Stripes Chest Plate;2001706617=RaidBot Chest Plate;2131557341=Raptor Chestplate;934627208=Retro Car Parts Chestplate;900807753=Salvaged Plating Armor;1353723648=Samurai Kozane Do;1587225313=Santa Chest Plate;970700662=Space Rocket Chest Plate;1845931269=Tactical Chestplate;2144720791=Test Dummy Chestplate;1932615190=Training Chest Plate;2178449205=Tribe Warrior Armor;1578628782=Troll Daddy Chest Plate;2059931054=Uproar Chestplate;1680452167=Vandal Chest Plate;1522963149=Wanderer's Chest Plate;1135168998=War Machine Chestplate;1113984430=Warface Chestplate;1421841596=Whaleman Chestplate
metal.facemask 1805321162=Apocalyptic Knight Facemask;901668040=Army Armored Facemask;832021670=Army Facemask;792649975=Aztek Night Hunter;1787201365=Azul Metal Facemask;2229280260=Bee Cosplay Facemask;1581351961=Berserk Facemask;784316334=Big Grin;2105454370=Blackout Facemask;799044333=Blingin Grill;821441043=BoltFace Metal Facemask;2304448562=Bombing Facemask;1969741836=Bombshell Facemask;835026584=Bronze War Mask;1121237616=Bruiser Facemask;831923884=Carbon Facemask;1711049678=Carrot Power Facemask;939788004=Clan Leader Mask;1270065112=Conquistador Face Mask;2092488951=Cow Moo Flage Facemask;1753711761=Dead Souls Facemask;792079554=Death Facemask;962694769=Deathwing Facemask;1092671728=Diesel Facemask;2005707226=Doodle Metal Facemask;2226597543=Dread Mask;1335769610=Dwarf Facemask;1993775723=Eat Me Facemask;1084823878=Elder's Metal Facemask;1886184322=Evil Pumpkin Facemask;1934943101=Evil Snowman Mask;915572534=Flesh Facemask;1349988105=Flyer Mask;2012095496=Forsaken Era Mask;2252919011=Franken-Facemask;807821375=Frostbite;1771714129=Frostwulf Mask;1638135398=Glory Mask;1172409741=Glowing Metal Pumpkin Mask;794837198=Glowing Skull;932233099=Heavy Industry;1886920683=Horror Facemask;812933296=Human Sacrifice Mask;881687672=Hunter Mask;1575391468=Huntsman Facemask;806983252=Industrial Protection Mask;899001394=Juggernaut Mask;2215908400=Kayak Helmet;1313529548=Legendary Gold Facemask;895067146=Looter's Mask;828888629=Machina Mask;1894591519=Maniac Facemask;841012325=Mask of Sacrifice;1083628316=Metalhunter Facemask;924019464=Metalmute Facemask;2296503845=Monument Memories Facemask;900645045=Mosaic Mask;1586135331=Naughty Gingerbread Facemask;2242198470=No Mercy Facemask;1777973800=Northwind Mask;2193149013=Opulent Mask;943128194=Overlord Mask;1693643930=Playmaker Facemask;2100738972=Poison Mask;1388857962=Precious Antiques Facemask;803894027=Punishment Mask;1900843064=Punkish Facemask;2001712636=RaidBot Facemask;2131549928=Raptor Facemask;903628875=Red Dead Jester;792905158=Rusted Smile;792827436=Sacrificial Mask;1353724450=Samurai Somen;1587225942=Santa Metal Facemask;1137533438=Savage Facemask;896211631=Scavenger Facemask;907176719=Scrapyard Curse;971433920=Space Rocket Face Mask;824898622=Stainless Facemask;816530945=Steampunk Leather Mask;915693648=Sunrise Metal Facemask;1845950558=Tactical Facemask;1130407273=Tank Crew Facemask;800980236=Tempered Mask;1203888714=Templar;2143679757=Test Dummy Mask;1932619423=Training Facemask;2178447488=Tribe Warrior Mask;1547874663=Troll Daddy Mask;2059935666=Uproar Facemask;1680454451=Vandal Face Mask;1522955755=Wanderer's Face Mask;1135160079=War Machine Mask;1113983678=Warface Mask;1421829383=Whaleman Facemask;832934294=Where Eagles Dare
hat.miner 886968007=Army Miner Hat;788260164=Train Conductor Miner's Hat;886318490=Workman's Safety Hat
smg.mp5 1137434899=Arctic Wolf MP5;1603970802=Batteries Not Included;2201971147=Bombshell Mp5;2172493867=BURNOUT;1693898215=Cold Hunter MP5;904404578=Dead Fish MP5;796679172=Digital Camo MP5;833639834=Elite Mp5;1637174724=Icarus MP5;796687275=Military Camo MP5;1865099372=No Mercy MP5;911612956=Nomad MP5;1673754411=Phantom MP5;808554348=Polymer MP5;892100306=Spitfire MP5;853438134=Tank MP5;800974015=Tempered Mp5;914624163=Urban Camo MP5;1654499223=Valentine MP5;1413917236=Wasp MP5;1084800708=Wild Flame MP5;1087199678=Wild Tiger MP5
paddlingpool 13034=Hot Tub;13035=Rainbow;13036=Sea Scape;13037=Spawn Pool
pants 1660293384=Airman Pants;1787243248=Apocalyptic Knight Pants;1100930207=Arctic Wolf Pants;888360095=Army Armored Pants;1961465777=Azul Pants;1406835139=Badboy Pants;2282181821=Base Invaders Pants;2192914821=Bee Cosplay Pants;1997534121=Bio Integrity Pants;2080977144=Blackout Pants;10001=Blue Jeans;10049=Blue Track Pants;490773561=Blue Track Pants;2295664263=Bombing Pants;2293180981=Bombshell Pants;1441311938=Brony Pants;1968533197=Buscador Pants;1432965178=Cajun Pants;909888619=Caravanner Pants;1987863036=Caution Workpants;1552705077=CCSC Pants;1911973450=Charitable Rust 2019 Pants;2289433771=Charitable Rust 2020 Pants;1371313777=Checkpoint Pants;1305364315=Chekist's Pants;1587846022=Christmas Gang Pants;1150816693=Conquistador Pants;2099701364=Conspiracy Nut Pants;2067568367=Cow Moo Flage Pants;1766646393=Cowboy Sheriff Pants;889714798=Desert Conqueror Pants;1950854989=Doodle Pants;2200988235=Dragon Pants;1581822078=Electrician Pants;2131787171=Elite Forest Camo Pants;1234956405=Explorer Pants;1296612316=Firefighter Pants;10019=Forest Camo Pants;2147367433=Garage Master Pants;2176989787=Hobo Pants;969289969=Huntsman Pants;1768737448=Jockey Pants;2215211982=Kayak Pants;1196747617=Loot Leader Trousers;1368418893=Lumberjack Pants;1448346336=Mad Rider Pants;1894589800=Maniac Pants;1385326314=Marsh Lurker Pants;1106596145=Metalhunter Pants;1700938224=Minicopter Pilot Pants;1740563572=No Mercy Pants;939586076=Nordic Beast Pants;1328753424=Northern Forester Pants;10078=Old Prisoner Pants;504687841=Old Prisoner Pants;823154911=One Percenter Chaps;1784474755=Operator Pants;2207291626=Opulent Pants;1356324187=Outlaws Pants;2022464363=Phantom Pants;1810590744=Playmaker Pants;2124531088=Poison Pants;1150763210=Predator Pants;1274163146=Prospector's Pants;10048=Punk Rock Pants;494003754=Punk Rock Pants;1858308973=Punkish Pants;1638743634=Railway Engineer Pants;1287193745=Revolution Jeans;1993902344=Road Romeo Pants;1927127023=Rocker Pants;2256110716=Rusteratu Pants;1936132863=Rustmas PJ Pants;1229552157=Santa's Helper Pants;1170988006=Savage Pants;1292094174=Scrapper Pants;1356749671=Seaman Pants;1111673876=Sky Seal Pants;10021=Snow Camo Pants;2138201022=Snow Warrior Pants;960252273=Stalker Pants;798690647=Steppe Camo Pants;1623181884=Survivor Pants;1883629284=Tactical Pants;975498827=Tailgunner Pants;1125254090=Tank Crew Pants;1703218418=Tough Bunny Pants;1740505052=Training Pants;2076980911=Uproar Pants;10020=Urban Camo Pants;1317553480=Urban Ice Pants;961084105=Wasteland Hunter Pants;2329782748=Winter Pants;955615160=Worker Pants;930559188=Yellow Racer Pants
pickaxe 904296143=Ancient Artifact Pick Axe;2068591788=Apocalyptic Pick Axe;2124297298=Chaos Pick Axe;1557509001=Cursed Treasure Pick Axe;1143157014=Damascus Steel Pickaxe;1911366896=Dragon Claw Pick Axe;1283807232=Elegant Pick Axe;1987871430=Emerald Relic Pick Axe;1320093416=Fenrir Pickaxe;828884658=Gold Digger;1407877776=Hazard Pick Axe;2328583396=Hunting Pick Axe;1083591199=Leather Pick Axe;1466675896=Machinery Pickaxe;2242717611=Meteorite Pick Axe;859743520=Military Pick Axe;1444912645=Montezuma Pick Axe;2093115622=Norse Pickaxe;949859819=Ornate Pick Axe;1435220253=Pharon Pick Axe;1150813747=Prospector's Pickaxe;2171468844=Rainbow Pony Pick Axe;1428399027=Raventale Pick Axe;1414450451=Regal Pick Axe;832799172=Rescue Pick Axe;1553326380=Runic Pick Axe;1377987815=Secret Zone Pick Axe;1845184191=Shadow of Death Pick Axe;1298797381=Shinobi Pick Axe;1362736707=Spec Ops Pickaxe;1872098938=Strange Fury Pick Axe;1780027581=Tactical Pick Axe;863455081=Tarnished Sun Pick Axe;1572401500=Taurus Pick Axe;1616992357=Tiki Pickaxe;1121521173=Tomb Pickaxe;1962080594=Toothed Pick Axe;1325483813=Virulent Pick Axe;1901442609=Warlord Pick Axe
shotgun.pump 10074=Chieftain Pump Shotgun;515716304=Chieftain Pump Shotgun;1115399868=Conquerer Shotgun;1553603344=Dead Ringer Pump Shotgun;964345579=Frostfire Shotgun;1153922437=Head Hunter Shotgun;1269617539=Loot Leader Shotgun;1666328139=Metalhead Pump Shotgun;1094741003=Modern Knight Shotgun;813631833=Native Gold;813628651=Native Yellow;1760154042=Pegasus;921253888=Polymer Pump Shotgun;1191938171=Problem Solver Stick;1476013941=Psychosis Pump;1132569603=Rebel Shotgun;1292063367=Royalty Pump Shotgun;1672954158=Spitfire Pump Shotgun;1652348929=Sweet Shot;850130444=Tank Pump Shotgun;849997025=The Billy Baroo;10140=The Swampmaster;639046335=The Swampmaster;1706897835=Troll Daddy Pump Shotgun;731119713=Urban Afterburn Pump Shotgun
pistol.python 1839518047=Aviator Python;1752928667=Azul Python;1631920728=Batteries Not Included Python;1457537882=Bite Python;1216163401=Black Mamba;2200875381=Cardboard Python;1421351634=Caution Python;1624620555=Celtic Python;1305704747=Cold Hunter Python;1228154190=Dark Silver Python;1215390635=Devourer;1563667918=Dragon's Spit;1455062983=Duelist's Python;1864788236=Dynasty Python;1217395562=Engraved Python;1914959779=Eternal Python;1373936691=Hellraiser Python;1406640269=Hollow Point Gifter;1265214612=Holy Python;1296687971=Hot Battle Steel;1342464644=Industrial Python;1335582211=Ivory Python;1917523660=Metal Beast Python;1435364672=Metalhead Python;1418647979=Morocco Python;1290876678=Necromancer Python;1445908611=Nitro Junkie Python;1812135451=No Mercy Python;1277518447=Outlaw Python;1605379554=Peacemaker Python;1364964220=Pearl Python;1461918011=Pegasus Python;1214609010=Phantom;1435858834=Pink Death Python;1328632407=Punk Python;1269667577=Relict Python;1796388607=Royal Python;1362224646=Sea Monster Python;1672707813=Skull Seeker Python;1356665596=Slaughter;1377347733=Smoking Python;2100486270=Stealth Python;1276136280=Steam Python;1529514494=Tempered Python;2025046773=Training Python;1223105431=Trausi's Python;2059988260=Venomous Shot;1235690536=Warstory Python;1258109891=Widowmaker Python
target.reactive 2255973811=Decoy Target;824001540=Led Light Target;791177585=On Target
pistol.revolver 910665268=Bandito Revolver;1901240954=Caution Revolver;2049887645=Choco-Revolver;1192708586=Death Viper;855087726=Defender;1235107237=Devourer Revolver;1265936882=Duelist Revolver;1141054826=Dynamo Revolver;815532676=Eightball;1517889157=Emerald Revolver;937338314=Firefighter Revolver;970737094=Forest Guardian Revolver;1536482422=Frankenstein Revolver;873242795=Frostbitten Revolver;2000389791=Gothic Revolver;809865395=Handmade Revolver;809822151=Hot-tempered Revolver;933056389=Junkyard Revolver;1448503557=Metalhead Revolver;1349358875=Necromancer Revolver;1580859157=Nuke Pistol;10114=Outback revolver;522224500=Outback revolver;809897611=Outlaw Revolver;1346870567=Party Pooper;911828654=Patriot Revolver;1235996786=Phantom Revolver;2340195521=Pharaoh's Revolver;1428863076=Pink Death Revolver;950956238=Pink Grunge;2312068016=Porcelain Revolver;1787802800=Pure Evil Revolver;1435664860=Radioactive Revolver;1161550991=Rebel Revolver;1309517474=Rebel Revolver;1408242038=Regal Revolver;1447877728=Sailor's Revolver;1099177489=Shamanism Revolver;973871108=Sting Revolver;1217455695=Tribal Revolver;887846629=Western Revolver Gold
riot.helmet 869125904=Biker Goth Helmet;930923611=Blast Shield Helmet;849872204=Born To Loot;1414953014=Bumble Bee Helmet;801095823=Captain's Helmet;937863435=Checkpoint Riot Helmet;911015530=Digger Helmet;1109466231=Furious Raider Riot Helmet;887283623=Hardline Helmet;920983864=Medical Riot Helmet;1784490572=Operator Helmet;950182163=Raider Helmet;1993881492=Road Romeo Helmet;869709888=Ruthless Riot Helmet;930563894=Yellow Racer Helmet
roadsign.jacket 953104456=Apocalypse Vest;1797481354=Apocalyptic Knight Vest;865659101=Army Sign Vest;1759481001=Azul Roadsign Vest;2120615642=Blackout Vest;2350092536=Bombing Roadsign Vest;1865210028=Bombshell Vest;801873550=British Sign Vest;2296713508=Cardboard Vest;1342125487=Caution Vest;2142378618=Centurion Vest;1442341176=Chaos Armored Vest;818611894=Chopshop Body Armor;1121456497=Cobalt Armor Vest;1102966153=Deathwing Vest;1251431494=Defender Vest;934926427=Desert Patrol Vest;1084394793=Diesel Roadsign Vest;1332334593=Dominator Vest;1986047563=Doodle Vest;1349940035=Dwarf Roadsign Vest;944577714=Epidemic Roadsign Vest;947950933=Freebooter Vest;1349163491=Full Metal Vest;784581113=Hazard Protection Vest;1380025789=Heavenly Legion Vest;1159597292=Heavy Alloy Vest;1740065674=Heavy Machinery Roadsign Vest;1944167671=Iceman Armor;879861502=Junker's Vest;934744263=Junkyard Samurai Vest;1269597852=Loot Leader Vest;1974808139=Lunar Armor Vest;1154446174=Mad Vest;1894379005=Metal Zombie Vest;1119760089=Metalhunter Roadsign Vest;2320209237=Mr. Gingerbread Vest;1539573170=Night Stalker Vest;2076262389=No Mercy Vest;892402754=Nordic Beast Vest;2199785536=Opulent Roadsign Vest;1438089648=Ornate Vest;2147211029=Oxums Racing Team Vest;953124938=Patchwork Cuirass;1441844877=Peacemaker Vest;1743991748=Phantom Vest;1098029034=Plywood Vest;950173158=Raider Roadsign Vest;1151219812=Saboteur's Vest;1248434418=Samurai Dou;1539651543=Scary Vest;974336556=Scrap Hazard Vest;1202977830=Scrapper Vest;1388417448=Snap Turtle Vest;1779981832=Solar Panel Vest;828175620=Spiked Metal Vest;1130406273=Tank Crew Roadsign Vest;1234957719=The Last Viking Vest;1906530247=Training Vest;1558586741=Troll Daddy Roadsign Vest;1130599258=Utilizer Vest;1400828574=Vandal Graffiti Vest;1442162947=Viking Armor Vest;932778217=Wasteland Legionnaire
roadsign.kilt 953112839=Apocalypse Kilt;1797483140=Apocalyptic Knight Kilt;865679836=Army Sign Kilt;1759482713=Azul Roadsign Pants;2120628865=Blackout Kilt;2350090284=Bombing Kilt;1865210905=Bombshell Kilt;801837047=British Sign Pants;2296714510=Cardboard Kilt;1342123902=Caution Pants;2142383374=Centurion Kilt;1442346890=Chaos Armored Pants;818612271=Chopshop Kilt;1121447954=Cobalt Armor Pants;1102986622=Deathwing Pants;1251419748=Defender Pants;934937654=Desert Patrol Pants;1084396407=Diesel Roadsign Pants;1332333384=Dominator Pants;1986050287=Doodle Kilt;1349943069=Dwarf Roadsign Pants;944586866=Epidemic Roadsign Pants;947949717=Freebooter Pants;1349158079=Full Metal Kilt;1657108026=Glory Kilt;784577443=Hazard Cover Pants;1380028657=Heavenly Legion Kilt;1159599284=Heavy Alloy Pants;1740068457=Heavy Machinery Roadsign Pants;1944165903=Iceman Kilt;879861153=Junker's Kilt;934742835=Junkyard Samurai Pants;1269612137=Loot Leader Pants;1974809731=Lunar Armor Pants;1154469089=Mad Pants;1894376712=Metal Zombie Kilt;1106569231=Metalhunter Roadsign Pants;794291485=Military Camo Roadsign Kilt;2320203004=Mr. Gingerbread Kilt;1539570583=Night Stalker Kilt;2076261294=No Mercy Kilt;892414125=Nordic Beast Kilt;2199787450=Opulent Roadsign Pants;1438090382=Ornate Pants;2147209635=Oxums Racing Team Pants;953123363=Patchwork War Kilt;1441848470=Peacemaker Pants;1737733590=Phantom Kilt;1723851847=Playmaker Kilt;1103687152=Plywood Kilt;950176525=Raider Roadsign Pants;1151205503=Saboteur's Pants;1248433379=Samurai Haidate;1353722661=Samurai Kusazuri;1539652650=Scary Kilt;974345761=Scrap Hazard Kilt;1202976443=Scrapper Kilt;1388416860=Snap Turtle Pants;1779983158=Solar Panel Pants;828173323=Spiked Metal Kilt;1915398061=Tactical Kilt;1130405286=Tank Crew Roadsign Pants;1906531526=Training Kilt;1558579257=Troll Daddy Roadsign Pants;1130610212=Utilizer Pants;1400837602=Vandal Graffiti Pants;1442167045=Viking Armor Pants
rock 2108583966=Acid Rock;1435229543=Adventurer's Rock;1209361016=Ancient World Rock;1084822722=Barb Wire Rock;1368454662=Best Friend;1636101879=Big Burger;1595910049=Dragon Egg;2313802668=Festive Pudding Rock;2350375831=Foil Ball;1530140666=Football Rock;864277659=Fresh Brain;858285362=Frozen Turkey;804791902=Gold Rock;2012371465=Golden Ore;1378500484=Gravel Rock;1693063715=Honeycomb;843429299=Hot Potato;971411353=Junkyard Rock;807372963=Meteorite;2200644593=Meteorite Rock;1617334269=Moon Light;1953527967=Morganite Rock;933809748=Mossy Fossil;1739062735=Mother's Day Rock;1205671322=My Only Friend;2154934029=Mystical Rock;2320435219=North Rock;2084257363=Obsidian Rock;1539197932=Pumpkin Rock;2187163489=Rainbow Stone;834287924=Ripe Watermelon;1838926976=Rooted Rock;1467090959=Shaman Rock;824904841=Shard of True Ice;1126754320=Sharptooth;2137102504=Sourdough Bread;1458528823=Swamp Rock
rocket.launcher 879708939=Aircraft Parts RL;813795591=Army Surplus Rocket Launcher;894679426=Beans Cannon;1936188783=Candy Launcher;1926503780=Dragon Launcher;1162978825=Glass Cannon;1657103887=Glory Rocket Launcher;1815384807=Gothic Reception;875930670=Hot Topic;853494512=KNOCK KNOCK;2268211267=Pixel Rocket Launcher;1839729563=Sea Monster Launcher;926279011=Surge Rocket Launcher;812737524=ThatGermanGuy Warhawk;1905848285=Totem Rocket Launcher;1162085821=Troglodyte;1137393412=Wood Barreled
rug 1637950966=Bandit Rug;1740724608=Blood & Fire;907327964=Rubber Hazard Mat;1461385713=Rust Island Car Rug;1225299046=Rustmas Rug;2179778281=Scientist Rug;871072156=Soviet Carpet;2156295778=Summer Rug;870851438=Tailor`s Carpet;1114718055=Tarp Rug
rug.bear 870446546=Panda Rug;2023982236=Teddy Bear Rug;2245825475=Werewolf Rug
icepick.salvaged 911446362=Dark Arts Icepick;820810719=Inferno Hazard Salvaged Icepick;844666224=Lavapick;933760454=Raven;1121804393=Rocket Scrap Salvaged Pickaxe;843454856=Runic Ice Pick;1276627079=Stinger Icepick;1124734833=Voodoo Daddy Icepick
salvaged.sword 1568609421=Buccaneer Blade;1587541456=Candybober Sword;1915832963=Double Blade;950134503=Fallen Knight;1652800384=Fire Slasher;1455468520=Grid Strike;1852787012=Helicopter Blade;828885909=Metal Roses Short Sword;1442148142=Oblivion Sword;2038180230=Pixel Sword;1442017029=Rainbow Sword;893871715=Roadsign Sword;969725237=Rusty Blade;1366123054=Saw Sword;1239660381=Scraptooth Sword;1154175800=Sheet Metal Sword;1283812544=Spartan Sword;1535765451=Tempered Sword;1212723513=Toothed Sword;930557072=Trained To Kill;1313755167=Trash Sword;825240467=Wooden Sword;1624719255=Zap Slasher
barricade.sandbags 809144507=Grandmother's Gift Barricade
explosive.satchel 855256664=Bad News;1934132095=Bad Santa Satchel;908893157=BadaBoom Satchel Charge;860156815=Box O Love;2172795318=Cargo Heli Satchel Charge;856333895=Close Enough;2315757321=DoorCracker;1586074827=Festive Surprise;2200482089=Legacy Satchel;855084816=Military Satchel Charge;1906259594=R.A.I.D. Satchel;855113878=Red Leather Day;1961769080=Satchelo;1710383765=Sweet Satchel
pistol.semiauto 902487409=Aircraft Parts SAP;1720501333=Aquamarine SAP;919535259=Armageddon SAP;883156158=Base Invaders SAP;924018875=Bitin' Dog SAP;937863988=Checkpoint SAP;876007573=Chrome SAP;1428766159=Cold-Forged Pistol;10087=Contamination Pistol;515313072=Contamination Pistol;1183693235=Croc Shot;1158943049=Demonic Pistol;863443112=Desert Hunter;953126981=Dime Bag SAP;910681058=Direct Threat SAP;1811814491=Dynasty SAP;1105853708=Faded SAP;1167255900=Fang;904356033=Fight Like a Girl;893118140=Fire Walk SAP;2041571172=Garden SAP;1121906926=Golden Dragon;805925675=Golden Leaf SAP;10108=Halloween Bat;539539196=Halloween Bat;1630961792=Holographic SAP;954520976=Khalifa SAP;1113544521=Last Eclipse SAP;830255284=LCD Marine Sidearm;899942580=Looter's SAP;853927198=Nightmare;1571099329=Nineties Zapper;950037016=Nishikigoi SAP;972059802=Oink SAP;830606037=Ol' Greasy;804337360=Paint Rush SAP;1328323548=Poison Jaws SAP;798375117=Polymer SAP;868298519=Poseidon Semi Auto Pistol;10081=Reaper Note Pistol;531196714=Reaper Note Pistol;10073=Red Shine Pistol;529604373=Red Shine Pistol;1446715780=Reptile SAP;908722214=Retro Car Parts SAP;827533196=Salt Shaker SAP;975102848=Silent Sting SAP;938007886=Soul Eater SAP;1118707296=Sting SAP;936623315=Sunrise SAP;829983759=Tehno Pistol;1553005167=Tempered SAP - Ornate;1092676141=Triad SAP;935205778=Yellow Racer SAP
rifle.semiauto 2222645873=Aborigene's SAR;1772028068=Anarchist SAR;828616457=Army SAR;1195821858=Aztec SAR;2193203225=Azul Sar;839302795=Bandito SAR;2131324289=Beach Day SAR;1168002579=Blood Dragon Rifle;1359059068=Buzzard SAR;1667097058=Candyman SAR;1385736095=Caution SAR;1818125194=Cobalt SAR;1616628843=Cold Hunter SAR;1652791742=Cupidon;1819195444=Diesel SAR;2171565192=Doodle SAR;1517644801=Drake SAR;2296659119=Elite Crate SAR;900921542=Fire Starter SAR;922119054=Forgotten Warfare SAR;1291766032=Freedom SAR;1395475969=Geartooth SAR;1936035303=Gingerbread SAR;959955205=Glory SAR;1448088345=Gold Phoenix SAR;1099992405=Gunsmith SAR;840023839=Hazard Semi Auto Rifle;1129722099=Hellcat SAR;1113987623=Hero's SAR;1217394290=Hot Rod SAR;1863834018=Imp SAR;1966875478=Lucky No.8 SAR;942919370=Meridian SAR;1621472496=Metalhead SAR;1429032578=Mojave SAR;2108652282=Monument Memories SAR;1098038362=Nightmare SAR;1788152335=No Mercy SAR;1576671137=Northwind SAR;2123641710=OPS SAR;1310522106=Payback SAR;1135415770=Pharaoh SAR;1876226129=Poseidon SAR;1522185915=Primal SAR;2249445756=Retrowave SAR;1446861251=Royal SAR;1182015913=Saboteur Rifle;2252306404=SAR from Hell;1170719113=SAR Scarecrow;1240340535=Scrapper SAR;1566048269=Sea Eater SAR;1298949573=Snakebite SAR;1933250593=Snowman Surprise SAR;1193105339=Soulburn SAR;1300239738=Soulkeeper SAR;875259741=Sublime SAR;1112906123=Suzy-Q SAR;1814170373=Tactical SAR;1313600286=Tiki SAR;899564368=To Hell And Back;2076615773=Training SAR;1279791283=Urban Light SAR;1300137383=Warbeast SAR;818613234=Workbench SAR
door.hinged.metal 1852469574=Ace Door;901194793=Ambulance Door;2131148230=Ancient Lore Door;1457845730=Ancient Totem Door;950560231=Antique Metal Door;836815358=Army Metal Door;1328395850=Artist's Door;1170684837=Aztec Door;1309566989=Aztec Gold Door;1415394917=Bandit Sheet Metal Door;1984902763=Bio Integrity Door;1313458951=Blacksmith's Door;1109694864=Blue Puzzle Door;1356364616=Boat House Door;1066783524=Brass Sentinel Door;1733664175=Broken Mirror Door;1290467327=Brutal Door;1952448742=Bull Rage Door;1362595551=Caution Door;1354718926=Chinook Fuselage Door;1412241247=Corinthian Door;2346936208=Corrupted Metal Door;1124738987=Dead Room Door;1653322594=Dead Valentine Door;1175547229=Death Crypt Door;1687047599=Deep Sea Door;1443957299=Defender Door;1466554259=Divinity Door;827190175=Doomsday Door;1539115581=Door of Flesh;948930384=Door to Death;1227441654=Dragon Relic Door;1565096963=Dreamer's Door;1599702939=Eagle Sheet Metal Door;1617363766=Egiptu Door;1213613030=Eisensheet Door;1759765099=El Dorado Door;1447671986=Emergency Exit Door;1260208160=Engineer's Door;1631261352=Evil Within;1852769999=Excavator Door;1707455661=Fallen Emperor Door;915684869=Fire Truck Door;1438420454=Flower Power Door;2282199805=Freedom Door;1281626747=Fretwork Door;1933669766=Gingerbread Door;942658960=Grey Fire Door;1294718018=Grid Door;1795304359=Guardian Door;1992539569=Guardians of the Heart;1176406578=Halloween Door;2255950540=Halloween House Door;2051016981=Happy Rabbit Door;849614068=Hazard Metal Door;1120339199=Hideout Door;2075130889=Hieroglyphic Metal Door;10189=Industrial Door;928503162=Jeweler's Security Door;1141051963=KEEP OUT;917719889=Laboratory Door;1524017223=Labyrinth Door;921076360=Locomotive Door;1205721755=Lost Hope Door;1211678957=Lost Metal Door;1239808532=Lost Treasure Door;2146923368=Mechanic Door;1356332123=Meltdown Metal Door;2264763191=Melted Blast Door;2200677375=MeowMeow Sheet Metal Door;832957536=Metal Shutter Door;959898495=Metalshop Scrap Door;1870735722=Midnight Door;922419554=Military Vehicle Door;2091097349=Molten Visage Metal Door;2116010484=Monitored Door;1747674239=Mosaic Door;1886472768=Mummy Door;1926577314=Musical Notes Door;1435254318=Night Sky Door;1587777999=Nutcracker;1680572723=Oil Rig Door;1999996993=Old Fighters Door;1812049396=Pirate Treasures Door;2009712630=Pixel Metal Door;1083653685=Polar Station Door;1514174191=Potty Door;1576050073=Power Door;859864870=Prison Door;1412186246=Pug Tower Door;1523940330=Quarantine Area;961909886=Quarantine Door;1342459239=Railway Door;1390896848=Rainbow Door;835119969=Recycled Garage Door;1383063240=Red Skull Door;2156515064=Riveted Summer Door;934924536=Roadsign Door;1772296521=Rocket Door;1727356485=Royal Door;1117884427=Salvaged APC Door;962391797=Salvation Door;2320063891=Santa's Door;1595324955=Santa's Front Door;897274189=School Bus Door;1306412169=Scrap Robot Door;1119310953=Scrap Tanker Door;883741993=Shipping Container Door;1839905607=Shippy & Friends Door;1587119000=Snowman Door;1362729705=Steel Pirate Door;1321264697=Submarine Door;1780241717=Sunrise Door;1401769919=Test Room Door;1447958101=Toxic Door;1380022034=Trophy Pirate Door;914869833=Truck Door;1328566466=Urban Night Door;2124140548=Wealthy Farmer Door;1845208821=Wild Owl Door;1448354224=Winged Guardian Door;1974769574=Year of the Rat Door
door.double.hinged.metal 1874961152=Ambulance Double Door;1900646657=Castle Double Door;1936126874=Doors to a Fairy Tale;1882782756=Double Door from Hell;1918077744=Dragon Door;1926125252=Earblaster Doors;2088339038=Eviction Double Door;1876575703=Global Freight Double Door;1904509199=Green Labs Door;2101572637=Horsemen of the Apocalypse Door;1895120296=Howling Double Door;1885983859=Jack Sheet Metal Double Door;2235414618=Lab Elevator Double Door;1883500337=Military Double Door;1911036760=Monster Double Door;1914299009=Oil Rig Double Door;2305997989=Pixel Metal Double Door;2253675722=Pumpkin Jail Double Door;2040477404=Red Barn Double Door;1926973479=Shippy & Friends Double Door
shirt.collared 885078753=Autumn Hunter's Shirt;797241160=Charitable Rust 2016 Shirt;802078252=Green Lumberjack;802073199=Red Lumberjack;819818852=Sergeant Shirt;809704306=Survival Shirt;801955689=The Blue Death
pants.shorts 794678401=Camo Shorts;793871235=Cutoff Shorts;818068257=Homemade Shorts;1412875829=Rust Footballer Shorts;1416779855=Rust Goalkeeper Shorts;799006291=Snow Camo Shorts
skullspikes 13050=Candles;13051=Pumpkin
skull.trophy 13052=Glass;13053=Glass 2;13054=Table
sled 13056=
sleepingbag 10121=Aston Christmas;558861217=Aston Christmas;1127084512=Bear Bag;10037=Blue Plaid Sleeping Bag;493375502=Blue Plaid Sleeping Bag;1296042340=Brony Bag;1165339422=Cannibal Survival Bag;1447956760=Captain's Bed;909889024=Caravanner Bedroll;10119=Christmas Bag;548925163=Christmas Bag;809186722=Christmas Holiday Bag;1152883867=Cobalt Survival Bag;1839630957=Comfortable Cardboard;1886931973=Comfortable Coffin;1711044880=Cozy Bunny Bag;1396600730=Crime Bag;2192906780=Desert Scout;1804347166=Dolphin Float;2347941731=Doodle Sleeping Bag;1709890051=Easter Bag;1140342335=Fisher Sleeping Bag;2131151567=Forest Camo Bag;1137518723=Freefolk Bedroll;539536110=Freshly Dug Grave;1818779860=Frostwulf Bed;1402402700=Golden Drake Sleeping Bag;10107=Horror Bag;535099192=Horror Bag;795398514=Jungle Camo Sleeping Bag;2215923791=Lifejacket Sleeping Bag;1991418530=Love Sack;2011695446=Monument Memories;1283724154=Muertos Sleeping Bag;1269426600=Nuke Bag;1466734204=Peacemaker Sleeping Bag;2329753984=Pitstop Bag;919353105=Ranger Bedroll;834487561=Red Survival Sleeping Bag;1624628815=Regeneration Program;2200870229=Retrowave Sleeping Bag;1986734890=Salvaged Hazmat Bag;1934818691=Santa's Bag;1586749954=Seasons Beatings;1858936313=Shippy Sleeping Bag;1102195403=Sleep Catcher;1565127136=Sleepover Bag;1174407153=Spooky Pumpkin Bed;2051263477=Spring Sleeping Bag;1132190812=Star Bedroll;1186393080=Supply Drop Sleeping Bag;1362261702=Survivor Bag;2185104012=Tea Bag;1773435398=Thermal Sleeping Bag;10077=Tiger Crown Sleeping Bag;514146546=Tiger Crown Sleeping Bag;1865305668=Toxic Sleeping Bag;944993672=Undead Bedroll;1906188254=Warboy Sleeping Bag;2303592013=Weather Sleeping Bag;2162368881=Winter Scout;10076=Wood Camo Sleeping Bag;494249390=Wood Camo Sleeping Bag;1228238024=Wood Sleeping Bag
jacket.snow 530154777=60's Army Jacket;10113=Black;913227043=Fireman's Jacket;530159711=Salvaged Shirt, Coat and Tie;839466039=Telogreika Jacket;10112=Woodland
stonehatchet 1438048408=Abstraction Stone Hatchet;1092741003=Ancient Gods Stone Hatchet;2228616112=Ancient Runic Stone Hatchet;1269563695=Artisan's Stone Hatchet;1117098080=Aztec Jade Hachet;2108830575=Bite Stone Hatchet;1114895505=Blood Feud;1559244155=Bone Dragon Hatchet;955692135=Bone Hatchet;887663210=Chieftain Stone Hatchet;1356232241=Dark Rite Stone Hatchet;1428010053=Dragon Glass Stone Hatchet;947950887=Fossil Tooth Hatchet;1788439811=Gemstone Hatchet;1058431260=Geode Hatchet;1395467841=Gravel Stone Hatchet;797445687=Ice Tooth;2275037516=Kids' Stone Hatchet;854688691=Large Fruit Pit Hatchet;1290344811=Megalodon Totem Hatchet;1184754750=Midas Hatchet;1906590340=Morganite Hatchet;1428438688=Mosaic Stone Hatchet;2084846275=Night Farmer Stone Hatchet;1340282993=Ritual Stone Hatchet;2138883683=Ruby Hatchet;1235107175=Sea Monster;1988082179=Silver Leaf Stone Hatchet;912599650=Soul Reaper Stone Hatchet;1196674526=Stonecraft Hatchet;1151551275=Tirbal Stone Hatchet;1306176753=Tree Killer;1342121150=Tribal Stone Hatchet;2171504484=Two Faced Stone Hatchet;1852290423=Vampire Stone Hatchet;878257758=Volcanic Stone Hatchet;1594996565=Winter Hatchet
stone.pickaxe 1100085862=Ancient Gods Stone Pickaxe;2228725445=Ancient Runic Pick Axe;1269582427=Artisan's Stone Pickaxe;1127557296=Aztec Jade Pick Axe;2108826652=Bite Stone Pick Axe;840380436=Bloody Tooth Pickaxe;1428014003=Dragon Glass Stone Pickaxe;1788447750=Gemstone Pickaxe;1395460858=Gravel Stone Pickaxe;886904592=Jawbreaker;2275036880=Kids' Stone Pick Axe;1290539482=Megalodon Totem Pickaxe;1906588860=Morganite Pick Axe;1428446680=Mosaic Stone Pick Axe;2084849175=Night Farmer Stone Pick Axe;2138887265=Ruby Pick Axe;1988077270=Silver Leaf Stone Pickaxe;1306179593=Stone Killer;1196675392=Stonecraft Pick Axe;1342118597=Tribal Stone Pickaxe;2171508439=Two Faced Stone Pickaxe;837149011=Uprising Stone Pickaxe;1852292345=Vampire Stone Pick Axe;1594886582=Winter Pickaxe
sunglasses 13040=Black Style 2;13043=Black Style 3;13041=Camo;13038=Chalk;13044=Chrome;13045=Gold;13042=Red;13039=Tortoise
tshirt 10130=Argyle Scavenger;490217825=Argyle Scavenger;10033=Baseball Tshirt;499455600=Baseball Tshirt;10003=Black Tshirt;14177=Blue Tshirt;851890495=Crossbone Crew;489329801=Facepunch TShirt;14181=Forest Camo Tshirt;10024=German Tshirt;10035=Hacker Valley Veteran;495902079=Hacker Valley Veteran;10046=Missing Textures TShirt;490948132=Missing Textures TShirt;10038=Murderer T-Shirt;492471488=Murderer T-Shirt;101=Red Tshirt;10025=Russia Tshirt;1412895302=Rust Footballer Shirt;10002=Sandbox Game Shirt;10134=Ser Winter TShirt;504919781=Ser Winter TShirt;489687236=Shadowfrax TShirt;10041=Skull & Bones TShirt;492781593=Skull & Bones TShirt;10053=Smile T-Shirt;492096219=Smile T-Shirt;10039=Target Practice T-Shirt;489878758=Target Practice T-Shirt;584379=Urban Camo;10043=Vyshyvanka Shirt;490236659=Vyshyvanka Shirt
table 875258582=Antique Dining Table;872346354=Off The Grid;909129983=Parquet Table
shirt.tanktop 784578916=Black Mesh Crop Top
smg.thompson 1772377862=Azul Thompson;1720001936=Devourer Thompson;1689944021=Glory Thompson;1345464512=Mysterious Cult Thompson;561462394=Santa's Little Helper;839819171=Wasteland Hunter
vending.machine 861029759=Army Vending Machine;862137836=Base Invaders;869474635=Brass Vending Machine;1335113551=Carpenter's Vending Machine;2018506223=Cobalt Coffee;1780228760=Cobalt Ice Cream;1161727529=Lavish Vending Machine;1927092059=Music Box;2146714479=Oxums Gas Pump;2311659818=Recycler Vending Machine;1373851317=Retro Vending Machine;860916780=Rox Black Vending Machine;862291005=RustyCola Machine;861548229=Sand Tone Vending Machine;2186443994=Tea Vending Machine;871927557=Urban Vending Machine
gun.water 13046=Green;13047=Grey;13048=Orange;13049=Yellow
water.purifier 886677071=Distillery;786826476=Radioactive Water Purifier;1796826334=Wooden Purifier
shotgun.waterpipe 1234721165=Apostate;1209128595=Blacksmith's Pipe;1274179291=Cannibal Tribe Musket;1168524895=Flaming Pipe;1851214164=Garden Pipe Shotgun;907070012=Hot Topic Waterpipe Shotgun;1320685736=Industrial Pipe Shotgun;1219492103=Junkyard Pipe;1250809355=KOI;1147084675=Luxuria;1421462560=Pirate Pipe;1693498234=Pure Evil;912464069=Riveted Pipe Shotgun;819137470=Rustpunk Scattergun;661319648=RustPunk Waterpipe Shotgun;1205464046=Sea Hunter Shotgun;10143=The Peace Pipe;633754963=The Peace Pipe;2268362982=Toy Shotgun;1181616781=Twisted Pipe;832764933=Western Waterpipe Shotgun
door.double.hinged.wood 1882487559=Pirate Ship Wooden Double Door;1876817741=Wind King Wooden Double Door
box.wooden 1865304630=Army Supply Box;2000024196=Cargo Heli Storage;1316294242=Carpenter's Small Box;2234050484=Cobalt Supply Box;2258758426=Day and Night Small Box;1212709764=Decorative Small Box;1455068496=Duelist's Wood Box;2051308391=Easter Bunny Small Box;787716105=First Aid Box;2329411820=Glacial Visage Small Box;2040776062=GMO Free Seed Box;1644263172=High Voltage Box;2268670063=Little Cloud Box;885103417=Medieval Small Wooden Box;2138650218=MILTAN Storage Box;1679876778=Oil Rig Storage Box;2186894702=Organic Berry Box;1529745641=Sea Supply Box;889212734=Seed Box;930694436=Small Medical Box;2146145661=Stickered Toy Car;1818868472=Toxic Hazard Box;1127078435=Treasure Crate;2255658925=Woodenstein
door.hinged.wood 1386052491=Alchemist Door;1733982448=Archer Door;1402178300=Artisan Wooden Door;1108316628=Barricaded Door;1932460590=Big Dreams Door;1100873539=Black Decorative Wood Door;838700836=Bleached Ebony Door;1320929144=Bone Collector Door;804991715=Christmas Tree Door;1605229872=Cobalt Wooden Door;1415059257=Cursed Wooden Door;809253752=Door to Heaven;1313604647=Dreamcatcher Door;2025017114=Eco Door;962427350=Forgotten Temple Door;1328425419=Fortified Castle Door;1539681696=Hell-o-ween Wooden Door;1666630991=Hut Door;2246937402=Jinx Wooden Door;1131650209=Lone Wolf Door;1269783329=Metal Tree Door;2229214032=Midgard Door;804854812=Old Heavy Wooden Door;1132144523=Ornate Wooden Door;1759874635=Pirate Hut Door;1415496136=Pirate Wooden Door;2135476099=Pixel Wooden Door;847902281=Porthole Door;1100886818=Red Decorative Wood Door;923763807=Riveted Wooden Door;1127631900=Sacrificial door;1886617093=The Growth Of Evil;2295055078=The Hunter and his Dog;1176899114=Trick Or Treat Door;1362500013=Vandal's Peace Door;1428632857=Viking Door;2348793011=Weather Wood Door;1260913194=Wisdom Door;950184212=Wise Door;1932737376=Wolf Den Wooden Door
1 item_shortname skins (id=name;id=name;...)
2 fun.guitar 809801196=Addicted Guitarist;826914904=Army Acoustic Guitar;809938266=Black Acoustic Guitar;844914652=No War Guitar
3 door.hinged.toptier 1228341388=Apocalypse Door;1206145767=Aristocratic Armored Door;1114020299=Armored Concrete;1402412287=Armored Mason Door;1414795168=Armored Scrapper Door;930478674=Armored Vault Door;1395469801=Blast Armored Door;948938468=Bunker Door;1557857999=Cargo Ship Security Door;869475498=Clockwork Portal;1176460121=Cobalt Graffiti Door;804286931=Corroded Bronze Door;911652483=Green Armored Container Door;1477263064=HellBunker Door;1376526519=Hellfire Portal;801889927=High Voltage;801937986=Incarceration Armored Door;933057923=Keep Out Armored Door;801831553=Laboratory Armored Door;1605324677=Mainframe Door;839925176=Military Armored Door;1999927543=Molten Visage Armored Door;809638761=No Escape;807729959=Radioactive Armored Door;1092678229=Safe Room Door;1135412861=TacCom Security Door;885928673=Urban Armored Door;2288730131=Weather Armored Door
4 door.double.hinged.toptier 1911994581=Charitable Rust 2019 Double Door;2318482252=Christmas Bunker Double Door;2254750609=Crypt Armored Double Door;1874611109=Hell Walker Double Armored Door;1925748582=Jester Armoured Double Door
5 rifle.ak 849047662=Agony Yellow;887494035=Aircraft Parts AK47;1359893925=AK Royale;1202410378=AK-47 From Hell;1372945520=AK-47 Victoria;859845460=Alien Red;1259716979=Anubis Ak47;1826520371=Apocalyptic Knight AK;1750654242=Azul AK47;2249370680=Basebreaker AR;809212871=Battle Scarred AK47;809190373=Battle-Scarred AKS47;1435827815=Beast of Industry;1112904406=Betty Lou AK47;2128372674=Blackout AR;1385673487=Brass Lion;1679665505=BullDozer AK47;2245084157=Candy Hunter AR;2041629387=Capitan's AR;2101560738=Cardboard AR;924020531=Cartagena AK47;1349512142=Caution AK47;2248879512=Chained Spirits AR;937864743=Checkpoint AK47;1196676446=Chivalry AK47;875130056=Claw AK47;1915393587=Cobalt Security AR;1174389582=Cobra;1583542371=Cold Hunter AK;1102750231=Conquerer AK47;840477492=Crimson King;1306351416=Crypt of Death AK47;885146172=Dark Flames;1137915903=Dead Pirate Rifle;1245563496=Death in Spades AK47;1349324364=Demonic AK47;1929819581=Desert Hawk AK47;1092674304=Diesel AK47;10135=Digital Camo AK47;615766181=Digital Camo AK47;2017002938=Doodle AK47;920472848=Doombringer AK47;2075372682=Dreamland AR;1804885723=Dynasty AK47;928950425=Epidemic AK47;1448221547=Etherya AK47;2319710097=Evil Snowman AR;939180121=Farseer AK47;940035827=Fate Destroyer;903882218=Frost Wolf;1476966011=Gearlord AK47;1588206436=Gingerbread AK;1167207039=Glorious AK;889710179=Glory AK47;1362212220=Gold Rush AK;1265322092=Golden Drake AK47;1364985829=Green Dragon AK47;1993279809=Heartbreaker AR;1599157678=Hell's Dogs;1575397458=Huntsman AK47;1886272847=Jack O Lantern - AK47;925720043=Jaws AK47;1272989639=King of the Jungle AK47;1434027951=Last Phoenix;908297014=Lonewolf AK47 - Blue;1213092632=Mandrill;1428980348=Marrakesh;1983066869=Memories AR;1457951707=Midnight Dream;10137=Military Camo AK47;618543834=Military Camo AK47;2085083014=Monument Memories AR;1338305091=Mystic AK47;2179386526=Neanderthal AR;1118706219=Night Howler AK47;1539318940=Nightmare AK47;1760078043=No Mercy AK47;1161844853=Panther AK47;1522034435=Phantom AK;1120500163=Piranha AK47;1685375084=Playmaker AK47;1549426268=Polymer AK47;2304993742=Porcelain AR;1907342157=Poseidon - AK47;2172715245=PulsAR;1870705926=Punkish AK47;911726740=Rabble Rouser AK47;2012334520=Rainbow AR;2059352465=Rainbow Pony AR;2108685486=Raptor AR;1252554814=Rebellion Assault Rifle;895307805=Retro Car Parts AK47;2268418002=Retrowave AR;1352844155=REX;1746886322=Royal AK47;1288866247=Rumble AK47;654502185=Rustpunk AK47;934891737=Sandstorm AK47;1175238674=Santa Muerte;1539409946=Scarecrow AK47;1372566409=Scorpion AK47;1277707212=Scrapper AK47;1396630285=Smolder;1076214414=Soul Taker AK47;1882821847=Sticker Pack AK47;1850236015=Sunken Treasure AK;2109182691=Sweet Poison AR;1539007965=T-Bone AK47;1230963555=Talon AK47;10138=Tempered AK47;566540646=Tempered AK47;1088459232=The Beast AK47;1129886223=The Beast Of The East;1124932043=The Reptile;1467269924=Toxic;2006878490=Training AR;1659781652=Troll Daddy AK;1402320927=Trophy Pirate AK47;2323019876=Trust In Rust 3 AR;2242791041=Underworld AR;1324932956=Urban Ice AK47;1140366289=War Machine AK47;2240088463=Wild Spirit AR;1159593268=Wyrm Rifle;1309470544=X-RAY AK47;2352506845=xQc Assault Rifle
6 mask.bandana 820870847=Beast Bandana;10061=Black Bandana;10060=Blue Bandana;1438048628=Burlap Bandit Bandana;10067=Checkered Bandana;2093051075=Creepy Bandana;10104=Creepy Clown Bandana;533328361=Creepy Clown Bandana;10066=Desert Camo Bandana;2051174405=Easter Bandit;1710737837=Egg Thief;10063=Forest Camo Bandana;10059=Green Bandana;903595865=Jawboy;10065=Red Skull Bandana;1323640876=Road Raider Bandana;1685873480=Salvaged Hazmat Bandana;1185794212=Santa Bandana;10064=Skull Bandana;10062=Snow Camo Bandana;10079=Wizard Bandana;521069222=Wizard Bandana
7 hat.cap 10029=Blue Cap;1565217605=Charitable Rust 2018 Cap;10027=Forest Camo Cap;10055=Friendly Cap;494030776=Friendly Cap;10030=Green Cap;10026=Grey Cap;1760269295=Jockey Cap;1137628492=Oxums Employee Cap;10028=Red Cap;10045=Rescue Cap;495026469=Rescue Cap;2276035673=Taxi Cap;890772638=Toothy Hat;893188334=Top Cap
8 beachchair 13000=Camo;13001=Flamingo;13002=Leaves;13003=Pizza;13004=Target;13005=Tarp;13006=ZenLabs
9 beachparasol 13007=Camo;13008=Flamingo;13009=Leaves;13010=Pizza;13011=Target;13012=Tarp;13013=ZenLabs
10 beachtowel 13014=Brown Stripes;13015=Brown Stripes;13016=Dyed;13017=Fish;13018=Shell;13019=Stripes;13020=Waves
11 hat.beenie 14180=Black Beenie Hat;10018=Blue Beenie Hat;10017=Green Beenie Hat;594202145=Gunner Beanie;10040=Rasta Beenie;501159601=Rasta Beenie;10016=Red Beenie Hat;10085=Winter Deers;519469651=Winter Deers
12 rifle.bolt 1852284996=Apocalyptic Knight Rifle;818403150=Army Bolt Rifle;1795984246=Azul Bolt Rifle;1535660827=Beauty Kills;1517933342=Bolt From Hell;1581664321=Caution Bolt Rifle;897023403=Deadly Rose BAR;10117=Dreamcatcher;516383225=Dreamcatcher;10115=Ghost Bolt Rifle;526539536=Ghost Bolt Rifle;933509449=Glory BAR;1687042408=Glory Rifle;1587273896=Granny's Bolt;875259050=Great War Service Rifle;943036098=Hunter's Bolt;2024514125=No Mercy Bolt Rifle;840105253=Polymer BAR;819149392=Rustpunk Rifle;972020573=Sandwar BAR;1592946955=Shark Rifle;947954942=Smuggler's BAR;1119629516=Steel and Brass BAR;1161165984=Survivor BAR;10116=Tundra Bolt Rifle;518199212=Tundra Bolt Rifle
13 bone.club 1557788243=Bone Scepter;810156739=Carved Club;2156399984=Ice Cream Club;791109245=Little Friend;2242052737=Little Nightmare;888839261=Maracas Bone Club;945026868=Sacrificial Club
14 deer.skull.mask 784259585=Demonic Deer Skull;1935631950=Rudolph Skull Mask;882204381=The Plague Doctor;837166252=Uprising Deer Skull Mask
15 knife.bone 808955868=Etched Edge Bone Knife;1277364396=Flesh Knife;909612594=Paititi Bone Knife;945031477=Sacrificial Knife;933322251=Studded Bone Knife
16 boogieboard 13021=Corrugated;13022=Crash Test;13023=Flames;13024=Marbled;13025=Shark;13026=Stars
17 hat.boonie 1438050325=Burlap Bandit Hat;1754286779=Cowboy Hat;1760060421=Cowboy Sheriff Hat;10058=Farmer Hat;503202816=Farmer Hat;2037650796=Farmer Straw Hat;587812040=Fisherman Boonie Hat;844289539=Flower Hat;2255866690=Gentleman's Fedora;1185551523=Hunted Hat;865054618=Leather Boonie Hat;833565406=PVC Hat
18 shoes.boots 1839313604=Apocalyptic Knight Boots;1100926907=Arctic Wolf Boots;882570089=Armored Boots;869090082=Army Armored Boots;826587881=Army Black Boots;10080=Army Boots;507940691=Army Boots;1406796292=Badboy Boots;2199934989=Bee Cosplay Boots;2009426933=Bio Integrity Boots;10023=Black Boots;2090776132=Blackout Boots;10088=Bloody Boots;513629119=Bloody Boots;1441308562=Brony Boots;1432967312=Cajun Boots;899942107=Caravanner Boots;838205144=Combat Boots;2075527039=Cow Moo Flage Boots;1960694026=Doodle Boots;919261524=Explorer Boots;1657109993=Glory Boots;784559403=Hazard Move Boots;1196740980=Loot Leader Boots;1395755190=Marsh Lurker Boots;1106548545=Metalhunter Boots;920390242=Muddy Boots;2304198263=No Mercy Boots;10034=Punk Boots;493534620=Punk Boots;1864539854=Punkish Boots;1995685684=Road Romeo Boots;613481881=Rock Star Boots;10044=Scavenged Sneaker Boots;493064563=Scavenged Sneaker Boots;1111680681=Sky Seal Boots;962503020=Stalker Boots;809586899=Tactical Boots;1915397286=Tactical Combat Boots;1084392788=Tailgunner Boots;10022=Tan Boots;1915955573=Training Boots;961096730=Wasteland Hunter Boots;944997041=Yellow Race Boots
19 bucket.helmet 831798567=Graffiti Bucket Helmet;926313433=Green Riveted Bucket Helmet;10127=Medic Helmet;570784227=Medic Helmet;1197730661=Punk Bucket;964461549=Road Cone Helmet;1073904216=Roasted Bucket Helmet;867605376=Rusty Bucket Helmet;784438982=Smilin' Jack;949889936=Sunrise Bucket Helmet;885450077=Super Happy Bucket;889767601=The King's Bucket;564826303=Wooden Bucket
20 burlap.headwrap 942098139=Anarchy;1691834772=Bandit Headwrap;896506958=Brotherhood Headwrap;861551572=Crimson Headwrap;2255857422=Death Mask;1694253807=Minicopter Pilot Helmet;868014709=Outlaw Headwrap;785890135=SandPrince;822358002=Shinobi Cowl
21 burlap.shirt 849866944=Biker Dad;1127407306=Blacksmith Shirt;809909900=Burlap and Leather Vest;1438049725=Burlap Bandit Shirt;654502725=Captain's Vest and Shirt;899941622=Caravanner Shirt;1755124648=Cowboy Shirt;926478499=Desert Outlaw Burlap Shirt;2039984110=Farmer Overalls Top;2255869247=Gentleman's Shirt;1294811936=It is Wednesday, my dudes;1394039696=Junkyard King Shirt;1354670586=Leopard Skin Shirt;1380044819=Pirate Shirt;10136=Pirate Vest & Shirt;585386820=Pirate Vest & Shirt;1145786859=Rioter's Jacket;1323654151=Road Raider Shirt;1229561297=Santa's Helper Shirt;882451685=Sleazy Rider;1294812700=Whens Whip?
22 burlap.shoes 906443871=Broken Ankles Cast;790679533=Burlap Ninja Slippers;2215057317=Fish Shoes
23 burlap.trousers 1127409880=Blacksmith Pants;1438049211=Burlap Bandit Pants;1755140135=Cowboy Pants;921250017=Desert Outlaw Burlap Pants;2039988322=Farmer Overalls Bottom;2255871111=Gentleman's Pants;1394040054=Junkyard King Pants;1354675665=Leopard Skin Pants;1380047706=Pirate Pants;809968188=Recycled Tarp Pants;1145780081=Rioter's Pants;1323664071=Road Raider Pants
24 chair 875258235=Antique Dining Chair;871339422=Danger Chair;1260443731=Glory Throne;897656037=Muerto Chair;2024586973=Night Sky Chair;871271807=Red Leather Chair;1147170604=Rusty Iron Throne;1154498476=Yellow Ornate Chair
25 coffeecan.helmet 848645884=Apocalypse Helmet;1797478191=Apocalyptic Knight Helmet;914060966=Army Armored Helmet;1759479029=Azul Helmet;2120618167=Blackout Helmet;2350097716=Bombing Helmet;1865208631=Bombshell Helmet;2296710564=Cardboard Helmet;1342122459=Caution Helmet;2142393198=Centurion Helmet;1445131741=Chaos Helmet;1121458604=Cobalt Armor Helmet;1251411840=Defender Helmet;938020581=Desert Patrol Helmet;1332335200=Dominator Helmet;1986043465=Doodle Helmet;1349946203=Dwarf Helmet;955675586=Epidemic Helmet;1349166206=Full Metal Helmet;1129809202=Funhouse Helmet;1380023142=Heavenly Legion Helmet;1740061403=Heavy Machinery Helmet;1944168755=Iceman Helmet;970583835=Junkyard Samurai Helmet;843676357=Lizard Skull;1269589560=Loot Leader Helmet;1974807032=Lunar Armor Helmet;1154453278=Mad Helmet;1894381558=Metal Zombie Helmet;1174375607=Metalhunter Can Helmet;2320222274=Mr. Gingerbread Helmet;1539575334=Night Stalker Helmet;2076260082=No Mercy Helmet;891592450=Nordic Beast Helmet;2199783358=Opulent Helmet;1438088592=Ornate Helmet;2147200135=Oxums Racing Team Helmet;1441850738=Peacemaker Helmet;1743856800=Phantom Helmet;1104118217=Plywood Helmet;948491992=Roadsign Warrior Helmet;806212029=Rusty Coffee Can Helmet;1151227603=Saboteur's Can Helmet;1248435433=Samurai Kabuto;1539650632=Scary Helmet;974321420=Scrap Hazard Helmet;1202978872=Scrapper Helmet;784910461=Skull Hazard;1388417865=Snap Turtle Helmet;1804649832=Solar Panel Helmet;814098474=Spare Parts;919595880=Sunrise Helmet;1906527802=Training Helmet;1130589746=Utilizer Helmet;1400824309=Vandal Graffiti Helmet;1442169133=Viking Helmet;809816871=Warboy Helmet;854460770=Welding Helmet
26 knife.combat 1730634130=Bronze Raven Knife;1706788762=Carbon Elite;1719795241=Combat Knife from Hell;1910941833=Dread Lord Knife;1738307827=Emerald Knife;1707332381=Emperor's Knife;1702783691=Glory Knife;1706692846=Nuke Combat Knife;1702530691=Phantom Knife;1739818618=Razor Knife;2187058228=Tea Ceremony Knife;1715608877=Thug Knife;1952506333=Toothed Knife
27 barricade.concrete 828182621=Metal Barricade;846663258=Military Barricade;924112225=Outpost Concrete Barricade;939333522=Railway Barricade;791070521=Road Barrier
28 crossbow 2136580235=Abyss Crossbow;915855989=Ancient Artifact Crossbow;2178956071=Blackout Crossbow;1565444858=Caution Crossbow;874268567=Chrome Crossbow;1961541693=Cloud Shot Crossbow;1772979668=Cold Hunter Crossbow;1242702498=Dead Man Crossbow;1390284445=Deep Water Crossbow;883141682=Doomwing Crossbow;818070371=Engraved Crossbow;1349337546=Gold Spirit Crossbow;1181976746=Gurkha Crossbow;1291686117=Hawk Crossbow;809964230=HazardCross;1466387739=Heart Shot;1699027694=Holy Trapper Crossbow;1428614422=Hunter's crossbow;1365706569=Huntsman Crossbow;1127389810=Lone Wulf Crossbow;1115959202=Mad Crossbow;1865294019=Mad Rider Crossbow;1421675342=Makeshift Crossbow;1184318659=Marauder;1739935284=Metal Lord Crossbow;1097642159=Northwind Crossbow;2059058861=One Shot Crossbow;2288242320=Phantom Crossbow;1269230939=Phoenix Crossbow;1089558546=POP Crossbow;1206661880=Primal Crossbow;2024146764=Rainbow Pony Crossbow;2193672354=Retrowave Crossbow;1328219905=Ronin;1701173429=Scrapper Crossbow;856029421=Tank Crossbow;1766369967=Tiki Crossbow;1559298697=Tooth Monster Crossbow;1367933148=Tribal Crossbow;1408631840=Trophy Pirate Crossbow;1810999666=Vampire Crossbow;1383105648=Victoria Crossbow;2316783823=Xmas Candy Crossbow
29 smg.2 1329096680=Afterburn SMG;820350952=Alien Relic SMG;820402694=Anarchy SMG;866745136=Bandito SMG;1081305198=Bone Shaman SMG;2186437441=Cloudshot SMG;1128840196=Dark Flames SMG;931547202=Engineer SMG;1185311263=Finish Line SMG;816728172=Firestarter Custom SMG;1839296742=Flyboy SMG;1805101270=Goldthorn SMG;897099822=Hailstorm SMG;892212957=Hunter SMG;904964438=Looter's SMG;1597038037=Metalhead SMG;2172135020=No Mercy SMG;1446184061=Pathogenesis;1961720552=Peacemaker SMG;1685722307=Phantom SMG;1198145190=Polymer SMG;1753609137=Poseidon SMG;1987573278=Rainbow Pony SMG;1114032911=Safari SMG;1107572641=Survivor SMG;854914986=Tank SMG;1523699528=Tempered SMG;2281845451=Toy SMG;822943156=tRUSTy Friend;970682025=Warpaint SMG
30 shotgun.double 916790605=Aircraft Parts DBS;865019380=Bespoke DBS;1448142776=Blunderbuss;1660175523=Brotherhood DBS;2059815527=Canned DBS;1119662164=Caution DBS;2118688615=DD Inc DBS;1680595474=Double Oil Pipe;1213074188=Double Trouble DBS;1378519774=Geartooth DBS;948113632=Grandfather DBS;1818232860=Happiness DBS;854987948=Heat Double Shotgun;1260964187=Hellion DBS;1522902588=Hippie Blaster;860153737=Industrial DBS;1414878365=Last Blast Twins;1295701369=Last Hero DBS;2107885378=Lighthouse DBS;1408050439=Mad DBS;1174675399=Military Boomstick;858957151=Nitro-Maniac DBS;1910558629=Pipeline DBS;1465627520=Predator DBS;1341524782=Protector DBS;1127266590=Quick Death DBS;1441939951=Raider's Shotgun;1870693079=Rat King DBS;1282137884=Saboteur DBS;1590495543=Santa's Blaster;1229950256=Santa's Boomstick;1277558450=Steam DBS;2249169000=Toy Blaster;1225880743=Vigilante DBS;1247696065=Whopper DBS;1616108563=Witchhunter DBS;1569952704=СМЭРТЬ
31 pistol.eoka 856053892=Banana Eoka;898387222=Birch Eoka;2032782073=Flare Eoka;1171935313=Flintlock;1174673119=Gurkha Eoka;926184643=Japanese Tanegashima;1413731110=Last Blast;920310954=Nordic Relic;857750032=Primal Gun
32 grenade.f1 836745325=Fire and Brimstone Grenade;936182773=Smile Grenade;1163186435=Unholy Grenade;815252048=Voodoo Grenade
33 fridge 869398873=Aircraft Parts Fridge;864918396=Biohazard Fridge;1759824768=Cobalt Cola Fridge;1927006810=Concert Speaker Fridge;2156206373=Ice Cream Freezer;1968311805=Portable Toilet;873612402=Urban Fridge;886416273=Victorian Food Vault
34 furnace 1260546874=Ancient Furnace;1335598661=Ancient Gods Furnace;1448350353=Ancient Totem Furnace;1247357204=Angry Furnace;1408433814=Artist's Furnace;1241065527=Aztec Furnace;2060469349=Bee Hive;1949401987=Bio Integrity Furnace;1645019295=Birch Furnace;1230386524=Blacksmith Furnace;1305332196=Brutal Furnace;1230680321=Cannibal Furnace;1701971555=Chocolate Bunny Furnace;1230975843=Christmas Furnace;1935093227=Cookie Maker Furnace;1457061230=Cursed Soul Furnace;1805182793=Deep Sea Furnace;1775718906=Demon Furance;1892656766=Demonic Stone Furnace;1384844042=Dragon Furnace;1975322284=Eastern Dragon Furnace;1632040649=Furious Volcano;1723387671=Furnace from Hell;1230272984=Furnace of the Shaman;1539005624=Ghostly Flame;2031915217=Greek Furnace;1652555216=Hearts Furnace;1865321291=Hell Forge;1391109786=Hellfire Furnace;1588458946=Home Sweet Home;2179924680=HQM Furnace;1260305347=Hydraulic Furnace;1427551950=Iron Calamity;1277616284=Iron Forge;2253998989=Jack-o'-lantern Furnace;1335260783=Junkyard Furnace;1583218948=Last Friend;1421455358=Mad Iron Furnace;1387619038=Marble Furnace;1992130386=Master's Furnace;1354629493=Medieval Fresco Furnace;2138871357=Metal Furnace;1377346304=Metalwork Flux Furnace;1320779999=Military Furnace;1354714819=Miner's Furnace;1630511618=Monster Furnace;1277183788=Mosaic Furnace;1936112920=Mr. Gingerbread;1810979800=Night Sky Furnace;1640730462=Octo Furnace;1636919294=Personal Lighthouse;1239083962=Potbelly Furnace;1356581838=Rainbow Furnace;1305743950=Ritual Furnace;1772650961=Royal Furnace;1587226587=Santa Furnace;1373663659=Scrap Face Furnace;1529559770=Sea Devil Furnace;2288536484=Shippy & Friends Furnace;2316854479=Silent Night;1230539924=Snowboy;1349367380=Soul Burner;1559242743=Spider Furnace;1539436979=Spooky Slime Furnace;2115314246=Sulfur Furnace;2198708104=Tiger Crown Furnace;1282172459=Totem Furnace;1458047080=Toxic Furnace;1367939983=Treasure Furnace;1575177513=Tribe Furnace;1261530424=Urban Furnace;1231071505=Victorian Furnace;1467078851=Wild Furnace;2193152729=Yummy Furnace;1587959070=Сhristmas Night
35 wall.frame.garagedoor 2317872477=Advent Calendar Garage Door;1398568170=Bandit Garage Door;1415167317=Brutal Jaws Garage Door;1334974046=Cargo Truck Garage Door;1772483395=Castle Gate;1617613419=Caution Garage Door;2010495833=CCTV Garage Door;2289421450=Charitable Rust 2020 Garage Door;1209586977=Checkpoint Door;2156585400=Chill Zone Garage Door;1180981036=Chop Shop Garage Door;1935858699=Christmas Tree Garage Door;1529742943=Cobalt Cargo Door;1805270622=Cobalt Quarantine;1186351868=Cobalt Space Door;1926583818=Concert Curtains;1415079530=Cursed Pirate Garage Door;1523814360=Danger Garage Door;2323315927=Dead Moroz;1788350229=Deep Sea Garage Door;1180968592=Defense Garage Door;1886876765=Dia De Los Muertos Garage Door;1649777840=Egiptu Garage Door;1575268855=Electro Garage Door;2238632740=Elevator Garage Door;1238292260=Factory Rolling Door;2041819488=Fresh Produce Garage Door;2222230165=Garage Door from Hell;1380090862=GNH-315;1529558717=Gun Lord Door;2123310382=HappyLand Garage Door;1539143998=House of Horror;2186094580=Laboratory Rolling Door;1465843732=Longtail Garage Door;1856195647=Love Nest;1968391406=Marine Blast Door;2146118486=Mechanic Garage Door;1871289078=Military Bunker Door;1871289078=Military Bunker Door;1645407409=Minicopter Hangar Door;1461027316=Monster Garage Door;1819106723=Morexo Garage Door;2255437587=Neon Pumpkin Garage Door;2014975420=Pixel Garage Door;2351178062=Pokimane Garage Door;2155588318=Raider's Cove Garage Door;1309406283=Reactor Room 3 of 10;1804915784=Resist Garage Door;2006000003=Revolution Garage Door;1183127702=Rolling Exit Door;1733848365=Royal Garage Door;1759641728=Rust Rider Door;1358030533=Sailor's Garage Door;1826250647=Shippy Garage Door;1747024635=Steer Clear;1839473397=Street Meat Door;1973756459=Street Rat;2101163537=Toxic Garage Door;1306203844=Trash Garage Door;2111916381=uMod Fundraiser Garage Door;1846000839=Vandalized Shop Door;1428456080=War Door;1680120997=ZENLABS Garage Door
36 hammer 1249500235=Aztec Jade Hammer;1539336419=Braineater Hammer;938806184=Builders Guild Hammer;2115359138=Building Block Hammer;1457914371=Calamity Hammer;1128710439=Dead Hammer;1208606722=Frost Hammer;1858261101=Fuel Hammer;1116103194=God Of Builders Hammer;1652017472=Heart of the Creator;1120977731=Kitchen Tile Hammer;1916000340=Morganite Hammer;1125995819=Museum Raider Hammer;1720644451=Mystic Hammer;1876980303=Night Sky Hammer;1884786335=Pumpkin Hammer;1095969830=Riveted Hammer;833423263=Scorched Hammer;2076299603=Silver Leaf Hammer;1586965130=Snowman Hammer;961294045=Trap Base Weaver;2138245748=Watermelon Ice Cream Hammer;822539548=Welded Hammer
37 hatchet 892263562=Ancient Artifact Hatchet;2068589541=Apocalyptic Hatchet;1145547996=Beast Hunter Hatchet;2124287244=Chaos Hatchet;1546404025=Cursed Treasure Hatchet;1143274085=Damascus Steel Hatchet;1911293067=Dragon Claw Hatchet;1171956705=Eater Hatchet;1987865546=Emerald Relic Hatchet;1320099240=Fenrir Hatchet;814630559=Firefighter Hatchet;1252014044=Full Metal Hatchet;824552943=Golden Axe;1290169302=Hatchet of Antiquities;1407875352=Hazard Hatchet;950020589=Hunter Hatchet;2328580814=Hunting Hatchet;924242197=Iron Jaws Hatchet;915910717=Iron Wing;1082302323=Leather Hatchet;1095577423=Macbeth Hatchet;1466664834=Machinery Hatchet;2242722277=Meteorite Hatchet;816715928=Military Hatchet;962959509=Modern Lumberjack Hatchet;2093114444=Norse Hatchet;967413298=Notorious Hatchet;944497252=Ornate Axe;1435214632=Pharon Hatchet;1076337199=Polynesian War Axe;1150815053=Prospector's Hatchet;1108554409=Raider Hatchet;2171464647=Rainbow Pony Hatchet;1422179740=Raventale Hatchet;1448232793=Reaper Hatchet;910196839=Red Chopper;953186726=Refined Hatchet;1414446668=Regal Hatchet;912857899=Replacement Blade Hatchet;1379766114=Road Hatchet;1553321287=Runic Hatchet;1242774466=Scrapper Hatchet;1378023158=Secret Zone Hatchet;1838326907=Shadow of Death Hatchet;1291775183=Shinobi Hatchet;1220880032=Siege Breaker;1247701169=Snow Valley Hatchet;1152712210=Soul Collector Hatchet;1193102490=Soulburn Hatchet;1362737705=Spec Ops Hatchet;1107210636=Spider King Hatchet;1710517158=Spring Hatchet;1870596204=Strange Fury Hatchet;928879549=Sunrise Hatchet;1137482995=Survivor Hatchet;1359120832=Survivor's Hatchet;1772892883=Tactical Hatchet;1572398539=Taurus Hatchet;1617000027=Tiki Hatchet;1121515438=Tomb Hatchet;1962083351=Toothed Hatchet;1092131816=Tribal Hatchet;826402867=Veteran Hatchet;814713259=Vikings Tomahawk;825033005=Vintage Hatchet;1325481133=Virulent Hatchet;1620492374=Virus Hatchet;1900587737=Warlord Hatchet;1258108678=Widowmaker Hatchet
38 hazmatsuit 10180=Spacesuit
39 twitch.headset 13055=Purple Headset
40 attire.hide.boots 785347695=Native American Hide Shoes;1230633097=Rudolph Slippers;837175591=Uprising Hide Shoes
41 attire.hide.helterneck 798669794=Caution Tape Top;845019310=Leopard Top
42 attire.hide.pants 1269154354=Tribesman Hide Pants;837179220=Uprising Hide Pants
43 attire.hide.poncho 833524594=Camo Netting;788732722=Grey Wolf Hide Poncho;825459163=Toymaker Poncho;1269162578=Tribesman Poncho;837191793=Uprising Hide Poncho
44 attire.hide.skirt 831920129=Blue Tarp Skirt;793180528=Irish Kilt
45 attire.hide.vest 878319804=Celtic Hide Shirt;1269172413=Tribesman Hide Shirt
46 hoodie 1660290744=Airman Hoodie;1787216403=Apocalyptic Knight Hoodie;1100931254=Arctic Wolf Hoodie;897890977=Army Armored Hoodie;2351687115=AuronPlay Hoodie;1961464025=Azul Hoodie;1408832378=Badboy Hoodie;2282178792=Base Invaders Hoodie;10142=BCHILLZ! Hoodie;626133126=BCHILLZ! Hoodie;2192919905=Bee Cosplay Hoodie;1997532879=Bio Integrity Hoodie;14179=Black Hoodie;2080975449=Blackout Hoodie;10052=Bloody Hoodie;492800372=Bloody Hoodie;14178=Blue Hoodie;2295666190=Bombing Hoodie;2293185782=Bombshell Hoodie;1373714814=Brony Hoodie;1968538819=Buscador Hoodie;1432964453=Cajun Hoodie;2000507925=Caution Hoodie;1552703337=CCSC Hoodie;1209453497=Charitable Rust 2017 Hoodie;1564974974=Charitable Rust 2018 Hoodie;1911980598=Charitable Rust 2019 Hoodie;2289427434=Charitable Rust 2020 Hoodie;1371314541=Checkpoint Hoodie;1305321596=Chekist's Hoodie;1587744366=Christmas Gang Hoodie;1150818496=Conquistador Hoodie;2099705103=Conspiracy Nut Hoodie;2067569919=Cow Moo Flage Hoodie;1766644324=Cowboy Sheriff Hoodie;10133=Cuda87 Hoodie;619935833=Cuda87 Hoodie;904963081=Denim Studded Hoodie;889718910=Desert Conqueror Hoodie;1950853975=Doodle Hoodie;2200988844=Dragon Hoodie;1581817010=Electrician Hoodie;2131784896=Elite Forest Camo Hoodie;1234693807=Explorer Hoodie;1296608954=Firefighter Hoodie;954392337=Gang Leader Hoodie;2147365537=Garage Master Hoodie;14072=Green Hoodie;2176988889=Hobo Hoodie;959900137=Huntsman Hoodie;1768733505=Jockey Hoodie;2215209664=Kayak Hoodie;895065994=Leather Strapped Hoodie;1196751864=Loot Leader Hoodie;914621940=Looter's Hoodie;2349487658=Ludwig Hoodie;1368417352=Lumberjack Hoodie;1448343881=Mad Rider Hoodie;1894585931=Maniac Hoodie;1385322661=Marsh Lurker Hoodie;1106582025=Metalhunter Hoodie;1700935391=Minicopter Pilot Jacket;1740562395=No Mercy Hoodie;939604165=Nordic Beast Hoodie;1328751626=Northern Forester Hoodie;797128321=Official Vertiigo Hoodie;1784482745=Operator Hoodie;2207288699=Opulent Hoodie;1356328924=Outlaws Hoodie;2022463110=Phantom Hoodie;1810592176=Playmaker Hoodie;2124528682=Poison Hoodie;1150760640=Predator Hoodie;1274163900=Prospector's Hoodie;1858310941=Punkish Hoodie;1638742127=Railway Engineer Hoodie;661319427=Ranger's Vest;919353761=Regulator's Hoodie;1282111884=Revolution Hoodie;10132=Rhinocrunch Hoodie;612956053=Rhinocrunch Hoodie;1993891915=Road Romeo Jacket;1927124747=Rocker Jacker;971807764=Rocket Factory Crew Hoodie;2256109331=Rusteratu Hoodie;1936131747=Rustmas PJ Hoodie;10129=Safety Crew;539943199=Safety Crew;1170989053=Savage Jacket;1292091712=Scrapper Hoodie;835836079=Scudpunk Hoodie;1356748246=Seaman Hoodie;2349484905=Shroud Hoodie;10086=Skeleton Hoodie;519147220=Skeleton Hoodie;1111669350=Sky Seal Hoodie;2138199381=Snow Warrior Hoodie;959641236=Stalker Hoodie;1623185000=Survivor Jacket;1883624383=Tactical Hoodie;975500312=Tailgunner Hoodie;677636990=Tank Crew Hoodie;1703216433=Tough Bunny Hoodie;1740503746=Training Hoodie;2182271278=Trust in Rust Hoodie;803249256=Unknown Territory Hoodie;2076428294=Uproar Hoodie;1317554978=Urban Ice Hoodie;961066582=Wasteland Hunter Hoodie;2329780962=Winter Hoodie;954947279=Worker Hoodie;941172099=Yellow Police Jacket;926162531=Yellow Racer Hoodie
47 bow.hunting 2108510511=Abyss Bow;2192571819=Blackout Bow;1773297889=Bushi Zhe Hunting Bow;2046137724=Chocolate Hunter Bow;1988012822=Cloud Shot Bow;2275810551=Dragon Bow;1926862937=Dread Lord Hunting Bow;1846220912=Golden Leaf Bow;1818588701=Heavy Machinery Bow;1793915047=Hunting Bow from Hell;2341845629=Jade Bow;1747542198=Metalhead Bow;1729920243=Native Hunting Bow;1759967280=Northwind Bowmaster;2032574584=One Shot Bow;1729629485=Phantom Bow;1984690140=Pink Death Bow;1734427277=Resin Bow;2229211780=Retrowave Bow;2312049369=Rising Moon Bow;1729683309=Scrapper Bow;2085489622=Seafarer Hunting Bow;1883523860=Sunken Treasure Bow;1885852817=The Bone Bow;2164997891=Tribe Hunting Bow;1974088369=Triumph Bow;1876857585=Vampire Bow;2185750735=Venomous Bow;1788414884=War Story Bow
48 mask.balaclava 843976918=Burglar Mask;539536877=Burlap Brains Balaclava;10069=Desert Camo Balaclava;10071=Double Yellow Balaclava;884484239=Executioner Latex;10068=Forest Camo Balaclava;1175131736=Frankenstein Mask;813561728=Knitted Balaclava;858156568=Meat Mask;10057=Murica Balaclava;503161493=Murica Balaclava;856403207=Nerd Glasses;10075=Nightmare Balaclava;506771831=Nightmare Balaclava;10070=Red Check Balaclava;10054=Rorschach Skull;502924129=Rorschach Skull;1174877663=Rotten Scalp;807719156=Santa Balaclava;10090=Skin Balaclava;507590678=Skin Balaclava;539562549=Stitched Skin;10084=The Rust Knight;519942815=The Rust Knight;851779943=Toupee;10139=Valentine Balaclava;613057784=Valentine Balaclava;10111=Zipper Face;535666265=Zipper Face
49 innertube 13027=Camo;13028=Donut;13029=Horse;13030=Tire;13031=Unicorn;13032=Watermelon;13033=Zebra
50 jacket 2137516645=Blackout Jacket;10011=Blue Jacket;10012=Desert Jacket;834233801=Fire jacket;10009=Green Jacket;10015=Hunting Jacket;2350426469=Lilypichu Jacket;10013=Multicam Jacket;2296376871=No Mercy Jacket;10072=Provocateur Jacket;505424331=Provocateur Jacket;10010=Red Jacket;10008=Snowcamo Jacket;10014=Urban Camo Jacket;1317555901=Urban Ice Jacket
51 box.wooden.large 813269955=Ammo Box;1915836108=Ammo Crate;10124=Ammo Wooden Box;566336757=Ammo Wooden Box;1285113124=Aztec Gold Chest;1206100969=Aztec Trunk;2157494407=Beach Crate;1320924107=Bone Collector Box;1196352289=Box from Hell;1651859603=Box of Hearts;892062620=Cabin Chest;1261541803=Captain's Treasure;2108972947=Cargo Heli Large Box;1315566388=Carpenter's Chest;1362394666=Caution Crate;2012513964=CCTV Storage;1209454231=Charitable Rust 2017 Relief Crate;1565532295=Charitable Rust 2018 Box;1911972056=Charitable Rust 2019 Box;2289415427=Charitable Rust 2020 Box;1277330503=Childhood Toolbox;810383121=Christmas Holiday LWB;10122=Christmas Storage;571495390=Christmas Storage;854002617=Components Storage;1539262307=Creepy Box;1394363785=Cursed Pirate Treasure Chest;1740339091=Cursed Soul Chest;576569265=D.O.A Trunk;1199632980=Danger Box;1673157060=Dead Man's Chest;1116497962=Dead Pirates Chest;1753777701=Deep Sea Storage;1443958473=Defender Box;1627583152=Digital Security Box;1466559128=Divinity Chest;2248888457=Doodle Large Wooden Box;1617361106=Egiptu Box;1251062707=Eisensheet Box;798455489=Explosives Box;2320069344=Fairy Tale Box;2040458769=Farming Storage Box;942678679=Fire Hose Box;10123=First Aid Green;565253186=First Aid Green;882223700=First Aid Large Box;809975811=Food Box Large;1067191615=Forgotten Temple Box;1686299197=Freight Crate;2256347841=Ghostly Flame Box;1582501552=Gingerbread Box;2156384652=Glacial Visage Large Box;10141=Gun Box;624269671=Gun Box;1102266445=Hazard Crate;2106939007=Hieroglyphic Large Box;1766238308=Horseshoe Box;1306240898=Ichtaca Treasure Box;1192724938=Idolized Toolbox;2350415758=Jacksepticeye Storage;1524018833=Labyrinth Box;2165312390=Large Stickered Toy Car;797422750=Large Stone Box;1575872461=Large Suitcase;969292267=Leather Bound Trunk;1680678559=Leprechaun's Loot;1204070852=Lone Wolf Chest;904962497=Long Hauler's Trunk;1135412156=Loot Coffer;2144339321=Mechanic Tool Box;851053322=Medieval Box;928502682=Metropolitan Trunk;1882223552=Midnight Box;842083350=Military Crate;942917320=Mini Nuke Case;1900496901=Molten Visage Large Box;1630549771=Monster Box;1825978701=Morexo Tool Box;1212838382=Muertos Chest;2212102023=Nautical Storage Box;1795321839=Night Sky Large Box;1517816237=Oathbreaker Box;1557427113=Open Stone Box;1356773002=Ordnance Box;932160919=Padded Armor Trunk;1282838099=Pandora's box;1535990243=Peacemaker Box;1456233168=Pharaoh Mummy Box;1353721544=Ragnarok Trunk;1342462175=Railway Box;1973015940=Rat Chest;878850459=Recyclables Box;2172084040=Reprocessing Box;1727351952=Royal Loot;881249489=Royal Wooden Box;1169231428=Salvaged Cargo Box;1853539864=Scrap Heli Box;1269932286=Scrapper Storage Chest;1877231477=Shippy Crate;2249242717=Spirit Board Box;1886917011=Spooky Large Box;1840296976=Sunrise Box;2068850952=Supplies Box;2185190213=Tea Cargo Box;1447962258=Toxic Box;1936186181=Toy Box;978112601=Trash Box;1382429236=Trophy Pirate Chest;2323036838=Trust In Rust 3 Box;1926650593=Turntable Box;890915277=Urban Large Wood Storage;1119263507=Vaccine box;1547157690=Varangian Chest;854718942=Weapons Box;2311523302=Weather Large Wood Box;1159589238=Wyrm Chest;2012101320=XPOINT Ammo;2023776102=XPOINT Armor;2023770995=XPOINT Clothes;2017867878=XPOINT Components;2023780547=XPOINT Electrical;2017869441=XPOINT Medical;2049364586=XPOINT Metal Fragments;2031688330=XPOINT Misc;2039982308=XPOINT Stone;2049362180=XPOINT Sulfur;2012102778=XPOINT Tools;2012098446=XPOINT Weapons;2031113316=XPOINT Wood
52 burlap.gloves 1839312425=Apocalyptic Knight Leather Gloves;1100928373=Arctic Wolf Gloves;874488180=Army Armored Gloves;1406800025=Badboy Gloves;2199937414=Bee Cosplay Gloves;2009427605=Bio Integrity Gloves;816473273=Black Alligator;2090790324=Blackout Gloves;10128=Boxer's Bandages;565678598=Boxer's Bandages;883476299=Bruiser Gloves;1432966221=Cajun Gloves;904961862=Caravanner Gloves;1552705918=CCSC Gloves;2075536045=Cow Moo Flage Gloves;1960696487=Doodle Gloves;661317919=Duelist Gloves;1296614997=Firefighter Gloves;1633859273=Glory Gloves;938394833=Junklord Gloves;1394040487=Junkyard King Gloves;1196737780=Loot Leader Gloves;1368419860=Lumberjack Gloves;1448347837=Mad Rider Gloves;1395757825=Marsh Lurker Gloves;921030333=Merciless Gloves;1106600389=Metalhunter Gloves;610098458=Motorcycle Gloves;2304196579=No Mercy Gloves;1727356926=Playmaker Gloves;1864540635=Punkish Gloves;1993913813=Road Romeo Gloves;1111677889=Sky Seal Gloves;949616124=Space Rocket Work Gloves;962495909=Stalker Gloves;1623175153=Survivor Gloves;1865178625=Tactical Leather Gloves;1084390180=Tailgunner Gloves;1915956499=Training Gloves;961103399=Wasteland Hunter Gloves
53 locker 879343335=Army Locker;2058696685=Cargo Heli Locker;1328242213=Carpenter's Locker;1935027646=Christmas Locker;1901223959=Cobalt Personal Locker;1138218408=Cobalt Security Locker;879533969=Grid Locker;881997061=Muertos Locker;881411749=Permanent Detention;2242254710=Toxic Locker
54 tshirt.long 10047=Aztec Long T-Shirt;493015260=Aztec Long T-Shirt;801204141=Battle Worn Long TShirt;10004=Black Longsleeve T-Shirt;808300545=Christmas Elf;512107102=Christmas Jumper;10106=Creepy Jack;534635471=Creepy Jack;10050=Frankensteins Sweater;493860728=Frankensteins Sweater;10032=Green Checkered Shirt;500940007=Green Checkered Shirt;10005=Grey Longsleeve T-Shirt;566893368=Lawman;10118=Merry Reindeer;564242686=Merry Reindeer;10051=Nightmare Sweater;492980527=Nightmare Sweater;10006=Orange Longsleeve T-Shirt;1416787006=Rust Goalkeeper Shirt;10036=Sign Painter;492923278=Sign Painter;2351253871=Sykkuno Longsleeve TShirt;10042=Varsity Jacket;494178127=Varsity Jacket;10007=Yellow Longsleeve T-Shirt
55 longsword 1222939471=Aztec Macuahuitl;825169057=Danger Fork;796733487=Hot-tempered Longsword;831965423=Kryss Longsword;855009078=Wakizashi;825008040=Xtreme Sword
56 rifle.lr300 1621894466=Badlands LR-300;2100059186=Basebreaker LR;1741459108=Black Pearl LR300;2151920583=Blackout LR;1535995784=Bogeyman LR300;1239079767=Bone Grinder LR-300;1569062511=BullDozer LR300;1173523145=Bulletstorm;1553359638=Cold Hunter LR 300;1812045814=Cutesy LR300;1174458060=Daemon Strike;1604879931=Dead Ringer LR300;1225499752=Deathcore LR300;2304318648=Doodle LR;1725240606=Dynasty LR300;1883559335=Flyboy LR;1419392688=Fury Ex Red;1700177871=Holographic LR300;1612152593=Icarus LR300;1578816958=Ice Marine LR300;1660691287=Jungle Fighter LR-300 Stockless;1173459827=LR300 - Wild;1644715625=Marked for Death;1177273104=Mercenary Rifle;1264358358=Midway LR300;2092965663=Monster LR;1953108368=No Mercy LR300;2122513705=Optimist LR;2146248175=OVERDRIVE LR;2229046238=Paintball LR;1671985039=Phantom LR-300;1652362426=Pink Death LR300;1308037543=Polymer LR300;1779949198=Poseidon LR300;1635559091=Prancing Pony LR-300;1787012455=Project White Light;1176479716=Survivor LR-300;2319796265=Sweet Gift LR;2058268475=Talon LR;1481478360=Tempered Steel LR300;1967805281=Toy Blast LR;2195318269=Tween LR;2016313108=Uproar LR300;1282171260=Warhead LR300;1203322875=Wildfire LR-300;1906355162=Winter Ops LR
57 lmg.m249 1719536313=Bombshell M249;1740639585=CHROMA FLAIR;1707973294=Guerilla M249;1992981006=Love Machine;1831294069=Playmaker M249;1712378771=The Beast M249
58 rifle.m39 1708343082=Desert Warrior;1708365495=Devourer M39;1736532811=Metalhead M39;1720530850=Ornate M39;1707880195=Skull Seeker
59 metal.plate.torso 1805322456=Apocalyptic Knight Chest Plate;1787198707=Azul Metal Chest Plate;2229279338=Bee Cosplay Chestplate;1581353262=Berserk Chest Plate;2105505757=Blackout Chestplate;2304445825=Bombing Chest Plate;1969743263=Bombshell Chestplate;1711048020=Carrot Power Chestplate;832233112=Chainmail;842577956=Chest Resistance;1270065959=Conquistador Chest Plate;2092488087=Cow Moo Flage Chestplate;1753699785=Dead Souls Chest Plate;2005709642=Doodle Metal Chestplate;2226598382=Dread Chestplate;1335770974=Dwarf Chestplate;1993774875=Eat Me Chestplate;924019814=Engineer's Chest Plate;1886179838=Evil Pumpkin Chest;1934946028=Evil Snowman Chestplate;796728308=Flak Vest - Green;1349989767=Flyer Vest;794169855=Forest Camo Chest Plate;2013723517=Forsaken Era Chest Plate;2252998412=Franken-Chestplate;1771804406=Frostwulf Armor;1638812721=Glory Armor Chest;823132085=Hazardous Grater Chest Plate;944835223=Hornet Chestplate;1886922099=Horror Chest Plate;1575392727=Huntsman Chest Plate;2215911873=Kayak Vest;895066686=Looter's Chain and Plate;828888000=Machina Plate;817022417=Metal Barrel Chest Plate;1094522474=Metalhunter Chest Plate;2296501936=Monument Memories Chestplate;2352188221=Myth Chestplate;1586132318=Naughty Gingerbread Chestplate;2242200040=No Mercy Chestplate;1777967326=Northwind Chestplate;819160334=Oil Barrel Chest Plate;2193157606=Opulent Chest Plate;797410767=Plate Carrier - Black;1693641239=Playmaker Chest Plate;2100740608=Poison Armor Plate;1388861988=Precious Antiques Chestplate;798736321=Press Vest;1900842357=Punkish Chestplate;799657859=Racing Stripes Chest Plate;2001706617=RaidBot Chest Plate;2131557341=Raptor Chestplate;934627208=Retro Car Parts Chestplate;900807753=Salvaged Plating Armor;1353723648=Samurai Kozane Do;1587225313=Santa Chest Plate;970700662=Space Rocket Chest Plate;1845931269=Tactical Chestplate;2144720791=Test Dummy Chestplate;1932615190=Training Chest Plate;2178449205=Tribe Warrior Armor;1578628782=Troll Daddy Chest Plate;2059931054=Uproar Chestplate;1680452167=Vandal Chest Plate;1522963149=Wanderer's Chest Plate;1135168998=War Machine Chestplate;1113984430=Warface Chestplate;1421841596=Whaleman Chestplate
60 metal.facemask 1805321162=Apocalyptic Knight Facemask;901668040=Army Armored Facemask;832021670=Army Facemask;792649975=Aztek Night Hunter;1787201365=Azul Metal Facemask;2229280260=Bee Cosplay Facemask;1581351961=Berserk Facemask;784316334=Big Grin;2105454370=Blackout Facemask;799044333=Blingin Grill;821441043=BoltFace Metal Facemask;2304448562=Bombing Facemask;1969741836=Bombshell Facemask;835026584=Bronze War Mask;1121237616=Bruiser Facemask;831923884=Carbon Facemask;1711049678=Carrot Power Facemask;939788004=Clan Leader Mask;1270065112=Conquistador Face Mask;2092488951=Cow Moo Flage Facemask;1753711761=Dead Souls Facemask;792079554=Death Facemask;962694769=Deathwing Facemask;1092671728=Diesel Facemask;2005707226=Doodle Metal Facemask;2226597543=Dread Mask;1335769610=Dwarf Facemask;1993775723=Eat Me Facemask;1084823878=Elder's Metal Facemask;1886184322=Evil Pumpkin Facemask;1934943101=Evil Snowman Mask;915572534=Flesh Facemask;1349988105=Flyer Mask;2012095496=Forsaken Era Mask;2252919011=Franken-Facemask;807821375=Frostbite;1771714129=Frostwulf Mask;1638135398=Glory Mask;1172409741=Glowing Metal Pumpkin Mask;794837198=Glowing Skull;932233099=Heavy Industry;1886920683=Horror Facemask;812933296=Human Sacrifice Mask;881687672=Hunter Mask;1575391468=Huntsman Facemask;806983252=Industrial Protection Mask;899001394=Juggernaut Mask;2215908400=Kayak Helmet;1313529548=Legendary Gold Facemask;895067146=Looter's Mask;828888629=Machina Mask;1894591519=Maniac Facemask;841012325=Mask of Sacrifice;1083628316=Metalhunter Facemask;924019464=Metalmute Facemask;2296503845=Monument Memories Facemask;900645045=Mosaic Mask;1586135331=Naughty Gingerbread Facemask;2242198470=No Mercy Facemask;1777973800=Northwind Mask;2193149013=Opulent Mask;943128194=Overlord Mask;1693643930=Playmaker Facemask;2100738972=Poison Mask;1388857962=Precious Antiques Facemask;803894027=Punishment Mask;1900843064=Punkish Facemask;2001712636=RaidBot Facemask;2131549928=Raptor Facemask;903628875=Red Dead Jester;792905158=Rusted Smile;792827436=Sacrificial Mask;1353724450=Samurai Somen;1587225942=Santa Metal Facemask;1137533438=Savage Facemask;896211631=Scavenger Facemask;907176719=Scrapyard Curse;971433920=Space Rocket Face Mask;824898622=Stainless Facemask;816530945=Steampunk Leather Mask;915693648=Sunrise Metal Facemask;1845950558=Tactical Facemask;1130407273=Tank Crew Facemask;800980236=Tempered Mask;1203888714=Templar;2143679757=Test Dummy Mask;1932619423=Training Facemask;2178447488=Tribe Warrior Mask;1547874663=Troll Daddy Mask;2059935666=Uproar Facemask;1680454451=Vandal Face Mask;1522955755=Wanderer's Face Mask;1135160079=War Machine Mask;1113983678=Warface Mask;1421829383=Whaleman Facemask;832934294=Where Eagles Dare
61 hat.miner 886968007=Army Miner Hat;788260164=Train Conductor Miner's Hat;886318490=Workman's Safety Hat
62 smg.mp5 1137434899=Arctic Wolf MP5;1603970802=Batteries Not Included;2201971147=Bombshell Mp5;2172493867=BURNOUT;1693898215=Cold Hunter MP5;904404578=Dead Fish MP5;796679172=Digital Camo MP5;833639834=Elite Mp5;1637174724=Icarus MP5;796687275=Military Camo MP5;1865099372=No Mercy MP5;911612956=Nomad MP5;1673754411=Phantom MP5;808554348=Polymer MP5;892100306=Spitfire MP5;853438134=Tank MP5;800974015=Tempered Mp5;914624163=Urban Camo MP5;1654499223=Valentine MP5;1413917236=Wasp MP5;1084800708=Wild Flame MP5;1087199678=Wild Tiger MP5
63 paddlingpool 13034=Hot Tub;13035=Rainbow;13036=Sea Scape;13037=Spawn Pool
64 pants 1660293384=Airman Pants;1787243248=Apocalyptic Knight Pants;1100930207=Arctic Wolf Pants;888360095=Army Armored Pants;1961465777=Azul Pants;1406835139=Badboy Pants;2282181821=Base Invaders Pants;2192914821=Bee Cosplay Pants;1997534121=Bio Integrity Pants;2080977144=Blackout Pants;10001=Blue Jeans;10049=Blue Track Pants;490773561=Blue Track Pants;2295664263=Bombing Pants;2293180981=Bombshell Pants;1441311938=Brony Pants;1968533197=Buscador Pants;1432965178=Cajun Pants;909888619=Caravanner Pants;1987863036=Caution Workpants;1552705077=CCSC Pants;1911973450=Charitable Rust 2019 Pants;2289433771=Charitable Rust 2020 Pants;1371313777=Checkpoint Pants;1305364315=Chekist's Pants;1587846022=Christmas Gang Pants;1150816693=Conquistador Pants;2099701364=Conspiracy Nut Pants;2067568367=Cow Moo Flage Pants;1766646393=Cowboy Sheriff Pants;889714798=Desert Conqueror Pants;1950854989=Doodle Pants;2200988235=Dragon Pants;1581822078=Electrician Pants;2131787171=Elite Forest Camo Pants;1234956405=Explorer Pants;1296612316=Firefighter Pants;10019=Forest Camo Pants;2147367433=Garage Master Pants;2176989787=Hobo Pants;969289969=Huntsman Pants;1768737448=Jockey Pants;2215211982=Kayak Pants;1196747617=Loot Leader Trousers;1368418893=Lumberjack Pants;1448346336=Mad Rider Pants;1894589800=Maniac Pants;1385326314=Marsh Lurker Pants;1106596145=Metalhunter Pants;1700938224=Minicopter Pilot Pants;1740563572=No Mercy Pants;939586076=Nordic Beast Pants;1328753424=Northern Forester Pants;10078=Old Prisoner Pants;504687841=Old Prisoner Pants;823154911=One Percenter Chaps;1784474755=Operator Pants;2207291626=Opulent Pants;1356324187=Outlaws Pants;2022464363=Phantom Pants;1810590744=Playmaker Pants;2124531088=Poison Pants;1150763210=Predator Pants;1274163146=Prospector's Pants;10048=Punk Rock Pants;494003754=Punk Rock Pants;1858308973=Punkish Pants;1638743634=Railway Engineer Pants;1287193745=Revolution Jeans;1993902344=Road Romeo Pants;1927127023=Rocker Pants;2256110716=Rusteratu Pants;1936132863=Rustmas PJ Pants;1229552157=Santa's Helper Pants;1170988006=Savage Pants;1292094174=Scrapper Pants;1356749671=Seaman Pants;1111673876=Sky Seal Pants;10021=Snow Camo Pants;2138201022=Snow Warrior Pants;960252273=Stalker Pants;798690647=Steppe Camo Pants;1623181884=Survivor Pants;1883629284=Tactical Pants;975498827=Tailgunner Pants;1125254090=Tank Crew Pants;1703218418=Tough Bunny Pants;1740505052=Training Pants;2076980911=Uproar Pants;10020=Urban Camo Pants;1317553480=Urban Ice Pants;961084105=Wasteland Hunter Pants;2329782748=Winter Pants;955615160=Worker Pants;930559188=Yellow Racer Pants
65 pickaxe 904296143=Ancient Artifact Pick Axe;2068591788=Apocalyptic Pick Axe;2124297298=Chaos Pick Axe;1557509001=Cursed Treasure Pick Axe;1143157014=Damascus Steel Pickaxe;1911366896=Dragon Claw Pick Axe;1283807232=Elegant Pick Axe;1987871430=Emerald Relic Pick Axe;1320093416=Fenrir Pickaxe;828884658=Gold Digger;1407877776=Hazard Pick Axe;2328583396=Hunting Pick Axe;1083591199=Leather Pick Axe;1466675896=Machinery Pickaxe;2242717611=Meteorite Pick Axe;859743520=Military Pick Axe;1444912645=Montezuma Pick Axe;2093115622=Norse Pickaxe;949859819=Ornate Pick Axe;1435220253=Pharon Pick Axe;1150813747=Prospector's Pickaxe;2171468844=Rainbow Pony Pick Axe;1428399027=Raventale Pick Axe;1414450451=Regal Pick Axe;832799172=Rescue Pick Axe;1553326380=Runic Pick Axe;1377987815=Secret Zone Pick Axe;1845184191=Shadow of Death Pick Axe;1298797381=Shinobi Pick Axe;1362736707=Spec Ops Pickaxe;1872098938=Strange Fury Pick Axe;1780027581=Tactical Pick Axe;863455081=Tarnished Sun Pick Axe;1572401500=Taurus Pick Axe;1616992357=Tiki Pickaxe;1121521173=Tomb Pickaxe;1962080594=Toothed Pick Axe;1325483813=Virulent Pick Axe;1901442609=Warlord Pick Axe
66 shotgun.pump 10074=Chieftain Pump Shotgun;515716304=Chieftain Pump Shotgun;1115399868=Conquerer Shotgun;1553603344=Dead Ringer Pump Shotgun;964345579=Frostfire Shotgun;1153922437=Head Hunter Shotgun;1269617539=Loot Leader Shotgun;1666328139=Metalhead Pump Shotgun;1094741003=Modern Knight Shotgun;813631833=Native Gold;813628651=Native Yellow;1760154042=Pegasus;921253888=Polymer Pump Shotgun;1191938171=Problem Solver Stick;1476013941=Psychosis Pump;1132569603=Rebel Shotgun;1292063367=Royalty Pump Shotgun;1672954158=Spitfire Pump Shotgun;1652348929=Sweet Shot;850130444=Tank Pump Shotgun;849997025=The Billy Baroo;10140=The Swampmaster;639046335=The Swampmaster;1706897835=Troll Daddy Pump Shotgun;731119713=Urban Afterburn Pump Shotgun
67 pistol.python 1839518047=Aviator Python;1752928667=Azul Python;1631920728=Batteries Not Included Python;1457537882=Bite Python;1216163401=Black Mamba;2200875381=Cardboard Python;1421351634=Caution Python;1624620555=Celtic Python;1305704747=Cold Hunter Python;1228154190=Dark Silver Python;1215390635=Devourer;1563667918=Dragon's Spit;1455062983=Duelist's Python;1864788236=Dynasty Python;1217395562=Engraved Python;1914959779=Eternal Python;1373936691=Hellraiser Python;1406640269=Hollow Point Gifter;1265214612=Holy Python;1296687971=Hot Battle Steel;1342464644=Industrial Python;1335582211=Ivory Python;1917523660=Metal Beast Python;1435364672=Metalhead Python;1418647979=Morocco Python;1290876678=Necromancer Python;1445908611=Nitro Junkie Python;1812135451=No Mercy Python;1277518447=Outlaw Python;1605379554=Peacemaker Python;1364964220=Pearl Python;1461918011=Pegasus Python;1214609010=Phantom;1435858834=Pink Death Python;1328632407=Punk Python;1269667577=Relict Python;1796388607=Royal Python;1362224646=Sea Monster Python;1672707813=Skull Seeker Python;1356665596=Slaughter;1377347733=Smoking Python;2100486270=Stealth Python;1276136280=Steam Python;1529514494=Tempered Python;2025046773=Training Python;1223105431=Trausi's Python;2059988260=Venomous Shot;1235690536=Warstory Python;1258109891=Widowmaker Python
68 target.reactive 2255973811=Decoy Target;824001540=Led Light Target;791177585=On Target
69 pistol.revolver 910665268=Bandito Revolver;1901240954=Caution Revolver;2049887645=Choco-Revolver;1192708586=Death Viper;855087726=Defender;1235107237=Devourer Revolver;1265936882=Duelist Revolver;1141054826=Dynamo Revolver;815532676=Eightball;1517889157=Emerald Revolver;937338314=Firefighter Revolver;970737094=Forest Guardian Revolver;1536482422=Frankenstein Revolver;873242795=Frostbitten Revolver;2000389791=Gothic Revolver;809865395=Handmade Revolver;809822151=Hot-tempered Revolver;933056389=Junkyard Revolver;1448503557=Metalhead Revolver;1349358875=Necromancer Revolver;1580859157=Nuke Pistol;10114=Outback revolver;522224500=Outback revolver;809897611=Outlaw Revolver;1346870567=Party Pooper;911828654=Patriot Revolver;1235996786=Phantom Revolver;2340195521=Pharaoh's Revolver;1428863076=Pink Death Revolver;950956238=Pink Grunge;2312068016=Porcelain Revolver;1787802800=Pure Evil Revolver;1435664860=Radioactive Revolver;1161550991=Rebel Revolver;1309517474=Rebel Revolver;1408242038=Regal Revolver;1447877728=Sailor's Revolver;1099177489=Shamanism Revolver;973871108=Sting Revolver;1217455695=Tribal Revolver;887846629=Western Revolver Gold
70 riot.helmet 869125904=Biker Goth Helmet;930923611=Blast Shield Helmet;849872204=Born To Loot;1414953014=Bumble Bee Helmet;801095823=Captain's Helmet;937863435=Checkpoint Riot Helmet;911015530=Digger Helmet;1109466231=Furious Raider Riot Helmet;887283623=Hardline Helmet;920983864=Medical Riot Helmet;1784490572=Operator Helmet;950182163=Raider Helmet;1993881492=Road Romeo Helmet;869709888=Ruthless Riot Helmet;930563894=Yellow Racer Helmet
71 roadsign.jacket 953104456=Apocalypse Vest;1797481354=Apocalyptic Knight Vest;865659101=Army Sign Vest;1759481001=Azul Roadsign Vest;2120615642=Blackout Vest;2350092536=Bombing Roadsign Vest;1865210028=Bombshell Vest;801873550=British Sign Vest;2296713508=Cardboard Vest;1342125487=Caution Vest;2142378618=Centurion Vest;1442341176=Chaos Armored Vest;818611894=Chopshop Body Armor;1121456497=Cobalt Armor Vest;1102966153=Deathwing Vest;1251431494=Defender Vest;934926427=Desert Patrol Vest;1084394793=Diesel Roadsign Vest;1332334593=Dominator Vest;1986047563=Doodle Vest;1349940035=Dwarf Roadsign Vest;944577714=Epidemic Roadsign Vest;947950933=Freebooter Vest;1349163491=Full Metal Vest;784581113=Hazard Protection Vest;1380025789=Heavenly Legion Vest;1159597292=Heavy Alloy Vest;1740065674=Heavy Machinery Roadsign Vest;1944167671=Iceman Armor;879861502=Junker's Vest;934744263=Junkyard Samurai Vest;1269597852=Loot Leader Vest;1974808139=Lunar Armor Vest;1154446174=Mad Vest;1894379005=Metal Zombie Vest;1119760089=Metalhunter Roadsign Vest;2320209237=Mr. Gingerbread Vest;1539573170=Night Stalker Vest;2076262389=No Mercy Vest;892402754=Nordic Beast Vest;2199785536=Opulent Roadsign Vest;1438089648=Ornate Vest;2147211029=Oxums Racing Team Vest;953124938=Patchwork Cuirass;1441844877=Peacemaker Vest;1743991748=Phantom Vest;1098029034=Plywood Vest;950173158=Raider Roadsign Vest;1151219812=Saboteur's Vest;1248434418=Samurai Dou;1539651543=Scary Vest;974336556=Scrap Hazard Vest;1202977830=Scrapper Vest;1388417448=Snap Turtle Vest;1779981832=Solar Panel Vest;828175620=Spiked Metal Vest;1130406273=Tank Crew Roadsign Vest;1234957719=The Last Viking Vest;1906530247=Training Vest;1558586741=Troll Daddy Roadsign Vest;1130599258=Utilizer Vest;1400828574=Vandal Graffiti Vest;1442162947=Viking Armor Vest;932778217=Wasteland Legionnaire
72 roadsign.kilt 953112839=Apocalypse Kilt;1797483140=Apocalyptic Knight Kilt;865679836=Army Sign Kilt;1759482713=Azul Roadsign Pants;2120628865=Blackout Kilt;2350090284=Bombing Kilt;1865210905=Bombshell Kilt;801837047=British Sign Pants;2296714510=Cardboard Kilt;1342123902=Caution Pants;2142383374=Centurion Kilt;1442346890=Chaos Armored Pants;818612271=Chopshop Kilt;1121447954=Cobalt Armor Pants;1102986622=Deathwing Pants;1251419748=Defender Pants;934937654=Desert Patrol Pants;1084396407=Diesel Roadsign Pants;1332333384=Dominator Pants;1986050287=Doodle Kilt;1349943069=Dwarf Roadsign Pants;944586866=Epidemic Roadsign Pants;947949717=Freebooter Pants;1349158079=Full Metal Kilt;1657108026=Glory Kilt;784577443=Hazard Cover Pants;1380028657=Heavenly Legion Kilt;1159599284=Heavy Alloy Pants;1740068457=Heavy Machinery Roadsign Pants;1944165903=Iceman Kilt;879861153=Junker's Kilt;934742835=Junkyard Samurai Pants;1269612137=Loot Leader Pants;1974809731=Lunar Armor Pants;1154469089=Mad Pants;1894376712=Metal Zombie Kilt;1106569231=Metalhunter Roadsign Pants;794291485=Military Camo Roadsign Kilt;2320203004=Mr. Gingerbread Kilt;1539570583=Night Stalker Kilt;2076261294=No Mercy Kilt;892414125=Nordic Beast Kilt;2199787450=Opulent Roadsign Pants;1438090382=Ornate Pants;2147209635=Oxums Racing Team Pants;953123363=Patchwork War Kilt;1441848470=Peacemaker Pants;1737733590=Phantom Kilt;1723851847=Playmaker Kilt;1103687152=Plywood Kilt;950176525=Raider Roadsign Pants;1151205503=Saboteur's Pants;1248433379=Samurai Haidate;1353722661=Samurai Kusazuri;1539652650=Scary Kilt;974345761=Scrap Hazard Kilt;1202976443=Scrapper Kilt;1388416860=Snap Turtle Pants;1779983158=Solar Panel Pants;828173323=Spiked Metal Kilt;1915398061=Tactical Kilt;1130405286=Tank Crew Roadsign Pants;1906531526=Training Kilt;1558579257=Troll Daddy Roadsign Pants;1130610212=Utilizer Pants;1400837602=Vandal Graffiti Pants;1442167045=Viking Armor Pants
73 rock 2108583966=Acid Rock;1435229543=Adventurer's Rock;1209361016=Ancient World Rock;1084822722=Barb Wire Rock;1368454662=Best Friend;1636101879=Big Burger;1595910049=Dragon Egg;2313802668=Festive Pudding Rock;2350375831=Foil Ball;1530140666=Football Rock;864277659=Fresh Brain;858285362=Frozen Turkey;804791902=Gold Rock;2012371465=Golden Ore;1378500484=Gravel Rock;1693063715=Honeycomb;843429299=Hot Potato;971411353=Junkyard Rock;807372963=Meteorite;2200644593=Meteorite Rock;1617334269=Moon Light;1953527967=Morganite Rock;933809748=Mossy Fossil;1739062735=Mother's Day Rock;1205671322=My Only Friend;2154934029=Mystical Rock;2320435219=North Rock;2084257363=Obsidian Rock;1539197932=Pumpkin Rock;2187163489=Rainbow Stone;834287924=Ripe Watermelon;1838926976=Rooted Rock;1467090959=Shaman Rock;824904841=Shard of True Ice;1126754320=Sharptooth;2137102504=Sourdough Bread;1458528823=Swamp Rock
74 rocket.launcher 879708939=Aircraft Parts RL;813795591=Army Surplus Rocket Launcher;894679426=Beans Cannon;1936188783=Candy Launcher;1926503780=Dragon Launcher;1162978825=Glass Cannon;1657103887=Glory Rocket Launcher;1815384807=Gothic Reception;875930670=Hot Topic;853494512=KNOCK KNOCK;2268211267=Pixel Rocket Launcher;1839729563=Sea Monster Launcher;926279011=Surge Rocket Launcher;812737524=ThatGermanGuy Warhawk;1905848285=Totem Rocket Launcher;1162085821=Troglodyte;1137393412=Wood Barreled
75 rug 1637950966=Bandit Rug;1740724608=Blood & Fire;907327964=Rubber Hazard Mat;1461385713=Rust Island Car Rug;1225299046=Rustmas Rug;2179778281=Scientist Rug;871072156=Soviet Carpet;2156295778=Summer Rug;870851438=Tailor`s Carpet;1114718055=Tarp Rug
76 rug.bear 870446546=Panda Rug;2023982236=Teddy Bear Rug;2245825475=Werewolf Rug
77 icepick.salvaged 911446362=Dark Arts Icepick;820810719=Inferno Hazard Salvaged Icepick;844666224=Lavapick;933760454=Raven;1121804393=Rocket Scrap Salvaged Pickaxe;843454856=Runic Ice Pick;1276627079=Stinger Icepick;1124734833=Voodoo Daddy Icepick
78 salvaged.sword 1568609421=Buccaneer Blade;1587541456=Candybober Sword;1915832963=Double Blade;950134503=Fallen Knight;1652800384=Fire Slasher;1455468520=Grid Strike;1852787012=Helicopter Blade;828885909=Metal Roses Short Sword;1442148142=Oblivion Sword;2038180230=Pixel Sword;1442017029=Rainbow Sword;893871715=Roadsign Sword;969725237=Rusty Blade;1366123054=Saw Sword;1239660381=Scraptooth Sword;1154175800=Sheet Metal Sword;1283812544=Spartan Sword;1535765451=Tempered Sword;1212723513=Toothed Sword;930557072=Trained To Kill;1313755167=Trash Sword;825240467=Wooden Sword;1624719255=Zap Slasher
79 barricade.sandbags 809144507=Grandmother's Gift Barricade
80 explosive.satchel 855256664=Bad News;1934132095=Bad Santa Satchel;908893157=BadaBoom Satchel Charge;860156815=Box O Love;2172795318=Cargo Heli Satchel Charge;856333895=Close Enough;2315757321=DoorCracker;1586074827=Festive Surprise;2200482089=Legacy Satchel;855084816=Military Satchel Charge;1906259594=R.A.I.D. Satchel;855113878=Red Leather Day;1961769080=Satchelo;1710383765=Sweet Satchel
81 pistol.semiauto 902487409=Aircraft Parts SAP;1720501333=Aquamarine SAP;919535259=Armageddon SAP;883156158=Base Invaders SAP;924018875=Bitin' Dog SAP;937863988=Checkpoint SAP;876007573=Chrome SAP;1428766159=Cold-Forged Pistol;10087=Contamination Pistol;515313072=Contamination Pistol;1183693235=Croc Shot;1158943049=Demonic Pistol;863443112=Desert Hunter;953126981=Dime Bag SAP;910681058=Direct Threat SAP;1811814491=Dynasty SAP;1105853708=Faded SAP;1167255900=Fang;904356033=Fight Like a Girl;893118140=Fire Walk SAP;2041571172=Garden SAP;1121906926=Golden Dragon;805925675=Golden Leaf SAP;10108=Halloween Bat;539539196=Halloween Bat;1630961792=Holographic SAP;954520976=Khalifa SAP;1113544521=Last Eclipse SAP;830255284=LCD Marine Sidearm;899942580=Looter's SAP;853927198=Nightmare;1571099329=Nineties Zapper;950037016=Nishikigoi SAP;972059802=Oink SAP;830606037=Ol' Greasy;804337360=Paint Rush SAP;1328323548=Poison Jaws SAP;798375117=Polymer SAP;868298519=Poseidon Semi Auto Pistol;10081=Reaper Note Pistol;531196714=Reaper Note Pistol;10073=Red Shine Pistol;529604373=Red Shine Pistol;1446715780=Reptile SAP;908722214=Retro Car Parts SAP;827533196=Salt Shaker SAP;975102848=Silent Sting SAP;938007886=Soul Eater SAP;1118707296=Sting SAP;936623315=Sunrise SAP;829983759=Tehno Pistol;1553005167=Tempered SAP - Ornate;1092676141=Triad SAP;935205778=Yellow Racer SAP
82 rifle.semiauto 2222645873=Aborigene's SAR;1772028068=Anarchist SAR;828616457=Army SAR;1195821858=Aztec SAR;2193203225=Azul Sar;839302795=Bandito SAR;2131324289=Beach Day SAR;1168002579=Blood Dragon Rifle;1359059068=Buzzard SAR;1667097058=Candyman SAR;1385736095=Caution SAR;1818125194=Cobalt SAR;1616628843=Cold Hunter SAR;1652791742=Cupidon;1819195444=Diesel SAR;2171565192=Doodle SAR;1517644801=Drake SAR;2296659119=Elite Crate SAR;900921542=Fire Starter SAR;922119054=Forgotten Warfare SAR;1291766032=Freedom SAR;1395475969=Geartooth SAR;1936035303=Gingerbread SAR;959955205=Glory SAR;1448088345=Gold Phoenix SAR;1099992405=Gunsmith SAR;840023839=Hazard Semi Auto Rifle;1129722099=Hellcat SAR;1113987623=Hero's SAR;1217394290=Hot Rod SAR;1863834018=Imp SAR;1966875478=Lucky No.8 SAR;942919370=Meridian SAR;1621472496=Metalhead SAR;1429032578=Mojave SAR;2108652282=Monument Memories SAR;1098038362=Nightmare SAR;1788152335=No Mercy SAR;1576671137=Northwind SAR;2123641710=OPS SAR;1310522106=Payback SAR;1135415770=Pharaoh SAR;1876226129=Poseidon SAR;1522185915=Primal SAR;2249445756=Retrowave SAR;1446861251=Royal SAR;1182015913=Saboteur Rifle;2252306404=SAR from Hell;1170719113=SAR Scarecrow;1240340535=Scrapper SAR;1566048269=Sea Eater SAR;1298949573=Snakebite SAR;1933250593=Snowman Surprise SAR;1193105339=Soulburn SAR;1300239738=Soulkeeper SAR;875259741=Sublime SAR;1112906123=Suzy-Q SAR;1814170373=Tactical SAR;1313600286=Tiki SAR;899564368=To Hell And Back;2076615773=Training SAR;1279791283=Urban Light SAR;1300137383=Warbeast SAR;818613234=Workbench SAR
83 door.hinged.metal 1852469574=Ace Door;901194793=Ambulance Door;2131148230=Ancient Lore Door;1457845730=Ancient Totem Door;950560231=Antique Metal Door;836815358=Army Metal Door;1328395850=Artist's Door;1170684837=Aztec Door;1309566989=Aztec Gold Door;1415394917=Bandit Sheet Metal Door;1984902763=Bio Integrity Door;1313458951=Blacksmith's Door;1109694864=Blue Puzzle Door;1356364616=Boat House Door;1066783524=Brass Sentinel Door;1733664175=Broken Mirror Door;1290467327=Brutal Door;1952448742=Bull Rage Door;1362595551=Caution Door;1354718926=Chinook Fuselage Door;1412241247=Corinthian Door;2346936208=Corrupted Metal Door;1124738987=Dead Room Door;1653322594=Dead Valentine Door;1175547229=Death Crypt Door;1687047599=Deep Sea Door;1443957299=Defender Door;1466554259=Divinity Door;827190175=Doomsday Door;1539115581=Door of Flesh;948930384=Door to Death;1227441654=Dragon Relic Door;1565096963=Dreamer's Door;1599702939=Eagle Sheet Metal Door;1617363766=Egiptu Door;1213613030=Eisensheet Door;1759765099=El Dorado Door;1447671986=Emergency Exit Door;1260208160=Engineer's Door;1631261352=Evil Within;1852769999=Excavator Door;1707455661=Fallen Emperor Door;915684869=Fire Truck Door;1438420454=Flower Power Door;2282199805=Freedom Door;1281626747=Fretwork Door;1933669766=Gingerbread Door;942658960=Grey Fire Door;1294718018=Grid Door;1795304359=Guardian Door;1992539569=Guardians of the Heart;1176406578=Halloween Door;2255950540=Halloween House Door;2051016981=Happy Rabbit Door;849614068=Hazard Metal Door;1120339199=Hideout Door;2075130889=Hieroglyphic Metal Door;10189=Industrial Door;928503162=Jeweler's Security Door;1141051963=KEEP OUT;917719889=Laboratory Door;1524017223=Labyrinth Door;921076360=Locomotive Door;1205721755=Lost Hope Door;1211678957=Lost Metal Door;1239808532=Lost Treasure Door;2146923368=Mechanic Door;1356332123=Meltdown Metal Door;2264763191=Melted Blast Door;2200677375=MeowMeow Sheet Metal Door;832957536=Metal Shutter Door;959898495=Metalshop Scrap Door;1870735722=Midnight Door;922419554=Military Vehicle Door;2091097349=Molten Visage Metal Door;2116010484=Monitored Door;1747674239=Mosaic Door;1886472768=Mummy Door;1926577314=Musical Notes Door;1435254318=Night Sky Door;1587777999=Nutcracker;1680572723=Oil Rig Door;1999996993=Old Fighters Door;1812049396=Pirate Treasures Door;2009712630=Pixel Metal Door;1083653685=Polar Station Door;1514174191=Potty Door;1576050073=Power Door;859864870=Prison Door;1412186246=Pug Tower Door;1523940330=Quarantine Area;961909886=Quarantine Door;1342459239=Railway Door;1390896848=Rainbow Door;835119969=Recycled Garage Door;1383063240=Red Skull Door;2156515064=Riveted Summer Door;934924536=Roadsign Door;1772296521=Rocket Door;1727356485=Royal Door;1117884427=Salvaged APC Door;962391797=Salvation Door;2320063891=Santa's Door;1595324955=Santa's Front Door;897274189=School Bus Door;1306412169=Scrap Robot Door;1119310953=Scrap Tanker Door;883741993=Shipping Container Door;1839905607=Shippy & Friends Door;1587119000=Snowman Door;1362729705=Steel Pirate Door;1321264697=Submarine Door;1780241717=Sunrise Door;1401769919=Test Room Door;1447958101=Toxic Door;1380022034=Trophy Pirate Door;914869833=Truck Door;1328566466=Urban Night Door;2124140548=Wealthy Farmer Door;1845208821=Wild Owl Door;1448354224=Winged Guardian Door;1974769574=Year of the Rat Door
84 door.double.hinged.metal 1874961152=Ambulance Double Door;1900646657=Castle Double Door;1936126874=Doors to a Fairy Tale;1882782756=Double Door from Hell;1918077744=Dragon Door;1926125252=Earblaster Doors;2088339038=Eviction Double Door;1876575703=Global Freight Double Door;1904509199=Green Labs Door;2101572637=Horsemen of the Apocalypse Door;1895120296=Howling Double Door;1885983859=Jack Sheet Metal Double Door;2235414618=Lab Elevator Double Door;1883500337=Military Double Door;1911036760=Monster Double Door;1914299009=Oil Rig Double Door;2305997989=Pixel Metal Double Door;2253675722=Pumpkin Jail Double Door;2040477404=Red Barn Double Door;1926973479=Shippy & Friends Double Door
85 shirt.collared 885078753=Autumn Hunter's Shirt;797241160=Charitable Rust 2016 Shirt;802078252=Green Lumberjack;802073199=Red Lumberjack;819818852=Sergeant Shirt;809704306=Survival Shirt;801955689=The Blue Death
86 pants.shorts 794678401=Camo Shorts;793871235=Cutoff Shorts;818068257=Homemade Shorts;1412875829=Rust Footballer Shorts;1416779855=Rust Goalkeeper Shorts;799006291=Snow Camo Shorts
87 skullspikes 13050=Candles;13051=Pumpkin
88 skull.trophy 13052=Glass;13053=Glass 2;13054=Table
89 sled 13056=
90 sleepingbag 10121=Aston Christmas;558861217=Aston Christmas;1127084512=Bear Bag;10037=Blue Plaid Sleeping Bag;493375502=Blue Plaid Sleeping Bag;1296042340=Brony Bag;1165339422=Cannibal Survival Bag;1447956760=Captain's Bed;909889024=Caravanner Bedroll;10119=Christmas Bag;548925163=Christmas Bag;809186722=Christmas Holiday Bag;1152883867=Cobalt Survival Bag;1839630957=Comfortable Cardboard;1886931973=Comfortable Coffin;1711044880=Cozy Bunny Bag;1396600730=Crime Bag;2192906780=Desert Scout;1804347166=Dolphin Float;2347941731=Doodle Sleeping Bag;1709890051=Easter Bag;1140342335=Fisher Sleeping Bag;2131151567=Forest Camo Bag;1137518723=Freefolk Bedroll;539536110=Freshly Dug Grave;1818779860=Frostwulf Bed;1402402700=Golden Drake Sleeping Bag;10107=Horror Bag;535099192=Horror Bag;795398514=Jungle Camo Sleeping Bag;2215923791=Lifejacket Sleeping Bag;1991418530=Love Sack;2011695446=Monument Memories;1283724154=Muertos Sleeping Bag;1269426600=Nuke Bag;1466734204=Peacemaker Sleeping Bag;2329753984=Pitstop Bag;919353105=Ranger Bedroll;834487561=Red Survival Sleeping Bag;1624628815=Regeneration Program;2200870229=Retrowave Sleeping Bag;1986734890=Salvaged Hazmat Bag;1934818691=Santa's Bag;1586749954=Seasons Beatings;1858936313=Shippy Sleeping Bag;1102195403=Sleep Catcher;1565127136=Sleepover Bag;1174407153=Spooky Pumpkin Bed;2051263477=Spring Sleeping Bag;1132190812=Star Bedroll;1186393080=Supply Drop Sleeping Bag;1362261702=Survivor Bag;2185104012=Tea Bag;1773435398=Thermal Sleeping Bag;10077=Tiger Crown Sleeping Bag;514146546=Tiger Crown Sleeping Bag;1865305668=Toxic Sleeping Bag;944993672=Undead Bedroll;1906188254=Warboy Sleeping Bag;2303592013=Weather Sleeping Bag;2162368881=Winter Scout;10076=Wood Camo Sleeping Bag;494249390=Wood Camo Sleeping Bag;1228238024=Wood Sleeping Bag
91 jacket.snow 530154777=60's Army Jacket;10113=Black;913227043=Fireman's Jacket;530159711=Salvaged Shirt, Coat and Tie;839466039=Telogreika Jacket;10112=Woodland
92 stonehatchet 1438048408=Abstraction Stone Hatchet;1092741003=Ancient Gods Stone Hatchet;2228616112=Ancient Runic Stone Hatchet;1269563695=Artisan's Stone Hatchet;1117098080=Aztec Jade Hachet;2108830575=Bite Stone Hatchet;1114895505=Blood Feud;1559244155=Bone Dragon Hatchet;955692135=Bone Hatchet;887663210=Chieftain Stone Hatchet;1356232241=Dark Rite Stone Hatchet;1428010053=Dragon Glass Stone Hatchet;947950887=Fossil Tooth Hatchet;1788439811=Gemstone Hatchet;1058431260=Geode Hatchet;1395467841=Gravel Stone Hatchet;797445687=Ice Tooth;2275037516=Kids' Stone Hatchet;854688691=Large Fruit Pit Hatchet;1290344811=Megalodon Totem Hatchet;1184754750=Midas Hatchet;1906590340=Morganite Hatchet;1428438688=Mosaic Stone Hatchet;2084846275=Night Farmer Stone Hatchet;1340282993=Ritual Stone Hatchet;2138883683=Ruby Hatchet;1235107175=Sea Monster;1988082179=Silver Leaf Stone Hatchet;912599650=Soul Reaper Stone Hatchet;1196674526=Stonecraft Hatchet;1151551275=Tirbal Stone Hatchet;1306176753=Tree Killer;1342121150=Tribal Stone Hatchet;2171504484=Two Faced Stone Hatchet;1852290423=Vampire Stone Hatchet;878257758=Volcanic Stone Hatchet;1594996565=Winter Hatchet
93 stone.pickaxe 1100085862=Ancient Gods Stone Pickaxe;2228725445=Ancient Runic Pick Axe;1269582427=Artisan's Stone Pickaxe;1127557296=Aztec Jade Pick Axe;2108826652=Bite Stone Pick Axe;840380436=Bloody Tooth Pickaxe;1428014003=Dragon Glass Stone Pickaxe;1788447750=Gemstone Pickaxe;1395460858=Gravel Stone Pickaxe;886904592=Jawbreaker;2275036880=Kids' Stone Pick Axe;1290539482=Megalodon Totem Pickaxe;1906588860=Morganite Pick Axe;1428446680=Mosaic Stone Pick Axe;2084849175=Night Farmer Stone Pick Axe;2138887265=Ruby Pick Axe;1988077270=Silver Leaf Stone Pickaxe;1306179593=Stone Killer;1196675392=Stonecraft Pick Axe;1342118597=Tribal Stone Pickaxe;2171508439=Two Faced Stone Pickaxe;837149011=Uprising Stone Pickaxe;1852292345=Vampire Stone Pick Axe;1594886582=Winter Pickaxe
94 sunglasses 13040=Black Style 2;13043=Black Style 3;13041=Camo;13038=Chalk;13044=Chrome;13045=Gold;13042=Red;13039=Tortoise
95 tshirt 10130=Argyle Scavenger;490217825=Argyle Scavenger;10033=Baseball Tshirt;499455600=Baseball Tshirt;10003=Black Tshirt;14177=Blue Tshirt;851890495=Crossbone Crew;489329801=Facepunch TShirt;14181=Forest Camo Tshirt;10024=German Tshirt;10035=Hacker Valley Veteran;495902079=Hacker Valley Veteran;10046=Missing Textures TShirt;490948132=Missing Textures TShirt;10038=Murderer T-Shirt;492471488=Murderer T-Shirt;101=Red Tshirt;10025=Russia Tshirt;1412895302=Rust Footballer Shirt;10002=Sandbox Game Shirt;10134=Ser Winter TShirt;504919781=Ser Winter TShirt;489687236=Shadowfrax TShirt;10041=Skull & Bones TShirt;492781593=Skull & Bones TShirt;10053=Smile T-Shirt;492096219=Smile T-Shirt;10039=Target Practice T-Shirt;489878758=Target Practice T-Shirt;584379=Urban Camo;10043=Vyshyvanka Shirt;490236659=Vyshyvanka Shirt
96 table 875258582=Antique Dining Table;872346354=Off The Grid;909129983=Parquet Table
97 shirt.tanktop 784578916=Black Mesh Crop Top
98 smg.thompson 1772377862=Azul Thompson;1720001936=Devourer Thompson;1689944021=Glory Thompson;1345464512=Mysterious Cult Thompson;561462394=Santa's Little Helper;839819171=Wasteland Hunter
99 vending.machine 861029759=Army Vending Machine;862137836=Base Invaders;869474635=Brass Vending Machine;1335113551=Carpenter's Vending Machine;2018506223=Cobalt Coffee;1780228760=Cobalt Ice Cream;1161727529=Lavish Vending Machine;1927092059=Music Box;2146714479=Oxums Gas Pump;2311659818=Recycler Vending Machine;1373851317=Retro Vending Machine;860916780=Rox Black Vending Machine;862291005=RustyCola Machine;861548229=Sand Tone Vending Machine;2186443994=Tea Vending Machine;871927557=Urban Vending Machine
100 gun.water 13046=Green;13047=Grey;13048=Orange;13049=Yellow
101 water.purifier 886677071=Distillery;786826476=Radioactive Water Purifier;1796826334=Wooden Purifier
102 shotgun.waterpipe 1234721165=Apostate;1209128595=Blacksmith's Pipe;1274179291=Cannibal Tribe Musket;1168524895=Flaming Pipe;1851214164=Garden Pipe Shotgun;907070012=Hot Topic Waterpipe Shotgun;1320685736=Industrial Pipe Shotgun;1219492103=Junkyard Pipe;1250809355=KOI;1147084675=Luxuria;1421462560=Pirate Pipe;1693498234=Pure Evil;912464069=Riveted Pipe Shotgun;819137470=Rustpunk Scattergun;661319648=RustPunk Waterpipe Shotgun;1205464046=Sea Hunter Shotgun;10143=The Peace Pipe;633754963=The Peace Pipe;2268362982=Toy Shotgun;1181616781=Twisted Pipe;832764933=Western Waterpipe Shotgun
103 door.double.hinged.wood 1882487559=Pirate Ship Wooden Double Door;1876817741=Wind King Wooden Double Door
104 box.wooden 1865304630=Army Supply Box;2000024196=Cargo Heli Storage;1316294242=Carpenter's Small Box;2234050484=Cobalt Supply Box;2258758426=Day and Night Small Box;1212709764=Decorative Small Box;1455068496=Duelist's Wood Box;2051308391=Easter Bunny Small Box;787716105=First Aid Box;2329411820=Glacial Visage Small Box;2040776062=GMO Free Seed Box;1644263172=High Voltage Box;2268670063=Little Cloud Box;885103417=Medieval Small Wooden Box;2138650218=MILTAN Storage Box;1679876778=Oil Rig Storage Box;2186894702=Organic Berry Box;1529745641=Sea Supply Box;889212734=Seed Box;930694436=Small Medical Box;2146145661=Stickered Toy Car;1818868472=Toxic Hazard Box;1127078435=Treasure Crate;2255658925=Woodenstein
105 door.hinged.wood 1386052491=Alchemist Door;1733982448=Archer Door;1402178300=Artisan Wooden Door;1108316628=Barricaded Door;1932460590=Big Dreams Door;1100873539=Black Decorative Wood Door;838700836=Bleached Ebony Door;1320929144=Bone Collector Door;804991715=Christmas Tree Door;1605229872=Cobalt Wooden Door;1415059257=Cursed Wooden Door;809253752=Door to Heaven;1313604647=Dreamcatcher Door;2025017114=Eco Door;962427350=Forgotten Temple Door;1328425419=Fortified Castle Door;1539681696=Hell-o-ween Wooden Door;1666630991=Hut Door;2246937402=Jinx Wooden Door;1131650209=Lone Wolf Door;1269783329=Metal Tree Door;2229214032=Midgard Door;804854812=Old Heavy Wooden Door;1132144523=Ornate Wooden Door;1759874635=Pirate Hut Door;1415496136=Pirate Wooden Door;2135476099=Pixel Wooden Door;847902281=Porthole Door;1100886818=Red Decorative Wood Door;923763807=Riveted Wooden Door;1127631900=Sacrificial door;1886617093=The Growth Of Evil;2295055078=The Hunter and his Dog;1176899114=Trick Or Treat Door;1362500013=Vandal's Peace Door;1428632857=Viking Door;2348793011=Weather Wood Door;1260913194=Wisdom Door;950184212=Wise Door;1932737376=Wolf Den Wooden Door

301
rust-link/INTEGRATION.md Normal file
View File

@@ -0,0 +1,301 @@
# rust-link — standing the bridge up
**Operator- and developer-facing.** How to get a Rust server, a sidecar and a website talking, and
how to tell which of the three is wrong when they are not. The contract itself is
[`PROTOCOL.md`](PROTOCOL.md).
There is no installer support for Rust yet — that is a later phase — so everything here is done by
hand. When the installer gains `--game rust`, this page becomes the fallback path rather than the
only one.
---
## 1. What you need
| Piece | Where it comes from |
|---|---|
| A Rust dedicated server with **Oxide** | umod.org |
| `RunicGateway.cs` | [Rust-Plugins](https://gitea.whitlocktech.com/RunicGateway/Rust-Plugins), `overlay/oxide/plugins/` |
| `rust-link-sidecar` | [Rust-Link](https://gitea.whitlocktech.com/RunicGateway/Rust-Link) |
| A Runic Gateway website with `module-rust` installed | [Module-Rust](https://gitea.whitlocktech.com/RunicGateway/Module-Rust) |
**One game server, one sidecar, on that server's own host.** Six servers means six of the first two
pairs and six rows in the website's admin panel.
The module also expects four third-party Oxide plugins to be present for the features that follow
the bridge itself — `Clans`, `Kits`, `PopupNotifications` and `ZoneManager`, all from k1lly0u on
umod.org. The bridge works without them; the features that read them do not.
---
## 2. The order that works
Sidecar first, then plugin, then website. Any order eventually converges — the plugin retries for
ever and the website polls — but this one gives you a readable log at each step instead of three
components all reporting that something else is missing.
### 2.1 The sidecar
```bash
rust-link-sidecar --print-config
```
This resolves the configuration exactly as a normal start would: it writes `sidecar.toml` if it is
missing, generates and saves an auth token if there is none, and prints the whole thing as JSON —
**including the token in clear text**, which is the point. Keep that token; the website needs it and
there is no second way to read it back.
```json
{
"component": "rust-link-sidecar",
"protocol": 1,
"config_path": "/etc/runicgateway/rust-main.toml",
"game": { "bind": "127.0.0.1:7799", "server_id": "" },
"web": { "bind": "127.0.0.1:8090", "auth_token": "…", "ws_path": "/ws" },
"store": { "path": "/var/lib/runicgateway/rust-link.db" }
}
```
Then start it. On a host running more than one game server, give each sidecar its own
`--config`, its own ports and its own database file.
**`[game].bind` stays on loopback.** There is no token on the game link — the plugin and the sidecar
share a host and `127.0.0.1` *is* the authentication. Moving that bind to a routable address puts an
unauthenticated command channel on the network.
**`[web].bind` is the one you may need to move**, because the website is usually on another host.
Behind TLS and a firewall: the token is the only thing guarding it.
Check it:
```bash
curl http://127.0.0.1:8090/health
{"status":"degraded","protocol":1,"plugin_connected":false,"database":"ok","uptime":"0m","last_event":null}
```
`degraded` with `plugin_connected: false` is exactly right at this point — nothing is connected yet.
### 2.2 The plugin
```bash
cp RunicGateway.cs /path/to/rust/oxide/plugins/
```
Oxide compiles and loads it on the write. Watch `oxide/logs/`:
```
[Info] RunicGateway was compiled successfully in 2295ms
[Info] [Runic Gateway] protocol 1, serverId 'main', sidecar 127.0.0.1:7799
[Info] [Runic Gateway] connected to 127.0.0.1:7799
```
The first load also writes `oxide/config/RunicGateway.json`. Set `ServerId` before you go further:
```json
{ "Host": "127.0.0.1", "Port": 7799, "QueueCap": 5000, "ServerId": "main" }
```
**`ServerId` is this server's identity as the website knows it, and it is permanent.** It is not
derived from the hostname on purpose — an operator renames a server for a season, and the site must
not lose its history for it. Changing it later orphans everything recorded under the old one.
Now `/health` should read:
```json
{"status":"ok","protocol":1,"plugin_connected":true,"database":"ok","uptime":"2m","last_event":"…"}
```
If it does not, ask the game server:
```
rg.link
protocol=1 serverId=main connected=True depth=0 sent=3 dropped=0 received=2
connects=1 writeErrors=0 bootId=boot-20260915T194502Z
```
### 2.3 The website
**Admin → Rust → add a server.** Four values:
| Field | Value |
|---|---|
| Id | the slug every URL carries. Match `ServerId` in the plugin config |
| Name | what visitors see |
| Sidecar base URL | `http://<sidecar host>:8090` |
| Sidecar token | the `auth_token` from `--print-config` |
**The token is write-only.** It is stored encrypted and never returned to any client; the panel
reports only whether one is set. A save that leaves the field blank keeps the stored one — so
renaming a server does not mean re-pasting a credential.
Then press **Test**, which probes the sidecar and reports what came back:
```json
{ "ok": true, "status": "ok",
"sidecar": { "status": "ok", "protocol": 1, "plugin_connected": true, } }
```
Within a poll interval the server appears at `/rust/servers`.
---
## 3. When it does not work
A wrong URL, a wrong token and a mismatched protocol version all present as *"the site says my
server is offline"*. The **Test** button is what separates them, and its `status` is the whole
diagnosis:
| `status` | What is wrong | Where to look |
|---|---|---|
| `ok` | nothing | — |
| `no-token` | the admin form was saved without one | Admin → Rust |
| `unauthorized` | the token does not match | `--print-config` on the sidecar host |
| `protocol-mismatch` | the sidecar and the module speak different versions | upgrade one of them; the body names both numbers |
| `timeout` | the sidecar answered too slowly, or not at all | the sidecar's own log |
| `transport-error` | nothing is listening at that address | the base URL, the firewall, whether the sidecar is running |
| `http-<code>` | something answered, and it was not a sidecar | usually a reverse proxy in front of the wrong thing |
Two failures that look alike and are not:
- **`plugin_connected: false` with an otherwise healthy sidecar** — the bridge is fine and the game
is not talking to it. Check the plugin is loaded (`oxide.plugins`) and `rg.link` on the game
server.
- **The server is listed but reads `stale`** — something reported once and has not since. The row
says what was true when it was written; nothing has written it since. Either the poll is failing
(the website's log) or the sidecar stopped (its own).
### 3.0 `untyped_frames` on `/health` is not zero
**The plugin and the sidecar are on different protocol versions.** The game link has no handshake
to catch that at connect time (`PROTOCOL.md` §2), so it shows up here instead: the sidecar files a
frame by its `type`, a frame from the wrong version does not carry one it recognises, and it is
dropped and counted rather than guessed at.
The symptom without this counter is the confusing one — a game server plainly up, a sidecar plainly
healthy, and a website showing nothing. Check the plugin's `rg.link` (it prints its protocol) against
the sidecar's `/health` (which prints its own) and upgrade whichever is behind.
### 3.1 The failures that are supposed to happen
Three things look like breakage and are the design:
- **Killing the sidecar does not disturb the game.** The plugin logs `sidecar link lost;
reconnecting` and retries with backoff, buffering into a bounded queue that drops its oldest
entries rather than growing. The game does not stall, and `Emit` never touches a socket.
- **Starting the plugin before the sidecar logs one line and then goes quiet.** `cannot reach the
sidecar: … — retrying quietly until it answers`, printed once per load rather than every few
seconds. A wrong `Host` or `Port` looks exactly like this, which is why it is printed at all.
- **The website renders with every game server off.** The server list, the player counts and the
last-reported times all come from stored state. A page that 500s because a socket is closed would
be a module that made the site's availability depend on the game's.
---
## 4. Running more than one server
Each pair is fully independent: its own ports, its own `sidecar.toml`, its own database file, its
own token, its own row on the website.
Set `[game].server_id` in each `sidecar.toml` to match that server's plugin config. It is a
**cross-check**, not a second source of truth — the plugin's announcement wins — and it exists to
catch exactly one mistake: two game servers pointed at one sidecar by a copied config, which is
silent in every other design and produces one server's history under another's name. When it fires
you get a warning naming both ids.
---
## 4.1 What the bridge sends, and how much of it is kept
From protocol 2 the plugin sends the read path: connects and disconnects, deaths, chat, gathering,
bans and reports, and the wipe. Two things about the volume are worth knowing before you size
anything.
**Gathering and NPC kills are counted, not forwarded.** `OnDispenserGather` fires on every swing at
a tree; sending one frame per swing would make the bridge the most expensive thing on the server. The
plugin keeps a per-player tally and flushes it once a minute as a single `player.tally` frame. So the
leaderboard is exact and the wire is quiet.
**The sidecar's history is bounded; the website's is not.** `[store].retain_days` (default 14) is
how long the sidecar keeps raw events. The permanent record — per-wipe totals that survive a wipe —
lives in the website's own tables, so shortening this loses recent detail and never loses a player's
history. Set it to `0` to keep everything, if the host's disk is yours to spend.
**From protocol 3 your players can link their Steam account.** In game they type `/link` and the
server answers them privately with a six-character code; on the website they type that code in
within five minutes and the two are joined. Nothing about the link is stored on the game host — the
website owns the record, and `/unlink` in game asks it to let go.
Two things an operator should know about it:
- **The code is never in a frame.** It reaches the player and nobody else, which is what makes typing
it into a signed-in browser proof that they are the one who asked. What crosses the bridge is
`account.link.requested`, a staff-visible note that somebody asked.
- **A Steam account can belong to one website account at a time, across your whole fleet.** A code
from any of your servers links for all of them. If somebody links the wrong account the site
refuses to move it — the player runs `/unlink` in game, or staff release it from the user's page in
the admin panel.
**From protocol 4 the website owns your permissions.** Groups and grants are written in
Admin → Rust permissions and pushed into this server's own Oxide/Carbon permission store, so every
plugin you already run honours them — Kits, ZoneManager, anything that calls `UserHasPermission`.
Nothing is required of those plugins and nothing is configured twice.
Four things an operator should know about it, because each looks like something else from the game
side:
- **A wipe does not lose them.** The site re-pushes the whole set when the server comes back. If your
wipe script clears `oxide/data/`, the permissions the site authored are back within a minute of the
server being up; ones granted at the console are not, because nothing remembers those.
- **Granting at the console still works, and the website notices.** A hand edit is reported as
drift on that screen and is **never** undone on its own — an operator is offered two answers to
it: adopt it, so the site maintains it from then on, or revoke it. That is deliberate: a console
grant during an incident must survive the next sync.
- **A permission no loaded plugin has registered cannot be granted.** Oxide's own API silently does
nothing for an unknown name, so the site checks first and reports the name as unresolved instead
of claiming a privilege nobody has. Load the plugin and the grant lands by itself.
- **A player who has never connected to that server can hold a grant but cannot be in a group.**
The store has no record of them to put in a group yet; the site says which memberships are waiting
and they land on that player's first connection.
`rg.perms` at the server console prints what the last sync did, which is the fastest way to tell
"that permission does not exist here" from "that player has never been seen here".
**From protocol 5 you can edit your plugins' settings from the website**, in Admin → Rust mod
config. It reads the configuration directory your framework actually uses — `oxide/config` or
`carbon/configs`, or wherever you moved it — and generates a form from the values it finds, so it
works for whatever you have installed. Four things worth knowing before you use it:
- **A save reloads the plugin and watches the reload.** If the plugin does not come back within four
seconds, the old file is **restored automatically** and the site shows you the log line that says
why. A typo costs you a few seconds, not a plugin.
- **Your data directory is not listed, deliberately.** `oxide/data` (or `carbon/data`) holds live
state — kit cooldowns, zone definitions, the permission store itself — not settings. Editing it
from a web form edits your players' cooldowns, and a running plugin overwrites the change on its
next save anyway.
- **Which plugin gets reloaded is your choice, with a guess filled in.** A folder name is
convention, not contract, so the site suggests one and lets you change it. The suggestion is right
nearly always and wrong silently when it is wrong, which is why it is a field rather than an
assumption.
- **This bridge's own `Host`, `Port` and `ServerId` are read-only there.** Changing them from the
website would cut the link carrying the change, or strand every row the site holds for this
server. Edit them on the host; everything else in that file is editable from the site.
`rg.config` at the server console prints which directory the site is reading and what the last write
from it did.
**Every row carries its wipe.** The plugin derives a `wipeId` from the save's creation time and
stamps it on every frame, so a wipe splits the history rather than ending it. That is also why
**the sidecar's database must never be in a wipe script's delete list** — see the Pterodactyl egg's
`REMOVE_FILES`.
---
## 5. Upgrading
The four declaration sites in [`PROTOCOL.md` §2](PROTOCOL.md#2-versioning) must agree. In practice
that means upgrading the sidecar and the plugin **together**, because the game link has no version
check of its own and a mismatched plugin mis-parses rather than refusing.
The website is the forgiving half: it sends its version on every request and a sidecar that
disagrees answers `409` with both numbers, so a module ahead of or behind its sidecar reports a
named fault rather than misbehaving.

217
rust-link/PLAYER_WALK.md Normal file
View File

@@ -0,0 +1,217 @@
# The player walk — proving the half of the read path a console cannot reach
Protocol 2's catalogue divides cleanly in two, and the line is not about importance: it is about
whether a hook can fire without somebody holding a mouse.
Everything in the first half was proven from a console and a REST client while phase 3 was built —
the boards, the wipe id, the envelope, bans, the server lifecycle. Everything below needs a **real
player on a real server**, because the hooks carry a `BasePlayer`, a `HitInfo` or a chat line, and
none of those three can be manufactured from a console without becoming a different test.
This document is the walk that closes it. It takes about ten minutes, it is the same on Oxide and on
Carbon, and it is written so that the answer is readable afterwards rather than watched live.
---
## Before you start
1. A rig running, with `RunicGateway.cs` loaded — `oxide.plugins` (or `c.plugins`) lists *Runic
Gateway*, and `rg.link` answers `connected=True`.
2. A sidecar the rig can reach, with its store **empty** — that is what makes the event list at the
end readable as a transcript of the walk and nothing else.
3. The sidecar's token to hand, for the reads at the bottom.
Run this once, before you join:
```
rg.hooks
```
Every player hook should read **silent**. That is the baseline: the point of the walk is to move
them, and starting from a run where some already fired proves less.
---
## The walk
Do these in order. The order matters only in two places, noted where it does.
| # | Do this | Fires | The frame should carry |
|---|---|---|---|
| 1 | **Join the server** | `CanUserLogin`, `OnUserApproved`, `OnPlayerConnected` | Three frames, in that order. The first two carry your **IP address** — check it is a real address and not the string `0`. `player.connected` carries your steam id and name |
| 2 | **Wake up / spawn in** (click Respawn if you are dead) | `OnPlayerRespawned` | `player.respawned`, steam id only. It does **not** fire if you simply wake from sleeping — that is the hook's own documented behaviour, so no frame here is a pass, not a failure |
| 3 | **Say something in chat**, then **say something in team chat** if you have a team | `OnPlayerChat` | Two `player.chat` frames, with `channel` reading `Global` and `Team`. The message must arrive whole — if it is truncated or the frame is missing, the flattener ate it |
| 4 | **Chop a tree for about twenty seconds**, then **mine a node** | `OnDispenserGather` | **Nothing immediately.** This is the aggregate: one `player.tally` frame within 60 seconds, carrying `gathered` with `wood` and `stones`, summed. Seeing a frame per swing would be the bug |
| 5 | **Kill an animal or a scientist** | `OnEntityDeath` | Again nothing immediately — `npcKills` on the next `player.tally`. No `player.death`: a chicken is not a killfeed entry |
| 6 | **Die to the environment** — fall damage is easiest | `OnPlayerDeath` | `player.death` with `attackerType: "environment"`, a `grid` like `H7`, and **no** `attackerId`. Check the grid against the map: a wrong sign in the row arithmetic mirrors the whole map, and only a human with the map open can see that |
| 7 | **Kill yourself**`kill` in the F1 console | `OnPlayerDeath` | `attackerType: "self"`, no `attackerId` |
| 8 | **If a second player is available**: kill each other once | `OnPlayerDeath` | `attackerType: "player"`, with `attackerId`, `attackerName`, a `weapon` shortname and a `distance` in metres. This is the killfeed's whole shape, and it is the one row phase 4's page is built from |
| 9 | **Build a foundation, then destroy it yourself** | `OnEntityDeath` | `entity.destroyed` with `ownerId` (yours), `prefab`, `grid` and `attackerId`. Decay must **not** produce one of these — only a player breaking it |
| 10 | **Disconnect** | `OnPlayerDisconnected` | `player.disconnected` with a `reason` and a **`sessionSec`** roughly equal to how long you were on. It also flushes your tally first, so any gathering since the last minute arrives immediately before it |
Two ordering notes: step 4 must come before step 10 by at least a minute if you want to see the
cadence flush rather than the disconnect flush, and step 1's three frames are the only place the
order between hooks is itself part of the answer.
---
## Reading the result
From the machine running the sidecar:
```bash
TOKEN=# [web].auth_token from sidecar.toml, or `--print-config`
BASE=http://127.0.0.1:8090
# The whole walk, oldest first, as a transcript.
curl -s -H "Authorization: Bearer $TOKEN" "$BASE/feed?since=0&limit=500" \
| python -m json.tool
# Or one kind at a time.
curl -s -H "Authorization: Bearer $TOKEN" "$BASE/events?kind=player.death&limit=20"
```
And from the game console:
```
rg.hooks
```
Every hook in the walk should now read **fired**, with a count. A hook still `silent` after the step
that should have fired it is the finding — and on Carbon it is the specific question
[`CARBON.md`](../modules/rust/CARBON.md) §6 asks, since Carbon's catalogue omits thirteen uMod names
and nobody has yet checked whether they are renames or holes.
---
## What counts as a pass
Not "frames arrived". Three things, and the third is the one worth slowing down for:
1. **Every hook in the table fired**, on both frameworks, from the same plugin file.
2. **Every frame carries the envelope**`type`, `serverId` and `wipeId` on all of them
([`PROTOCOL.md`](PROTOCOL.md) §8.1). A player frame without a `wipeId` cannot be attributed to a
wipe and its rollup is lost.
3. **The aggregates are aggregates.** `player.tally` is a delta since the last flush, so two minutes
of chopping is two frames that sum to the total, not two frames each carrying the total. Getting
this backwards makes every leaderboard roughly double, and it looks correct until somebody counts.
Anything that disagrees with the table is a finding about the game or the framework rather than a
mistake in the table — record it, the same way phases 0, 1 and 2 recorded theirs.
---
## The identity walk (protocol 3, phase 6)
Added 2026-09-21, and here for the same reason as everything above: **a link code reaches a player
and nobody else**, so no console can read one. The site's own half was walked in a browser — the
refusals, the admin panel, staff unlink, the rate limit — and what needs a person in game is the
three steps below.
It takes two minutes, and it wants **two website accounts** — one you will link, one you will try to
link the same Steam account to.
| # | Do this | You should see |
|---|---|---|
| 1 | **In game, type `/link`** | A private reply with a six-character code and a five-minute deadline. Check it is private: a second player on the server must not see it. The code has **no O, 0, I or 1** in it — those glyphs are not in the alphabet, so one in your code is a finding |
| 2 | **Type `/link` again straight away** | *"Please wait a moment…"* — the thirty-second cooldown. The first code is now dead either way: a new request drops the old one, so only the newest ever works |
| 3 | **On the website, sign in and open `/player/rust`. Type the code** | The account appears, named as the game knows you, with the server it came from. Try the same code again: *"That code is unknown or has expired"* — it works once |
| 4 | **Sign in as the SECOND account and type a fresh code for the same Steam account** | Refused, naming the account that holds it: *"That Steam account is already linked to <name>. Run /unlink in game to release it."* The link must **not** move — it is what phase 7 grants permissions against |
| 5 | **In game, type `/unlink`** | The site's row disappears within one ingest tick (five seconds by default). Reload `/player/rust` to confirm — this is the frame arriving over the feed, not the page asking |
| 6 | **Type a code from a server whose sidecar you have just stopped** | *"One of the servers could not be reached… your code is still good — try again in a minute."* Distinct from step 3's refusal, and the distinction is the point: the code is fine and fetching another one would not help |
Step 6 needs a fleet of two, one of them down; on a single-server rig it reads *"The game servers are
unreachable right now"* instead, which is the same rule with nothing left to be unsure about.
**What counts as a pass here:** the code never appears anywhere but in front of the player who asked
for it (check the chat log and the sidecar's `/events?kind=account.link.requested` — the frame
carries the steam id, the name and a TTL, and **no code**), a Steam account belongs to one website
account at a time, and every refusal is a sentence that tells the player what to do next.
---
## The permission walk (protocol 4, phase 7)
Added 2026-09-21. The website half was walked end to end against a stand-in plugin — the authoring
screen, the report, drift and its two answers, and a restart that emptied the store and was fully
re-pushed. **What is left is the sentence the phase exists for: a grant made on the website gates a
third-party plugin in the game.**
It cannot be walked from a console, and it cannot be walked on the owner's account:
- **A console session bypasses every gate.** The standard idiom is
`return !player || permission.UserHasPermission(...)`, and an RCON command has no `BasePlayer`
so the console is unconditionally allowed ([PLAN.md §12.5](../modules/rust/PLAN.md)).
- **An admin account bypasses most plugins' gates too**, and not uniformly: Popup Notifications
(`player.IsAdmin ||`) and Zone Manager (`authLevel > 0 ||`) are hard bypasses. Kits is the
exception — its `IsAdmin` is the `kits.admin` **permission** and `AdminIgnoreRestrictions`
defaults to `false` — so a kit's `RequiredPermission` does apply to a server owner.
So this walk wants a **second, non-admin Steam account** connected to the rig. Kits alone can be
walked on the owner's account; steps 4 and 5 cannot.
| # | Do this | You should see |
|---|---|---|
| 1 | **Link the second account** (the identity walk above), then on the website open Admin → Rust permissions and grant it a kit's `RequiredPermission` — pick the kit from `GetKitNames`, or read one out of `oxide/config/Kits.json` | The grant appears with the account beside it. Within a minute the server row reads **in sync** — or press *Sync now* and watch it happen |
| 2 | **In game on that account, open the kit menu** | The kit is no longer locked. Before the grant it shows as locked; that difference is the whole phase |
| 3 | **At the server console, `oxide.show user <steamid>`** | The permission is there, granted by this plugin rather than by hand |
| 4 | **At the console, `oxide.grant user <steamid> zonemanager.admin`** (a permission the site manages but did not grant) | Within seconds the website's screen shows it under *Changed in game*. **Revoke** it there, and it is gone from `oxide.show user` on the next sync. **Adopt** a different one instead and it stays, now listed as the site's own |
| 5 | **Put the second account in a group on the website, then wipe or restart the server** (a wipe script that clears `oxide/data/` is the interesting case) | After the server is back: the group exists again, the membership is back, and the grant is back — without anybody touching the website. This is R2's central promise and the one thing a stand-in cannot prove |
| 6 | **Grant a permission whose plugin you have just unloaded** | The site reports it **unresolved** against that server and keeps the grant. Load the plugin again: it lands on the next sync, with nothing typed |
| 7 | **Add a website account that has never connected to this server to a group** | The site reports the membership as *waiting on their first connection*. Have them connect: it lands. A **direct grant** to the same account, by contrast, is in `oxide.show user` immediately |
**Run it on both frameworks.** From phase 3, done means done on Oxide and on Carbon (R19/R21), and
this phase has two specific things to confirm there rather than assume:
- **`GetPermissionUsers` / `GetUsersInGroup` entry format.** Both answer `id(name)`, and the spacing
differs between the calls and between the frameworks. The plugin takes everything before the first
bracket. If that parse is wrong, **every holder is reported as foreign** — which is visible
immediately: the drift list fills with grants the site itself made.
- **`GetGroupPermissions(name, false)`** is called with both arguments. If Carbon's signature has no
second parameter, the plugin does not compile there at all — the one place in protocol 4 where
R19's byte-identical-plugin claim is at risk.
**What counts as a pass:** a non-admin player's access in game changes because of something typed on
the website and nothing else; a hand edit is reported rather than undone; and a wipe costs the
operator nothing.
## The configuration walk (protocol 5, phase 7b)
Added 2026-09-22. The website half was walked end to end against a real sidecar and a stand-in
plugin over a real directory of real config files — the recursive walk, a form save, a rollback, a
refusal, a version conflict and the locked keys — and the plugin half **compiles and loads on the
live Oxide rig**, where `rg.config` answers
`protocol=5 framework=oxide root=/home/container/oxide/config`.
**What is left is the sentence the phase exists for: a setting changed on the website takes effect
in the running game.** It needs the sidecar and the game server on **one host**, because the game
link is loopback by design (D2) — on the Pterodactyl rigs that is phase 18's egg, and on a
development machine it is a firewall rule for the port the plugin dials.
| # | Do this | You should see |
|---|---|---|
| 1 | **Open Admin → Rust mod config** and pick the server | The tree the framework actually uses — `oxide/config` on Oxide, `carbon/configs` on Carbon — grouped by plugin, with every loaded plugin's version beside it |
| 2 | **Open `ZoneManager.json`, change a setting, leave the reload target on its guess, and save** | "Saved, and the plugin reloaded." At the console, `oxide.show`/`c.show` is irrelevant — the proof is the plugin behaving differently, so pick a setting you can see: `Auto Show Zones`, or an entry message |
| 3 | **Check a float nobody touched**, e.g. a rate ending `.0`, in the file on the host | It is still `1.0`, not `1`. This is the trap the whole editor exists for, and a server whose configs are full of whole-numbered floats is where it bites |
| 4 | **Break a config on purpose** — in Raw JSON, give a numeric field a string, or anything the plugin's own class cannot deserialize — and save with that plugin as the reload target | Within about four seconds: *"The plugin did not come back, so the old file was put back automatically"*, the compiler's own line underneath it, and the file on the host back as it was. `oxide.plugins` shows the plugin **loaded** — because the restore was reloaded too |
| 5 | **Save a nested file** (`Kits/kits.json`, or any `config/<Mod>/x.json`) **and confirm the reload target** | The right plugin reloads. Reloading the wrong one is the failure this field exists to prevent, and it reports success — so check `oxide.plugins`' timestamps, not the website's word |
| 6 | **Open the bridge's own config** | `Host`, `Port` and `ServerId` are read-only with the reason; `QueueCap` saves; the reload dropdown does not offer this plugin. The save says it was written and **not** reloaded, which is the honest answer — our settings apply on the next deliberate reload |
| 7 | **Edit a file on the host over SSH while the website has it open, then save from the website** | A conflict, with the current file offered — never an overwrite |
| 8 | **Ask for a file outside the tree** (`../data/oxide.users.data`, an absolute path) with `curl` against the sidecar, with a valid token | Refused by the **plugin**, with a reason. The sidecar forwards paths and judges none of them; the guard is where the directory is |
**Run it on both frameworks.** From phase 3, done means done on Oxide and on Carbon (R19/R21), and
this phase has two specific things to confirm rather than assume:
- **The reload path.** The plugin asks `Interface.Oxide` for `ReloadPlugin` by reflection and falls
back to a console command — `c.reload` on Carbon, `oxide.reload` on Oxide, chosen by looking for a
Carbon assembly at runtime. A wrong prefix on Carbon prints **nothing at all**, which looks
exactly like a command that worked (`CARBON.md` §5), so the proof is `OnPluginLoaded` arriving,
not the command being accepted.
- **`OnPluginLoaded` / `OnPluginUnloaded` firing at all.** They are the rollback's only evidence. If
either does not fire on a framework, every save there rolls itself back four seconds later and
reports a plugin that is in fact perfectly fine. `rg.hooks` at the console is the standing answer:
both names are in `ExpectedHooks`, so a framework that never raises one shows a zero.
**What counts as a pass:** a setting typed on the website changes what the running game does; a
deliberately broken config leaves the plugin loaded and the operator holding the reason; and no file
the save did not touch differs by a single byte.

1089
rust-link/PROTOCOL.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -865,11 +865,6 @@ website/
│ │ ├── trustProxy.test.js
│ │ ├── usernamePolicy.test.js
│ │ └── userNotificationsSql.test.js
│ ├── tools/
│ │ └── cliloc-export/
│ │ ├── clilocexport.csproj
│ │ ├── Program.cs
│ │ └── README.md
│ ├── .env.example
│ ├── engagement-triggers.json
│ ├── package-lock.json