About DynamicData
DynamicData — Configure Without Limits
“No more configuration limits. Let your imagination run wild.”
DynamicData automates applying your data files (JSON) for Rust according to a wipe-relative timeline.
Drop in your profiles (per plugin), specify when they should apply (e.g., 2d4h, 6h30m, 1d@restart),
and the target plugin is reloaded with the right config—immediately or on the next restart.
Goal:
fewer manual ops, fewer errors, a clear and fun wipe progression for your players.
Highlights
- No limits: schedule as many profiles as you need, for as many plugins as you want.
- Flexible activation time: immediate or on the next restart (ideal for big changes).
- Natural wipe progression: make your servers readable and motivating, from Day 1 onward.
- Compatible by design: works with any plugin that uses data files.
Installation & Quick Start
- Drop DynamicData.cs into oxide/plugins and (re)load it.
- Prepare your JSONs per plugin.
- Place them under oxide/data/DynamicData/<Plugin>/... with a time suffix (and @restart if desired).
- Start the server: DynamicData applies and reloads target plugins at the right times automatically.
How It Works
Place your JSON profiles here:
oxide/data/DynamicData/<Plugin>/<Subfolder>/*.json
(e.g., DynamicData/RaidableBases/Profiles/Medium_2d.json).
Files carry a time suffix (\d+[dhms] can be chained) and optionally @restart.
Examples: Easy_6h.json, [email protected]n.
DynamicData computes each due time from Day 1 (wipe), adds deterministic jitter (a few seconds) to smooth spikes, then copies the JSON to the target plugin’s data location and reloads that plugin.
If @restart is present, the profile is marked READY and only applies at the next reboot (useful for big changes).
Structure & Naming
- Dynamic root: oxide/data/DynamicData (real-time watch on *.json).
- Destination: the base name (without the time suffix) becomes the final data file for the plugin
- (e.g., Profiles/Medium_2d.json ⇒ oxide/data/RaidableBases/Profiles/Medium.json).
- Valid suffixes: concatenations of d/h/m/s (e.g., 2d4h30m, 45m, 10s).
- Add @restart to force application on reboot.
Important — Match the Target Plugin’s Official Directory Structure
DynamicData applies your files only if the tree under
oxide/data/DynamicData/<Plugin>/... mirrors exactly what the target plugin expects under
oxide/data/<Plugin>/....
Golden rule
Everything after <Plugin>/ in DynamicData must be the exact same path as in oxide/data/<Plugin>/...
(same folders, same case, same filename).
Concrete Examples
oxide/data/DynamicData/RaidableBases/Profiles/Easy.json
<- Default config (Important to place if you want a default config loaded)
oxide/data/DynamicData/RaidableBases/Profiles/Medium.json+12h
<- Config loaded after 12h of wipe
oxide/data/DynamicData/RaidableBases/Profiles/Hard.json+2d
<- Config loaded after 2 days of wipe
oxide/data/DynamicData/RaidableBases/Profiles/Expert.json+4d@restart
<- Config loaded after 4 days of wipe, only after a server restart
Raidable Bases Evolving Over the Wipe
- Days 1–2: Easy + Medium profiles, 1 event, component-heavy loot; applied immediately at opening.
- Days 3–5: Medium + Hard profiles, 2–3 events, T2/T3 loot; applied on next restart for a smooth transition.
- Day 6+: Hard + Expert profiles, 3–4 events, rich loot (rare C4/Rockets), buffed NPCs; applied immediately on the morning of Day 6.
One-Click Seasonal Pack
- Halloween (Oct 24 → 31): “Spooky” bases, themed loot, NPC +25%; trigger with @restart on 10/24.
Other Plugins (any that read data files)
- Kits: Starter (D1–D2), weekend farm promo (D3–D5), advanced kits (D6+).
- BetterNPC: Calm day / Night +HP +accuracy / end-of-wipe heavy loadouts.
- Loot tables: progressive T2/T3 ramp, event boosts.
- NTeleportation: cooldowns and costs relax as the wipe progresses.
- Skins/SkinBox: automatic seasonal whitelists; off-season ⇒ vanilla/server set.
Permissions
dynamicdata.admin — access to commands (authLevel 1+ also accepted).
oxide.grant group admin dynamicdata.admin
Commands (console/RCON)
dyndata.list – Shows Day 1 (wipe), last application, and next due time per plugin; marks [PAUSE] if applicable.
dyndata.simulate <duration|all|*> – Simulates upcoming applications up to a horizon (e.g., 1h, 30m, 2d, all). Useful to verify your plan.
dyndata.rescan – Immediate rescan of the DynamicData folder, applies what’s due, reschedules the rest.
dyndata.pause <Plugin> – Pauses a plugin (no applications while paused).
dyndata.resume <Plugin> – Resumes a previously paused plugin.
Configuration (oxide/config/DynamicData.json)
Available keys (defaults shown):
LogLevel: "info" — levels: quiet, info, verbose.
RateLimitPerMinute: 3 — limit of applications per minute (built-in queue).
JitterMinSeconds: 5, JitterMaxSeconds: 30 — deterministic jitter per plugin/file to avoid bursts.
MaxDataSizeBytes: 2000000 — max JSON size (safety).
DisplayTimeZone: "Europe/Paris" — timezone for logs/displays.
InterpretSaveCreatedAs: "auto" — how to interpret SaveCreatedTime if it lacks a timezone (auto, display-tz, server-local, utc).
WipeDetectPriority: ["signature","files","serverinfo"] — wipe detection order:
signature: seed/size/level change ⇒ wipe,
files: detect via .map/.sav timestamps,
serverinfo: SaveCreatedTime reported by the server.
FileDetectionWindowHours: 12 — analysis window for .map/.sav files.
FilePreGenToleranceHours: 2 — tolerance when files are pre-generated before boot.
FileClampToBoot: true — if needed, clamps Day 1 to boot time to stay consistent.
WipeLogShowUtc: false — also show UTC timestamps in wipe logs.
ReloadTargetPlugin: true — auto-reload target plugin after copying.
QuarantineStrayDynamicFiles: true — quarantines “stray” dynamic files in oxide/data/DynamicData.__quarantine__.
Tip: use dyndata.simulate 2d to validate your plan before a real wipe.
FAQ
Q: Does this only work with certain plugins?
A: No—any plugin that relies on data (JSON) files.
Q: Do I have to restart for every change?
A: No. Choose immediate (live) or @restart. The target plugin reloads automatically.
Q: What if I want to roll back?
A: Keep your staged profiles (early/mid/late/seasonal) and reactivate the previous one to return to the desired state.
Q: Performance impact?
A: Applications are occasional, reloads are targeted, rate limit is configurable—negligible impact for a standard server.
