diff --git a/README.md b/README.md index 605ddcb..3e369e4 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,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 uMod's Rust Oxide API, scraped from upstream: [HOOKS.md](modules/rust/HOOKS.md) (all 477 hooks) and [DEFINITIONS.md](modules/rust/DEFINITIONS.md) (678 items, 2,590 skins) | +| [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 | diff --git a/modules/rust/HOOKS.md b/modules/rust/HOOKS.md index 7c91dab..22fb598 100644 --- a/modules/rust/HOOKS.md +++ b/modules/rust/HOOKS.md @@ -35,6 +35,29 @@ Each hook gives three things: --- + + +## Universal hooks + +**34 of the 477 hooks below are not Rust's** — they are uMod's own *universal* (Covalence) hooks, +which uMod raises identically on every game it supports. They are listed on the Rust page because +they fire on Rust too, and every one of them is reproduced here. The distinction matters to us: +**a universal hook is the portable part of the surface** — code written against it would carry to +any other uMod-supported game, where a Rust-specific hook would not. + +They are marked **U** in the alphabetical index. The full set: + +- **Player** — [`CanUserLogin`](#canuserlogin), [`OnUserApproved`](#onuserapproved), [`OnUserBanned`](#onuserbanned), [`OnUserChat`](#onuserchat), [`OnUserCommand`](#onusercommand), [`OnUserConnected`](#onuserconnected), [`OnUserDisconnected`](#onuserdisconnected), [`OnUserGroupAdded`](#onusergroupadded), [`OnUserGroupRemoved`](#onusergroupremoved), [`OnUserKicked`](#onuserkicked), [`OnUserNameUpdated`](#onusernameupdated), [`OnUserPermissionGranted`](#onuserpermissiongranted), [`OnUserPermissionRevoked`](#onuserpermissionrevoked), [`OnUserRespawn`](#onuserrespawn), [`OnUserRespawned`](#onuserrespawned), [`OnUserUnbanned`](#onuserunbanned) +- **Server** — [`Init`](#init), [`OnFrame`](#onframe), [`OnPluginLoaded`](#onpluginloaded), [`OnPluginUnloaded`](#onpluginunloaded), [`OnServerInitialized`](#onserverinitialized), [`OnServerSave`](#onserversave) +- **Plugin** — [`LoadDefaultConfig`](#loaddefaultconfig), [`LoadDefaultMessages`](#loaddefaultmessages), [`Loaded`](#loaded), [`Unload`](#unload) +- **Permission** — [`OnGroupCreated`](#ongroupcreated), [`OnGroupDeleted`](#ongroupdeleted), [`OnGroupParentSet`](#ongroupparentset), [`OnGroupPermissionGranted`](#ongrouppermissiongranted), [`OnGroupPermissionRevoked`](#ongrouppermissionrevoked), [`OnGroupRankSet`](#ongrouprankset), [`OnGroupTitleSet`](#ongrouptitleset), [`OnPermissionRegistered`](#onpermissionregistered) + +> Source: . Verified against that page on the +> same capture — all 34 appear in the Rust set, and the Rust page adds no universal hook of its +> own, so this list is exactly the intersection. + +--- + ## Categories | Category | Hooks | What it covers | @@ -65,485 +88,487 @@ Each hook gives three things: ## Alphabetical index -| Hook | Category | Returns | -|---|---|---| -| [`CanAcceptItem`](#canacceptitem) | Item | Returning CanAcceptResult value overrides default behavior | -| [`CanAdministerVending`](#canadministervending) | Vending | Returning true or false overrides default behavior | -| [`CanAffordToPlace`](#canaffordtoplace) | Player | Returning true or false overrides default behavior | -| [`CanAffordUpgrade`](#canaffordupgrade) | Player | Returning true or false overrides default behavior | -| [`CanAssignBed`](#canassignbed) | Player | Returning a non-null value overrides default behavior | -| [`CanBeTargeted`](#canbetargeted) | Player | Returning true or false overrides default behavior | -| [`CanBeWounded`](#canbewounded) | Player | Returning true or false overrides default behavior | -| [`CanBradleyApcTarget`](#canbradleyapctarget) | Entity | Returning true or false overrides default behavior | -| [`CanBuild`](#canbuild) | Player | Returning a non-null value overrides default behavior | -| [`CanBypassQueue`](#canbypassqueue) | Player | Returning true will bypass the queue, returning nothing will by def… | -| [`CanCatchFish`](#cancatchfish) | Fishing | Returning true or false overrides default behavior | -| [`CanChangeCode`](#canchangecode) | Player | Returning a non-null value overrides default behavior | -| [`CanChangeGrade`](#canchangegrade) | Player | Returning true or false overrides default behavior | -| [`CanCheckFuel`](#cancheckfuel) | Vehicle | Returning true or false overrides default behavior | -| [`CanClientLogin`](#canclientlogin) | Player | Returning a string will use the string as the error message | -| [`CanCombineDroppedItem`](#cancombinedroppeditem) | Item | Returning a non-null value overwrites command arguments | -| [`CanCraft`](#cancraft) | Player | Returning true or false overrides default behavior | -| [`CanCreateWorldProjectile`](#cancreateworldprojectile) | Weapon | Returning a non-null value overrides default behavior | -| [`CanDemolish`](#candemolish) | Player | Returning true or false overrides default behavior | -| [`CanDeployItem`](#candeployitem) | Player | Returning a non-null value cancels default behavior | -| [`CanDismountEntity`](#candismountentity) | Player | Returning a non-null value overrides default behavior | -| [`CanDropActiveItem`](#candropactiveitem) | Item | Returning true or false overrides default behavior | -| [`CanEntityBeHostile`](#canentitybehostile) | Entity | Returning a non-null value overrides default behavior | -| [`CanEquipItem`](#canequipitem) | Player | Returning true or false overrides default behavior | -| [`CanExplosiveStick`](#canexplosivestick) | Weapon | Returning a non-null value overwrites the default behavior | -| [`CanHackCrate`](#canhackcrate) | Player | Returning a non-null value overrides default behavior | -| [`CanHelicopterDropCrate`](#canhelicopterdropcrate) | Entity | Returning true or false overrides default behavior | -| [`CanHelicopterStrafe`](#canhelicopterstrafe) | Entity | Returning true or false overrides default behavior | -| [`CanHelicopterStrafeTarget`](#canhelicopterstrafetarget) | Entity | Returning true or false overrides default behavior | -| [`CanHelicopterTarget`](#canhelicoptertarget) | Entity | Returning true or false overrides default behavior | -| [`CanHelicopterUseNapalm`](#canhelicopterusenapalm) | Entity | Returning true or false overrides default behavior | -| [`CanHideStash`](#canhidestash) | Player | Returning a non-null value overrides default behavior | -| [`CanLock`](#canlock) | Player | Returning a non-null value cancels default behavior | -| [`CanLockerAcceptItem`](#canlockeracceptitem) | Entity | Returning true or false overrides default behavior | -| [`CanLootEntity`](#canlootentity) | Player | Returning a non-null value overrides default behavior | -| [`CanLootPlayer`](#canlootplayer) | Player | Returning true or false overrides default behavior | -| [`CanMountEntity`](#canmountentity) | Player | Returning a non-null value overrides default behavior | -| [`CanMoveItem`](#canmoveitem) | Item | Returning a non-null value overrides default behavior | -| [`CanNetworkTo`](#cannetworkto) | Entity | Returning true or false overrides default behavior | -| [`CanNpcAttack`](#cannpcattack) | Entity | Returning true or false overrides default behavior | -| [`CanNpcEat`](#cannpceat) | Entity | Returning true or false overrides default behavior | -| [`CanPickupEntity`](#canpickupentity) | Player | Returning true or false overrides default behavior | -| [`CanPickupLock`](#canpickuplock) | Player | Returning true or false overrides default behavior | -| [`CanPushBoat`](#canpushboat) | Player | Returning a non-null value cancels default behavior | -| [`CanReceiveCall`](#canreceivecall) | Phone | Returning true or false overrides default behavior | -| [`CanRecycle`](#canrecycle) | Entity | Returning true or false overrides default behavior | -| [`CanRenameBed`](#canrenamebed) | Player | Returning a non-null value overrides default behavior | -| [`CanResearchItem`](#canresearchitem) | Player | Returning a non-null value overrides default behavior | -| [`CanSamSiteShoot`](#cansamsiteshoot) | Entity | Returning a non-null value cancels default behavior | -| [`CanSeeStash`](#canseestash) | Player | Returning a non-null value overrides default behavior | -| [`CanSetBedPublic`](#cansetbedpublic) | Player | Returning a non-null value overrides default behavior | -| [`CanSetRelationship`](#cansetrelationship) | Player | Returning true or false overrides default behavior | -| [`CanSpectateTarget`](#canspectatetarget) | Player | Returning a non-null value cancels default behavior | -| [`CanStackItem`](#canstackitem) | Item | Returning true or false overrides default behavior | -| [`CanSwapToSeat`](#canswaptoseat) | Entity | Returning true or false overrides default behavior | -| [`CanTakeCutting`](#cantakecutting) | Resource | Returning a non-null value cancels default behavior | -| [`CanUnlock`](#canunlock) | Player | Returning a non-null value overrides default behavior | -| [`CanUnlockTechTreeNode`](#canunlocktechtreenode) | TechTree | Returning true or false overrides default behavior | -| [`CanUnlockTechTreeNodePath`](#canunlocktechtreenodepath) | TechTree | Returning true or false overrides default behavior | -| [`CanUpdateSign`](#canupdatesign) | Player | Returning true or false overrides default behavior | -| [`CanUseFuel`](#canusefuel) | Vehicle | Returning true or false overrides default behavior | -| [`CanUseGesture`](#canusegesture) | Player | Returning true or false overrides default behavior | -| [`CanUseHelicopter`](#canusehelicopter) | Vehicle | Returning a non-null value cancels default behavior | -| [`CanUseLockedEntity`](#canuselockedentity) | Player | Returning true or false overrides default behavior | -| [`CanUseMailbox`](#canusemailbox) | Player | Returning true or false overrides default behavior | -| [`CanUserLogin`](#canuserlogin) | Player | Returning a string will kick the user with this reason. Returning a… | -| [`CanUseUI`](#canuseui) | Player | Returning a non-null value overrides default behavior | -| [`CanUseVending`](#canusevending) | Vending | Returning true or false overrides default behavior | -| [`CanUseWires`](#canusewires) | Player | Returning a non-null value overrides default behavior | -| [`CanVendingAcceptItem`](#canvendingacceptitem) | Vending | Returning true or false overrides default behavior | -| [`CanWearItem`](#canwearitem) | Player | Returning a non-null value overrides default behavior | -| [`Init`](#init) | Server | — | -| [`LoadDefaultConfig`](#loaddefaultconfig) | Plugin | — | -| [`LoadDefaultMessages`](#loaddefaultmessages) | Plugin | — | -| [`Loaded`](#loaded) | Plugin | — | -| [`OnActiveItemChange`](#onactiveitemchange) | Player | Returning a non-null value cancels default behavior | -| [`OnActiveItemChanged`](#onactiveitemchanged) | Player | — | -| [`OnAddVendingOffer`](#onaddvendingoffer) | Vending | — | -| [`OnAirdrop`](#onairdrop) | Entity | — | -| [`OnAmmoSwitch`](#onammoswitch) | Weapon | Returning a non-null value overrides default behavior | -| [`OnAmmoUnload`](#onammounload) | Weapon | Returning a non-null value cancels default behavior | -| [`OnAnalysisComplete`](#onanalysiscomplete) | Player | — | -| [`OnBackpackDrop`](#onbackpackdrop) | Item | Return non-null to override default behaviour. | -| [`OnBigWheelLoss`](#onbigwheelloss) | Entity | — | -| [`OnBigWheelWin`](#onbigwheelwin) | Entity | Returning non-null value overrides default behaviour. | -| [`OnBoatPathGenerate`](#onboatpathgenerate) | Vehicle | Returning a List overrides default behavior | -| [`OnBonusItemDrop`](#onbonusitemdrop) | Item | Returning a non-null value overrides default behavior | -| [`OnBonusItemDropped`](#onbonusitemdropped) | Item | — | -| [`OnBookmarkAdd`](#onbookmarkadd) | Entity | Returning a non-null value overrides default behavior | -| [`OnBookmarkControl`](#onbookmarkcontrol) | Entity | Returning a non-null value overrides default behavior | -| [`OnBookmarkControlEnd`](#onbookmarkcontrolend) | Entity | Returning a non-null value overrides default behavior | -| [`OnBookmarkControlEnded`](#onbookmarkcontrolended) | Entity | — | -| [`OnBookmarkControlStarted`](#onbookmarkcontrolstarted) | Entity | — | -| [`OnBookmarkDelete`](#onbookmarkdelete) | Entity | Returning a non-null value overrides default behavior | -| [`OnBookmarkInput`](#onbookmarkinput) | Entity | Returning a non-null value overrides default behavior | -| [`OnBookmarksSendControl`](#onbookmarkssendcontrol) | Entity | Returning a non-null value overrides default behavior | -| [`OnBradleyApcHunt`](#onbradleyapchunt) | Entity | Returning a non-null value overrides default behavior | -| [`OnBradleyApcInitialize`](#onbradleyapcinitialize) | Entity | Returning a non-null value overrides default behavior | -| [`OnBradleyApcPatrol`](#onbradleyapcpatrol) | Entity | Returning a non-null value overrides default behavior | -| [`OnBroadcastCommand`](#onbroadcastcommand) | Player | Returning a non-null value overwrites command arguments | -| [`OnBuildingPrivilege`](#onbuildingprivilege) | Entity | Returning BuildingPrivlidge value overrides default behavior | -| [`OnBuildingSplit`](#onbuildingsplit) | Structure | — | -| [`OnButtonPress`](#onbuttonpress) | Entity | Returning a non-null value cancels default behavior | -| [`OnBuyVendingItem`](#onbuyvendingitem) | Vending | Returning a non-null value overrides default behavior | -| [`OnCardSwipe`](#oncardswipe) | Item | Returning a non-null value cancels default behavior | -| [`OnCargoPlaneSignaled`](#oncargoplanesignaled) | Entity | — | -| [`OnCCTVDirectionChange`](#oncctvdirectionchange) | Entity | Returning a non-null value cancels default behavior | -| [`OnCentralizedBanCheck`](#oncentralizedbancheck) | Player | Returning a non-null value cancels default behavior | -| [`OnClanColorChanged`](#onclancolorchanged) | Clan | — | -| [`OnClanCreated`](#onclancreated) | Clan | — | -| [`OnClanDisbanded`](#onclandisbanded) | Clan | — | -| [`OnClanLogoChanged`](#onclanlogochanged) | Clan | — | -| [`OnClanMemberAdded`](#onclanmemberadded) | Clan | — | -| [`OnClanMemberKicked`](#onclanmemberkicked) | Clan | — | -| [`OnClanMemberLeft`](#onclanmemberleft) | Clan | — | -| [`OnClientAuth`](#onclientauth) | Player | — | -| [`OnClientCommand`](#onclientcommand) | Player | Returning a non-null value overrides default behavior | -| [`OnCodeEntered`](#oncodeentered) | Structure | Returning a non-null value overrides default behavior | -| [`OnCollectiblePickup`](#oncollectiblepickup) | Resource | Returning a non-null value overrides default behavior | -| [`OnConstructionPlace`](#onconstructionplace) | Structure | Returning a non-null value overrides default behavior | -| [`OnContainerDropItems`](#oncontainerdropitems) | Entity | Returning a non-null value overrides default behavior | -| [`OnCorpsePopulate`](#oncorpsepopulate) | Player | Returning a BaseCorpse overrides default behavior | -| [`OnCounterModeToggle`](#oncountermodetoggle) | Entity | Returning a non-null value overrides default behavior | -| [`OnCounterTargetChange`](#oncountertargetchange) | Entity | Returning a non-null value overrides default behavior | -| [`OnCrateDropped`](#oncratedropped) | Entity | — | -| [`OnCrateHack`](#oncratehack) | Entity | — | -| [`OnCrateHackEnd`](#oncratehackend) | Entity | — | -| [`OnCrateLanded`](#oncratelanded) | Entity | — | -| [`OnCupboardAuthorize`](#oncupboardauthorize) | Structure | Returning a non-null value overrides default behavior | -| [`OnCupboardClearList`](#oncupboardclearlist) | Structure | Returning a non-null value overrides default behavior | -| [`OnCupboardDeauthorize`](#oncupboarddeauthorize) | Structure | Returning a non-null value overrides default behavior | -| [`OnDefaultItemsReceive`](#ondefaultitemsreceive) | Player | Returning a non-null value overrides default behavior | -| [`OnDefaultItemsReceived`](#ondefaultitemsreceived) | Player | Returning a non-null value overrides default behavior | -| [`OnDeleteVendingOffer`](#ondeletevendingoffer) | Vending | — | -| [`OnDemoRecordingStart`](#ondemorecordingstart) | Player | Returning a non-null value overrides default behavior | -| [`OnDemoRecordingStarted`](#ondemorecordingstarted) | Player | — | -| [`OnDemoRecordingStop`](#ondemorecordingstop) | Player | Returning a non-null value overrides default behavior | -| [`OnDemoRecordingStopped`](#ondemorecordingstopped) | Player | — | -| [`OnDestroyUI`](#ondestroyui) | Player | — | -| [`OnDieselEngineToggle`](#ondieselenginetoggle) | Entity | Returning a non-null value cancels default behavior | -| [`OnDieselEngineToggled`](#ondieselenginetoggled) | Entity | — | -| [`OnDispenserBonus`](#ondispenserbonus) | Resource | Returning an Item replaces the existing Item | -| [`OnDispenserGather`](#ondispensergather) | Resource | Returning a non-null value overrides default behavior | -| [`OnDoorClosed`](#ondoorclosed) | Structure | — | -| [`OnDoorKnocked`](#ondoorknocked) | Structure | — | -| [`OnDoorOpened`](#ondooropened) | Structure | — | -| [`OnElevatorButtonPress`](#onelevatorbuttonpress) | Entity | Returning a non-null value overrides default behavior | -| [`OnElevatorCall`](#onelevatorcall) | Entity | Returning a non-null value overrides default behavior | -| [`OnElevatorMove`](#onelevatormove) | Entity | Returning a non-null value overrides default behavior | -| [`OnEngineLoadoutRefresh`](#onengineloadoutrefresh) | Entity | Returning a non-null value overrides default behaviour | -| [`OnEngineStart`](#onenginestart) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnEngineStarted`](#onenginestarted) | Vehicle | — | -| [`OnEngineStatsRefresh`](#onenginestatsrefresh) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnEngineStatsRefreshed`](#onenginestatsrefreshed) | Vehicle | — | -| [`OnEngineStop`](#onenginestop) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnEngineStopped`](#onenginestopped) | Vehicle | — | -| [`OnEntityBuilt`](#onentitybuilt) | Structure | — | -| [`OnEntityControl`](#onentitycontrol) | Entity | Returning true or false overrides default behavior | -| [`OnEntityDeath`](#onentitydeath) | Entity | — | -| [`OnEntityDestroy`](#onentitydestroy) | Entity | Returning a non-null value overrides default behavior | -| [`OnEntityDismounted`](#onentitydismounted) | Entity | — | -| [`OnEntityEnter`](#onentityenter) | Entity | — | -| [`OnEntityFlagsNetworkUpdate`](#onentityflagsnetworkupdate) | Entity | Returning a non-null value overrides default behavior | -| [`OnEntityGroundMissing`](#onentitygroundmissing) | Entity | Returning a non-null value overrides default behavior | -| [`OnEntityKill`](#onentitykill) | Entity | Returning a non-null value overrides default behavior | -| [`OnEntityLeave`](#onentityleave) | Entity | — | -| [`OnEntityMarkHostile`](#onentitymarkhostile) | Entity | Returning a non-null value cancels default behavior | -| [`OnEntityMounted`](#onentitymounted) | Entity | — | -| [`OnEntitySaved`](#onentitysaved) | Entity | — | -| [`OnEntitySnapshot`](#onentitysnapshot) | Entity | Returning a non-null value overrides default behavior | -| [`OnEntitySpawned`](#onentityspawned) | Entity | — | -| [`OnEntityStabilityCheck`](#onentitystabilitycheck) | Entity | Returning a non-null value cancels default behavior | -| [`OnEntityTakeDamage`](#onentitytakedamage) | Entity | | -| [`OnExcavatorGather`](#onexcavatorgather) | Entity | Returning a non-null value cancels default behavior | -| [`OnExcavatorMiningToggled`](#onexcavatorminingtoggled) | Entity | — | -| [`OnExcavatorResourceSet`](#onexcavatorresourceset) | Entity | Returning a non-null value cancels default behavior | -| [`OnExcavatorSuppliesRequest`](#onexcavatorsuppliesrequest) | Electronic | Returning non-null overrides default behaviour. | -| [`OnExcavatorSuppliesRequested`](#onexcavatorsuppliesrequested) | Electronic | | -| [`OnExperimentEnd`](#onexperimentend) | Player | Returning a non-null value overrides defualt behaviour. | -| [`OnExperimentEnded`](#onexperimentended) | Player | — | -| [`OnExperimentStart`](#onexperimentstart) | Player | Returning a non-null value overrides default behavior | -| [`OnExperimentStarted`](#onexperimentstarted) | Player | — | -| [`OnExplosiveDropped`](#onexplosivedropped) | Weapon | — | -| [`OnExplosiveDud`](#onexplosivedud) | Weapon | Returning a non-null value cancels default behavior | -| [`OnExplosiveFuseSet`](#onexplosivefuseset) | Weapon | Returning a non-null value overwrites fuse length | -| [`OnExplosiveThrown`](#onexplosivethrown) | Weapon | — | -| [`OnFindBurnable`](#onfindburnable) | Item | Returning an Item overrides default behavior | -| [`OnFindSpawnPoint`](#onfindspawnpoint) | Player | Return a BasePlayer.SpawnPoint object to use that spawnpoint | -| [`OnFireBallDamage`](#onfireballdamage) | Entity | — | -| [`OnFireBallSpread`](#onfireballspread) | Entity | — | -| [`OnFishCatch`](#onfishcatch) | Fishing | Returning a non-null value overrides default behavior | -| [`OnFishCaught`](#onfishcaught) | Fishing | — | -| [`OnFishingStopped`](#onfishingstopped) | Fishing | — | -| [`OnFlameExplosion`](#onflameexplosion) | Entity | — | -| [`OnFlameThrowerBurn`](#onflamethrowerburn) | Weapon | — | -| [`OnFrame`](#onframe) | Server | — | -| [`OnFuelAmountCheck`](#onfuelamountcheck) | Vehicle | Returning a numeric value (int) overrides the default value | -| [`OnFuelCheck`](#onfuelcheck) | Vehicle | Returning true or false overrides default behavior | -| [`OnFuelConsume`](#onfuelconsume) | Item | Returning a non-null value overrides default behavior | -| [`OnFuelConsumed`](#onfuelconsumed) | Item | — | -| [`OnFuelItemCheck`](#onfuelitemcheck) | Vehicle | Returning an Item overrides default behavior | -| [`OnGiveSoldItem`](#ongivesolditem) | Vending | Returning a non-null value cancels default behavior | -| [`OnGroupCreated`](#ongroupcreated) | Permission | — | -| [`OnGroupDeleted`](#ongroupdeleted) | Permission | — | -| [`OnGroupParentSet`](#ongroupparentset) | Permission | — | -| [`OnGroupPermissionGranted`](#ongrouppermissiongranted) | Permission | — | -| [`OnGroupPermissionRevoked`](#ongrouppermissionrevoked) | Permission | — | -| [`OnGroupRankSet`](#ongrouprankset) | Permission | — | -| [`OnGroupTitleSet`](#ongrouptitleset) | Permission | — | -| [`OnGrowableGather`](#ongrowablegather) | Resource | Returning a non-null value overrides default behavior | -| [`OnGrowableGathered`](#ongrowablegathered) | Resource | — | -| [`OnHammerHit`](#onhammerhit) | Structure | Returning a non-null value overrides default behavior | -| [`OnHealingItemUse`](#onhealingitemuse) | Item | Returning a non-null value overrides default behavior | -| [`OnHelicopterAttack`](#onhelicopterattack) | Entity | Returning a non-null value overrides default behavior | -| [`OnHelicopterDropCrate`](#onhelicopterdropcrate) | Entity | Returning a non-null value overrides default behavior | -| [`OnHelicopterDropDoorOpen`](#onhelicopterdropdooropen) | Entity | Returning a non-null value overrides default behavior | -| [`OnHelicopterKilled`](#onhelicopterkilled) | Entity | Returning a non-null value overrides default behavior | -| [`OnHelicopterOutOfCrates`](#onhelicopteroutofcrates) | Entity | Returning true or false overrides default behavior | -| [`OnHelicopterRetire`](#onhelicopterretire) | Entity | Returning a non-null value overrides default behaviour. | -| [`OnHelicopterStrafeEnter`](#onhelicopterstrafeenter) | Entity | Returning a non-null value cancels default behavior | -| [`OnHelicopterTarget`](#onhelicoptertarget) | Entity | Returning a non-null value overrides default behavior | -| [`OnHorseHitch`](#onhorsehitch) | Entity | Returning a non-null value overrides default behavior | -| [`OnHorseLead`](#onhorselead) | Entity | Returning a non-null value overrides default behavior | -| [`OnHotAirBalloonToggle`](#onhotairballoontoggle) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnHotAirBalloonToggled`](#onhotairballoontoggled) | Vehicle | — | -| [`OnIngredientsCollect`](#oningredientscollect) | Item | Returning a non-null value cancels default behavior | -| [`OnInputUpdate`](#oninputupdate) | Entity | Returning a non-null value cancels default behavior | -| [`OnInventoryNetworkUpdate`](#oninventorynetworkupdate) | Player | Returning a non-null value overrides default behavior | -| [`OnIORefCleared`](#oniorefcleared) | Entity | — | -| [`OnItemAction`](#onitemaction) | Item | Returning a non-null value overrides default behavior | -| [`OnItemAddedToContainer`](#onitemaddedtocontainer) | Item | — | -| [`OnItemCraft`](#onitemcraft) | Item | Returning true or false overrides default behavior | -| [`OnItemCraftCancelled`](#onitemcraftcancelled) | Item | — | -| [`OnItemCraftFinished`](#onitemcraftfinished) | Item | — | -| [`OnItemDeployed`](#onitemdeployed) | Item | — | -| [`OnItemDropped`](#onitemdropped) | Item | — | -| [`OnItemLock`](#onitemlock) | Item | Returning a non-null value overrides default behavior | -| [`OnItemPickup`](#onitempickup) | Item | Returning a non-null value overrides default behavior | -| [`OnItemRecycle`](#onitemrecycle) | Entity | Returning a non-null value overrides default behavior | -| [`OnItemRefill`](#onitemrefill) | Item | Returning a non-null value overrides default behavior | -| [`OnItemRemove`](#onitemremove) | Item | Return a non-null value stop item from being destroyed | -| [`OnItemRemovedFromContainer`](#onitemremovedfromcontainer) | Item | — | -| [`OnItemRepair`](#onitemrepair) | Item | Returning a non-null value overrides default behavior | -| [`OnItemResearch`](#onitemresearch) | Item | — | -| [`OnItemResearched`](#onitemresearched) | Item | Returning a float will affect if researching is successful or not | -| [`OnItemSplit`](#onitemsplit) | Item | Returning an Item overrides default behavior | -| [`OnItemStacked`](#onitemstacked) | Item | — | -| [`OnItemSubmit`](#onitemsubmit) | Item | Returning a non-null value cancels default behavior | -| [`OnItemUnlock`](#onitemunlock) | Item | Returning a non-null value overrides default behavior | -| [`OnItemUpgrade`](#onitemupgrade) | Item | — | -| [`OnItemUse`](#onitemuse) | Item | Returning an int overrides the amount consumed. | -| [`OnLiftUse`](#onliftuse) | Entity | Returning a non-null value overrides default behavior | -| [`OnLiquidVesselFill`](#onliquidvesselfill) | Entity | Returning a non-null value cancels default behavior | -| [`OnLockerSwap`](#onlockerswap) | Entity | Returning non-null value overrides default behavior | -| [`OnLootEntity`](#onlootentity) | Player | — | -| [`OnLootEntityEnd`](#onlootentityend) | Player | — | -| [`OnLootItem`](#onlootitem) | Player | — | -| [`OnLootNetworkUpdate`](#onlootnetworkupdate) | Player | Returning a non-null value overrides default behavior | -| [`OnLootPlayer`](#onlootplayer) | Player | — | -| [`OnLootSpawn`](#onlootspawn) | Entity | Returning a non-null value overrides default behavior | -| [`OnLoseCondition`](#onlosecondition) | Item | — | -| [`OnMagazineReload`](#onmagazinereload) | Weapon | Returning a non-null value overrides default behavior | -| [`OnMapImageUpdated`](#onmapimageupdated) | Item | — | -| [`OnMapMarkerAdd`](#onmapmarkeradd) | Player | Returning a non-null value cancels default behavior | -| [`OnMapMarkerAdded`](#onmapmarkeradded) | Player | — | -| [`OnMapMarkerRemove`](#onmapmarkerremove) | Player | Returning a non-null value cancels default behaviour | -| [`OnMapMarkersClear`](#onmapmarkersclear) | Player | Returning a non-null value cancels default behavior | -| [`OnMapMarkersCleared`](#onmapmarkerscleared) | Player | — | -| [`OnMaxStackable`](#onmaxstackable) | Item | Returning a numeric value (int) overrides the default value | -| [`OnMeleeAttack`](#onmeleeattack) | Player | Returning a non-null value cancels default behavior | -| [`OnMeleeThrown`](#onmeleethrown) | Weapon | — | -| [`OnMessagePlayer`](#onmessageplayer) | Server | Returning a non-null value overrides default behavior | -| [`OnMlrsFire`](#onmlrsfire) | Entity | Returning a non-null value overrides default behaviour. | -| [`OnMlrsFired`](#onmlrsfired) | Entity | No return behaviour. | -| [`OnNetworkGroupEntered`](#onnetworkgroupentered) | Player | — | -| [`OnNetworkGroupLeft`](#onnetworkgroupleft) | Player | — | -| [`OnNetworkSubscriptionsUpdate`](#onnetworksubscriptionsupdate) | Entity | Returning a non-null value prevents Rust from applying the proposed… | -| [`OnNewSave`](#onnewsave) | Server | — | -| [`OnNpcConversationEnded`](#onnpcconversationended) | Player | — | -| [`OnNpcConversationRespond`](#onnpcconversationrespond) | Player | Returning a non-null value overrides default behavior | -| [`OnNpcConversationResponded`](#onnpcconversationresponded) | Player | — | -| [`OnNpcConversationStart`](#onnpcconversationstart) | Player | Returning a non-null value overrides default behavior | -| [`OnNpcDestinationSet`](#onnpcdestinationset) | Entity | Returning a non-null value cancels default behavior | -| [`OnNpcGiveSoldItem`](#onnpcgivesolditem) | Vending | Returning a non-null value overrides default behaviour. | -| [`OnNpcPlayerResume`](#onnpcplayerresume) | Entity | Returning a non-null value cancels default behavior | -| [`OnNpcStopMoving`](#onnpcstopmoving) | Entity | Returning a non-null value cancels default behavior | -| [`OnNpcTarget`](#onnpctarget) | Entity | Returning a non-null value overrides default behavior | -| [`OnNpcTargetSense`](#onnpctargetsense) | Entity | Returning a non-null value overrides default behavior | -| [`OnOpenVendingAdmin`](#onopenvendingadmin) | Vending | — | -| [`OnOutputUpdate`](#onoutputupdate) | Entity | Returning a non-null value cancels default behavior | -| [`OnOvenCook`](#onovencook) | Entity | Returning a non-null value overrides default behavior | -| [`OnOvenCooked`](#onovencooked) | Entity | — | -| [`OnOvenToggle`](#onoventoggle) | Entity | Returning a non-null value overrides default behavior | -| [`OnPayForPlacement`](#onpayforplacement) | Player | Returning a non-null value cancels default behavior | -| [`OnPayForUpgrade`](#onpayforupgrade) | Player | Returning a non-null value cancels default behavior | -| [`OnPermissionRegistered`](#onpermissionregistered) | Permission | — | -| [`OnPhoneAnswer`](#onphoneanswer) | Phone | Returning a non-null value overrides default behavior | -| [`OnPhoneAnswered`](#onphoneanswered) | Phone | — | -| [`OnPhoneCallStart`](#onphonecallstart) | Phone | Returning a non-null value overrides default behavior | -| [`OnPhoneCallStarted`](#onphonecallstarted) | Phone | | -| [`OnPhoneDial`](#onphonedial) | Phone | Returning a non-null value overrides default behavior | -| [`OnPhoneDialFail`](#onphonedialfail) | Phone | Returning a non-null value overrides default behavior | -| [`OnPhoneDialFailed`](#onphonedialfailed) | Phone | — | -| [`OnPhoneDialTimedOut`](#onphonedialtimedout) | Phone | — | -| [`OnPhoneDialTimeout`](#onphonedialtimeout) | Phone | Returning a non-null value overrides default behavior | -| [`OnPhoneNameUpdate`](#onphonenameupdate) | Phone | Returning a non-null value overrides default behavior | -| [`OnPhoneNameUpdated`](#onphonenameupdated) | Phone | — | -| [`OnPlayerAddModifiers`](#onplayeraddmodifiers) | Player | Returning a non-null value overrides default behavior (prevents the… | -| [`OnPlayerAssist`](#onplayerassist) | Player | Returning a non-null value cancels default behavior | -| [`OnPlayerAttack`](#onplayerattack) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerBanned`](#onplayerbanned) | Player | — | -| [`OnPlayerChat`](#onplayerchat) | Player | Returning a non-null value overrides default behavior of chat, not… | -| [`OnPlayerCommand`](#onplayercommand) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerConnected`](#onplayerconnected) | Player | — | -| [`OnPlayerCorpse`](#onplayercorpse) | Player | — | -| [`OnPlayerCorpseSpawn`](#onplayercorpsespawn) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerCorpseSpawned`](#onplayercorpsespawned) | Player | — | -| [`OnPlayerDeath`](#onplayerdeath) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerDisconnected`](#onplayerdisconnected) | Player | — | -| [`OnPlayerDropActiveItem`](#onplayerdropactiveitem) | Player | — | -| [`OnPlayerHealthChange`](#onplayerhealthchange) | Player | Returning a non-null value cancels the health change | -| [`OnPlayerInput`](#onplayerinput) | Player | — | -| [`OnPlayerKeepAlive`](#onplayerkeepalive) | Player | Returning a non-null value cancels default behavior | -| [`OnPlayerKicked`](#onplayerkicked) | Player | — | -| [`OnPlayerLand`](#onplayerland) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerLanded`](#onplayerlanded) | Player | — | -| [`OnPlayerLootEnd`](#onplayerlootend) | Player | — | -| [`OnPlayerMetabolize`](#onplayermetabolize) | Player | — | -| [`OnPlayerRecover`](#onplayerrecover) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerRecovered`](#onplayerrecovered) | Player | — | -| [`OnPlayerReported`](#onplayerreported) | Player | — | -| [`OnPlayerRespawn`](#onplayerrespawn) | Player | Returning a BasePlayer.SpawnPoint (takes a position and rotation),… | -| [`OnPlayerRespawned`](#onplayerrespawned) | Player | — | -| [`OnPlayerRevive`](#onplayerrevive) | Player | Returning a non-null value cancels default behavior | -| [`OnPlayerSetInfo`](#onplayersetinfo) | Player | — | -| [`OnPlayerSleep`](#onplayersleep) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerSleepEnded`](#onplayersleepended) | Player | — | -| [`OnPlayerSpawn`](#onplayerspawn) | Player | Returning true overrides default behavior | -| [`OnPlayerSpectate`](#onplayerspectate) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerSpectateEnd`](#onplayerspectateend) | Player | Returning a non-null value stops the spectate from ending | -| [`OnPlayerTick`](#onplayertick) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerViolation`](#onplayerviolation) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerVoice`](#onplayervoice) | Player | Returning a non-null value overrides default behavior | -| [`OnPlayerWound`](#onplayerwound) | Player | Returning a non-null value cancels the wounded state | -| [`OnPluginLoaded`](#onpluginloaded) | Server | — | -| [`OnPluginUnloaded`](#onpluginunloaded) | Server | — | -| [`OnProjectileRicochet`](#onprojectilericochet) | Weapon | Returning a non-null value overrides default behavior | -| [`OnQuarryEnabled`](#onquarryenabled) | Resource | — | -| [`OnQuarryGather`](#onquarrygather) | Resource | — | -| [`OnQuarryToggled`](#onquarrytoggled) | Resource | — | -| [`OnRconCommand`](#onrconcommand) | Server | — | -| [`OnRconConnection`](#onrconconnection) | Server | Returning a non-null value overrides default behavior | -| [`OnReactiveTargetReset`](#onreactivetargetreset) | Entity | — | -| [`OnRecyclerToggle`](#onrecyclertoggle) | Entity | Returning a non-null value overrides default behavior | -| [`OnRefreshVendingStock`](#onrefreshvendingstock) | Vending | — | -| [`OnRemoveDying`](#onremovedying) | Resource | Returning a non-null value overrides default behavior | -| [`OnResearchCostDetermine`](#onresearchcostdetermine) | Item | Returning a numeric value (int) overrides the default value | -| [`OnResourceDepositCreated`](#onresourcedepositcreated) | Entity | — | -| [`OnRespawnInformationGiven`](#onrespawninformationgiven) | Player | — | -| [`OnRfBroadcasterAdd`](#onrfbroadcasteradd) | Entity | Returning a non-null value overrides default behavior | -| [`OnRfBroadcasterAdded`](#onrfbroadcasteradded) | Entity | — | -| [`OnRfBroadcasterRemove`](#onrfbroadcasterremove) | Entity | Returning a non-null value overrides default behavior | -| [`OnRfBroadcasterRemoved`](#onrfbroadcasterremoved) | Entity | — | -| [`OnRfFrequencyChange`](#onrffrequencychange) | Entity | Returning a non-null value overrides default behavior | -| [`OnRfFrequencyChanged`](#onrffrequencychanged) | Entity | — | -| [`OnRfListenerAdd`](#onrflisteneradd) | Entity | Returning a non-null value overrides default behavior | -| [`OnRfListenerAdded`](#onrflisteneradded) | Entity | — | -| [`OnRfListenerRemove`](#onrflistenerremove) | Entity | Returning a non-null value overrides default behavior | -| [`OnRfListenerRemoved`](#onrflistenerremoved) | Entity | — | -| [`OnRidableAnimalClaim`](#onridableanimalclaim) | Entity | Returning a non-null value overrides default behavior | -| [`OnRidableAnimalClaimed`](#onridableanimalclaimed) | Entity | — | -| [`OnRocketLaunched`](#onrocketlaunched) | Weapon | — | -| [`OnRotateVendingMachine`](#onrotatevendingmachine) | Vending | Returning a non-null value overrides default behavior | -| [`OnRunPlayerMetabolism`](#onrunplayermetabolism) | Player | Returning a non-null value cancels the update | -| [`OnSamSiteTarget`](#onsamsitetarget) | Entity | Returning a non-null value cancels default behavior | -| [`OnSaveLoad`](#onsaveload) | Server | Returning a non-null value overrides default behavior | -| [`OnSendCommand`](#onsendcommand) | Player | Returning a non-null value overwrites command arguments | -| [`OnServerCommand`](#onservercommand) | Server | Returning a non-null value overrides default behavior | -| [`OnServerInformationUpdated`](#onserverinformationupdated) | Server | — | -| [`OnServerInitialized`](#onserverinitialized) | Server | — | -| [`OnServerMessage`](#onservermessage) | Server | Return a non-null value to stop message from being sent | -| [`OnServerRestartInterrupt`](#onserverrestartinterrupt) | Server | Returning a non-null value overrides default behavior | -| [`OnServerSave`](#onserversave) | Server | — | -| [`OnServerShutdown`](#onservershutdown) | Server | — | -| [`OnShopAcceptClick`](#onshopacceptclick) | Entity | Returning a non-null value cancels default behavior | -| [`OnShopCancelClick`](#onshopcancelclick) | Entity | Returning a non-null value cancels default behavior | -| [`OnShopCompleteTrade`](#onshopcompletetrade) | Entity | Returning a non-null value cancels default behavior | -| [`OnShopCompleteTrade`](#onshopcompletetrade-1) | Entity | Returning a non-null value overrides default behavior | -| [`OnSignLocked`](#onsignlocked) | Sign | — | -| [`OnSignUpdated`](#onsignupdated) | Sign | — | -| [`OnSleepingBagDestroy`](#onsleepingbagdestroy) | Entity | Returning a non-null value overrides default behavior | -| [`OnSleepingBagDestroyed`](#onsleepingbagdestroyed) | Entity | — | -| [`OnSleepingBagValidCheck`](#onsleepingbagvalidcheck) | Entity | Returning true or false overrides default behavior | -| [`OnSolarPanelSunUpdate`](#onsolarpanelsunupdate) | Entity | Returning a non-null value overrides default behavior | -| [`OnSpinWheel`](#onspinwheel) | Sign | — | -| [`OnStashExposed`](#onstashexposed) | Player | — | -| [`OnStashHidden`](#onstashhidden) | Player | — | -| [`OnStructureDemolish`](#onstructuredemolish) | Structure | Returning a non-null value overrides default behavior | -| [`OnStructureRepair`](#onstructurerepair) | Structure | Returning a non-null value cancels repair | -| [`OnStructureRotate`](#onstructurerotate) | Structure | Returning a non-null value cancels rotate | -| [`OnStructureUpgrade`](#onstructureupgrade) | Structure | Returning a non-null value overrides default behavior | -| [`OnSupplyDropDropped`](#onsupplydropdropped) | Entity | — | -| [`OnSupplyDropLanded`](#onsupplydroplanded) | Entity | — | -| [`OnSurveyGather`](#onsurveygather) | Resource | — | -| [`OnSwitchToggle`](#onswitchtoggle) | Entity | Returning a non-null value cancels default behavior | -| [`OnSwitchToggled`](#onswitchtoggled) | Entity | — | -| [`OnTakeCurrencyItem`](#ontakecurrencyitem) | Vending | Returning a non-null value cancels default behavior | -| [`OnTeamAcceptInvite`](#onteamacceptinvite) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamCreate`](#onteamcreate) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamCreated`](#onteamcreated) | Team | — | -| [`OnTeamDisband`](#onteamdisband) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamDisbanded`](#onteamdisbanded) | Team | — | -| [`OnTeamInvite`](#onteaminvite) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamKick`](#onteamkick) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamLeave`](#onteamleave) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamPromote`](#onteampromote) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamRejectInvite`](#onteamrejectinvite) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamUpdate`](#onteamupdate) | Team | Returning a non-null value cancels default behavior | -| [`OnTeamUpdated`](#onteamupdated) | Team | Returning a non-null value cancels default behavior | -| [`OnTechTreeNodeUnlock`](#ontechtreenodeunlock) | TechTree | Returning a non-null value overrides default behavior | -| [`OnTechTreeNodeUnlocked`](#ontechtreenodeunlocked) | TechTree | — | -| [`OnTerrainInitialized`](#onterraininitialized) | Terrain | — | -| [`OnThreatLevelUpdate`](#onthreatlevelupdate) | Player | Returning a non-null value cancels default behavior | -| [`OnTick`](#ontick) | Server | — | -| [`OnToggleVendingBroadcast`](#ontogglevendingbroadcast) | Vending | — | -| [`OnTrapArm`](#ontraparm) | Item | Returning a non-null value overrides default behavior | -| [`OnTrapDisarm`](#ontrapdisarm) | Item | Returning a non-null value overrides default behavior | -| [`OnTrapSnapped`](#ontrapsnapped) | Item | — | -| [`OnTrapTrigger`](#ontraptrigger) | Item | Returning a non-null value overrides default behavior | -| [`OnTreeMarkerHit`](#ontreemarkerhit) | Resource | Returning true or false overrides default behaviour | -| [`OnTurretAssign`](#onturretassign) | Entity | Returning a non-null value cancels default behavior | -| [`OnTurretAssigned`](#onturretassigned) | Entity | — | -| [`OnTurretAuthorize`](#onturretauthorize) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretClearList`](#onturretclearlist) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretDeauthorize`](#onturretdeauthorize) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretModeToggle`](#onturretmodetoggle) | Entity | — | -| [`OnTurretRotate`](#onturretrotate) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretShutdown`](#onturretshutdown) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretStartup`](#onturretstartup) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretTarget`](#onturrettarget) | Entity | Returning a non-null value overrides default behavior | -| [`OnTurretToggle`](#onturrettoggle) | Entity | Returning a non-null value overrides default behavior | -| [`OnUserApprove`](#onuserapprove) | Player | Returning a non-null value overrides default behavior, plugin shoul… | -| [`OnUserApproved`](#onuserapproved) | Player | — | -| [`OnUserBanned`](#onuserbanned) | Player | — | -| [`OnUserChat`](#onuserchat) | Player | Returning true overrides default behavior of chat, not commands | -| [`OnUserCommand`](#onusercommand) | Player | Returning a non-null value overrides default behavior | -| [`OnUserConnected`](#onuserconnected) | Player | — | -| [`OnUserDisconnected`](#onuserdisconnected) | Player | — | -| [`OnUserGroupAdded`](#onusergroupadded) | Player | — | -| [`OnUserGroupRemoved`](#onusergroupremoved) | Player | — | -| [`OnUserKicked`](#onuserkicked) | Player | — | -| [`OnUserNameUpdated`](#onusernameupdated) | Player | — | -| [`OnUserPermissionGranted`](#onuserpermissiongranted) | Player | — | -| [`OnUserPermissionRevoked`](#onuserpermissionrevoked) | Player | — | -| [`OnUserRespawn`](#onuserrespawn) | Player | — | -| [`OnUserRespawned`](#onuserrespawned) | Player | — | -| [`OnUserUnbanned`](#onuserunbanned) | Player | — | -| [`OnVehicleModuleDeselected`](#onvehiclemoduledeselected) | Vehicle | — | -| [`OnVehicleModuleMove`](#onvehiclemodulemove) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnVehicleModulesAssign`](#onvehiclemodulesassign) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnVehicleModulesAssigned`](#onvehiclemodulesassigned) | Vehicle | — | -| [`OnVehicleModuleSelect`](#onvehiclemoduleselect) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnVehicleModuleSelected`](#onvehiclemoduleselected) | Vehicle | — | -| [`OnVehiclePush`](#onvehiclepush) | Vehicle | Returning a non-null value overrides default behavior | -| [`OnVendingShopOpened`](#onvendingshopopened) | Vending | — | -| [`OnVendingShopRename`](#onvendingshoprename) | Vending | Returning a non-null value cancels default behavior | -| [`OnVendingTransaction`](#onvendingtransaction) | Vending | Returning true or false overrides default behavior | -| [`OnWaterCollect`](#onwatercollect) | Entity | Returning a non-null value cancels default behavior | -| [`OnWaterPurified`](#onwaterpurified) | Entity | — | -| [`OnWaterPurify`](#onwaterpurify) | Entity | Returning a non-null value cancels default behavior | -| [`OnWeaponFired`](#onweaponfired) | Weapon | — | -| [`OnWeaponReload`](#onweaponreload) | Weapon | Returning a non-null value overrides default behavior | -| [`OnWireClear`](#onwireclear) | Entity | Returning a non-null value cancels default behavior | -| [`OnWireConnect`](#onwireconnect) | Entity | Returning a non-null value cancels default behavior | -| [`OnWorldPrefabSpawned`](#onworldprefabspawned) | World | — | -| [`OnWorldProjectileCreate`](#onworldprojectilecreate) | Weapon | Returning a non-null value overrides default behavior | -| [`Unload`](#unload) | Plugin | — | +**U** marks one of the **34 universal hooks** — see [Universal hooks](#universal-hooks) below. + +| Hook | Category | U | Returns | +|---|---|:-:|---| +| [`CanAcceptItem`](#canacceptitem) | Item | | Returning CanAcceptResult value overrides default behavior | +| [`CanAdministerVending`](#canadministervending) | Vending | | Returning true or false overrides default behavior | +| [`CanAffordToPlace`](#canaffordtoplace) | Player | | Returning true or false overrides default behavior | +| [`CanAffordUpgrade`](#canaffordupgrade) | Player | | Returning true or false overrides default behavior | +| [`CanAssignBed`](#canassignbed) | Player | | Returning a non-null value overrides default behavior | +| [`CanBeTargeted`](#canbetargeted) | Player | | Returning true or false overrides default behavior | +| [`CanBeWounded`](#canbewounded) | Player | | Returning true or false overrides default behavior | +| [`CanBradleyApcTarget`](#canbradleyapctarget) | Entity | | Returning true or false overrides default behavior | +| [`CanBuild`](#canbuild) | Player | | Returning a non-null value overrides default behavior | +| [`CanBypassQueue`](#canbypassqueue) | Player | | Returning true will bypass the queue, returning nothing will by def… | +| [`CanCatchFish`](#cancatchfish) | Fishing | | Returning true or false overrides default behavior | +| [`CanChangeCode`](#canchangecode) | Player | | Returning a non-null value overrides default behavior | +| [`CanChangeGrade`](#canchangegrade) | Player | | Returning true or false overrides default behavior | +| [`CanCheckFuel`](#cancheckfuel) | Vehicle | | Returning true or false overrides default behavior | +| [`CanClientLogin`](#canclientlogin) | Player | | Returning a string will use the string as the error message | +| [`CanCombineDroppedItem`](#cancombinedroppeditem) | Item | | Returning a non-null value overwrites command arguments | +| [`CanCraft`](#cancraft) | Player | | Returning true or false overrides default behavior | +| [`CanCreateWorldProjectile`](#cancreateworldprojectile) | Weapon | | Returning a non-null value overrides default behavior | +| [`CanDemolish`](#candemolish) | Player | | Returning true or false overrides default behavior | +| [`CanDeployItem`](#candeployitem) | Player | | Returning a non-null value cancels default behavior | +| [`CanDismountEntity`](#candismountentity) | Player | | Returning a non-null value overrides default behavior | +| [`CanDropActiveItem`](#candropactiveitem) | Item | | Returning true or false overrides default behavior | +| [`CanEntityBeHostile`](#canentitybehostile) | Entity | | Returning a non-null value overrides default behavior | +| [`CanEquipItem`](#canequipitem) | Player | | Returning true or false overrides default behavior | +| [`CanExplosiveStick`](#canexplosivestick) | Weapon | | Returning a non-null value overwrites the default behavior | +| [`CanHackCrate`](#canhackcrate) | Player | | Returning a non-null value overrides default behavior | +| [`CanHelicopterDropCrate`](#canhelicopterdropcrate) | Entity | | Returning true or false overrides default behavior | +| [`CanHelicopterStrafe`](#canhelicopterstrafe) | Entity | | Returning true or false overrides default behavior | +| [`CanHelicopterStrafeTarget`](#canhelicopterstrafetarget) | Entity | | Returning true or false overrides default behavior | +| [`CanHelicopterTarget`](#canhelicoptertarget) | Entity | | Returning true or false overrides default behavior | +| [`CanHelicopterUseNapalm`](#canhelicopterusenapalm) | Entity | | Returning true or false overrides default behavior | +| [`CanHideStash`](#canhidestash) | Player | | Returning a non-null value overrides default behavior | +| [`CanLock`](#canlock) | Player | | Returning a non-null value cancels default behavior | +| [`CanLockerAcceptItem`](#canlockeracceptitem) | Entity | | Returning true or false overrides default behavior | +| [`CanLootEntity`](#canlootentity) | Player | | Returning a non-null value overrides default behavior | +| [`CanLootPlayer`](#canlootplayer) | Player | | Returning true or false overrides default behavior | +| [`CanMountEntity`](#canmountentity) | Player | | Returning a non-null value overrides default behavior | +| [`CanMoveItem`](#canmoveitem) | Item | | Returning a non-null value overrides default behavior | +| [`CanNetworkTo`](#cannetworkto) | Entity | | Returning true or false overrides default behavior | +| [`CanNpcAttack`](#cannpcattack) | Entity | | Returning true or false overrides default behavior | +| [`CanNpcEat`](#cannpceat) | Entity | | Returning true or false overrides default behavior | +| [`CanPickupEntity`](#canpickupentity) | Player | | Returning true or false overrides default behavior | +| [`CanPickupLock`](#canpickuplock) | Player | | Returning true or false overrides default behavior | +| [`CanPushBoat`](#canpushboat) | Player | | Returning a non-null value cancels default behavior | +| [`CanReceiveCall`](#canreceivecall) | Phone | | Returning true or false overrides default behavior | +| [`CanRecycle`](#canrecycle) | Entity | | Returning true or false overrides default behavior | +| [`CanRenameBed`](#canrenamebed) | Player | | Returning a non-null value overrides default behavior | +| [`CanResearchItem`](#canresearchitem) | Player | | Returning a non-null value overrides default behavior | +| [`CanSamSiteShoot`](#cansamsiteshoot) | Entity | | Returning a non-null value cancels default behavior | +| [`CanSeeStash`](#canseestash) | Player | | Returning a non-null value overrides default behavior | +| [`CanSetBedPublic`](#cansetbedpublic) | Player | | Returning a non-null value overrides default behavior | +| [`CanSetRelationship`](#cansetrelationship) | Player | | Returning true or false overrides default behavior | +| [`CanSpectateTarget`](#canspectatetarget) | Player | | Returning a non-null value cancels default behavior | +| [`CanStackItem`](#canstackitem) | Item | | Returning true or false overrides default behavior | +| [`CanSwapToSeat`](#canswaptoseat) | Entity | | Returning true or false overrides default behavior | +| [`CanTakeCutting`](#cantakecutting) | Resource | | Returning a non-null value cancels default behavior | +| [`CanUnlock`](#canunlock) | Player | | Returning a non-null value overrides default behavior | +| [`CanUnlockTechTreeNode`](#canunlocktechtreenode) | TechTree | | Returning true or false overrides default behavior | +| [`CanUnlockTechTreeNodePath`](#canunlocktechtreenodepath) | TechTree | | Returning true or false overrides default behavior | +| [`CanUpdateSign`](#canupdatesign) | Player | | Returning true or false overrides default behavior | +| [`CanUseFuel`](#canusefuel) | Vehicle | | Returning true or false overrides default behavior | +| [`CanUseGesture`](#canusegesture) | Player | | Returning true or false overrides default behavior | +| [`CanUseHelicopter`](#canusehelicopter) | Vehicle | | Returning a non-null value cancels default behavior | +| [`CanUseLockedEntity`](#canuselockedentity) | Player | | Returning true or false overrides default behavior | +| [`CanUseMailbox`](#canusemailbox) | Player | | Returning true or false overrides default behavior | +| [`CanUserLogin`](#canuserlogin) | Player | U | Returning a string will kick the user with this reason. Returning a… | +| [`CanUseUI`](#canuseui) | Player | | Returning a non-null value overrides default behavior | +| [`CanUseVending`](#canusevending) | Vending | | Returning true or false overrides default behavior | +| [`CanUseWires`](#canusewires) | Player | | Returning a non-null value overrides default behavior | +| [`CanVendingAcceptItem`](#canvendingacceptitem) | Vending | | Returning true or false overrides default behavior | +| [`CanWearItem`](#canwearitem) | Player | | Returning a non-null value overrides default behavior | +| [`Init`](#init) | Server | U | — | +| [`LoadDefaultConfig`](#loaddefaultconfig) | Plugin | U | — | +| [`LoadDefaultMessages`](#loaddefaultmessages) | Plugin | U | — | +| [`Loaded`](#loaded) | Plugin | U | — | +| [`OnActiveItemChange`](#onactiveitemchange) | Player | | Returning a non-null value cancels default behavior | +| [`OnActiveItemChanged`](#onactiveitemchanged) | Player | | — | +| [`OnAddVendingOffer`](#onaddvendingoffer) | Vending | | — | +| [`OnAirdrop`](#onairdrop) | Entity | | — | +| [`OnAmmoSwitch`](#onammoswitch) | Weapon | | Returning a non-null value overrides default behavior | +| [`OnAmmoUnload`](#onammounload) | Weapon | | Returning a non-null value cancels default behavior | +| [`OnAnalysisComplete`](#onanalysiscomplete) | Player | | — | +| [`OnBackpackDrop`](#onbackpackdrop) | Item | | Return non-null to override default behaviour. | +| [`OnBigWheelLoss`](#onbigwheelloss) | Entity | | — | +| [`OnBigWheelWin`](#onbigwheelwin) | Entity | | Returning non-null value overrides default behaviour. | +| [`OnBoatPathGenerate`](#onboatpathgenerate) | Vehicle | | Returning a List overrides default behavior | +| [`OnBonusItemDrop`](#onbonusitemdrop) | Item | | Returning a non-null value overrides default behavior | +| [`OnBonusItemDropped`](#onbonusitemdropped) | Item | | — | +| [`OnBookmarkAdd`](#onbookmarkadd) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBookmarkControl`](#onbookmarkcontrol) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBookmarkControlEnd`](#onbookmarkcontrolend) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBookmarkControlEnded`](#onbookmarkcontrolended) | Entity | | — | +| [`OnBookmarkControlStarted`](#onbookmarkcontrolstarted) | Entity | | — | +| [`OnBookmarkDelete`](#onbookmarkdelete) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBookmarkInput`](#onbookmarkinput) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBookmarksSendControl`](#onbookmarkssendcontrol) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBradleyApcHunt`](#onbradleyapchunt) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBradleyApcInitialize`](#onbradleyapcinitialize) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBradleyApcPatrol`](#onbradleyapcpatrol) | Entity | | Returning a non-null value overrides default behavior | +| [`OnBroadcastCommand`](#onbroadcastcommand) | Player | | Returning a non-null value overwrites command arguments | +| [`OnBuildingPrivilege`](#onbuildingprivilege) | Entity | | Returning BuildingPrivlidge value overrides default behavior | +| [`OnBuildingSplit`](#onbuildingsplit) | Structure | | — | +| [`OnButtonPress`](#onbuttonpress) | Entity | | Returning a non-null value cancels default behavior | +| [`OnBuyVendingItem`](#onbuyvendingitem) | Vending | | Returning a non-null value overrides default behavior | +| [`OnCardSwipe`](#oncardswipe) | Item | | Returning a non-null value cancels default behavior | +| [`OnCargoPlaneSignaled`](#oncargoplanesignaled) | Entity | | — | +| [`OnCCTVDirectionChange`](#oncctvdirectionchange) | Entity | | Returning a non-null value cancels default behavior | +| [`OnCentralizedBanCheck`](#oncentralizedbancheck) | Player | | Returning a non-null value cancels default behavior | +| [`OnClanColorChanged`](#onclancolorchanged) | Clan | | — | +| [`OnClanCreated`](#onclancreated) | Clan | | — | +| [`OnClanDisbanded`](#onclandisbanded) | Clan | | — | +| [`OnClanLogoChanged`](#onclanlogochanged) | Clan | | — | +| [`OnClanMemberAdded`](#onclanmemberadded) | Clan | | — | +| [`OnClanMemberKicked`](#onclanmemberkicked) | Clan | | — | +| [`OnClanMemberLeft`](#onclanmemberleft) | Clan | | — | +| [`OnClientAuth`](#onclientauth) | Player | | — | +| [`OnClientCommand`](#onclientcommand) | Player | | Returning a non-null value overrides default behavior | +| [`OnCodeEntered`](#oncodeentered) | Structure | | Returning a non-null value overrides default behavior | +| [`OnCollectiblePickup`](#oncollectiblepickup) | Resource | | Returning a non-null value overrides default behavior | +| [`OnConstructionPlace`](#onconstructionplace) | Structure | | Returning a non-null value overrides default behavior | +| [`OnContainerDropItems`](#oncontainerdropitems) | Entity | | Returning a non-null value overrides default behavior | +| [`OnCorpsePopulate`](#oncorpsepopulate) | Player | | Returning a BaseCorpse overrides default behavior | +| [`OnCounterModeToggle`](#oncountermodetoggle) | Entity | | Returning a non-null value overrides default behavior | +| [`OnCounterTargetChange`](#oncountertargetchange) | Entity | | Returning a non-null value overrides default behavior | +| [`OnCrateDropped`](#oncratedropped) | Entity | | — | +| [`OnCrateHack`](#oncratehack) | Entity | | — | +| [`OnCrateHackEnd`](#oncratehackend) | Entity | | — | +| [`OnCrateLanded`](#oncratelanded) | Entity | | — | +| [`OnCupboardAuthorize`](#oncupboardauthorize) | Structure | | Returning a non-null value overrides default behavior | +| [`OnCupboardClearList`](#oncupboardclearlist) | Structure | | Returning a non-null value overrides default behavior | +| [`OnCupboardDeauthorize`](#oncupboarddeauthorize) | Structure | | Returning a non-null value overrides default behavior | +| [`OnDefaultItemsReceive`](#ondefaultitemsreceive) | Player | | Returning a non-null value overrides default behavior | +| [`OnDefaultItemsReceived`](#ondefaultitemsreceived) | Player | | Returning a non-null value overrides default behavior | +| [`OnDeleteVendingOffer`](#ondeletevendingoffer) | Vending | | — | +| [`OnDemoRecordingStart`](#ondemorecordingstart) | Player | | Returning a non-null value overrides default behavior | +| [`OnDemoRecordingStarted`](#ondemorecordingstarted) | Player | | — | +| [`OnDemoRecordingStop`](#ondemorecordingstop) | Player | | Returning a non-null value overrides default behavior | +| [`OnDemoRecordingStopped`](#ondemorecordingstopped) | Player | | — | +| [`OnDestroyUI`](#ondestroyui) | Player | | — | +| [`OnDieselEngineToggle`](#ondieselenginetoggle) | Entity | | Returning a non-null value cancels default behavior | +| [`OnDieselEngineToggled`](#ondieselenginetoggled) | Entity | | — | +| [`OnDispenserBonus`](#ondispenserbonus) | Resource | | Returning an Item replaces the existing Item | +| [`OnDispenserGather`](#ondispensergather) | Resource | | Returning a non-null value overrides default behavior | +| [`OnDoorClosed`](#ondoorclosed) | Structure | | — | +| [`OnDoorKnocked`](#ondoorknocked) | Structure | | — | +| [`OnDoorOpened`](#ondooropened) | Structure | | — | +| [`OnElevatorButtonPress`](#onelevatorbuttonpress) | Entity | | Returning a non-null value overrides default behavior | +| [`OnElevatorCall`](#onelevatorcall) | Entity | | Returning a non-null value overrides default behavior | +| [`OnElevatorMove`](#onelevatormove) | Entity | | Returning a non-null value overrides default behavior | +| [`OnEngineLoadoutRefresh`](#onengineloadoutrefresh) | Entity | | Returning a non-null value overrides default behaviour | +| [`OnEngineStart`](#onenginestart) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnEngineStarted`](#onenginestarted) | Vehicle | | — | +| [`OnEngineStatsRefresh`](#onenginestatsrefresh) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnEngineStatsRefreshed`](#onenginestatsrefreshed) | Vehicle | | — | +| [`OnEngineStop`](#onenginestop) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnEngineStopped`](#onenginestopped) | Vehicle | | — | +| [`OnEntityBuilt`](#onentitybuilt) | Structure | | — | +| [`OnEntityControl`](#onentitycontrol) | Entity | | Returning true or false overrides default behavior | +| [`OnEntityDeath`](#onentitydeath) | Entity | | — | +| [`OnEntityDestroy`](#onentitydestroy) | Entity | | Returning a non-null value overrides default behavior | +| [`OnEntityDismounted`](#onentitydismounted) | Entity | | — | +| [`OnEntityEnter`](#onentityenter) | Entity | | — | +| [`OnEntityFlagsNetworkUpdate`](#onentityflagsnetworkupdate) | Entity | | Returning a non-null value overrides default behavior | +| [`OnEntityGroundMissing`](#onentitygroundmissing) | Entity | | Returning a non-null value overrides default behavior | +| [`OnEntityKill`](#onentitykill) | Entity | | Returning a non-null value overrides default behavior | +| [`OnEntityLeave`](#onentityleave) | Entity | | — | +| [`OnEntityMarkHostile`](#onentitymarkhostile) | Entity | | Returning a non-null value cancels default behavior | +| [`OnEntityMounted`](#onentitymounted) | Entity | | — | +| [`OnEntitySaved`](#onentitysaved) | Entity | | — | +| [`OnEntitySnapshot`](#onentitysnapshot) | Entity | | Returning a non-null value overrides default behavior | +| [`OnEntitySpawned`](#onentityspawned) | Entity | | — | +| [`OnEntityStabilityCheck`](#onentitystabilitycheck) | Entity | | Returning a non-null value cancels default behavior | +| [`OnEntityTakeDamage`](#onentitytakedamage) | Entity | | | +| [`OnExcavatorGather`](#onexcavatorgather) | Entity | | Returning a non-null value cancels default behavior | +| [`OnExcavatorMiningToggled`](#onexcavatorminingtoggled) | Entity | | — | +| [`OnExcavatorResourceSet`](#onexcavatorresourceset) | Entity | | Returning a non-null value cancels default behavior | +| [`OnExcavatorSuppliesRequest`](#onexcavatorsuppliesrequest) | Electronic | | Returning non-null overrides default behaviour. | +| [`OnExcavatorSuppliesRequested`](#onexcavatorsuppliesrequested) | Electronic | | | +| [`OnExperimentEnd`](#onexperimentend) | Player | | Returning a non-null value overrides defualt behaviour. | +| [`OnExperimentEnded`](#onexperimentended) | Player | | — | +| [`OnExperimentStart`](#onexperimentstart) | Player | | Returning a non-null value overrides default behavior | +| [`OnExperimentStarted`](#onexperimentstarted) | Player | | — | +| [`OnExplosiveDropped`](#onexplosivedropped) | Weapon | | — | +| [`OnExplosiveDud`](#onexplosivedud) | Weapon | | Returning a non-null value cancels default behavior | +| [`OnExplosiveFuseSet`](#onexplosivefuseset) | Weapon | | Returning a non-null value overwrites fuse length | +| [`OnExplosiveThrown`](#onexplosivethrown) | Weapon | | — | +| [`OnFindBurnable`](#onfindburnable) | Item | | Returning an Item overrides default behavior | +| [`OnFindSpawnPoint`](#onfindspawnpoint) | Player | | Return a BasePlayer.SpawnPoint object to use that spawnpoint | +| [`OnFireBallDamage`](#onfireballdamage) | Entity | | — | +| [`OnFireBallSpread`](#onfireballspread) | Entity | | — | +| [`OnFishCatch`](#onfishcatch) | Fishing | | Returning a non-null value overrides default behavior | +| [`OnFishCaught`](#onfishcaught) | Fishing | | — | +| [`OnFishingStopped`](#onfishingstopped) | Fishing | | — | +| [`OnFlameExplosion`](#onflameexplosion) | Entity | | — | +| [`OnFlameThrowerBurn`](#onflamethrowerburn) | Weapon | | — | +| [`OnFrame`](#onframe) | Server | U | — | +| [`OnFuelAmountCheck`](#onfuelamountcheck) | Vehicle | | Returning a numeric value (int) overrides the default value | +| [`OnFuelCheck`](#onfuelcheck) | Vehicle | | Returning true or false overrides default behavior | +| [`OnFuelConsume`](#onfuelconsume) | Item | | Returning a non-null value overrides default behavior | +| [`OnFuelConsumed`](#onfuelconsumed) | Item | | — | +| [`OnFuelItemCheck`](#onfuelitemcheck) | Vehicle | | Returning an Item overrides default behavior | +| [`OnGiveSoldItem`](#ongivesolditem) | Vending | | Returning a non-null value cancels default behavior | +| [`OnGroupCreated`](#ongroupcreated) | Permission | U | — | +| [`OnGroupDeleted`](#ongroupdeleted) | Permission | U | — | +| [`OnGroupParentSet`](#ongroupparentset) | Permission | U | — | +| [`OnGroupPermissionGranted`](#ongrouppermissiongranted) | Permission | U | — | +| [`OnGroupPermissionRevoked`](#ongrouppermissionrevoked) | Permission | U | — | +| [`OnGroupRankSet`](#ongrouprankset) | Permission | U | — | +| [`OnGroupTitleSet`](#ongrouptitleset) | Permission | U | — | +| [`OnGrowableGather`](#ongrowablegather) | Resource | | Returning a non-null value overrides default behavior | +| [`OnGrowableGathered`](#ongrowablegathered) | Resource | | — | +| [`OnHammerHit`](#onhammerhit) | Structure | | Returning a non-null value overrides default behavior | +| [`OnHealingItemUse`](#onhealingitemuse) | Item | | Returning a non-null value overrides default behavior | +| [`OnHelicopterAttack`](#onhelicopterattack) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHelicopterDropCrate`](#onhelicopterdropcrate) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHelicopterDropDoorOpen`](#onhelicopterdropdooropen) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHelicopterKilled`](#onhelicopterkilled) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHelicopterOutOfCrates`](#onhelicopteroutofcrates) | Entity | | Returning true or false overrides default behavior | +| [`OnHelicopterRetire`](#onhelicopterretire) | Entity | | Returning a non-null value overrides default behaviour. | +| [`OnHelicopterStrafeEnter`](#onhelicopterstrafeenter) | Entity | | Returning a non-null value cancels default behavior | +| [`OnHelicopterTarget`](#onhelicoptertarget) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHorseHitch`](#onhorsehitch) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHorseLead`](#onhorselead) | Entity | | Returning a non-null value overrides default behavior | +| [`OnHotAirBalloonToggle`](#onhotairballoontoggle) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnHotAirBalloonToggled`](#onhotairballoontoggled) | Vehicle | | — | +| [`OnIngredientsCollect`](#oningredientscollect) | Item | | Returning a non-null value cancels default behavior | +| [`OnInputUpdate`](#oninputupdate) | Entity | | Returning a non-null value cancels default behavior | +| [`OnInventoryNetworkUpdate`](#oninventorynetworkupdate) | Player | | Returning a non-null value overrides default behavior | +| [`OnIORefCleared`](#oniorefcleared) | Entity | | — | +| [`OnItemAction`](#onitemaction) | Item | | Returning a non-null value overrides default behavior | +| [`OnItemAddedToContainer`](#onitemaddedtocontainer) | Item | | — | +| [`OnItemCraft`](#onitemcraft) | Item | | Returning true or false overrides default behavior | +| [`OnItemCraftCancelled`](#onitemcraftcancelled) | Item | | — | +| [`OnItemCraftFinished`](#onitemcraftfinished) | Item | | — | +| [`OnItemDeployed`](#onitemdeployed) | Item | | — | +| [`OnItemDropped`](#onitemdropped) | Item | | — | +| [`OnItemLock`](#onitemlock) | Item | | Returning a non-null value overrides default behavior | +| [`OnItemPickup`](#onitempickup) | Item | | Returning a non-null value overrides default behavior | +| [`OnItemRecycle`](#onitemrecycle) | Entity | | Returning a non-null value overrides default behavior | +| [`OnItemRefill`](#onitemrefill) | Item | | Returning a non-null value overrides default behavior | +| [`OnItemRemove`](#onitemremove) | Item | | Return a non-null value stop item from being destroyed | +| [`OnItemRemovedFromContainer`](#onitemremovedfromcontainer) | Item | | — | +| [`OnItemRepair`](#onitemrepair) | Item | | Returning a non-null value overrides default behavior | +| [`OnItemResearch`](#onitemresearch) | Item | | — | +| [`OnItemResearched`](#onitemresearched) | Item | | Returning a float will affect if researching is successful or not | +| [`OnItemSplit`](#onitemsplit) | Item | | Returning an Item overrides default behavior | +| [`OnItemStacked`](#onitemstacked) | Item | | — | +| [`OnItemSubmit`](#onitemsubmit) | Item | | Returning a non-null value cancels default behavior | +| [`OnItemUnlock`](#onitemunlock) | Item | | Returning a non-null value overrides default behavior | +| [`OnItemUpgrade`](#onitemupgrade) | Item | | — | +| [`OnItemUse`](#onitemuse) | Item | | Returning an int overrides the amount consumed. | +| [`OnLiftUse`](#onliftuse) | Entity | | Returning a non-null value overrides default behavior | +| [`OnLiquidVesselFill`](#onliquidvesselfill) | Entity | | Returning a non-null value cancels default behavior | +| [`OnLockerSwap`](#onlockerswap) | Entity | | Returning non-null value overrides default behavior | +| [`OnLootEntity`](#onlootentity) | Player | | — | +| [`OnLootEntityEnd`](#onlootentityend) | Player | | — | +| [`OnLootItem`](#onlootitem) | Player | | — | +| [`OnLootNetworkUpdate`](#onlootnetworkupdate) | Player | | Returning a non-null value overrides default behavior | +| [`OnLootPlayer`](#onlootplayer) | Player | | — | +| [`OnLootSpawn`](#onlootspawn) | Entity | | Returning a non-null value overrides default behavior | +| [`OnLoseCondition`](#onlosecondition) | Item | | — | +| [`OnMagazineReload`](#onmagazinereload) | Weapon | | Returning a non-null value overrides default behavior | +| [`OnMapImageUpdated`](#onmapimageupdated) | Item | | — | +| [`OnMapMarkerAdd`](#onmapmarkeradd) | Player | | Returning a non-null value cancels default behavior | +| [`OnMapMarkerAdded`](#onmapmarkeradded) | Player | | — | +| [`OnMapMarkerRemove`](#onmapmarkerremove) | Player | | Returning a non-null value cancels default behaviour | +| [`OnMapMarkersClear`](#onmapmarkersclear) | Player | | Returning a non-null value cancels default behavior | +| [`OnMapMarkersCleared`](#onmapmarkerscleared) | Player | | — | +| [`OnMaxStackable`](#onmaxstackable) | Item | | Returning a numeric value (int) overrides the default value | +| [`OnMeleeAttack`](#onmeleeattack) | Player | | Returning a non-null value cancels default behavior | +| [`OnMeleeThrown`](#onmeleethrown) | Weapon | | — | +| [`OnMessagePlayer`](#onmessageplayer) | Server | | Returning a non-null value overrides default behavior | +| [`OnMlrsFire`](#onmlrsfire) | Entity | | Returning a non-null value overrides default behaviour. | +| [`OnMlrsFired`](#onmlrsfired) | Entity | | No return behaviour. | +| [`OnNetworkGroupEntered`](#onnetworkgroupentered) | Player | | — | +| [`OnNetworkGroupLeft`](#onnetworkgroupleft) | Player | | — | +| [`OnNetworkSubscriptionsUpdate`](#onnetworksubscriptionsupdate) | Entity | | Returning a non-null value prevents Rust from applying the proposed… | +| [`OnNewSave`](#onnewsave) | Server | | — | +| [`OnNpcConversationEnded`](#onnpcconversationended) | Player | | — | +| [`OnNpcConversationRespond`](#onnpcconversationrespond) | Player | | Returning a non-null value overrides default behavior | +| [`OnNpcConversationResponded`](#onnpcconversationresponded) | Player | | — | +| [`OnNpcConversationStart`](#onnpcconversationstart) | Player | | Returning a non-null value overrides default behavior | +| [`OnNpcDestinationSet`](#onnpcdestinationset) | Entity | | Returning a non-null value cancels default behavior | +| [`OnNpcGiveSoldItem`](#onnpcgivesolditem) | Vending | | Returning a non-null value overrides default behaviour. | +| [`OnNpcPlayerResume`](#onnpcplayerresume) | Entity | | Returning a non-null value cancels default behavior | +| [`OnNpcStopMoving`](#onnpcstopmoving) | Entity | | Returning a non-null value cancels default behavior | +| [`OnNpcTarget`](#onnpctarget) | Entity | | Returning a non-null value overrides default behavior | +| [`OnNpcTargetSense`](#onnpctargetsense) | Entity | | Returning a non-null value overrides default behavior | +| [`OnOpenVendingAdmin`](#onopenvendingadmin) | Vending | | — | +| [`OnOutputUpdate`](#onoutputupdate) | Entity | | Returning a non-null value cancels default behavior | +| [`OnOvenCook`](#onovencook) | Entity | | Returning a non-null value overrides default behavior | +| [`OnOvenCooked`](#onovencooked) | Entity | | — | +| [`OnOvenToggle`](#onoventoggle) | Entity | | Returning a non-null value overrides default behavior | +| [`OnPayForPlacement`](#onpayforplacement) | Player | | Returning a non-null value cancels default behavior | +| [`OnPayForUpgrade`](#onpayforupgrade) | Player | | Returning a non-null value cancels default behavior | +| [`OnPermissionRegistered`](#onpermissionregistered) | Permission | U | — | +| [`OnPhoneAnswer`](#onphoneanswer) | Phone | | Returning a non-null value overrides default behavior | +| [`OnPhoneAnswered`](#onphoneanswered) | Phone | | — | +| [`OnPhoneCallStart`](#onphonecallstart) | Phone | | Returning a non-null value overrides default behavior | +| [`OnPhoneCallStarted`](#onphonecallstarted) | Phone | | | +| [`OnPhoneDial`](#onphonedial) | Phone | | Returning a non-null value overrides default behavior | +| [`OnPhoneDialFail`](#onphonedialfail) | Phone | | Returning a non-null value overrides default behavior | +| [`OnPhoneDialFailed`](#onphonedialfailed) | Phone | | — | +| [`OnPhoneDialTimedOut`](#onphonedialtimedout) | Phone | | — | +| [`OnPhoneDialTimeout`](#onphonedialtimeout) | Phone | | Returning a non-null value overrides default behavior | +| [`OnPhoneNameUpdate`](#onphonenameupdate) | Phone | | Returning a non-null value overrides default behavior | +| [`OnPhoneNameUpdated`](#onphonenameupdated) | Phone | | — | +| [`OnPlayerAddModifiers`](#onplayeraddmodifiers) | Player | | Returning a non-null value overrides default behavior (prevents the… | +| [`OnPlayerAssist`](#onplayerassist) | Player | | Returning a non-null value cancels default behavior | +| [`OnPlayerAttack`](#onplayerattack) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerBanned`](#onplayerbanned) | Player | | — | +| [`OnPlayerChat`](#onplayerchat) | Player | | Returning a non-null value overrides default behavior of chat, not… | +| [`OnPlayerCommand`](#onplayercommand) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerConnected`](#onplayerconnected) | Player | | — | +| [`OnPlayerCorpse`](#onplayercorpse) | Player | | — | +| [`OnPlayerCorpseSpawn`](#onplayercorpsespawn) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerCorpseSpawned`](#onplayercorpsespawned) | Player | | — | +| [`OnPlayerDeath`](#onplayerdeath) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerDisconnected`](#onplayerdisconnected) | Player | | — | +| [`OnPlayerDropActiveItem`](#onplayerdropactiveitem) | Player | | — | +| [`OnPlayerHealthChange`](#onplayerhealthchange) | Player | | Returning a non-null value cancels the health change | +| [`OnPlayerInput`](#onplayerinput) | Player | | — | +| [`OnPlayerKeepAlive`](#onplayerkeepalive) | Player | | Returning a non-null value cancels default behavior | +| [`OnPlayerKicked`](#onplayerkicked) | Player | | — | +| [`OnPlayerLand`](#onplayerland) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerLanded`](#onplayerlanded) | Player | | — | +| [`OnPlayerLootEnd`](#onplayerlootend) | Player | | — | +| [`OnPlayerMetabolize`](#onplayermetabolize) | Player | | — | +| [`OnPlayerRecover`](#onplayerrecover) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerRecovered`](#onplayerrecovered) | Player | | — | +| [`OnPlayerReported`](#onplayerreported) | Player | | — | +| [`OnPlayerRespawn`](#onplayerrespawn) | Player | | Returning a BasePlayer.SpawnPoint (takes a position and rotation),… | +| [`OnPlayerRespawned`](#onplayerrespawned) | Player | | — | +| [`OnPlayerRevive`](#onplayerrevive) | Player | | Returning a non-null value cancels default behavior | +| [`OnPlayerSetInfo`](#onplayersetinfo) | Player | | — | +| [`OnPlayerSleep`](#onplayersleep) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerSleepEnded`](#onplayersleepended) | Player | | — | +| [`OnPlayerSpawn`](#onplayerspawn) | Player | | Returning true overrides default behavior | +| [`OnPlayerSpectate`](#onplayerspectate) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerSpectateEnd`](#onplayerspectateend) | Player | | Returning a non-null value stops the spectate from ending | +| [`OnPlayerTick`](#onplayertick) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerViolation`](#onplayerviolation) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerVoice`](#onplayervoice) | Player | | Returning a non-null value overrides default behavior | +| [`OnPlayerWound`](#onplayerwound) | Player | | Returning a non-null value cancels the wounded state | +| [`OnPluginLoaded`](#onpluginloaded) | Server | U | — | +| [`OnPluginUnloaded`](#onpluginunloaded) | Server | U | — | +| [`OnProjectileRicochet`](#onprojectilericochet) | Weapon | | Returning a non-null value overrides default behavior | +| [`OnQuarryEnabled`](#onquarryenabled) | Resource | | — | +| [`OnQuarryGather`](#onquarrygather) | Resource | | — | +| [`OnQuarryToggled`](#onquarrytoggled) | Resource | | — | +| [`OnRconCommand`](#onrconcommand) | Server | | — | +| [`OnRconConnection`](#onrconconnection) | Server | | Returning a non-null value overrides default behavior | +| [`OnReactiveTargetReset`](#onreactivetargetreset) | Entity | | — | +| [`OnRecyclerToggle`](#onrecyclertoggle) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRefreshVendingStock`](#onrefreshvendingstock) | Vending | | — | +| [`OnRemoveDying`](#onremovedying) | Resource | | Returning a non-null value overrides default behavior | +| [`OnResearchCostDetermine`](#onresearchcostdetermine) | Item | | Returning a numeric value (int) overrides the default value | +| [`OnResourceDepositCreated`](#onresourcedepositcreated) | Entity | | — | +| [`OnRespawnInformationGiven`](#onrespawninformationgiven) | Player | | — | +| [`OnRfBroadcasterAdd`](#onrfbroadcasteradd) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRfBroadcasterAdded`](#onrfbroadcasteradded) | Entity | | — | +| [`OnRfBroadcasterRemove`](#onrfbroadcasterremove) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRfBroadcasterRemoved`](#onrfbroadcasterremoved) | Entity | | — | +| [`OnRfFrequencyChange`](#onrffrequencychange) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRfFrequencyChanged`](#onrffrequencychanged) | Entity | | — | +| [`OnRfListenerAdd`](#onrflisteneradd) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRfListenerAdded`](#onrflisteneradded) | Entity | | — | +| [`OnRfListenerRemove`](#onrflistenerremove) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRfListenerRemoved`](#onrflistenerremoved) | Entity | | — | +| [`OnRidableAnimalClaim`](#onridableanimalclaim) | Entity | | Returning a non-null value overrides default behavior | +| [`OnRidableAnimalClaimed`](#onridableanimalclaimed) | Entity | | — | +| [`OnRocketLaunched`](#onrocketlaunched) | Weapon | | — | +| [`OnRotateVendingMachine`](#onrotatevendingmachine) | Vending | | Returning a non-null value overrides default behavior | +| [`OnRunPlayerMetabolism`](#onrunplayermetabolism) | Player | | Returning a non-null value cancels the update | +| [`OnSamSiteTarget`](#onsamsitetarget) | Entity | | Returning a non-null value cancels default behavior | +| [`OnSaveLoad`](#onsaveload) | Server | | Returning a non-null value overrides default behavior | +| [`OnSendCommand`](#onsendcommand) | Player | | Returning a non-null value overwrites command arguments | +| [`OnServerCommand`](#onservercommand) | Server | | Returning a non-null value overrides default behavior | +| [`OnServerInformationUpdated`](#onserverinformationupdated) | Server | | — | +| [`OnServerInitialized`](#onserverinitialized) | Server | U | — | +| [`OnServerMessage`](#onservermessage) | Server | | Return a non-null value to stop message from being sent | +| [`OnServerRestartInterrupt`](#onserverrestartinterrupt) | Server | | Returning a non-null value overrides default behavior | +| [`OnServerSave`](#onserversave) | Server | U | — | +| [`OnServerShutdown`](#onservershutdown) | Server | | — | +| [`OnShopAcceptClick`](#onshopacceptclick) | Entity | | Returning a non-null value cancels default behavior | +| [`OnShopCancelClick`](#onshopcancelclick) | Entity | | Returning a non-null value cancels default behavior | +| [`OnShopCompleteTrade`](#onshopcompletetrade) | Entity | | Returning a non-null value cancels default behavior | +| [`OnShopCompleteTrade`](#onshopcompletetrade-1) | Entity | | Returning a non-null value overrides default behavior | +| [`OnSignLocked`](#onsignlocked) | Sign | | — | +| [`OnSignUpdated`](#onsignupdated) | Sign | | — | +| [`OnSleepingBagDestroy`](#onsleepingbagdestroy) | Entity | | Returning a non-null value overrides default behavior | +| [`OnSleepingBagDestroyed`](#onsleepingbagdestroyed) | Entity | | — | +| [`OnSleepingBagValidCheck`](#onsleepingbagvalidcheck) | Entity | | Returning true or false overrides default behavior | +| [`OnSolarPanelSunUpdate`](#onsolarpanelsunupdate) | Entity | | Returning a non-null value overrides default behavior | +| [`OnSpinWheel`](#onspinwheel) | Sign | | — | +| [`OnStashExposed`](#onstashexposed) | Player | | — | +| [`OnStashHidden`](#onstashhidden) | Player | | — | +| [`OnStructureDemolish`](#onstructuredemolish) | Structure | | Returning a non-null value overrides default behavior | +| [`OnStructureRepair`](#onstructurerepair) | Structure | | Returning a non-null value cancels repair | +| [`OnStructureRotate`](#onstructurerotate) | Structure | | Returning a non-null value cancels rotate | +| [`OnStructureUpgrade`](#onstructureupgrade) | Structure | | Returning a non-null value overrides default behavior | +| [`OnSupplyDropDropped`](#onsupplydropdropped) | Entity | | — | +| [`OnSupplyDropLanded`](#onsupplydroplanded) | Entity | | — | +| [`OnSurveyGather`](#onsurveygather) | Resource | | — | +| [`OnSwitchToggle`](#onswitchtoggle) | Entity | | Returning a non-null value cancels default behavior | +| [`OnSwitchToggled`](#onswitchtoggled) | Entity | | — | +| [`OnTakeCurrencyItem`](#ontakecurrencyitem) | Vending | | Returning a non-null value cancels default behavior | +| [`OnTeamAcceptInvite`](#onteamacceptinvite) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamCreate`](#onteamcreate) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamCreated`](#onteamcreated) | Team | | — | +| [`OnTeamDisband`](#onteamdisband) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamDisbanded`](#onteamdisbanded) | Team | | — | +| [`OnTeamInvite`](#onteaminvite) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamKick`](#onteamkick) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamLeave`](#onteamleave) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamPromote`](#onteampromote) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamRejectInvite`](#onteamrejectinvite) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamUpdate`](#onteamupdate) | Team | | Returning a non-null value cancels default behavior | +| [`OnTeamUpdated`](#onteamupdated) | Team | | Returning a non-null value cancels default behavior | +| [`OnTechTreeNodeUnlock`](#ontechtreenodeunlock) | TechTree | | Returning a non-null value overrides default behavior | +| [`OnTechTreeNodeUnlocked`](#ontechtreenodeunlocked) | TechTree | | — | +| [`OnTerrainInitialized`](#onterraininitialized) | Terrain | | — | +| [`OnThreatLevelUpdate`](#onthreatlevelupdate) | Player | | Returning a non-null value cancels default behavior | +| [`OnTick`](#ontick) | Server | | — | +| [`OnToggleVendingBroadcast`](#ontogglevendingbroadcast) | Vending | | — | +| [`OnTrapArm`](#ontraparm) | Item | | Returning a non-null value overrides default behavior | +| [`OnTrapDisarm`](#ontrapdisarm) | Item | | Returning a non-null value overrides default behavior | +| [`OnTrapSnapped`](#ontrapsnapped) | Item | | — | +| [`OnTrapTrigger`](#ontraptrigger) | Item | | Returning a non-null value overrides default behavior | +| [`OnTreeMarkerHit`](#ontreemarkerhit) | Resource | | Returning true or false overrides default behaviour | +| [`OnTurretAssign`](#onturretassign) | Entity | | Returning a non-null value cancels default behavior | +| [`OnTurretAssigned`](#onturretassigned) | Entity | | — | +| [`OnTurretAuthorize`](#onturretauthorize) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretClearList`](#onturretclearlist) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretDeauthorize`](#onturretdeauthorize) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretModeToggle`](#onturretmodetoggle) | Entity | | — | +| [`OnTurretRotate`](#onturretrotate) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretShutdown`](#onturretshutdown) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretStartup`](#onturretstartup) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretTarget`](#onturrettarget) | Entity | | Returning a non-null value overrides default behavior | +| [`OnTurretToggle`](#onturrettoggle) | Entity | | Returning a non-null value overrides default behavior | +| [`OnUserApprove`](#onuserapprove) | Player | | Returning a non-null value overrides default behavior, plugin shoul… | +| [`OnUserApproved`](#onuserapproved) | Player | U | — | +| [`OnUserBanned`](#onuserbanned) | Player | U | — | +| [`OnUserChat`](#onuserchat) | Player | U | Returning true overrides default behavior of chat, not commands | +| [`OnUserCommand`](#onusercommand) | Player | U | Returning a non-null value overrides default behavior | +| [`OnUserConnected`](#onuserconnected) | Player | U | — | +| [`OnUserDisconnected`](#onuserdisconnected) | Player | U | — | +| [`OnUserGroupAdded`](#onusergroupadded) | Player | U | — | +| [`OnUserGroupRemoved`](#onusergroupremoved) | Player | U | — | +| [`OnUserKicked`](#onuserkicked) | Player | U | — | +| [`OnUserNameUpdated`](#onusernameupdated) | Player | U | — | +| [`OnUserPermissionGranted`](#onuserpermissiongranted) | Player | U | — | +| [`OnUserPermissionRevoked`](#onuserpermissionrevoked) | Player | U | — | +| [`OnUserRespawn`](#onuserrespawn) | Player | U | — | +| [`OnUserRespawned`](#onuserrespawned) | Player | U | — | +| [`OnUserUnbanned`](#onuserunbanned) | Player | U | — | +| [`OnVehicleModuleDeselected`](#onvehiclemoduledeselected) | Vehicle | | — | +| [`OnVehicleModuleMove`](#onvehiclemodulemove) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnVehicleModulesAssign`](#onvehiclemodulesassign) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnVehicleModulesAssigned`](#onvehiclemodulesassigned) | Vehicle | | — | +| [`OnVehicleModuleSelect`](#onvehiclemoduleselect) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnVehicleModuleSelected`](#onvehiclemoduleselected) | Vehicle | | — | +| [`OnVehiclePush`](#onvehiclepush) | Vehicle | | Returning a non-null value overrides default behavior | +| [`OnVendingShopOpened`](#onvendingshopopened) | Vending | | — | +| [`OnVendingShopRename`](#onvendingshoprename) | Vending | | Returning a non-null value cancels default behavior | +| [`OnVendingTransaction`](#onvendingtransaction) | Vending | | Returning true or false overrides default behavior | +| [`OnWaterCollect`](#onwatercollect) | Entity | | Returning a non-null value cancels default behavior | +| [`OnWaterPurified`](#onwaterpurified) | Entity | | — | +| [`OnWaterPurify`](#onwaterpurify) | Entity | | Returning a non-null value cancels default behavior | +| [`OnWeaponFired`](#onweaponfired) | Weapon | | — | +| [`OnWeaponReload`](#onweaponreload) | Weapon | | Returning a non-null value overrides default behavior | +| [`OnWireClear`](#onwireclear) | Entity | | Returning a non-null value cancels default behavior | +| [`OnWireConnect`](#onwireconnect) | Entity | | Returning a non-null value cancels default behavior | +| [`OnWorldPrefabSpawned`](#onworldprefabspawned) | World | | — | +| [`OnWorldProjectileCreate`](#onworldprojectilecreate) | Weapon | | Returning a non-null value overrides default behavior | +| [`Unload`](#unload) | Plugin | U | — | --- @@ -555,7 +580,7 @@ Each hook gives three things: -### `Init` +### `Init` · *universal* - Called when a plugin is being initialized - Other plugins may or may not be present, dependant on load order @@ -644,7 +669,7 @@ void OnServerShutdown() -### `OnFrame` +### `OnFrame` · *universal* - Called each frame @@ -695,7 +720,7 @@ void OnRconCommand(IPAddress ip, string command, string[] args) -### `OnPluginLoaded` +### `OnPluginLoaded` · *universal* - Called when any plugin has been loaded - Not to be confused with [`Loaded`](#loaded) @@ -748,7 +773,7 @@ void OnNewSave(string filename) -### `OnPluginUnloaded` +### `OnPluginUnloaded` · *universal* - Called when any plugin has been unloaded - Not to be confused with [`Unload`](#unload) @@ -784,7 +809,7 @@ object OnSaveLoad(Dictionary entities) -### `OnServerInitialized` +### `OnServerInitialized` · *universal* - 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 @@ -837,7 +862,7 @@ void OnServerMessage(string message, string playerName, string color, ulong play -### `OnServerSave` +### `OnServerSave` · *universal* - Called before the server saves @@ -1446,7 +1471,7 @@ object OnSendCommand(Connection connection, string command, object[] args) -### `OnUserChat` +### `OnUserChat` · *universal* - Called when a player sends a chat message to the server @@ -1464,7 +1489,7 @@ object OnUserChat(IPlayer player, string message) -### `OnUserCommand` +### `OnUserCommand` · *universal* - Useful for intercepting players' commands before their handling @@ -1482,7 +1507,7 @@ object OnUserCommand(IPlayer player, string command, string[] args) -### `OnUserRespawn` +### `OnUserRespawn` · *universal* - Called when a player is respawning @@ -1499,7 +1524,7 @@ void OnUserRespawn(IPlayer player) -### `OnUserRespawned` +### `OnUserRespawned` · *universal* - Called after a player has respawned @@ -1516,7 +1541,7 @@ void OnUserRespawned(IPlayer player) -### `OnUserConnected` +### `OnUserConnected` · *universal* - Called after a player has been approved and has connected to the server @@ -1542,7 +1567,7 @@ void OnUserConnected(IPlayer player) -### `OnUserDisconnected` +### `OnUserDisconnected` · *universal* - Called after a player has disconnected from the server @@ -1749,7 +1774,7 @@ object CanHackCrate(BasePlayer player, HackableLockedCrate crate) -### `CanUserLogin` +### `CanUserLogin` · *universal* - Called when a player is attempting to connect to the server @@ -1772,7 +1797,7 @@ object CanUserLogin(string name, string id, string ipAddress) -### `OnUserApproved` +### `OnUserApproved` · *universal* - Called after a player is approved to connect to the server @@ -1807,7 +1832,7 @@ object CanDismountEntity(BasePlayer player, BaseMountable entity) -### `OnUserNameUpdated` +### `OnUserNameUpdated` · *universal* - Called when a player's stored nickname has been changed @@ -1842,7 +1867,7 @@ bool CanEquipItem(PlayerInventory inventory, Item item, int targetPos) -### `OnUserGroupAdded` +### `OnUserGroupAdded` · *universal* - Called when a player has been added to a group @@ -1859,7 +1884,7 @@ void OnUserGroupAdded(string id, string groupName) -### `OnUserGroupRemoved` +### `OnUserGroupRemoved` · *universal* - Called when a player has been removed from a group @@ -1911,7 +1936,7 @@ void OnExperimentStarted(Workbench workbench, BasePlayer player) -### `OnUserPermissionGranted` +### `OnUserPermissionGranted` · *universal* - Called when a permission has been granted to a player @@ -1928,7 +1953,7 @@ void OnUserPermissionGranted(string id, string permName) -### `OnUserPermissionRevoked` +### `OnUserPermissionRevoked` · *universal* - Called when a permission has been revoked from a player @@ -1980,7 +2005,7 @@ void OnExperimentEnded(Workbench workbench) -### `OnUserKicked` +### `OnUserKicked` · *universal* - Called when a player has been kicked from the server @@ -2015,7 +2040,7 @@ object CanHideStash(BasePlayer player, StashContainer stash) -### `OnUserBanned` +### `OnUserBanned` · *universal* - Called when a player has been banned from the server - Will have reason available if provided @@ -2115,7 +2140,7 @@ object CanMountEntity(BasePlayer player, BaseMountable entity) -### `OnUserUnbanned` +### `OnUserUnbanned` · *universal* - Called when a player has been unbanned from the server @@ -8691,7 +8716,7 @@ void OnClanMemberLeft(LocalClan clan, ulong steamId) -### `Loaded` +### `Loaded` · *universal* - Called when a plugin has finished loading - Other plugins may or may not be present, dependant on load order @@ -8709,7 +8734,7 @@ void Loaded() -### `LoadDefaultConfig` +### `LoadDefaultConfig` · *universal* - Called when the config for a plugin should be initialized - Only called if the config file does not already exist @@ -8727,7 +8752,7 @@ protected override void LoadDefaultConfig() -### `Unload` +### `Unload` · *universal* - Called when a plugin is being unloaded @@ -8744,7 +8769,7 @@ void Unload() -### `LoadDefaultMessages` +### `LoadDefaultMessages` · *universal* - Called when the localization for a plugin should be registered @@ -9155,7 +9180,7 @@ void OnPhoneNameUpdated(PhoneController phoneController, string name, BasePlayer -### `OnPermissionRegistered` +### `OnPermissionRegistered` · *universal* - Called when a permission has been registered @@ -9172,7 +9197,7 @@ void OnPermissionRegistered(string name, Plugin owner) -### `OnGroupPermissionGranted` +### `OnGroupPermissionGranted` · *universal* - Called when a permission has been granted to a group @@ -9189,7 +9214,7 @@ void OnGroupPermissionGranted(string name, string perm) -### `OnGroupPermissionRevoked` +### `OnGroupPermissionRevoked` · *universal* - Called when a permission has been revoked from a group @@ -9206,7 +9231,7 @@ void OnGroupPermissionRevoked(string name, string perm) -### `OnGroupCreated` +### `OnGroupCreated` · *universal* - Called when a group has been created successfully @@ -9223,7 +9248,7 @@ void OnGroupCreated(string name) -### `OnGroupDeleted` +### `OnGroupDeleted` · *universal* - Called when a group has been deleted successfully @@ -9240,7 +9265,7 @@ void OnGroupDeleted(string name) -### `OnGroupRankSet` +### `OnGroupRankSet` · *universal* - Called when a group rank has been updated @@ -9257,7 +9282,7 @@ void OnGroupRankSet(string name, int rank) -### `OnGroupTitleSet` +### `OnGroupTitleSet` · *universal* - Called when a group title has been updated @@ -9274,7 +9299,7 @@ void OnGroupTitleSet(string name, string title) -### `OnGroupParentSet` +### `OnGroupParentSet` · *universal* - Called when a group parent has been updated diff --git a/modules/rust/OPERATING.md b/modules/rust/OPERATING.md new file mode 100644 index 0000000..ab08ad0 --- /dev/null +++ b/modules/rust/OPERATING.md @@ -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 + +--- + + + +## Getting Started + +Source: + +--- + +### 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) + +--- + + + +## Plugins - Getting Started + +Source: + +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` + +--- + + + +## Plugin installation + +Source: + +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. + +--- + + + +## Plugin configuration + +Source: + +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)... + +--- + + + +## Data Files + +Source: + +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. + +--- + + + +## Permissions + +Source: + +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. + +--- + +Mirrored from uMod, 2026-09-15. diff --git a/modules/rust/OXIDE_API.md b/modules/rust/OXIDE_API.md new file mode 100644 index 0000000..fe16d9a --- /dev/null +++ b/modules/rust/OXIDE_API.md @@ -0,0 +1,2072 @@ +# The Oxide/uMod plugin API + +The **game-independent** half of the ecosystem: how an Oxide plugin is structured, how it +declares hooks and commands, how it persists state, and how it talks to other plugins. Pair it +with [`HOOKS.md`](HOOKS.md), which is the Rust-specific half — *what* the game will tell you. + +> **Mirrored verbatim from uMod's developer documentation on 2026-09-15** — 19 pages under +> `umod.org/documentation/api/`. uMod is upstream and normative; this copy exists so the work can +> be done offline and grepped. See [`README.md`](README.md) for provenance and refresh. + +--- + +## Contents + +**Orientation** + +- [Overview](#overview) — What a plugin is, and the two base classes +- [Getting Started](#getting-started) — The smallest plugin that loads, and the file layout + +**The core surfaces** + +- [Hooks](#hooks) — Declaring hooks, calling them, and subscribing/unsubscribing at runtime +- [Commands](#commands) — Chat and console commands +- [Player Interface](#player-interface) — The `IPlayer` interface — the game-agnostic player object +- [Permissions](#permissions) — Registering permissions, groups, ranks + +**State and I/O** + +- [Configuration](#configuration) — The config file, defaults, and reading values +- [Data Files](#data-files) — Persisting plugin state to disk +- [Database](#database) — SQLite and MySQL access +- [Localization](#localization) — Message catalogues and per-player language +- [Timers](#timers) — One-shot, repeating, continuous and next-frame timers +- [Web Requests](#web-requests) — Outbound HTTP from a plugin + +**Talking to other plugins** + +- [Dependencies](#dependencies) — Hard and soft dependencies +- [Integration](#integration) — Calling another plugin, and exposing your own API + +**Build and release** + +- [Preprocessor Directives](#preprocessor-directives) — Per-game compilation symbols +- [Security](#security) — What a plugin must not do +- [Style Guide](#style-guide) — uMod's house style +- [Continuous Integration](#continuous-integration) — Building plugins in CI +- [Approval Guide](#approval-guide) — What uMod's reviewers check before publishing a plugin + +--- + + + +## Overview + +Source: + +--- + +### .NET framework + +Oxide and all of the games that Oxide actively supports are written in .NET or provide some interface through .NET. + +This guide is not meant to serve as introduction to programming. Though the entry level for Oxide is low, we do assume some basic programming knowledge. + +### CSharp ecosystem + +Learning C# is fundamental to using Oxide. Oxide and all resources that Oxide currently supports are written in C#. + +Technically Oxide has legacy support for JS, Lua, and Python plugins; however, these are currently unsupported and will likely remain so due to lack of community interest. + +There are [hundreds](https://umod.org/plugins) of free and open-source examples of working C# code written for Oxide and Oxide supported games. + +### Server-side modification + +All of the games that Oxide supports are currently multiplayer games which have both a client-side and a server-side component. + +A game client is generally an executable file that a player runs locally on their machine to play the game. + +In contrast, a server is generally a service running on another machine over the internet which a player connects to in order to play the game with other players. + +Oxide support is injected into the server-side component exclusively. Oxide is **not** a game client modification. Our contributors are largely limited to capabilities (or lack thereof) provided by third-party game developers. This includes... + +1. Core game mechanics. +2. Client-server integration +3. Error handling +4. Game engine + +### Plugins and hot loading + +Oxide is bundled with a C# compiler. Plugins are downloaded and installed as raw source code, and may be unloaded or loaded at a whim. + +This is is especially useful during development, as Oxide will detect when plugin source code has changed and automatically reload the given plugin. + +### Extensions and products + +Most extensions are free and open-source binaries and must be deployed as `.dll` files. Contrary to plugins, extensions may not be hot loaded and require a server restart for every update. + +Products are generally closed-source proprietary plugins or extensions which are also deployed as `.dll` files or remotely through our upcoming Marketplace extension. + +--- + + + +## Getting Started + +Source: + +--- + +Below is a minimal example of an Oxide plugin. + +```csharp +namespace Oxide.Plugins +{ + [Info("Epic Stuff", "Unknown Author", "0.1.0")] + [Description("Makes epic stuff happen")] + class EpicStuff : CovalencePlugin + { + private void Init() + { + Puts("A baby plugin is born!"); + } + + // The rest of the code magic + + // TODO (you): Make more epic stuff + } +} +``` + +### Namespace + +The namespace of each plugin should be `Oxide.Plugins` and will always be the same due to how plugins are currently setup to interact with each other and the core. + +```csharp +namespace Oxide.Plugins +``` + +### Title + +The Title variable *(first part of Info attribute)* is what defines the plugin. This should be a unique name or codename related to the purpose of the plugin. This variable (Title) can be accessed throughout the plugin in non-static methods as well. + +```csharp +"Epic Stuff" +``` + +### Author + +The Author variable *(second part of Info attribute)* is used to show who made or currently maintains the plugin. This should match the author's uMod.org username (if releasing). This (Author) variable can be accessed throughout the plugin in non-static methods as well. + +```csharp +"Unknown Author" +``` + +### Version + +The Version variable *(third part of Info attribute)* is used to tell if the plugin is outdated or not and should be incremented with each release. [Semantic Versioning](http://semver.org/) is recommended. This variable (Version) can be accessed throughout the plugin in non-static methods as well. + +```csharp +"0.1.0" +``` + +### Description + +The optional Description variable *(standalone Description attribute)* helps explain to users what the plugin does, in case the title is not enough. Make it good, but not too long! This (Description) variable can be accessed throughout the plugin in non-static methods as well. + +```csharp +[Description("Makes epic stuff happen")] +``` + +### Class Name + +The class name of the plugin is also the Name variable. This needs to match the filename, otherwise warnings will be issued. The class name should not contain any spaces or numbers, and should always start with a capital letter. This variable (Name) can be accessed throughout the plugin in non-static methods as well. + +```csharp +class EpicStuff +``` + +### Plugin Type + +Plugins should be inheriting the **CovalencePlugin** type. The CovalencePlugin type is used for both universal and non-universal plugins. + +```csharp +class EpicStuff : CovalencePlugin +``` + +--- + + + +## Hooks + +Source: + +uMod supports *hundreds* of hooks and even more are available through plugins and extensions. + +Hooks are what make a plugin tick in most cases. A hook event is triggered every time a feature aspect of the game (or injection site) is procedurally passed through. A hook, once triggered, will call all plugin methods that are subscribed to it. + +More generally a hook is a default server-side game behavior which a plugin tracks, modifies, augments, or cancels. + +--- + +#### Basic example + +```csharp +private bool CanUserLogin(string name, string id, string ip) +{ + Puts("No one can connect"); + return false; // By returning false, no players may connect to this server +} +``` + +### Available hooks + +Please consult our [Games](https://umod.org/documentation/umod/games) documentation for a list of all available hooks. + +### Custom hooks + +Developers may leverage hooks to easily develop [integrations](https://umod.org/documentation/api/integration) between plugins. + +#### Calling a hook from a plugin reference + +For information about plugin references, please consult [dependencies](https://umod.org/documentation/umod/api/dependencies#optional-dependencies) + +```csharp +bool result = EpicStuff.CallHook("CanDoSomething"); +if (result) +{ + Puts("Player can do the thing!"); +} +``` + +#### Calling a hook globally + +```csharp +bool result = Interface.CallHook("CanDoSomething"); +if (result) +{ + Puts("Player can do the thing!"); +} +``` + +#### Hook subscription + +By default, hooks that are included with uMod will be subscribed to automatically by a plugin when the plugin loads. A developer does not need to do anything special to subscribe to a hook aside from write a hook method that has the correct method name and corresponding parameters. + +However, developers may exercise direct control over which hooks are used by unsubscribing or subscribing to hooks manually. + +It is recommended for many (CPU intensive) hooks to unsubscribe from them entirely when they are not in use by any feature of a plugin. + +##### Unsubscribe from hook + +This example will unsubscribe `OnUserChat` if `chatFeatureEnabled` is `false`. + +```csharp +bool chatFeatureEnabled = false; + +void Init() +{ + if (!chatFeatureEnabled) + { + Unsubscribe("OnUserChat"); + } +} + +object OnUserChat(IPlayer player, string message) +{ + // Do stuff +} +``` + +##### Subscribe to hook + +After unsubscribing from a hook as in the previous example, the plugin may re-subscribe again to re-enable the plugin's chat behavior. + +```csharp +[Command("test")] +private void TestCommand(IPlayer player, string command, string[] args) +{ + if (player.IsAdmin) + { + Puts("Enabling chat behavior"); + Subscribe("OnUserChat"); + } +} +``` + +#### Hook overloading + +Hooks support method overloading. This means that, if possible, a hook will call the method which has a signature that most closely resembles the arguments provided (when the methods have the same name). + +```csharp +int EpicNumber = 42; +string EpicString = "Whoa"; + +Interface.CallHook("EpicHook", EpicNumber); +Interface.CallHook("EpicHook", EpicNumber, EpicString); +``` + +To catch the above hooks: + +```csharp +private void EpicHook(int epicNumber) +{ + Puts($"Received a number '{epicNumber}'"); +} + +private void EpicHook(int epicNumber, string epicString) +{ + Puts($"Received a number '{epicNumber}' AND string '{epicString}'"); +} +``` + +--- + + + +## Commands + +Source: + +Custom commands are easily implemented with minimal boilerplate for both in-game chat interfaces and conventional command-line interfaces. + +--- + +### Chat commands + +Chat commands are in-game commands entered via the game client's chat, prefixed by a forward slash (/). + +```csharp +[Command("test")] +private void TestCommand(IPlayer player, string command, string[] args) +{ + player.Reply("Test successful!"); +} +``` + +### Console commands + +Console commands may be executed from the server console and in-game interfaces (where applicable). + +```csharp +[Command("epicstuff.test")] +private void TestCommand(IPlayer player, string command, string[] args) +{ + player.Reply("Test successful!"); +} +``` + +### Command permissions + +Easily restrict command usage to players who have a permission assigned to them. + +```csharp +[Command("test"), Permission("epicstuff.use")] +private void TestCommand(IPlayer player, string command, string[] args) +{ + player.Reply("Test successful!"); +} +``` + +--- + + + +## Player Interface + +Source: + +Oxide provides a standard universal method for accessing player information and performing actions on a player using the `IPlayer` interface. + +--- + +For examples when to use IPlayer in practice, consider the [Commands](https://umod.org/documentation/umod/api/commands) documentation. + +### Information + +#### Name + +The player's in-game display name, which by default is usually the same as their Steam account alias (but not necessarily). + +```csharp +string name = player.Name; +``` + +#### Id + +The player's unique identification number, in many cases a 64 bit [Steam ID](https://developer.valvesoftware.com/wiki/SteamID) (but not necessarily). + +```csharp +string id = player.Id; +``` + +#### Address + +The player's IPv4 or IPv6 IP address. + +```csharp +string address = player.Address; +``` + +#### Ping + +The player's average network ping + +```csharp +int ping = player.Ping; +``` + +#### Language + +The player's currently configured language. For more information about `CultureInfo`, please see the official [CultureInfo](https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo) documentation. + +```csharp +CultureInfo language = player.Language; +``` + +#### IsConnected + +Whether a player is currently connected to the server + +```csharp +if (player.IsConnected) +{ + player.Reply("You are connected"); +} +``` + +#### IsServer + +Whether a player is the server + +```csharp +if (player.IsServer) +{ + player.Reply("You are the server"); +} +``` + +### Administration + +#### IsAdmin + +Whether a player is an administrator + +```csharp +if (player.IsAdmin) +{ + player.Reply("You are an admin"); +} +``` + +#### IsBanned + +Whether a player is banned from the server + +```csharp +if (player.IsBanned) +{ + player.Reply("You are banned"); +} +``` + +#### BanTimeRemaining + +The amount of time left before a player is unbanned (if ban is temporary). For more information about TimeSpan, please see the official [TimeSpan](https://docs.microsoft.com/en-us/dotnet/api/system.timespan) documentation. + +```csharp +TimeSpan banTimeRemaining = player.BanTimeRemaining; +``` + +#### Ban + +Bans a player from the server. For more information about TimeSpan, please see the official [TimeSpan](https://docs.microsoft.com/en-us/dotnet/api/system.timespan) documentation. + +```csharp +player.Ban("reason"); // Ban player indefinitely +player.Ban("reason", new TimeSpan(2, 0, 0)); // Ban player for 2 hours +``` + +#### Unban + +Unbans a player, allowing them to connect to the server + +```csharp +player.Unban(); +``` + +#### Kick + +Kicks a player from the server + +```csharp +player.Kick("reason"); +``` + +### Character + +#### Health + +Retrieve or update a player's health + +```csharp +float health = player.Health; +player.Health = 100f; +``` + +#### MaxHealth + +Retrieve or update a player's maximum health + +```csharp +float maxHealth = player.MaxHealth; +player.MaxHealth = 50f; +``` + +#### Heal + +Heals a player's health a given amount + +```csharp +player.Heal(100f); +``` + +#### Hurt + +Hurts a player's health a given amount + +```csharp +player.Hurt(50f); +``` + +#### Kill + +Kills a player, causing them to die + +```csharp +player.Kill(); +``` + +#### Rename + +Renames a player, changing their in-game name + +```csharp +player.Rename("EpicName"); +``` + +### Location + +#### Teleport + +Teleports a player to the given world position + +```csharp +float x = 1; +float y = 2; +float z = 3; +player.Teleport(x, y, z); + +GenericPosition position = new GenericPosition(x, y, z); +player.Teleport(position); +``` + +#### Position + +Retrieve a player's in-game character position + +```csharp +GenericPosition position = player.Position(); +``` + +### Chat and Commands + +#### Message + +Sends the given message and prefix to a player + +```csharp +player.Message("hello world"); +``` + +#### Reply + +Replies to a player with the given message and prefix + +```csharp +player.Reply("hello world"); +``` + +#### Command + +Runs the given console command as a player + +```csharp +player.Command("command", arg1, arg2 /* , ... */ ); +``` + +### Permissions + +#### HasPermission + +Checks if a player has the given permission + +```csharp +if (player.HasPermission("epicstuff.use")) +{ + player.Reply("You have the epic permission"); +} +``` + +#### GrantPermission + +Grants a given permission to a player + +```csharp +player.GrantPermission("epicstuff.use"); +``` + +#### RevokePermission + +Removes a given permission from a player + +```csharp +player.RevokePermission("epicstuff.use"); +``` + +#### BelongsToGroup + +Checks if a player belongs to a given group + +```csharp +if (player.BelongsToGroup("admin")) +{ + player.Reply("You are in the admin group"); +} +``` + +#### AddToGroup + +Adds a player to a given group + +```csharp +player.AddToGroup("admin"); +``` + +#### RemoveFromGroup + +Removes a player from a given group + +```csharp +player.RemoveFromGroup("admin"); +``` + +--- + + + +## Permissions + +Source: + +Oxide offers a substantial API to control user access with permissions and groups + +### Basic usage + +For a primer on how to use permissions as a server owner, please consult the *Using the Oxide permissions system* tutorial. + +Most plugins can benefit from some permissions. Below is a basic example of how to register a permission and check if a player has that permission assigned to them. + +```csharp +namespace Oxide.Plugins +{ + [Info("Epic Stuff", "Unknown Author", "0.1.0")] + [Description("Makes epic stuff happen")] + class EpicStuff : CovalencePlugin + { + private void Init() + { + permission.RegisterPermission("epicstuff.use", this); + } + + private void OnUserConnected(IPlayer player) + { + if (player.HasPermission("epicstuff.use")) + { + // Player has permission, do special stuff for them + } + } + } +} +``` + +## API + +### Groups + +#### Get all groups + +```csharp +string[] groups = permission.GetGroups(); +``` + +#### Check if group exists + +```csharp +bool GroupExists = permission.GroupExists("GroupName"); +``` + +#### Create a group + +```csharp +bool GroupCreated = permission.CreateGroup("GroupName", "Group Title", 0); +``` + +#### Remove a group + +```csharp +bool GroupRemoved = permission.RemoveGroup("GroupName"); +``` + +#### Check if group has a permission + +```csharp +bool GroupHasPermission = permission.GroupHasPermission("GroupName", "epicstuff.use"); +``` + +#### Grant permission to a group + +```csharp +permission.GrantGroupPermission("GroupName", "epicstuff.use", this); +``` + +#### Revoke permission from a group + +```csharp +permission.RevokeGroupPermission("GroupName", "epicstuff.use"); +``` + +#### Get the rank for a group + +```csharp +int GroupRank = permission.GetGroupRank("GroupName"); +``` + +#### Get the title for a group + +```csharp +string GroupTitle = permission.GetGroupTitle("GroupName"); +``` + +#### Get parent group for a group + +```csharp +string GroupParent = permission.GetGroupParent("GroupName"); +``` + +#### Get permissions for a group + +```csharp +string[] permissions = permission.GetGroupPermissions("GroupName", false); +``` + +#### Migrate group + +```csharp +permission.MigrateGroup("OldGroupName", "NewGroupName"); +``` + +### Users + +#### Get permissions granted to player + +```csharp +string[] UserPermissions = permission.GetUserPermissions("playerID"); +``` + +#### Check if player has a permission + +```csharp +bool UserHasPermission = permission.UserHasPermission("playerID", "epicstuff.use"); +``` + +#### Add player to a group + +```csharp +permission.AddUserGroup("playerID", "GroupName"); +``` + +#### Remove player from a group + +```csharp +permission.RemoveUserGroup("playerID", "GroupName"); +``` + +#### Check if player is in a group + +```csharp +bool UserHasGroup = permission.UserHasGroup("playerID", "GroupName"); +``` + +#### Grant permission to a player + +```csharp +permission.GrantUserPermission("playerID", "epicstuff.use", this); +``` + +#### Revoke permission from a player + +```csharp +permission.RevokeUserPermission("playerID", "epicstuff.use"); +``` + +### Server + +#### Get all registered permissions + +```csharp +string[] permissions = permission.GetPermissions(); +``` + +#### Check if a permission exists + +```csharp +bool PermissionExists = permission.PermissionExists("epicstuff.use", this); +``` + +#### Register a permission + +```csharp +permission.RegisterPermission("epicstuff.use", this); +``` + +--- + + + +## Configuration + +Source: + +Since many users can not or do not want to edit the plugin directly to change settings or options, it is best to offer them a configuration file that can easily be edited without worrying about messing up the plugin or it resetting each time the plugin is updated. + +--- + +### Simple configuration + +#### Creating + +There are many methods to create a configuration file. The examples below outline the simplest possible usage. + +```csharp +protected override void LoadDefaultConfig() +{ + LogWarning("Creating a new configuration file"); + Config["ShowJoinMessage"] = true; + Config["ShowLeaveMessage"] = true; + Config["JoinMessage"] = "Welcome to this server"; + Config["LeaveMessage"] = "Goodbye"; +} +``` + +#### Updating + +Modify and save configuration entries by simply assigning the new values and calling the save function. + +```csharp +[Command("test")] +private void TestCommand(IPlayer player, string command, string[] args) +{ + Config["ShowJoinMessage"] = !(bool)Config["ShowJoinMessage"]; + SaveConfig(); +} +``` + +### Advanced configuration + +For large plugins with more elaborate configurations, it may be helpful to scaffold a formal configuration class. + +```csharp +private class PluginConfig +{ + public bool ShowJoinMessage; + public bool ShowLeaveMessage; + public string JoinMessage; + public string LeaveMessage; +} +``` + +#### Updating + +Write the configuration object directly to a file using this simple one-liner. + +```csharp +private void SaveConfig() +{ + Config.WriteObject(config, true); +} +``` + +#### Loading + +Load the configuration object directly from a file. + +```csharp +private PluginConfig config; + +private void Init() +{ + config = Config.ReadObject(); +} + +protected override void LoadDefaultConfig() +{ + Config.WriteObject(GetDefaultConfig(), true); +} + +private PluginConfig GetDefaultConfig() +{ + return new PluginConfig + { + ShowJoinMessage = true, + ShowLeaveMessage = true, + JoinMessage = "Welcome to this server", + LeaveMessage = "Goodbye" + }; +} +``` + +--- + + + +## Data Files + +Source: + +Data files are used to store potentially large amounts of arbitrary data. + +--- + +### Using a data file + +The `GetDatafile` method will return a `DynamicConfigFile` object. If the file requested already exists, its data will be loaded into the `DynamicConfigFile`. If the file does not exist, it will be created. + +#### Creating/saving the file + +```csharp +DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetDatafile("MyDataFile"); + +dataFile["EpicString"] = "EpicValue"; +dataFile["EpicNumber"] = 42; + +dataFile.Save(); +``` + +Doing this will create a file at the location `oxide/data/MyDataFile.json` which will have the following contents: + +```json +{ + "EpicString" : "EpicValue", + "EpicNumber" : 42 +} +``` + +#### Accessing data by key + +```csharp +// Check if the EpicString exists +if (dataFile["EpicString"] != null) +{ + Puts(dataFile["EpicString"]); // Outputs: EpicValue +} + +// Check if the EpicNumber exists +if (dataFile["EpicNumber"] != null) +{ + Puts(dataFile["EpicNumber"]); // Outputs: 42 +} +``` + +#### Removing a key + +Remove a particular key, using the previous example. + +```csharp +dataFile.Remove("EpicString"); +dataFile.Save(); +``` + +The final JSON output: + +```json +{ + "EpicNumber" : 42 +} +``` + +#### Clearing the entire file + +```csharp +dataFile.Clear(); +``` + +### Nested keys + +A developer may use the `DynamicConfigFile` object to easily read and write nested key-value pairs. + +#### Write nested key + +```csharp +dataFile["EpicCategory", "EpicString"] = "EpicValue"; +``` + +```json +{ + "EpicCategory" : { + "EpicString" : "EpicValue" + } +} +``` + +#### Read nested key + +```csharp +if (dataFile["EpicCategory", "EpicString"] != null) +{ + Puts(dataFile["EpicCategory", "EpicString"]); // Outputs: EpicValue +} +``` + +### Checking if a file exists + +```csharp +if (Interface.Oxide.DataFileSystem.ExistsDatafile("MyDataFile")) +{ + Puts("MyDataFile exists!"); +} +else +{ + Puts("MyDataFile does not exist"); +} +``` + +### Loading a data object + +Much like [advanced configurations](https://umod.org/documentation/api/configuration#advanced-configuration), data files may be scaffolded using a class definition. + +```csharp +private class StoredData +{ + public HashSet Players = new HashSet(); + + public StoredData() + { + } +} + +private class PlayerInfo +{ + public string Id; + public string Name; + + public PlayerInfo() + { + } + + public PlayerInfo(IPlayer player) + { + Id = player.Id; + Name = player.Name; + } +} + +private StoredData storedData; + +private void Init() +{ + storedData = Interface.Oxide.DataFileSystem.ReadObject("MyDataFile"); +} +``` + +### Saving a data object + +Change data files by simply assigning the new values and writing the object to the file. + +```csharp +[Command("test")] +private void TestCommand(IPlayer player, string command, string[] args) +{ + PlayerInfo info = new PlayerInfo(player); + if (storedData.Players.Contains(info)) + { + player.Reply("Your data has already been added to the file"); + } + else + { + storedData.Players.Add(info); + player.Reply("Saving your data to the file..."); + Interface.Oxide.DataFileSystem.WriteObject("MyDataFile", storedData); + } +} +``` + +### Advanced data + +For large plugins that potentially store massive amounts of data, using a single data file may not be advisable. In this case, uMod provides the ability to store many smaller data files in a custom sub-directory. These smaller data files may be loaded on an as-needed basis, thus reducing the impact of a plugin on memory and the filesystem overall. + +```csharp +private DataFileSystem dataFile; + +private void Init() +{ + dataFile = new DataFileSystem($"{Interface.Oxide.DataDirectory}\\player_info"); +} + +private PlayerInfo LoadPlayerInfo(string playerId) +{ + return dataFile.ReadObject($"playerInfo_{playerId}"); +} + +private void SavePlayerInfo(string playerId, PlayerInfo playerInfo) +{ + dataFile.WriteObject($"playerInfo_{playerId}", playerInfo); +} +``` + +--- + + + +## Database + +Source: + +The Oxide database extensions implement a generalized database abstraction layer for both MySQL and SQLite. + +--- + +### Open a connection + +Create a new connection to a database by providing the database file location or an address (URI and port), a database name, and authentication credentials. + +```csharp +Core.MySql.Libraries.MySql sqlLibrary = Interface.Oxide.GetLibrary(); +Connection sqlConnection = sqlLibrary.OpenDb("localhost", 3306, "umod", "username", "password", this); +``` + +### Close the connection + +Close an existing connection to the database. + +```csharp +sqlLibrary.CloseDb(sqlConnection); +``` + +### Query the database + +Retrieve data from the database, typically using a SELECT statement. + +```csharp +string sqlQuery = "SELECT `id`, `field1`, `field2` FROM example_table"; +Sql selectCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery); + +sqlLibrary.Query(selectCommand, sqlConnection, list => +{ + if (list == null) + { + return; // Empty result or no records found + } + + StringBuilder newString = new StringBuilder(); + newString.AppendLine(" id\tfield1\tfield2"); + + // Iterate through resulting records + foreach (Dictionary entry in list) + { + newString.AppendFormat(" {0}\t{1}\t{2}\n", entry["id"], entry["field1"], entry["field2"]); + } + + Puts(newString.ToString()); +}); +``` + +### Insert query + +Insert records into the database using an INSERT statement. + +```csharp +string sqlQuery = "INSERT INTO example_table (`field1`, `field2`) VALUES (@0, @1);"; +Sql insertCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, "field1 value", "field2 value"); + +sqlLibrary.Insert(insertCommand, sqlConnection, rowsAffected => +{ + if (rowsAffected > 0) + { + Puts("New record inserted with ID: {0}", sqlConnection.LastInsertRowId); + } +}); +``` + +### Update query + +Update existing records in the database using an UPDATE statement. + +```csharp +int exampleId = 2; +string sqlQuery = "UPDATE example_table SET `field1` = @0, `field2` = @1 WHERE `id` = @2;"; +Sql updateCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, "field1 value", "field2 value", exampleId); + +sqlLibrary.Update(updateCommand, sqlConnection, rowsAffected => +{ + if (rowsAffected > 0) + { + Puts("Record successfully updated!"); + } +}); +``` + +### Delete query + +Delete existing records from a database using a DELETE statement. + +```csharp +int exampleId = 2; +string sqlQuery = "DELETE FROM example_table WHERE `id` = @0;"; +Sql deleteCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, exampleId); + +sqlLibrary.Delete(deleteCommand, sqlConnection, rowsAffected => +{ + if (rowsAffected > 0) + { + Puts("Record successfully deleted!"); + } +}); +``` + +### Non-query + +By definition a non-query is a query which modifies data and does not retrieve data. Insert, Update, and Delete queries are all considered non-queries. + +```csharp +int exampleId = 2; +string sqlQuery = "UPDATE example_table SET `field1` = @0, `field2` = @1 WHERE `id` = @3;"; +Sql sqlCommand = Oxide.Core.Database.Sql.Builder.Append(sqlQuery, "field1 value", "field2 value", exampleId); + +sqlLibrary.ExecuteNonQuery(sqlCommand, sqlConnection); +``` + +--- + + + +## Localization + +Source: + +Oxide provides a simple API with which a developer may easily add support for multiple languages to plugins and extensions. + +--- + +### Localization guidelines + +1. English, please + While we certainly encourage submissions that support multiple languages, English *must* be included. +2. No prefixes + While not required, not prefixing messages with your plugin name is generally encouraged as it keeps the messages sent to players shorter and cleaner. Some plugin developers opt for having the prefix configurable via the configuration file, but most do not set one. +3. Format + Try to keep messages brief and to the point to avoid taking up an excess amount of screen or console space. Best practice is to use Sentence case, not Title Case or ALL CAPS. + +### Plugin messages + +#### Registering messages + +When a plugin loads, it must register all of the messages used in the plugin. + +```csharp +protected override void LoadDefaultMessages() +{ + lang.RegisterMessages(new Dictionary + { + ["EpicThing"] = "An epic thing has happened", + ["EpicTimes"] = "An epic thing has happened: {0} time(s)" + }, this); +} +``` + +#### Get all messages + +Retrieves a Dictionary of all the messages registered for a particular plugin and language. + +```csharp +Dictionary messages = lang.GetMessages("en", this); + +Puts($"Messages for {Title}:"); +foreach(KeyValuePair message in messages) +{ + Puts($"{message.Key}: {message.Value}"); +} +``` + +#### Get a single message + +```csharp +[Command("epicstuff.message")] +private void TestMessageCommand(IPlayer player) +{ + string message = lang.GetMessage("EpicThing", this, player.Id); + Puts(message); +} +``` + +> **Note.** +> **The player's ID is passed to the `GetMessage` method, which will send them the message in their language when available.** + +#### Formatting a message + +```csharp +int amount = 0; + +[Command("epicstuff.amount")] +private void TestAmountCommand(IPlayer player) +{ + amount++; + string message = lang.GetMessage("EpicTimes", this, player.Id); + Puts(string.Format(message, amount.ToString())); +} +``` + +### Player language + +#### Get player language + +Retrieve the server-wide language setting for a player. + +```csharp +[Command("epicstuff.language")] +private void TestLanguageCommand(IPlayer player) +{ + Puts(lang.GetLanguage(player.Id)); + // Will output (by default): en +} +``` + +#### Set player language + +Update the server-wide language setting for a player. + +```csharp +[Command("epicstuff.french")] +private void TestUpdateCommand(IPlayer player) +{ + lang.SetLanguage("fr", player.Id); + Puts("Merci bien! Votre langue est le français"); +} +``` + +Players can also set their language by using the included `oxide.lang`, `o.lang`, or `lang` console or chat commands along with their desired, available two-letter language code. + +### Plugin languages + +#### Get plugin languages + +Retrieves an array of strings containing a list of all the languages that a plugin supports. + +```csharp +string[] languages = lang.GetLanguages(this); + +Puts($"Supported languages for {Title}:"); +foreach(string language in languages) +{ + Puts(language); +} +``` + +### Server language + +#### Get server language + +Retrieve the default language for the server. + +```csharp +Puts(lang.GetServerLanguage()); // Will output (by default): en +``` + +#### Set server language + +Update the default language for the server. + +```csharp +lang.SetServerLanguage("fr"); // Will set language to "fr" +``` + +--- + + + +## Timers + +Source: + +Timers generally execute functions after a set interval. Optionally continuous, repeating, and immediate timers are also available. + +--- + +### Single timer + +Executes a function once after the specified delay interval. + +```csharp +timer.Once(1f, () => +{ + Puts("Hello world!"); +}); +``` + +### Continuous timer + +Executes a function at the specified delay interval (until the timer is manually destroyed or plugin is unloaded). + +```csharp +timer.Every(3f, () => +{ + Puts("Hello world!"); +}); +``` + +### Repeating timer + +Executes a function a specific number of times at the specified delay interval. If the number of recurrences is not specified (0), then a repeating timer behaves identically to a continuous timer. + +```csharp +timer.Repeat(5f, 0, () => +{ + Puts("Hello world!"); +}); +``` + +### Immediate timer + +Executes a function immediately (in the next frame). + +```csharp +NextFrame(() => +{ + Puts("Hello world!"); +}); +``` + +### Destroying timer + +When a timer is no longer operating, it is marked as destroyed. Additionally timers may be destroyed manually if stored in a variable. + +```csharp +Timer myTimer = timer.Every(3f, () => +{ + Puts("Hello world!"); +}); + +myTimer.Destroy(); +if (myTimer.Destroyed) +{ + Puts("Timer destroyed!"); +} +``` + +--- + + + +## Web Requests + +Source: + +Make a web request to a URI (Uniform Resource Identifier) using the HTTP GET, POST, or PUT methods. + +Web requests create a raw connection to a web page as done in a web browser. The request will return true if the web request was sent, false if not. + +The callback is called with 2 parameters - an integer HTTP response code and a string response. + +--- + +### GET web request + +The HTTP GET method is used to retrieve a resource, usually represented as XML or JSON. HTTP status code 200 (OK) is expected in response to a successful GET request. + +```csharp +webrequest.Enqueue("http://www.google.com/search?q=umod", null, (code, response) => +{ + if (code != 200 || response == null) + { + Puts($"Couldn't get an answer from Google!"); + return; + } + Puts($"Google answered: {response}"); +}, this, RequestMethod.GET); +``` + +#### Advanced GET request + +The following example demonstrates how to specify custom request timeout and/or additional headers. + +```csharp +[Command("get")] +private void GetRequest(IPlayer player, string command, string[] args) +{ + // Set a custom timeout (in milliseconds) + float timeout = 200f; + + // Set some custom request headers (eg. for HTTP Basic Auth) + Dictionary headers = new Dictionary { { "header", "value" } }; + + webrequest.Enqueue("http://www.google.com/search?q=umod", null, (code, response) => + GetCallback(code, response, player), this, RequestMethod.GET, headers, timeout); +} + +private void GetCallback(int code, string response, IPlayer player) +{ + if (response == null || code != 200) + { + Puts($"Error: {code} - Couldn't get an answer from Google for {player.Name}"); + return; + } + + Puts($"Google answered for {player.Name}: {response}"); +} +``` + +### POST web request + +The HTTP POST method is generally used to create new resources. HTTP status code 200 (OK) OR HTTP status code 201 (Created), and an accompanying redirect (to the newly created resource) are expected in response to a successful POST request. + +```csharp +webrequest.Enqueue("http://www.google.com/search?q=umod", "param1=value1", (code, response) => +{ + if (code != 200 || response == null) + { + Puts($"Couldn't get an answer from Google!"); + return; + } + Puts($"Google answered: {response}"); +}, this, RequestMethod.POST); +``` + +### PUT web request + +The HTTP PUT is generally used to update existing resources. The request body of a PUT request generally contains an updated representation of the original resource. HTTP status code 200 (OK) OR HTTP status code 204 (No Content) are expected in response to a successful PUT request. + +```csharp +webrequest.Enqueue("http://www.google.com/search?q=umod", null, (code, response) => +{ + if (code != 200 || response == null) + { + Puts($"Couldn't get an answer from Google!"); + return; + } + Puts($"Google answered: {response}"); +}, this, RequestMethod.PUT); +``` + +### POST and PUT body + +Typically an updated resource is represented in a POST/PUT request body as a query string. + +```csharp +Dictionary parameters = new Dictionary(); + +parameters.Add("param1", "value1"); +parameters.Add("param2", "value2"); + +string[] body = string.Join("&", parameters.Cast().Select(key => string.Format("{0}={1}", key, source[key])); +webrequest.Enqueue("http://www.google.com/search?q=umod", body, (code, response) => +{ + if (code != 200 || response == null) + { + Puts($"Couldn't get an answer from Google!"); + return; + } + Puts($"Google answered: {response}"); +}, this, RequestMethod.POST); +``` + +### Using a method callback + +The following example demonstrates how to refactor delegate behavior by encapsulating it in a separate method, rather than solely using an anonymous function. + +```csharp +[Command("get")] +private void GetRequest(IPlayer player, string command, string[] args) +{ + webrequest.EnqueueGet("http://www.google.com/search?q=umod", (code, response) => GetCallback(code, response, player), this); +} + +private void GetCallback(int code, string response, IPlayer player) +{ + if (response == null || code != 200) + { + Puts($"Error: {code} - Couldn't get an answer from Google for {player.Name}"); + return; + } + + Puts($"Google answered for {player.Name}: {response}"); +} +``` + +--- + + + +## Dependencies + +Source: + +Dependencies are functional relationships between different code resources. + +--- + +### Optional dependencies + +Optional dependencies are plugins, extensions, products, or third-party libraries that your code *can* use but does not require to work. + +Generally an optional dependency means checking for the installation of another resource (i.e. plugin), and disabling or enabling features depending on its existence. + +#### Basic plugin reference + +A plugin reference field allows developers to magically reference another plugin. If the plugin is not available, the reference field will return `null`. + +The name of the plugin reference field must match the class name of the plugin being referenced. + +```csharp +[PluginReference] +private Plugin EpicStuff; + +private void Loaded() +{ + if (EpicStuff != null) + { + EpicStuff.Call("SomeMethod"); + } +} +``` + +### Required dependencies + +Resource requirements are plugins, extensions, products, or third-party libraries that a plugin *must* have in order to work. + +Requirements are *not* optional, and the code must check for them and display a helpful error message when they are unavailable. + +```csharp +private void Loaded() +{ + if (EpicStuff == null) + { + LogError("Epic Stuff is not loaded, get it at https://umod.org"); + } +} +``` + +### Hard dependencies + +"Hard" dependencies are special cases where a resource (i.e. plugin) is compiled alongside another plugin and may be referenced directly (as opposed to indirectly through Oxide). + +It is *not* recommended to use hard dependencies except when it is absolutely needed. + +> **Warning.** +> **If a hard dependency is not installed alongside a plugin that requires it, a compilation error will be thrown.** + +At the top of the plugin file, above using statements: + +```csharp +// Requires: EpicStuff +``` + +In the plugin body: + +```csharp +// EpicStuff may now be referenced directly +EpicStuff EpicStuff; + +private void Loaded() +{ + EpicStuff = (EpicStuff)Manager.GetPlugin("EpicStuff"); +} +``` + +--- + + + +## Integration + +Source: + +Oxide provides an interface or intermediate layer to bring together two separate plugins which then cooperate ensuring that both plugins function together as a single system. + +Providing integrations with other plugins is one of the single best value adding propositions in the Oxide ecosystem. + +### Modularity and interoperability + +It is recommended that plugins follow [SOLID](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)) object oriented design principles. Using these principles correctly often means that disparate functionality is refactored down to constituent parts, each limited to their specific scope and responsibility. + +This approach is beneficial because, not only does it prevent code from becoming spaghetti (or a big mess), it also ensures each code unit is separated into easily digestible parts for other programmers to understand. + +### Plugin dependencies + +Creating a dependency is usually the first step to creating a plugin integration. + +As outlined in the [dependencies](https://umod.org/documentation/api/dependencies) documentation, there are three (3) different types of dependencies: `optional`, `required`, and `hard`. + +A basic plugin reference: + +```csharp +[PluginReference] +private Plugin EpicStuff; +``` + +> **Warning.** +> **The name of the property (e.g. "EpicStuff") must match the class name of the plugin being referenced exactly.** + +### Call method + +After creating a dependency, a plugin may call specific methods in another plugin. + +```csharp +private void Loaded() +{ + if (EpicStuff != null) // check if plugin is loaded + { + EpicStuff.Call("SomeMethod", "argument1", "argument2"); + } +} +``` + +When return behavior is required the call method returns an object by default. The call method has an optional generic method which may be used to explicitly cast the result. + +```csharp +bool someResponse = EpicStuff.Call("SomeMethod", "argument1", "argument2"); +if(someResponse) +{ + Puts("SomeMethod Response: True"); +} +``` + +In order for the above implementations to work, the `EpicStuff` plugin must have a method that matches the signatures used above. + +```csharp +// In EpicStuff.cs +private bool SomeMethod(string argument1, string argument2) +{ + Puts($"Do stuff: {argument1} {argument2}"); + return true; +} +``` + +### Hook conflicts + +Hooks that have return behavior may conflict when multiple plugins using a hook return different values. In such cases, it is often necessary for one plugin or the other to integrate and resolve the conflict. + +Hook conflicts usually print a message like... + +> **Warning.** +> ****[Warning] Calling hook CanUserLogin resulted in a conflict between the following plugins: MyPlugin - True (Boolean), EpicPlugin (False (Boolean))**** + +The solution is usually to integrate MyPlugin with EpicPlugin (or vice versa) to give one plugin's hook precedence over the other. + +```csharp +bool CanUserLogin (string name, string id, string ip) +{ + if (EpicPlugin != null) + { + var result = EpicPlugin.Call ("CanUserLogin", name, id, ip); + if (result is bool) + { + return (bool)result; + } + } + + Puts("No conflict, do plugin stuff here"); + + return true; +} +``` + +### Custom hooks + +Integrations do not necessarily require dependencies, sometimes simply using a [custom hook](https://umod.org/documentation/api/hooks#custom-hooks) is sufficient. + +For example, if a plugin creates a backpack for players to store their items, it could create a custom hook called `CanCreateBackpack`. Other plugins could then implement the `CanCreateBackpack` hook, and prevent the player from using their backpack in certain situations (e.g. being in an arena). + +This might be part of a backpack plugin: + +```csharp +bool result = Interface.Oxide.CallHook("CanCreateBackpack", player); +if (!result) +{ + return; +} + +// Create backpack +``` + +Then in the integration plugin: + +```csharp +private object CanCreateBackpack(IPlayer player) +{ + if (IsInArena(player)) + { + return false; + } + + return null; +} +``` + +--- + + + +## Preprocessor Directives + +Source: + +When writing or debugging plugins, it is useful to be familiar with [preprocessor directives](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/). + +--- + +### Basic usage + +Each game and branch that Oxide supports has an accompanying preprocessor symbol. + +In universal plugins, this symbol may be used to separate code for different games. This is used frequently to ensure that blocks of code are only compiled for a particular game. + +```csharp +private bool CanUserLogin(string name, string id, string ip) +{ +#if RUST + // Do Rust-specific code +#elif HURTWORLD + // Do Hurtworld-specific code +#endif +} +``` + +When a plugin is compiled for Rust, only the first code will be compiled. Conversely, in a Hurtworld context, only the second code will be used. + +### Available symbols + +| Game | Symbol | +|---|---| +| Rust | `RUST` | +| Hurtworld | `HURTWORLD` | +| 7 Days To Die | `SEVENDAYS` | +| 7 Days To Die latest_experimental | `SEVENDAYS` `SEVENDAYSLATEST_EXPERIMENTAL` | +| Reign Of Kings | `REIGNOFKINGS` | +| The Forest | `THEFOREST` | + +### Custom symbols + +In some plugins you may see the `DEBUG` symbol or other symbols used. These are primarily for testing purposes. + +#### Example + +```csharp +#if DEBUG + Puts("Some test related info"); +#endif +``` + +In order to enable these debugging code blocks, a preprocessor directive must be defined at the beginning of the plugin file. + +```csharp +#define DEBUG + +using System; +``` + +--- + + + +## Security + +Source: + +--- + +### Sandbox + +Plugins and products are compiled in a restricted mode that prevents a substantial number of .NET features from being used. + +These restrictions are in place to prevent potentially malicious code. + +#### Restricted namespaces + +The list of namespaces restricted by the sandbox includes, but is not limited to: + +1. `System.IO` +2. `System.Net` +3. `System.Reflection` +4. `System.Threading` +5. `System.Runtime.InteropServices` +6. `System.Diagnostics` +7. `System.Security` +8. `System.Timers` + +#### Restriction exceptions + +There are some exceptions to the above list, and they are: + +1. `System.Diagnostics.Stopwatch` +2. `System.IO.MemoryStream` +3. `System.IO.Stream` +4. `System.IO.BinaryReader` +5. `System.IO.BinaryWriter` +6. `System.Net.Dns` +7. `System.Net.Dns.GetHostEntry` +8. `System.Net.IPAddress` +9. `System.Net.IPEndPoint` +10. `System.Net.NetworkInformation` +11. `System.Net.Sockets.SocketFlags` +12. `System.Security.Cryptography` +13. `System.Threading.Interlocked` + +### Extensions + +Extensions are generally not sandboxed, meaning that any code deployed as an extension will have unmitigated access to all .NET libraries. + +For this reason, we do not generally accept extensions except in the most needful cases. If code is submitted as an extension, the author ought to be prepared to demonstrate why it *absolutely must* be deployed as an extension. + +--- + + + +## Style Guide + +Source: + +Plugins and extensions require some core scaffolding to be functional and/or approved within the uMod ecosystem. + +--- + +### Title + + The title of the plugin (first part of Info attribute in C# plugins) must be set and closely match the submission name on our site. Please avoid using "Plugin" or "uMod" in the title as that would be a bit redundant. Good Ban System +Bad BanPlugin for Admin + +### Author + + The author of the plugin (second part of Info attribute in C# plugins) must be set and match or contain the name of the user submitting the plugin on our site. Please do not use this to advertise websites or game servers, or anything really. Good + +##### Wulf + +Bad + +##### Fluw @ MyServer.net + +### Version + + The version of the plugin (third part of Info attribute in C# plugins) must be set in the x.x or "x.x.x" format. This should be updated each time a plugin update is released. Semantic Versioning is recommended, though not fully supported. Good 1.2.3 +Bad 2017-02-01 Beta 1 + +### Description + + The Description is an optional, standalone attribute, but recommended as other plugins can utilize it for making help commands and such. Please make sure to actually describe the plugin, but keep it brief. Best practice is to use Sentence case, not Title Case or CAPS. Keep it clean! Good Allows admin to ban players easily on command +Bad Cool Admin BanPlugin + +--- + + + +## Continuous Integration + +Source: + +For experienced developers, uMod seamlessly integrates both ways with GitHub and GitLab ^(Coming Soon). + +--- + +### GitHub app + +By installing the [GitHub app](https://github.com/apps/umod-org) on a repository, the entire plugin development life-cycle may be managed solely through GitHub. + +#### Documentation + +Adding or updating a [README.md](https://help.github.com/articles/about-readmes) file in a plugin repository will automatically update the documentation displayed for that plugin on uMod.org + +#### Licensing + +Adding or updating a [LICENSE.md](https://help.github.com/articles/adding-a-license-to-a-repository) file in a plugin repository will automatically update the license displayed for that plugin on uMod.org + +#### Releases + +Adding a [release](https://help.github.com/articles/creating-releases) of your plugin on GitHub will automatically push a public update of your plugin on uMod.org. + +#### Branches + +*Coming Soon!* + +#### Issues + +*Coming Soon!* + +### GitLab app + +*Coming Soon!* + +### Builds + +Our CI server will compile and inspect the plugin automatically against (nearly) all games that the plugin supports upon release. + +If a build fails, the author will be notified and the release may be hidden from view. + +--- + + + +## Approval Guide + +Source: + +In order to ensure a plugin submission is approved, please consult the following guidelines carefully. + +--- + +### Style + +Most importantly, the [Style Guide](https://umod.org/documentation/umod/api/style-guide) covers the bare minimum conventions we expect when approving a plugin. + +### Best practices + +#### Code quality + +1. While not a requirement, cleanly formatted code is always appreciated as it makes our job easier when we can easily follow the code of plugin being submitted. [Visual Studio 2015](https://www.visualstudio.com/downloads) or above is always recommended to enable support for the latest C# version as well as numerous options for helping improve your code. +2. Using statements (i.e. `using System;` at the top of the plugin) can easily get out of hand. Try to only add what is needed by the plugin and remove those that are not. Most development environments such as Visual Studio have options and addons to handle this and more. +3. Use [static code analysis](https://docs.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-managed-code-overview?view=vs-2017) tools. After a plugin is submitted or updated, an automatic inspection checks for hundreds of potential issues and scores each discovered issue by severity. Not all issues require developer attention, but most do. Many IDE's are often bundled with static code analysis tools and offer the same or similar functionality. +4. Do not assume anything passed to a plugin by the game, engine, or hook parameters is not null. Use [null conditional operators](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators) generously. + +#### Performance + +1. Each hook call takes up resources and time. Some hooks are called more than others, and each may have a different performance impact depending on game mechanics or server configuration. +2. Be mindful of how often hooks are called and, when possible, avoid implementing computationally expensive methods in frequently called hooks. Delay or distribute computation cycles, use async or cooperative multitasking, and store frequently used resources in memory. +3. Unsubscribe from unused hooks. If a plugin only requires a specific hook in certain cases (i.e. when a particular feature is enabled), then disable that hook in all other cases. + +#### Uniqueness + +When submitting resources to be published on uMod.org, developers must submit their own work or include express authorization from the original author(s) of the work. + +While we discourage and do not accept direct copying (or forks) of code from other developers, we generally do *not* deny plugins simply on the basis that they share any of the following components: + +1. Similar option +2. Similar use-case +3. Application design pattern +4. Integration point +5. Algorithm + +### Undesirables + +There are certain types of plugins that we generally do not approve. These are often because of their general use for abuse, trolling, backdoors, causing conflicts, drama, potentially problematic, or going way beyond their purpose. + +1. Piracy enabling or authentication bypassing plugins (this should be an obvious one) +2. Any plugin attempt to bypass sandboxing or security measures put in place (security is important) +3. Any plugin containing a backdoor or access privileges for specific individuals, even developers +4. FPS "booster" type plugins (these have been known to be malicious and problematic) +5. All-in-one does-everything plugins (these defeat the purpose of being modular, often cause conflicts) +6. Copies of existing plugins with various "fixes" in them (fixes should be contributed to the original) +7. Copies of existing plugins with messages translated directly (translations can be contributed to the original) +8. Plugins using any sort of obfuscation method + +--- + +Mirrored from uMod developer documentation, 2026-09-15. diff --git a/modules/rust/README.md b/modules/rust/README.md index 47555e9..1098960 100644 --- a/modules/rust/README.md +++ b/modules/rust/README.md @@ -1,15 +1,20 @@ -# Rust — the Oxide/uMod API reference +# Rust — the Oxide/uMod ecosystem reference -Reference material for the **upcoming `module-rust`**: a mirror of uMod's Rust game API, captured -here so the module can be designed and built against it without a round trip to the website on every -question. +Reference material for the **upcoming `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. -Two documents, both **scraped verbatim from uMod on 2026-09-15**: +Everything below was **scraped verbatim from uMod on 2026-09-15**. -| Doc | What it holds | Size | -|---|---|---:| -| [`HOOKS.md`](HOOKS.md) | Every hook the uMod Rust extension raises — **477 hooks in 20 categories**, each with its description, its return contract, its tags and the C# signature to declare | 9.3k lines | -| [`DEFINITIONS.md`](DEFINITIONS.md) | The item table (**678 items**: short name, item id, display name) and the workshop skin ids (**2,590 skins** across 104 items) | 3.8k lines | +## 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. | > **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 @@ -33,24 +38,25 @@ The dry run's central structural fact is the thing this reference serves: > way in is a mod — specifically an **Oxide plugin**, since Oxide/uMod is what modded Rust servers > run — hooking the game's own events. -So where the UO side gets to *choose* what the shard emits, the Rust side can only emit **what Oxide -already hands it**. `HOOKS.md` is therefore the hard boundary on what a Rust module can ever know -about a live server: if a fact is not reachable from one of these 477 hooks (or from a game type one -of them hands you), the bridge cannot report it. +Two consequences, and they are the two halves of this directory: -That makes this reference the input to two decisions the module has to make: - -1. **What the Rust sidecar's event catalogue can contain** — the analogue of +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. **Which hooks are cheap and which are hot.** `OnTick`, `OnFrame` and `OnEntityTakeDamage` fire at - game-loop rates; a bridge that does real work inside them stalls the server. The same invariant - as UO's `Emit()` applies — see §4. +2. **We are a guest in someone else's plugin framework.** Our plugin is compiled, loaded, permissioned + and configured by Oxide, on Oxide's 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`, because it is not in the table itself: +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 @@ -64,14 +70,14 @@ visible rather than mysterious. ### The return contract -`HOOKS.md` reproduces uMod's return line for every hook and it is the load-bearing part: +[`HOOKS.md`](HOOKS.md) reproduces uMod's return line for every hook and it is the load-bearing part: -| uMod's wording | What it means | -|---|---| -| *No return behavior* | A **notification**. Declare `void`. Nothing you return is read. | -| *Returning a non-null value overrides default behavior* | 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* | A **veto**. Declare `object`; `null` abstains — returning `false` is *not* the same as abstaining. | -| *Returning a string will kick…* | The value is **consumed as data**, not merely as a veto. | +| 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: @@ -79,10 +85,11 @@ Two cautions that apply across the whole table: 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 §4. + 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; `HOOKS.md` marks those *(not stated upstream)* rather than guessing. +return behaviour upstream at all; both the markdown and the TSV mark those *(not stated upstream)* / +`?` rather than guessing. --- @@ -108,20 +115,43 @@ return behaviour upstream at all; `HOOKS.md` marks those *(not stated upstream)* | Electronic | 2 | | | Terrain · World | 1 each | | -**Player and Entity are 58% of the surface between them.** `HOOKS.md` opens with a full alphabetical -index (name → category → return contract), which is the fastest way in when you already know the -hook's name. +**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 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`. -- Eleven hooks document **more than one overload** (e.g. `CanUpdateSign` takes either a `Signage` or +- Twelve hooks document **more than one overload** (e.g. `CanUpdateSign` takes either a `Signage` or a `PhotoFrame`). Every code block is reproduced. --- -## 4. Where this meets our architecture +## 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 @@ -132,6 +162,8 @@ them. Restated against Oxide: - **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 @@ -141,53 +173,66 @@ them. Restated against Oxide: 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, then -`HOOKS.md` for what the game can actually tell it. +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. --- -## 5. Provenance and refreshing +## 6. Provenance and refreshing | | | |---|---| -| Source (hooks) | | -| Source (definitions) | | -| Captured | 2026-09-15 | -| Content | 477 hooks · 678 items · 2,590 skins | +| Captured | **2026-09-15** | +| Hooks | · | +| Definitions | | +| Developer API | — 19 pages | +| Operator docs | — 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 note the new date at the top of both files. +the module, and update the date in every file — they all carry it. -The hooks page renders client-side from a JSON endpoint, and *that endpoint is not behind -Cloudflare* even though the HTML page is: +### 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 + "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 ``` -One request returns every hook (`per_page` is 9999, so there is no paging). Each record carries -`name`, `subcategory`, `tags`, `description` (HTML `
    `) and `example` (a markdown-fenced C# -block) — which is exactly what `HOOKS.md` renders. A `?subcategory=Server` query narrows it. +Each record carries `name`, `subcategory`, `tags`, `description` (HTML `
      `) and `example` (a +markdown-fenced C# block). A `?subcategory=Server` query narrows it. -The **definitions** page has no such endpoint and the HTML *is* Cloudflare-gated, so it has to come -out of a real browser session: load the page, then read the `Rust Items` table and the per-item +**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. -## 6. Beyond this page +The pages mirrored here, in the order they appear: -This reference covers the **Rust-specific** API only — the hooks and the item data. uMod's -general plugin-authoring documentation is a separate set and is *not* mirrored here: +- `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 -| Page | Covers | -|---|---| -| [Plugins — Getting Started](https://umod.org/documentation/plugins/getting-started) | The plugin skeleton, lifecycle, and the universal hooks (`Init`, `Loaded`, `Unload`) | -| [Plugin configuration](https://umod.org/documentation/plugins/configuration) | `Config`, defaults, and the config file on disk | -| [Data files](https://umod.org/documentation/plugins/data-files) | Persisting plugin state | -| [Permissions](https://umod.org/documentation/plugins/permissions) | The Covalence permission and group API | -| [Plugin installation](https://umod.org/documentation/plugins/installation) | Operator-side install | -| [Getting Started](https://umod.org/documentation/getting-started) | Installing Oxide/uMod on a server | +### Deliberately not mirrored -Mirror these too if the module work starts leaning on them. +- **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. diff --git a/modules/rust/agent/README.md b/modules/rust/agent/README.md new file mode 100644 index 0000000..987846b --- /dev/null +++ b/modules/rust/agent/README.md @@ -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 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. diff --git a/modules/rust/agent/api.jsonl b/modules/rust/agent/api.jsonl new file mode 100644 index 0000000..e221a15 --- /dev/null +++ b/modules/rust/agent/api.jsonl @@ -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(\"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(\"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();\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 Players = new HashSet();\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(\"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_{playerId}\");\n}\n\nprivate void SavePlayerInfo(string playerId, PlayerInfo playerInfo)\n{\n dataFile.WriteObject($\"playerInfo_{playerId}\", playerInfo);\n}"} +{"page":"api/database","section":"Open a connection","lang":"csharp","code":"Core.MySql.Libraries.MySql sqlLibrary = Interface.Oxide.GetLibrary();\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 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\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 messages = lang.GetMessages(\"en\", this);\n\nPuts($\"Messages for {Title}:\");\nforeach(KeyValuePair 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 headers = new Dictionary { { \"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 parameters = new Dictionary();\n\nparameters.Add(\"param1\", \"value1\");\nparameters.Add(\"param2\", \"value2\");\n\nstring[] body = string.Join(\"&\", parameters.Cast().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(\"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(\"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.*"} diff --git a/modules/rust/agent/hooks.tsv b/modules/rust/agent/hooks.tsv new file mode 100644 index 0000000..5f26d25 --- /dev/null +++ b/modules/rust/agent/hooks.tsv @@ -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 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 notes) Called when trying to clear map markers +OnMapMarkersCleared Player none void OnMapMarkersCleared(BasePlayer player, List 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 groupsToAdd, List 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 entities) Called when a save file is loaded +OnSendCommand Player nonnull object OnSendCommand(List 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 diff --git a/modules/rust/agent/items.tsv b/modules/rust/agent/items.tsv new file mode 100644 index 0000000..bdfa301 --- /dev/null +++ b/modules/rust/agent/items.tsv @@ -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 diff --git a/modules/rust/agent/skins.tsv b/modules/rust/agent/skins.tsv new file mode 100644 index 0000000..7f5eede --- /dev/null +++ b/modules/rust/agent/skins.tsv @@ -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