About GatherRang
GatherRang V2
Native-Style Ranged Gathering for Rust (High-Pop Optimized)
GatherRang V2 is a full rewrite designed to let players farm trees, ore nodes, and corpses using ranged weapons — while still behaving like native Rust gathering internally.
Instead of faking yields or spawning resources, V2 routes hits through Rust’s ResourceDispenser system using the same mechanics tools rely on (fraction remaining, destroy fraction, finish bonus, hotspot scaling, etc.). This keeps the system stable, consistent, and compatible with Rust’s normal gather behavior.
Media:
What Players Can Farm:
- Trees (wood)
- Ore Nodes (stone / metal / sulfur / HQM)
- Animals / Corpses (flesh harvesting)
- Charcoal farming is not part of V2 (and there are no charcoal permissions in the current build).
Native-Style Gather Flow:
GatherRang V2 gathers through Rust’s native dispenser calls:
- ResourceDispenser.GiveResources(...)
- ResourceDispenser.AssignFinishBonus(...)
So the plugin supports:
- Proper dispenser depletion (fractionRemaining)
- Correct destroy scaling (destroyFraction)
- Optional finish bonus (config controlled)
- Hotspot/spark scaling for nodes
- X-marker bonus scaling for trees
- This approach is built for long-term stability and avoids the common “fake gather” problems that desync or inflate yield.
Always Hit System (Permission Based):
GatherRang V2 includes two optional VIP-style permissions that force the bonus systems:
Always Hit “X” (Trees)
- Permission: gatherrang.alwayshitx
- When granted:
- Ranged hits will always count as hitting the tree X marker
- The plugin will spawn/maintain marker flow automatically
- Bonus scaling applies reliably without needing perfect aim
- Without this permission:
- Players must hit the X marker normally
Always Hit Spark (Nodes)
- Permission: gatherrang.alwayshitspark
- When granted:
- Ranged hits will always count as hitting the node spark
- Spark multiplier and bonus level sound triggers apply
- Hotspot logic stays active and consistent
- Without this permission:
- Players must aim for the spark like vanilla Rust
Permission System:
Core (Required)
- gatherrang.use
Weapon-Type + Target Permissions
Trees:
- gatherrang.bow.tree
- gatherrang.pistol.tree
- gatherrang.shotgun.tree
- gatherrang.smg.tree
- gatherrang.rifle.tree
Nodes:
- gatherrang.bow.node
- gatherrang.pistol.node
- gatherrang.shotgun.node
- gatherrang.smg.node
- gatherrang.rifle.node
Flesh (corpses/animals):
- gatherrang.bow.flesh
- gatherrang.pistol.flesh
- gatherrang.shotgun.flesh
- gatherrang.smg.flesh
- gatherrang.rifle.flesh
Bonus forcing:
- gatherrang.alwayshitx
- gatherrang.alwayshitspark
Player Toggle System (No Chat Spam)
GatherRang V2 does not send gather messages to chat.
- Instead it includes a clean player toggle:
- Command: /gather on or /gather off
- Uses a toast notification (gametip.showtoast)
- Player state is saved to a datafile:
- GatherRang/PlayerToggles
So players can opt in/out without any server-wide spam.
Datafile-Based Farming Profiles
Gather behavior is driven by profiles stored in a datafile, not hardcoded values.
Profiles File > GatherRang/FarmProfiles >Profiles define:
- Tree.gatherDamage
- Ore.gatherDamage
- Flesh.gatherDamage
- Tree.destroyFraction
- Ore.destroyFraction
- Flesh.destroyFraction
Default profiles are created automatically if missing, and new defaults are merged in safely over time.
This system makes it easy for server owners to:
- Add custom profiles
- Fine-tune balance
- Create tiered harvesting power (VIP)
Per-Weapon Profile Overrides
Each weapon group supports per-weapon overrides through config:
Config key:
"Per-Weapon Inherit Profile Overrides (shortname -> profileName)"
Example use cases:
- Make rifle.ak inherit a stronger profile
- Give a custom weapon its own harvesting profile
- Balance specific guns differently without changing the whole weapon group
Config Example:
{
"Enabled": true,
"Enable Tree Gathering": true,
"Enable Node Gathering": true,
"Enable Flesh Gathering (corpses)": true,
"Native Engine Settings": {
"Kill Trees On Complete": false,
"Kill Nodes On Complete": true,
"Kill Corpses On Complete": false,
"UseFinishBonus": true
},
"Weapon Group Defaults": {
"Bow": {
"Default Profile (name)": "Generic",
"Override Tree.gatherDamage (-1 = inherit)": -1.0,
"Override Ore.gatherDamage (-1 = inherit)": -1.0,
"Override Flesh.gatherDamage (-1 = inherit)": -1.0
},
"Pistol": {
"Default Profile (name)": "Generic",
"Override Tree.gatherDamage (-1 = inherit)": -1.0,
"Override Ore.gatherDamage (-1 = inherit)": -1.0,
"Override Flesh.gatherDamage (-1 = inherit)": -1.0
},
"Shotgun": {
"Default Profile (name)": "Generic",
"Override Tree.gatherDamage (-1 = inherit)": -1.0,
"Override Ore.gatherDamage (-1 = inherit)": -1.0,
"Override Flesh.gatherDamage (-1 = inherit)": -1.0
},
"SMG": {
"Default Profile (name)": "Generic",
"Override Tree.gatherDamage (-1 = inherit)": -1.0,
"Override Ore.gatherDamage (-1 = inherit)": -1.0,
"Override Flesh.gatherDamage (-1 = inherit)": -1.0
},
"Rifle": {
"Default Profile (name)": "Generic",
"Override Tree.gatherDamage (-1 = inherit)": -1.0,
"Override Ore.gatherDamage (-1 = inherit)": -1.0,
"Override Flesh.gatherDamage (-1 = inherit)": -1.0
}
},
"Weapon Groups": {
"Bow": {
"Enabled": true,
"Weapon Shortnames (exact item shortname)": [
"bow.hunting",
"bow.compound",
"crossbow",
"minicrossbow",
"legacy bow"
],
"Per-Weapon Inherit Profile Overrides (shortname -> profileName)": {}
},
"Pistol": {
"Enabled": true,
"Weapon Shortnames (exact item shortname)": [
"pistol.revolver",
"pistol.semiauto",
"pistol.python",
"pistol.m92",
"pistol.nailgun",
"pistol.semiauto.a.m15",
"pistol.prototype17"
],
"Per-Weapon Inherit Profile Overrides (shortname -> profileName)": {}
},
"Shotgun": {
"Enabled": true,
"Weapon Shortnames (exact item shortname)": [
"shotgun.pump",
"shotgun.spas12",
"shotgun.double",
"shotgun.waterpipe",
"blunderbuss",
"krieg.shotgun",
"shotgun.m4"
],
"Per-Weapon Inherit Profile Overrides (shortname -> profileName)": {}
},
"SMG": {
"Enabled": true,
"Weapon Shortnames (exact item shortname)": [
"smg.2",
"smg.thompson",
"smg.mp5",
"t1_smg"
],
"Per-Weapon Inherit Profile Overrides (shortname -> profileName)": {}
},
"Rifle": {
"Enabled": true,
"Weapon Shortnames (exact item shortname)": [
"rifle.ak",
"rifle.ak.diver",
"rifle.ak.ice",
"rifle.ak.jungle",
"rifle.ak.med",
"rifle.sks",
"rifle.lr300",
"rifle.lr300.space",
"rifle.bolt",
"rifle.l96",
"rifle.m39",
"rifle.semiauto",
"lmg.m249",
"hmlmg",
"minigun"
],
"Per-Weapon Inherit Profile Overrides (shortname -> profileName)": {}
}
},
"Debug Enabled": false
}
Profile Datafile Example:
{
"Rock": {
"Tree.gatherDamage": 10.0,
"Ore.gatherDamage": 5.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.5,
"Ore.destroyFraction": 0.5,
"Flesh.destroyFraction": 0.5
},
"BoneClub": {
"Tree.gatherDamage": 9.0,
"Ore.gatherDamage": 4.0,
"Flesh.gatherDamage": 5.0,
"Tree.destroyFraction": 0.4,
"Ore.destroyFraction": 0.4,
"Flesh.destroyFraction": 0.5
},
"BoneKnife": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"StonePickaxe": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 16.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.15,
"Flesh.destroyFraction": 0.2
},
"StoneHatchet": {
"Tree.gatherDamage": 20.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.15,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.334
},
"SalvagedCleaver": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.1
},
"VampireStake": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 30.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"BaseballBat": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.1
},
"Hatchet": {
"Tree.gatherDamage": 30.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 12.0,
"Tree.destroyFraction": 0.1,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"Pickaxe": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 30.0,
"Flesh.gatherDamage": 5.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.6
},
"SalvagedAxe": {
"Tree.gatherDamage": 50.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 15.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"SalvagedIcepick": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 50.0,
"Flesh.gatherDamage": 5.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.2
},
"Jackhammer": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 25.0,
"Flesh.gatherDamage": 5.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.2
},
"Chainsaw": {
"Tree.gatherDamage": 30.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 2.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.5,
"Flesh.destroyFraction": 0.25
},
"SalvagedHammer": {
"Tree.gatherDamage": 20.0,
"Ore.gatherDamage": 20.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.2,
"Ore.destroyFraction": 0.2,
"Flesh.destroyFraction": 0.6
},
"ButcherKnife": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 18.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"CombatKnife": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 20.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"Longsword": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.1
},
"SalvagedSword": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.1
},
"SkinningKnife": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 18.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
},
"Machete": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.1
},
"KriegChainsword": {
"Tree.gatherDamage": 30.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 2.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.5,
"Flesh.destroyFraction": 0.25
},
"Mace": {
"Tree.gatherDamage": 0.0,
"Ore.gatherDamage": 0.0,
"Flesh.gatherDamage": 10.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.1
},
"Generic": {
"Tree.gatherDamage": 25.0,
"Ore.gatherDamage": 25.0,
"Flesh.gatherDamage": 12.0,
"Tree.destroyFraction": 0.0,
"Ore.destroyFraction": 0.0,
"Flesh.destroyFraction": 0.0
}
}
High-Pop Optimized
- V2 is built for performance:
- Permission bitmask caching per player
- Weapon group lookup cache
- TreeMarkerData prefab cache
- Proper NetID cleanup in OnEntityKill
- Uses Subscribe/Unsubscribe to avoid idle overhead when disabled
- Minimal allocations and safe NextTick usage
- Designed to run smoothly on high population servers with constant farming activity.
Plugins by Duff
Discord: https://discord.gg/2KBPH7hXb7
