Magnumk's Wishlist
-
Copter Weapons
Overview:
This plugin allows players to mount weapons to their player Helicopters. Players can configure their weapons by simply inserting them into the corresponding inventory slots of a box on the back of the copter. Ammo for the weapons is also stored in this box in ammo slots that are shared between all of the weapons. Players can also equip their copters with flares, a radar set, and other utilities which will be added in the future.
Operation
Using the plugin is very straightforward and intuitive: just drop weapons in the spots you want em, then go! The default key binds mimic the attack helicopter, so players don’t get confused:
Fire Weapon: LMB
Fire Flare: RMB
Switch Weapon: Sprint
Switch Ammo/Reload : Duck
Switch Radar Target: Use
Lock target/Activate Seeker: Reload
Configuration
The config is very long and can be confusing to navigate. The plugin will automatically create the default config when you first run it. The dictionary of weapons always gets written on top, so you will need to scroll to the very bottom in order to find the general plugin settings.
Here are some of the settings that can be changed (this is subject to change as I plan to add much more functionality over the coming months):
"DebounceTimeSeconds": 4.0, (The amount of time a button will be inactive after pressing)
"DisplayOutOfAmmoMessage": true,
"DisplaySelectedWeaponMessage": true,
"UnlimitedAmmo": false, (Makes server projectile weapons not require ammo, but doesn’t work on most weapons. If you want an unlimited ammo version, please look for Minicopter Combat)
"DisablePermissionCheck": true, (enables permissions for each weapon)
"ApplyToScrapCopter": true, (Does a weapon box spawn on the back of all minicopters)
"ApplyToMinicopter": true,
"FlareFiredSfx": "assets/prefabs/weapons/grenade launcher/effects/attack.prefab",
"SwitchWeaponSfx": "assets/prefabs/deployable/dropbox/effects/submit_items.prefab",
"AlarmSfx": "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab",
"ReloadSfx": "assets/prefabs/npc/autoturret/effects/reload.prefab",
"CounterMeasureDespawnTime": 5.0,
"WeaponSwitchDelay": 2.0,
"AmmoSwitchDelay": 1.0,
"FirePrimaryButton": 1024, (This is where you can set your keybinds. The values represent binarys for a facepunch Enum that represents each client input. Refer to the button table below.)
"FireFlareButton": 2048,
"SwitchWeaponButton": 128,
"SwitchAmmoButton": 64,
"RadarSelectButton": 256,
"TargetLockButton": 8192,
"EnableScrapcopterGibs": false, (turns off gib spawning for better server performance)
"GibsDespawnTimerOverride": 0.0,
"DisableFire": false,
"HideUnauthorizedWeapons": true, (This option doesn’t quite work as intended yet. It will show players the weapons they don’t have access to due to not having the oxide permission for that weapon in the weapon selection menu while flying. Right now, setting this to false shows all weapons that exist for the plugin.)
Buttons
• FORWARD = 2,
• BACKWARD = 4,
• LEFT = 8,
• RIGHT = 16
• JUMP = 32
• DUCK = 64
• SPRINT = 128
• USE = 256
• FIRE_PRIMARY = 1024
• FIRE_SECONDARY = 2048
• RELOAD = 8192
• FIRE_THIRD = 134217728
- #copter
- #helicopter
- (and 10 more)
-
Courier NPCs
Bring your Rust server to life with Courier NPCs — AI bots that travel across the map carrying valuable loot. Hunt them down for rewards, but be careful — they may not go down without a fight.
Features:
📦 Traveling Couriers
• NPCs spawn with random loot from your config and start travel to point.
• At destination, couriers either despawn or dropping a stash.
• Setup health, damage rates, spawn frequency, and other.
• Configure spawn loadouts — weapons, clothes, and loot for delivery.
• Each courier can carry a backpack with its own separate loot.
⚔️ Dynamic Combat
• Configurable combat behaviour:
Friendly (doesn't attack, continues to run) Defensive (defends if attacked) Aggressive (attacks first) • Uses ranged and melee weapons in fights.
• Couriers can deploy mines, bear traps, and other traps while traveling.
• Couriers heal themselves during and outside of combat using configurable health thresholds.
🗺️ Flexible Spawn System
• Multiple spawn modes available — random map position, road/beach position, or SpawnsDatabase points.
• Spawn and destination modes can be mixed for varied and unpredictable routes.
• Couriers can prefer road-based pathfinding or take off-road routes.
📺 See It in Action! Watch The Video
🛠️ Commands ("couriernpcs.admin" permission):
/cnpc vis - shows all couriers on server /cnpc killall - kills all couriers /cnpc tp - teleports all couriers to you 📃 Configuration:
{ "Bots settings": [ { "Enable bot?": true, "How many of these bots can be spawned?": 1, "Bot name (leave empty for random)": "Leon", "Respawn timer (min 3 seconds)": { "Min": 600.0, "Max": 1800.0 }, "Configure the position of the courier's birth. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": false }, "Random road position mode": { "Enable this mode?": true }, "Random spawn position mode": { "Enable this mode?": false }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Configure the position of the courier's final path. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": false }, "Random road position mode": { "Enable this mode?": true }, "Random spawn position mode": { "Enable this mode?": false }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Maximum health": 500.0, "What spawns on death (PlayerCorpse, NpcCorpse, Backpack)": "PlayerCorpse", "How many items will be destroyed when Backpack is selected (0 - 100%)": 0.0, "Backpack setup": { "Should I give out a backpack?": true, "Backpack item": { "Item shortname or ID": "largebackpack", "Item skin": 0 }, "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": [] } ] }, "Wear settings": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "hazmatsuit.kick", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] } ] }, "Belt customization (add weapons, ammo, medicine, traps that the bot can use here)": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "smg.mp5", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Item settings": { "Item shortname or ID": "ammo.pistol", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "legacy bow", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "arrow.wooden", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 300.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "salvaged.cleaver", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "syringe.medical", "Item skin": 0 }, "Random amount": { "Min": 300.0, "Max": 300.0 }, "Attachments": [] } ] }, "Inventory settings": { "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": [] } ] }, "List of items that won't drop on death (applies if the inventory is not locked)": [ { "Item shortname or ID": "smg.mp5", "Item skin": 0 } ], "Courier behavior settings": { "Time for a brain tick (0.01 - 1)": 0.1, "Combat setup (weapons, ammunition, should be given in the belt inventory)": { "Use ammunition from equipment?": true, "The bot's character when meeting players - Aggressive, Friendly, Defensive": "Aggressive", "The bot's character when meeting npc - Aggressive, Friendly, Defensive": "Defensive", "The bot's character when meeting animal - Aggressive, Friendly, Defensive": "Defensive", "Damage settings": { "Damage multiplier for players": 1.0, "NPC damage multiplier": 1.0, "Damage multiplier for animals": 1.0, "Courier damage multiplier from players": 1.0, "Courier damage multiplier from NPCs": 1.0, "Animal damage multiplier for the courier": 1.0 } }, "Treatment settings (medications should be issued in the belt inventory)": { "Percentage of health to enter the healing state (% 50 - 90)": 75.0, "Percentage of health to enter healing state during combat (% 1 - 50)": 30.0, "Use the medicines from the equipment?": true }, "Setting up traps (mines and traps should be given in the belt inventory)": { "Enable this setting?": true, "Use mines and traps from equipment?": false, "Trap usage check timer (min 60 sec.)": { "Min": 300.0, "Max": 300.0 }, "Chance of using a trap (% 0 - 100)": { "Min": 50.0, "Max": 50.0 }, "Life time (0 - will exist until restart)": 3600.0 }, "Setting up movement to the finishing position": { "Allow searching for routes by roads first?": true, "Speed of movement to the finish (Slowest, Slow, Normal, Fast)": "Fast" }, "Setting up behavior when reaching the finish position": { "Use stash mode?": true, "Use suicide mode?": true, "Movement speed while searching for a hiding place (Slowest, Slow, Normal, Fast)": "Fast", "Setting up a stash": { "Stash setup (bot will put items in the stash)": { "Enable?": true, "Hide stash?": true, "Life time (0 - will exist until restart)": 3600.0 }, "Box setup (bot will put items in the box)": { "Enable?": false, "Use small box?": true, "Box skin": 0, "Life time (0 - will exist until restart or until it dies)": 3600.0, "Another container prefab (you can leave it empty)": "" } } } }, "Controller settings": { "Time for a controller tick (0.01 - 0.2)": 0.05, "Allow turrets to attack the courier?": true } }, { "Enable bot?": true, "How many of these bots can be spawned?": 1, "Bot name (leave empty for random)": "Denis", "Respawn timer (min 3 seconds)": { "Min": 600.0, "Max": 1800.0 }, "Configure the position of the courier's birth. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": true }, "Random road position mode": { "Enable this mode?": true }, "Random spawn position mode": { "Enable this mode?": true }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Configure the position of the courier's final path. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": true }, "Random road position mode": { "Enable this mode?": true }, "Random spawn position mode": { "Enable this mode?": true }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Maximum health": 150.0, "What spawns on death (PlayerCorpse, NpcCorpse, Backpack)": "PlayerCorpse", "How many items will be destroyed when Backpack is selected (0 - 100%)": 0.0, "Backpack setup": { "Should I give out a backpack?": true, "Backpack item": { "Item shortname or ID": "smallbackpack", "Item skin": 0 }, "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": [] } ] }, "Wear settings": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "hazmatsuit.pilot", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] } ] }, "Belt customization (add weapons, ammo, medicine, traps that the bot can use here)": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "rifle.m39", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Item settings": { "Item shortname or ID": "ammo.rifle", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 300.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "trap.bear", "Item skin": 0 }, "Random amount": { "Min": 5.0, "Max": 10.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "trap.landmine", "Item skin": 0 }, "Random amount": { "Min": 5.0, "Max": 10.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "syringe.medical", "Item skin": 0 }, "Random amount": { "Min": 300.0, "Max": 300.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "largemedkit", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] } ] }, "Inventory settings": { "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": [] } ] }, "List of items that won't drop on death (applies if the inventory is not locked)": [ { "Item shortname or ID": "rifle.m39", "Item skin": 0 } ], "Courier behavior settings": { "Time for a brain tick (0.01 - 1)": 0.1, "Combat setup (weapons, ammunition, should be given in the belt inventory)": { "Use ammunition from equipment?": true, "The bot's character when meeting players - Aggressive, Friendly, Defensive": "Defensive", "The bot's character when meeting npc - Aggressive, Friendly, Defensive": "Defensive", "The bot's character when meeting animal - Aggressive, Friendly, Defensive": "Defensive", "Damage settings": { "Damage multiplier for players": 1.0, "NPC damage multiplier": 1.0, "Damage multiplier for animals": 1.0, "Courier damage multiplier from players": 1.0, "Courier damage multiplier from NPCs": 1.0, "Animal damage multiplier for the courier": 1.0 } }, "Treatment settings (medications should be issued in the belt inventory)": { "Percentage of health to enter the healing state (% 50 - 90)": 75.0, "Percentage of health to enter healing state during combat (% 1 - 50)": 30.0, "Use the medicines from the equipment?": true }, "Setting up traps (mines and traps should be given in the belt inventory)": { "Enable this setting?": true, "Use mines and traps from equipment?": true, "Trap usage check timer (min 60 sec.)": { "Min": 300.0, "Max": 300.0 }, "Chance of using a trap (% 0 - 100)": { "Min": 50.0, "Max": 50.0 }, "Life time (0 - will exist until restart)": 3600.0 }, "Setting up movement to the finishing position": { "Allow searching for routes by roads first?": false, "Speed of movement to the finish (Slowest, Slow, Normal, Fast)": "Fast" }, "Setting up behavior when reaching the finish position": { "Use stash mode?": true, "Use suicide mode?": true, "Movement speed while searching for a hiding place (Slowest, Slow, Normal, Fast)": "Fast", "Setting up a stash": { "Stash setup (bot will put items in the stash)": { "Enable?": true, "Hide stash?": true, "Life time (0 - will exist until restart)": 3600.0 }, "Box setup (bot will put items in the box)": { "Enable?": false, "Use small box?": true, "Box skin": 0, "Life time (0 - will exist until restart or until it dies)": 3600.0, "Another container prefab (you can leave it empty)": "" } } } }, "Controller settings": { "Time for a controller tick (0.01 - 0.2)": 0.1, "Allow turrets to attack the courier?": true } }, { "Enable bot?": true, "How many of these bots can be spawned?": 1, "Bot name (leave empty for random)": "Paul", "Respawn timer (min 3 seconds)": { "Min": 600.0, "Max": 1800.0 }, "Configure the position of the courier's birth. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": true }, "Random road position mode": { "Enable this mode?": true }, "Random spawn position mode": { "Enable this mode?": true }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Configure the position of the courier's final path. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": true }, "Random road position mode": { "Enable this mode?": true }, "Random spawn position mode": { "Enable this mode?": true }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Maximum health": 150.0, "What spawns on death (PlayerCorpse, NpcCorpse, Backpack)": "PlayerCorpse", "How many items will be destroyed when Backpack is selected (0 - 100%)": 0.0, "Backpack setup": { "Should I give out a backpack?": true, "Backpack item": { "Item shortname or ID": "smallbackpack", "Item skin": 0 }, "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": [] } ] }, "Wear settings": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "hazmatsuit.diver", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] } ] }, "Belt customization (add weapons, ammo, medicine, traps that the bot can use here)": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "rifle.lr300.space", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "ammo.rifle", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 300.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "trap.bear", "Item skin": 0 }, "Random amount": { "Min": 5.0, "Max": 10.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "trap.landmine", "Item skin": 0 }, "Random amount": { "Min": 5.0, "Max": 10.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "syringe.medical", "Item skin": 0 }, "Random amount": { "Min": 300.0, "Max": 300.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "largemedkit", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] } ] }, "Inventory settings": { "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": [] }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": [] } ] }, "List of items that won't drop on death (applies if the inventory is not locked)": [ { "Item shortname or ID": "rifle.lr300.space", "Item skin": 0 } ], "Courier behavior settings": { "Time for a brain tick (0.01 - 1)": 0.1, "Combat setup (weapons, ammunition, should be given in the belt inventory)": { "Use ammunition from equipment?": false, "The bot's character when meeting players - Aggressive, Friendly, Defensive": "Defensive", "The bot's character when meeting npc - Aggressive, Friendly, Defensive": "Defensive", "The bot's character when meeting animal - Aggressive, Friendly, Defensive": "Defensive", "Damage settings": { "Damage multiplier for players": 1.0, "NPC damage multiplier": 1.0, "Damage multiplier for animals": 1.0, "Courier damage multiplier from players": 1.0, "Courier damage multiplier from NPCs": 1.0, "Animal damage multiplier for the courier": 1.0 } }, "Treatment settings (medications should be issued in the belt inventory)": { "Percentage of health to enter the healing state (% 50 - 90)": 75.0, "Percentage of health to enter healing state during combat (% 1 - 50)": 30.0, "Use the medicines from the equipment?": true }, "Setting up traps (mines and traps should be given in the belt inventory)": { "Enable this setting?": true, "Use mines and traps from equipment?": true, "Trap usage check timer (min 60 sec.)": { "Min": 300.0, "Max": 300.0 }, "Chance of using a trap (% 0 - 100)": { "Min": 50.0, "Max": 50.0 }, "Life time (0 - will exist until restart)": 3600.0 }, "Setting up movement to the finishing position": { "Allow searching for routes by roads first?": false, "Speed of movement to the finish (Slowest, Slow, Normal, Fast)": "Fast" }, "Setting up behavior when reaching the finish position": { "Use stash mode?": true, "Use suicide mode?": true, "Movement speed while searching for a hiding place (Slowest, Slow, Normal, Fast)": "Fast", "Setting up a stash": { "Stash setup (bot will put items in the stash)": { "Enable?": true, "Hide stash?": true, "Life time (0 - will exist until restart)": 3600.0 }, "Box setup (bot will put items in the box)": { "Enable?": false, "Use small box?": true, "Box skin": 0, "Life time (0 - will exist until restart or until it dies)": 3600.0, "Another container prefab (you can leave it empty)": "" } } } }, "Controller settings": { "Time for a controller tick (0.01 - 0.2)": 0.1, "Allow turrets to attack the courier?": true } }, { "Enable bot?": true, "How many of these bots can be spawned?": 1, "Bot name (leave empty for random)": "Mike", "Respawn timer (min 3 seconds)": { "Min": 600.0, "Max": 1800.0 }, "Configure the position of the courier's birth. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": false }, "Random road position mode": { "Enable this mode?": false }, "Random spawn position mode": { "Enable this mode?": true }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Configure the position of the courier's final path. (configure several modes for random selection)": { "Random map position mode": { "Enable this mode?": true }, "Random road position mode": { "Enable this mode?": false }, "Random spawn position mode": { "Enable this mode?": false }, "Mode of selection of a position from the Spawns.cs plugin": { "Enable this mode?": false, "File name with positions": "" } }, "Maximum health": 500.0, "What spawns on death (PlayerCorpse, NpcCorpse, Backpack)": "PlayerCorpse", "How many items will be destroyed when Backpack is selected (0 - 100%)": 0.0, "Backpack setup": { "Should I give out a backpack?": true, "Backpack item": { "Item shortname or ID": "kriegbackpack", "Item skin": 0 }, "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": null } ] }, "Wear settings": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "hazmatsuit.arcticsuit", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, "Belt customization (add weapons, ammo, medicine, traps that the bot can use here)": { "Lock container? (true - after death loot won't drop)": true, "List of items": [ { "Item settings": { "Item shortname or ID": "rifle.ak.ice", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "knife.combat", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [] }, { "Item settings": { "Item shortname or ID": "largemedkit", "Item skin": 0 }, "Random amount": { "Min": 300.0, "Max": 300.0 }, "Attachments": [] } ] }, "Inventory settings": { "Lock container? (true - after death loot won't drop)": false, "List of items": [ { "Chance (% 0 - 100)": 10.0, "Item settings": { "Item shortname or ID": "rifle.sks", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": [ { "Item settings": { "Item shortname or ID": "weapon.mod.silencer", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null } ] }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "minigun", "Item skin": 0 }, "Random amount": { "Min": 1.0, "Max": 1.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 20.0, "Item settings": { "Item shortname or ID": "ammo.shotgun.slug", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 5.0, "Item settings": { "Item shortname or ID": "explosives", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 500.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 90.0, "Item settings": { "Item shortname or ID": "wood", "Item skin": 0 }, "Random amount": { "Min": 2000.0, "Max": 5000.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "stones", "Item skin": 0 }, "Random amount": { "Min": 1000.0, "Max": 2000.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 80.0, "Item settings": { "Item shortname or ID": "metal.fragments", "Item skin": 0 }, "Random amount": { "Min": 500.0, "Max": 1000.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 70.0, "Item settings": { "Item shortname or ID": "sulfur", "Item skin": 0 }, "Random amount": { "Min": 200.0, "Max": 500.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 60.0, "Item settings": { "Item shortname or ID": "scrap", "Item skin": 0 }, "Random amount": { "Min": 100.0, "Max": 200.0 }, "Attachments": null }, { "Chance (% 0 - 100)": 50.0, "Item settings": { "Item shortname or ID": "metal.refined", "Item skin": 0 }, "Random amount": { "Min": 50.0, "Max": 100.0 }, "Attachments": null } ] }, "List of items that won't drop on death (applies if the inventory is not locked)": [ { "Item shortname or ID": "rifle.ak.ice", "Item skin": 0 } ], "Courier behavior settings": { "Time for a brain tick (0.01 - 1)": 0.1, "Combat setup (weapons, ammunition, should be given in the belt inventory)": { "Use ammunition from equipment?": false, "The bot's character when meeting players - Aggressive, Friendly, Defensive": "Aggressive", "The bot's character when meeting npc - Aggressive, Friendly, Defensive": "Aggressive", "The bot's character when meeting animal - Aggressive, Friendly, Defensive": "Defensive", "Damage settings": { "Damage multiplier for players": 1.0, "NPC damage multiplier": 1.0, "Damage multiplier for animals": 1.0, "Courier damage multiplier from players": 1.0, "Courier damage multiplier from NPCs": 1.0, "Animal damage multiplier for the courier": 1.0 } }, "Treatment settings (medications should be issued in the belt inventory)": { "Percentage of health to enter the healing state (% 50 - 90)": 75.0, "Percentage of health to enter healing state during combat (% 1 - 50)": 30.0, "Use the medicines from the equipment?": true }, "Setting up traps (mines and traps should be given in the belt inventory)": { "Enable this setting?": true, "Use mines and traps from equipment?": false, "Trap usage check timer (min 60 sec.)": { "Min": 300.0, "Max": 300.0 }, "Chance of using a trap (% 0 - 100)": { "Min": 50.0, "Max": 50.0 }, "Life time (0 - will exist until restart)": 3600.0 }, "Setting up movement to the finishing position": { "Allow searching for routes by roads first?": true, "Speed of movement to the finish (Slowest, Slow, Normal, Fast)": "Fast" }, "Setting up behavior when reaching the finish position": { "Use stash mode?": true, "Use suicide mode?": true, "Movement speed while searching for a hiding place (Slowest, Slow, Normal, Fast)": "Fast", "Setting up a stash": { "Stash setup (bot will put items in the stash)": { "Enable?": true, "Hide stash?": true, "Life time (0 - will exist until restart)": 3600.0 }, "Box setup (bot will put items in the box)": { "Enable?": true, "Use small box?": true, "Box skin": 0, "Life time (0 - will exist until restart or until it dies)": 3600.0, "Another container prefab (you can leave it empty)": "" } } } }, "Controller settings": { "Time for a controller tick (0.01 - 0.2)": 0.05, "Allow turrets to attack the courier?": true } } ] }
-
Techtree
⚠️ If you use Oxide, Carbon Aliases if required ! Else ignore this.
TechTree is a complete custom techtree system for Rust servers.
It can replace the vanilla workbench tech tree, or it can be used as a custom progression layer opened near a workbench. The goal is simple: give server owners a clean in-game way to control progression without spending their life editing giant JSON files by hand.
You can keep a mostly vanilla progression, build something fully custom, or mix both: vanilla nodes, custom branches, permissions, rewards, custom prices, custom currencies.
Replaces the vanilla workbench tech tree by default. Optional mode where players open the tree with R near a workbench. Supports Workbench Level 1, Level 2, Level 3, and Engineering. Includes an in-game CUI editor for admins. Lets you add, modify, move, and remove nodes directly in game. Supports custom node prices and custom currency items. Supports item icons and custom URL images. Supports localized node names and descriptions. Supports node rewards: ConsoleCommand, ChatCommand, and Economics. Supports branch permissions for restricted progression paths. Supports free unlock and instant unlock permissions. Can recover vanilla nodes after Rust updates. Can freeze a tree so Facepunch updates do not modify your custom layout. Includes a theme editor with palette and node style settings. Provides hooks and API methods for other plugins.
Players use TechTree from a workbench.
If vanilla replacement is enabled, opening the workbench tech tree opens TechTree instead.
If vanilla replacement is disabled, players stand near a workbench and press R to open the TechTree UI.
Available tree tabs depend on the workbench:
Level 1 workbench: Level 1 tree Level 2 workbench: Level 1 and Level 2 trees Level 3 workbench: Level 1, Level 2, and Level 3 trees Engineering workbench: Engineering tree Nodes clearly show their state: locked, unlockable, unlocked, or restricted by permission. When a player selects a node, the right panel shows the cost, currency, required path cost when relevant, and unlock action.
Admins can switch from player mode to edit mode directly from the TechTree UI.
The editor works with a draft session:
Changes are previewed immediately. Nothing is permanently written until you press Save. Closing or cancelling edit mode discards unsaved edits. Admins can:
Add a node on an empty grid cell. Modify an existing node. Remove a node. Move nodes on the grid. Set parent nodes. Set a branch permission. Change item icon or URL image. Set name and description. Set price and currency. Add rewards. Edit the grid size. Reset a tree to vanilla. Recover missing vanilla nodes. Exclude vanilla nodes from a frozen/custom tree. Edit and save themes. This means you can build or adjust a progression tree without leaving the server.
TechTree supports local images for node icons.
You can place your image files inside the TechTree Images folder and select them directly from the editor.
Local images support folders and subfolders, so you can organize icons by category, for example:
In the editor, paths are handled relative to the Images folder.
Example:
is used as:
A reload action is available to refresh the image database after adding, removing, or reorganizing image files.
This updates the available local images without requiring a full plugin reload.
Local images are supported on Carbon and Oxide.
On first load, TechTree creates its default data from Rust's vanilla workbench tech trees.
Quick difference between vanilla nodes and custom nodes:
Vanilla nodes
Vanilla nodes come from Rust's original Facepunch tech tree. They have a vanilla ID, which allows TechTree to recognize them later.
Because they are linked to Rust's vanilla data, TechTree can synchronize them, recover them, update missing vanilla entries after Rust changes, or exclude them when you intentionally remove them.
You can still fully edit vanilla nodes. You can move them, change their price, change their currency, adjust their unlock path, add permissions, add rewards, or remove them from the tree.
Use vanilla nodes when you want to keep the familiar Rust progression but customize how it behaves on your server.
Custom nodes
Custom nodes are created by you inside the TechTree editor. They do not come from Rust's vanilla tree and they do not have a vanilla ID.
Because they are fully plugin-side nodes, vanilla synchronization does not restore, recover, or replace them. They belong only to your custom TechTree data.
Custom nodes can use the same kind of options as vanilla nodes: price, currency, parents, permissions, rewards, commands, image, name, and description.
A custom node can even reproduce a vanilla unlock if you really want to build it that way, although this is usually not the main reason to use them.
Custom nodes are mostly useful when you want to create progression that does not exist in the default Rust tech tree, such as custom items, plugin rewards, special server progression, profession branches, VIP paths, economy rewards, command unlocks, or server-specific content.
You can mix both types in the same tree. For example, you can keep most vanilla nodes, remove a few unwanted vanilla unlocks, then add custom nodes with rewards or branch permissions.
The important rule:
Only vanilla nodes need vanilla exclusion logic. If you remove a custom node, it is simply removed from your custom data. If you remove a vanilla node and want it to stay removed, you must exclude it correctly so vanilla synchronization does not bring it back later.
There are three important controls:
Auto Vanilla Synchronization
Useful when you want to keep a tree close to vanilla. Missing vanilla nodes can be imported and conflicts can be handled automatically.
Excluded Vanilla IDs
Marks vanilla nodes that were intentionally removed from a custom/frozen tree.
Disable Future Vanilla Imports
Freezes the current workbench tree. Future vanilla additions will not be imported automatically.
Important:
Exclude from vanilla sync must be used together with Disable Future Vanilla Imports.
If Disable Future Vanilla Imports is not enabled, vanilla synchronization can import removed vanilla nodes again later.
Safe workflow:
Open the TechTree at the correct workbench. Switch to Edit Mode. Open Excluded Nodes. Enable Disable Future Vanilla Imports. Select the vanilla node you want to remove. Click Modify. Enable Exclude from vanilla sync. Confirm. Select the same node again. Click Remove. Press Save. For a fully custom tree:
Open Edit Mode. Open Excluded Nodes. Enable Disable Future Vanilla Imports. Click Exclude All. Remove the vanilla nodes you do not want. Build your custom tree. Save. If you want to keep receiving future Facepunch additions, keep Auto Vanilla Synchronization enabled and avoid permanently removing vanilla nodes.
The config option "Use Permissions ?" enables TechTree permission checks.
This includes the global permissions listed below and the custom branch permissions set on nodes.
When "Use Permissions ?" is false:
Players can open TechTree without techtree.use. techtree.unlock.free does not apply. techtree.unlock.instant does not apply. Branch permissions are not enforced. When "Use Permissions ?" is true:
Players need techtree.use to open TechTree. Players with techtree.unlock.free unlock nodes for free. Players with techtree.unlock.instant skip the unlock timer. Branch permissions are enforced when a node has a custom permission set. Registered global permissions:
techtree.use
Allows the player to open/use TechTree when "Use Permissions ?" is enabled.
techtree.unlock.free
Allows the player to unlock nodes for free when "Use Permissions ?" is enabled.
techtree.unlock.instant
Allows the player to unlock nodes instantly when "Use Permissions ?" is enabled.
Branch permissions are custom node permissions.
They are not the same thing as techtree.use, techtree.unlock.free, or techtree.unlock.instant, but they still require "Use Permissions ?" to be enabled.
A branch permission is a custom permission typed directly on a node in the editor. If a player does not have that permission, the node and its child branch are locked for that player.
Example:
Recommended workflow:
Open the TechTree editor. Select the first node of the restricted branch. Click Modify. Enter your custom permission in the Permission field. Confirm. Save. Grant the permission to the correct player or group. Good examples:
Common mistake:
Typing the permission in the node editor but never granting it. In that case, the branch stays locked for everyone.
Rewards are executed when a player unlocks a node.
You can add multiple rewards to the same node.
Reward types:
ConsoleCommand
Runs a server command from the server console.
Use this for server/admin actions such as granting permissions, giving items, or running plugin commands.
Examples:
ChatCommand
Runs a command from the player's client.
Use this only when the command should be executed by the player.
Example:
Economics
Deposits money into the player's Economics balance.
Example value:
Important:
Most reward actions should use ConsoleCommand. If a command needs server authority, do not use ChatCommand.
The playerID placeholder is automatically replaced with the unlocking player's Steam ID.
Default configuration:
{ "Settings": { "Wipe Player Data at Wipe": true, "Time For Unlock Node": 1.0, "Selected Theme": "Default", "Use Permissions ?": false, "Use Economics ?": false, "Replace tree vanilla ? Open with [R] if false": true } } Config notes:
Wipe Player Data at Wipe
Deletes TechTree player unlock data on a new save.
Time For Unlock Node
Unlock progress duration in seconds.
Selected Theme
Active theme loaded from Themes.json.
Use Permissions ?
Enables the global TechTree permission checks.
Use Economics ?
The config value exists, but Economics integration is handled through the Economics reward type.
Replace tree vanilla ? Open with [R] if false
When true, TechTree replaces the vanilla workbench tech tree. When false, players open it with R near a workbench.
TechTree creates separate data files for each workbench tree:
Player progression is saved separately per player and per workbench.
TechTree includes API methods and hooks for other plugins.
API methods:
API_GetPlayerData(BasePlayer player) // Returns: Dictionary<string, object>
Return format:
{ "workbench": { "Workbench_1": [123, 456], "Workbench_2": [789], "Workbench_3": [], "Engineering": [] } }
API_SetPlayerData(BasePlayer player, Dictionary<string, object> apiData) // Returns: bool
The plugin cleans invalid node IDs before saving.
API_ClearPlayerWorkbenchData(BasePlayer player, Workbench workbench) // Returns: bool
Clears the player's TechTree data only for the workbench category matching the provided Workbench.
API_ClearPlayerData(BasePlayer player) // Returns: bool
Clears all TechTree unlock data for that player.
Example API usage:
[PluginReference] Plugin TechTree; var playerData = TechTree?.Call("API_GetPlayerData", player) as Dictionary<string, object>; if (playerData != null) { var workbenchData = playerData["workbench"] as Dictionary<string, object>; }
Node dictionary format used by hooks:
{ "id": 123456, "vanillaId": 84, "price": 250, "parents": [111111], "isVanilla": true, "currency": { "itemId": -932201673, "skinId": 0 } }
Tree dictionary format:
{ "workbench": Workbench, "nodes": [ nodeDictionary, nodeDictionary, ... ] } Plugin hooks:
// Called before a node is unlocked. OnNodeUnlock(Workbench workbench, Dictionary<string, object> node, BasePlayer player) // Return false to block the unlock. // Return null or true to allow it. // Alternative hook format with the full tree dictionary. OnNodeUnlock(BasePlayer player, Dictionary<string, object> node, Dictionary<string, object> tree) // Return false to block the unlock. // Return null or true to allow it. // Called after a node has been unlocked. OnNodeUnlocked(Workbench workbench, Dictionary<string, object> node, BasePlayer player) // Called after multiple nodes were unlocked through a path unlock. OnPathNodeUnlocked(Workbench workbench, List<object> nodes, BasePlayer player) // The nodes list contains node dictionaries.
Example hook:
private object OnNodeUnlock(Workbench workbench, Dictionary<string, object> node, BasePlayer player) { int nodeId = Convert.ToInt32(node["id"]); if (nodeId == 123456 && !permission.UserHasPermission(player.UserIDString, "myplugin.allow")) { player.ChatMessage("You cannot unlock this node yet."); return false; } return null; }
Example after-unlock hook:
private void OnNodeUnlocked(Workbench workbench, Dictionary<string, object> node, BasePlayer player) { int nodeId = Convert.ToInt32(node["id"]); Puts($"{player.displayName} unlocked TechTree node {nodeId}"); } Vanilla-compatible hooks are also called for vanilla nodes where possible:
OnTechTreeNodeUnlock(Workbench workbench, TechTreeData.NodeInstance node, BasePlayer player) OnTechTreeNodeUnlocked(Workbench workbench, TechTreeData.NodeInstance node, BasePlayer player, List<ItemDefinition> unlockedItems)
More detail : https://github.com/Gdkenni/TechTree-Doc
Place TechTree.cs in your server plugins folder. Make sure the file is named exactly TechTree.cs. Load the plugin. Let it generate the config and data files. Open a workbench in game. As an admin, switch to edit mode. Customize the tree. Press Save.
Always press Save after editing. Back up oxide/data/TechTree before major progression changes. If you remove vanilla nodes, use Disable Future Vanilla Imports first. If a branch permission locks everyone out, check that the permission was granted. If techtree.use blocks players, check that "Use Permissions ?" is enabled and the permission was granted. Use ConsoleCommand for most rewards. Use ChatCommand only for commands that should be executed by the player. If upgrading from very old versions (before v2), older data files may not be compatible with the revamped system.
TechTree is built for servers that want progression to feel intentional.
You can keep the familiar Rust workbench flow while changing how players unlock items, what path they follow, what they pay, and what they receive along the way.
It works well for:
Modded progression servers. Economy servers. Roleplay servers with professions. VIP or group-based branches. Servers that want to reorganize, delay, or remove vanilla unlocks.
Send me a private message on Codefling. Send me a message on Discord: gd.kenni
-
RustCuiEditor - Visual CUI creator
Rust CUI Editor
Visual Interface Designer for Rust
Stop writing UI code blindly. Design your CUI interfaces visually and export ready-to-use code in seconds.
What is this?
Rust CUI Editor is a desktop application for creating Rust game UI (CUI) interfaces using a visual drag-and-drop editor. Instead of writing dozens of lines of CuiHelper code and constantly reloading your plugin to see the result, you design everything visually and get clean, working code instantly.
Video demonstration 2.0.0 Version (At the moment the version is already newer with new features)
Elements
Panel
Image (URL/sprite)
Label (with outline)
Button
InputField
ScrollView
Countdown
Draggable
Slot
NeedsCursor / NeedsKeyboard
Layout
Horizontal Layout Group
Vertical Layout Group
Grid Layout Group
Content Size Fitter
LayoutElement
Visual
Drag elements on canvas
Resize with 8 handles
Multi-selection
Marquee select
Anchor/offset system
Element rotation
Inline text editing
Element locking
Alignment
Left / Center / Right
Top / Middle / Bottom
Stretch to parent
Match Width/Height
Distribute evenly
🆕 Find & Replace
Search and replace element properties across the entire project at once. No need to click through each element manually.
► Search by text content, color value, sprite, or material
► Filter results by element type
► Replace single matches or all at once
► Full undo support for bulk replacements
🆕 Inspect Element
Dedicated inspection window for any selected element. Shows all properties in structured form alongside the raw CUI JSON output.
► All component properties in one place
► Raw CUI JSON with one-click copy
► Useful for debugging and quick exports
► Opens with shortcut or right-click menu
🆕 Snapshots
Save named project states at any point and restore them without losing your current work. Snapshots are completely separate from undo history.
► Create named snapshots before risky changes
► Restore any snapshot at any time — current work is preserved
► Stored in a .snapshots folder next to the project file
► Independent from undo/redo stack
🆕 Wrap in Parent
You've built a header with a label and a close button, then realize you forgot to add a background panel behind them. Select all elements, right-click, Wrap in Parent — done. Nothing moves.
► Works with any selection of elements
► New parent is sized to the bounding box of the selection
► All anchors recalculate automatically
► Wrap into Panel, Button, Image, or ScrollView
🆕 Themes
Dark Theme
Default dark interface.
Easy on the eyes during long sessions.
Light Theme
Full light mode across all panels,
dialogs, and overlays. Toggle in settings.
🆕 Plugin Import
Load CUI elements directly from an existing .cs plugin source file. The parser reconstructs the full element tree for visual editing.
► Parses CuiHelper and CuiElementContainer patterns
► Resolves local variables and string constants
► Handles loops and repeated element generation
► Substitutes lang message references with preview text
► Works on any Oxide/Carbon plugin file
🆕 Built-in Reference
A built-in help system with searchable articles covering the entire CUI system. No need to leave the editor to look something up.
► Articles for every element type and property
► Covers layers, ScrollView, blur materials, anchors, offsets, fonts
► Shortcut reference with all editor hotkeys
► Live demo canvas inside each article
► One-click "Add to project" from any example
🆕 Performance Rewrite
Canvas
GPU rendering
Scene bitmap cache
Static layer cache
SKPicture cache
SKPaint pooling (50+ allocs/frame saved)
Text layout cache
Typeface cache
Pan without full re-render
Element Tree
Debounced rebuild on rapid changes
Bulk update batching
Fast flat selection cache O(n)
ThumbnailBrush cache
Detach() memory leak fixed
Color Picker
Real-time updates while dragging
Only the affected element redraws
No full scene invalidation
🆕 Live Preview
See your UI exactly as it appears in-game, right inside the editor. Every element is fully rendered with correct Rust scaling, colors, sprites, and fonts. No need to reload your plugin to check the result.
Rendering
Panels & Images
Labels with fonts
Rich Text support
Sprite tinting
FadeIn / FadeOut
Interactive
Button hover & press
ScrollView with inertia
Elastic bounce
Auto-hiding scrollbars
Live Countdown
Drag & Drop
Draggable elements
Slot filter matching
MoveToAnchor snap
Element swapping
KeepOnTop z-order
Tools
Element Inspector
Grid overlay
Outlines view
Auto-sync with editor
Screenshot to PNG
All CuiDraggableComponent properties are supported in preview: LimitToParent, MaxDistance, AllowSwapping, DropAnywhere, DragAlpha, ParentPadding, ParentLimitIndex, AnchorOffset, and more.
► Pick up Draggable elements and drop them into Slots
► Filter matching ensures only compatible elements snap
► Swap elements between occupied slots
► Inspector overlay shows element info on hover (shortcut: I)
► Grid and outline overlays for layout debugging (G / O)
► Background selector: dark, light, or any game screenshot
► Auto-sync keeps preview updated as you edit
► Export preview as PNG screenshot (S)
🆕 Smart Hook Generation
When your project uses Draggable or Slot elements, the export automatically generates ready-to-use hook methods with proper logic:
► OnCuiDraggableDrag with if/switch blocks for each draggable
► OnCuiDraggableDropped with switch by slot name
► Comments with accepted elements and filter values
► Works in both Snippet and Plugin export modes
🆕 Developer Tools
Professional plugin development toolkit with four dedicated tabs:
Plugin Settings
Author & version
Chat/console commands
Auto-show hooks
Permissions list
Plugin references
Generate Unload
Lang System
Multi-language support
Visual translation table
Per-element lang keys
lang.GetMessage() export
Canvas preview
ImageLibrary
Image key/URL table
Per-element ImageLib key
GetImage() helper
Auto OnServerInitialized
Auto plugin reference
Templates
Reusable code templates
Custom method generation
Placeholder system
Per-project settings
🆕 Localization System
Full multi-language support for your plugins. Assign lang keys to any text element, manage translations visually, and export with automatic lang.GetMessage() calls.
► Add unlimited languages (en, ru, de, fr, etc.)
► Visual translation table - edit all strings in one place
► Toggle between raw text and lang key per element
► Canvas shows resolved translations in real-time
► Exported code includes full LoadDefaultMessages with all languages
🆕 ImageLibrary Integration
Manage image assets directly in the editor. Define image keys and URLs, assign them to elements, and get clean export code with automatic ImageLibrary loading.
► Image key/URL table in Dev Tools
► ImageLib Key property on Image elements
► Export generates GetImage() helper method
► Plugin export auto-adds OnServerInitialized with image loading
► Automatic [PluginReference] ImageLibrary in export
🆕 Syntax Highlighting
► C# syntax highlighting in Export window
► JSON syntax highlighting in Export window
► Color-coded keywords, strings, numbers, comments
► Optimized for large code blocks
🆕 SVG Design Import
Import your designs directly from professional design tools:
Figma
export to SVG and import
Illustrator
Adobe AI/SVG support
Inkscape
free vector editor
Any SVG
standard format
► Automatic source detection optimizes parsing for each tool
► Smart layer hierarchy preservation
► Automatic element type detection (btn_, lbl_, img_, panel_)
► Correct parent-child coordinate conversion
🆕 Figma Plugin & Tools
New "Tools" folder included with the editor:
► CuiHelper Plugin for Figma - export designs directly to C# code
► Sample SVG designs - ready-to-import examples for testing and learning
► Documentation - setup guide for Figma plugin
🆕 Smart Resize Mode
Default Mode
Resize by changing Anchor values
Perfect for responsive layouts that
scale with screen size
Shift + Resize
Resize by changing Offset values
Perfect for pixel-perfect positioning
Orange handles indicate active mode
🆕 Inline Text Editing
► Double-click any text element to edit it directly on canvas
► No need to switch to the property panel, just click and type
► Press Enter or click outside to confirm changes
Guides, Grid & Smart Snapping
► Draggable guides from rulers
► Customizable grid with snap
► Smart guides - auto-snap to edges
► Distance indicators while dragging
Multiple Backgrounds
Preview your UI on actual game screenshots:
Game view Inventory Loot container Crafting Map Transparent
Export Formats
Generate ready-to-use code in three formats:
C# (CuiHelper)
container.Add(new CuiPanel { RectTransform = { AnchorMin = "0.3 0.3", AnchorMax = "0.7 0.7" }, Image = { Color = "0.1 0.1 0.1 0.9" } }, "Overlay", "MyPanel"); JSON
[{ "name":"MyPanel", "parent":"Overlay", "components":[...] }] Full Plugin
Complete .cs file with:
• using statements
• class definition
• commands & permissions
• Lang & ImageLib integration
• all UI code
Import Existing Code
Already have CUI code? Import it!
► Paste JSON array
► Paste C# CuiHelper code
► Import from PSD files
► Import from SVG files (Figma, Illustrator, Inkscape)
► Import from .cs plugin source files
The editor parses your code and recreates all elements for visual editing.
Project Management
► Save/Load project files
► Multiple tabs for different projects
► Recent projects with thumbnails
► Per-project settings
► Close confirmation for unsaved changes
Property Editor
Full control over every element property:
► Position (anchors + offsets)
► Colors with Rust format (0-1 RGBA)
► Fonts and text alignment
► Sprite/material selection
► Outline settings
► Fade in/out animations
► Button commands
► Input field parameters
► ScrollView settings
► Rotation and pivot point
Element Hierarchy
► Layer-based structure (Overlay, Hud, HudMenu)
► Parent-child relationships
► Drag & drop reordering
► Visibility toggle
► Lock elements to prevent accidental edits
► Rename with double-click
► Hover a tree node to highlight it on canvas
Additional Tools
Measure Tool
measure distances on canvas
Style Picker
copy style between elements
Sprite Library
browse Rust sprites
Color Picker
Rust format preview
Quality of Life
► Unlimited undo/redo
► Copy/paste/duplicate elements
► Copy/paste style
► Keyboard shortcuts for everything
► Multiple preset resolutions
► Smooth multiplicative zoom
► Auto-fit canvas to window
► Dark and light themes
► English & Russian localization
► Automatic update notifications
System Requirements
► Windows 10/11
► .NET 8.0 Runtime (bundled)
Installation
1. Download and extract the archive
2. Run RustCUIEditor.exe
3. Start creating!
Questions or support issues?
Contact me via CodeFling messages.
- #cui
- #cui editor
-
(and 2 more)
Tagged with:
-
Contracts
By MaxiJonson in Plugins
Contracts is a time-rotating quest system plugin that allows you to create versatile quests/missions that rotate periodically.
Each contract can have one or more objectives, with multiple objective types to choose from. It doesn't stop there: each objective can be augmented with objective conditions, which add additional requirements in order to progress it. This allows you to define versatile and unique quests:
You could have quests as simple as "Kill 5 scientists"... or a little bit more challenging quests like "Kill 5 scientists with an assault rifle" or have crazy requirements like "Kill 5 scientists, with an assault rifle OR an MP5, between 25-50m away, while being below 20 HP, while wearing a bandana and riding a horse". The possibilities are endless! Not just another quest plugin
Most quest plugins hand out static, repeatable, single-objective quests with no cap on how many you can have active at once and no deadline on finishing them. Players end up completing them passively in the background without ever engaging with the system, like achievements.
Contracts turns these side-quests into main quests by putting them on a timer. A limited set of contracts is live at a time, each with a real deadline you define, so players have to decide what to prioritize rather than mindlessly clear a checklist. That urgency is why players keep logging back in throughout the wipe, when they'd otherwise burn out once progression stalls.
Contracts also supports multi-objective quests with layered conditions (requirements), so a single contract can demand more than "kill 10 scientists." Simple objectives stack into real challenges, not one-line fetch quests.
Rotation keeps players coming back. Layered objectives keep them there once they do.
Features
Highly customizable quests/missions to help you build your unique set of goals and control difficulty beyond just progression amounts required. Control the flow and order of how contract objectives can be completed. 13 objective types to vary gameplay across your server 11 objective condition types to add as many layers of challenge that you want to your objectives Customizable categories and their rotation period, with the possibility to disable rotations altogether and manually control when contracts rotate. Clean UI for browsing and tracking contracts. HUD to track contracts while playing. Permission based features for your VIP members: Max active contracts globally, Max active contracts per category and Max HUD pins. Event logging with JSONL format support Powerful Web editor to make editing your configs a breeze and viewing insightful charts on your JSONL logs Quick Links
🗨️ Discord Server
📄 Full Documentation
✏️ Web Editor
🧭 Roadmap
🆓 Lite Edition - Try Contracts for FREE
Included
While you can discard and customize the contracts, categories and presets yourself, the plugin comes with:
4 categories: Hourly (14 contracts), Daily (26 contracts), Weekly (19 contracts) and Wipe (6) 65 contracts designed to touch just about every objective types and objective conditions available. These contracts' difficulty was designed for the category they were assigned to. You can preview these without purchasing the plugin in the web editor by loading the default data.
Full Plugin Documentation
Contracts is a very large plugin with a growing number of features. Documenting everything on the Codefling plugin page (here) can be very intimidating, inconvenient to read/search and drive new users away when they see a wall of text. For these reasons, I've created a structured, digestable and detailed documentation website with guides for new Contracts users! Check it out:
https://www.rustcontracts.com
Web Editor
Nobody wants to be writing complex JSON structures by hand! Head to the Web Editor at https://editor.rustcontracts.com , drop your data configs and start editing your configs in a convenient UI. The quality of the editor and its extensive features are on par with the quality of the plugin! This isn't just simple forms and inputs.
Editor Features
Convenient UI: Edit all your contracts, categories and presets in a Web-based UI. No manual JSON editing required. Rich Editing Experience: Validation, undo/redo from anywhere, ID refactoring, autocomplete fields, optional raw JSON editing and more QoL features. Data Persistence: Save snapshots of your configs and restore or download them at a later time (data saved in your browser). Advanced Data Importing: You can import entire data files or choose parts of them to merge into your working config. This makes importing new default contracts or shared contracts into your existing config a breeze. AI Generated Contracts: Use the prompt given by the editor in ChatGPT/Claude and paste its response into the editor to generate a contract. Command Palette: Easily navigate through contracts, categories, presets from anywhere in the editor through the command palette. Stats: View your JSONL logs in pre-made charts to gain insights into your contracts, such as pacing and reward balance. Discord
Join the official Discord server for support, announcements and more! https://discord.rustcontracts.com
- #contracts
- #quests
- (and 19 more)