
Plant Rate Limiter
by Base Inspector · v4.3.0 · updated Nov 8, 2026
PlantRateLimiter is a lightweight, performance-optimized Oxide plugin that prevents players from spamming seeds and clones across the map.
No dependencies: works on its own.
Installs itself with Oxide Sync. Add it to a linked server from My servers. Every future update included. How it works
- Full C# source
- Free updates
- Signed releases
- Oxide / uMod compatible
🌱 PlantRateLimiter (v4.3.0)
Author: Base Inspector
Platform: Rust (Oxide/uMod)
Category: Anti-Spam / Farming Control / Performance Protection
🛡 Overview
PlantRateLimiter is a lightweight, performance-optimized Oxide plugin that prevents players from spamming seeds and clones across the map.
Designed specifically for high-population and modded servers (including 100x environments), this plugin ensures farming remains balanced while protecting your server from entity spam and unnecessary performance strain.
It enforces a configurable cooldown between plant placements --- anywhere in the world --- without interfering with normal gameplay flow.
🚀 Why Use PlantRateLimiter?
Seed and clone spam can:
- ❌ Create excessive world entities
- ❌ Hurt server FPS
- ❌ Be abused for griefing
- ❌ Cause unnecessary lag during raids or PvP
PlantRateLimiter solves this with a clean, efficient cooldown system that:
- ✔️ Works globally (not just per area)
- ✔️ Includes admins by default (no hidden bypass)
- ✔️ Prevents spam without breaking immersion
- ✔️ Automatically refunds blocked seeds/clones (optional)
- ✔️ Uses O(1) dictionary lookups for maximum performance
🔧 Core Features
🌿 Global Plant Cooldown
Players must wait a configurable number of seconds before planting another seed or clone.
Default: 30 seconds
Fully configurable in config.json.
🧠 Smart Detection System
The plugin detects planting in two ways:
- CanDeployItem Hook -- Blocks placement before it happens (when supported by the build).
- OnEntityBuilt Hook -- Fallback protection to catch placement even if deploy hook fails.
This dual-hook system ensures reliability across Rust branches and updates.
🔄 Optional Seed Refund
When a player is blocked:
- The spawned plant entity is instantly removed
- The player can optionally receive 1 seed/clone refunded
- If inventory is full, the item drops safely at their feet
This prevents item loss frustration while still enforcing cooldowns.
💬 Anti-Spam Chat Notifications
When blocked, players receive:
Planting is on cooldown. Try again in 18s.
To prevent chat flooding, notification messages are rate-limited separately.
🔐 Permission-Based Bypass (Explicit Only)
Admins are NOT automatically bypassed.
To bypass cooldown:
plantratelimiter.bypass
⚙️ Configuration Example
{
"CooldownSeconds": 30.0,
"NotifyBlocked": true,
"MessageCooldownSeconds": 2.0,
"Debug": false,
"RefundOnBlock": true,
"PlantPrefabNameContains": [
"hemp",
"corn",
"pumpkin",
"berry",
"plant"
]
}
💬 Player Command
/plantcd
Shows remaining cooldown time:
Plant cooldown: 12s remaining.
Or:
Plant cooldown: ready
🛠 Permissions
Permission Description
plantratelimiter.bypass Allows planting without cooldown
plantratelimiter.admin Reserved for future tooling
📦 Installation
-
Upload
PlantRateLimiter.csto:oxide/plugins/ -
Reload:
oxide.reload PlantRateLimiter
Configuration file will auto-generate in:
oxide/config/PlantRateLimiter.json
🌱 Keep Farming --- Without the Spam
PlantRateLimiter keeps your world clean, your FPS stable, and your gameplay balanced --- without punishing legitimate players.
If you're running a serious Rust server, this belongs in your plugin stack.
/plantcdShows remaining cooldown time
v4.3.0Mar 2, 2026Latest
FixWhat changed#2 Double-hook bugAdded _justAllowed HashSet<ulong>. CanDeployItem adds the player to it on approval; OnEntityBuilt removes and skips them if present — no double-block possible.#3 realtimeSinceStartupReplaced float/Time.realtimeSinceStartup with long/DateTimeOffset.UtcNow.ToUnixTimeSeconds(). Cooldowns now survive server restarts correctly.#4 Hot-path string allocReplaced ToLowerInvariant() + Contains() with IndexOf(..., StringComparison.OrdinalIgnoreCase) — zero heap allocations per plant event.#5 try/catch in hot pathAdded ProbeGetItem() at startup using reflection to check once whether Planner.GetItem() exists on this build. TryGetPlannerItem() is now a simple null-guarded call — no exceptions ever thrown in the planting hot path.#6 Dictionary over-allocationInitial capacity now uses ConVar.Server.maxplayers instead of the hard-coded 2048.#7 Unused PermAdminRemoved entirely — the permission registration and constant are gone.#9 Duplicated cooldown logicCmdPlantCd now calls IsOnCooldown() like everything else instead of reimplementing the logic inline.
v4.2.1Mar 2, 2026
Minor update
v1.0.0Feb 23, 2026
Initial release



