About DynamicData
DynamicData — Configurez sans limites
« Plus aucune limite de configuration. Laissez libre cours à votre imagination. »
DynamicData automatise l'application de vos fichiers de données (JSON) pour Rust selon une chronologie relative à l'effacement.
Ajoutez vos profils (par plugin) , spécifiez quand ils doivent s'appliquer (par exemple, 2j4h, 6h30m, 1j@redémarrage) ,
et le plugin cible est rechargé avec la bonne configuration, immédiatement ou au prochain redémarrage.
Objectif :
moins d’opérations manuelles, moins d’erreurs, une progression de réinitialisation claire et amusante pour vos joueurs.
Points forts
- Aucune limite : planifiez autant de profils que nécessaire, pour autant de plugins que vous le souhaitez.
- Délai d'activation flexible : immédiat ou au prochain redémarrage (idéal pour les changements importants).
- Progression naturelle des réinitialisations : rendez vos serveurs lisibles et motivants, dès le premier jour.
- Conçu pour être compatible : fonctionne avec tous les plugins utilisant des fichiers de données.
Installation et démarrage rapide
- Déposez DynamicData.cs dans oxide/plugins et (re)chargez-le.
- Préparez vos fichiers JSON pour chaque plugin.
- Placez-les sous oxide/data/DynamicData/<Plugin>/... avec un suffixe temporel (et @restart si souhaité).
- Démarrez le serveur : DynamicData applique et recharge automatiquement les plugins cibles aux moments opportuns.
Comment ça marche
Placez vos profils JSON ici :
oxide/data/DynamicData/<Plugin>/<Subfolder>/*.json
(par exemple, DynamicData/RaidableBases/Profiles/Medium_2d.json) .
Les fichiers comportent un suffixe temporel (\d+[dhms] peuvent être chaînés) et éventuellement @restart.
Exemples : Easy_6h.json, [email protected] .
DynamicData calcule chaque échéance à partir du Jour 1 (effacement) , ajoute une marge déterministe (quelques secondes) pour lisser les pics, puis copie le JSON vers l'emplacement de données du plugin cible et recharge ce 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__.
Conseil : utilisez dyndata.simulate 2d pour valider votre plan avant une réinitialisation réelle.
FAQ
Q : Cela ne fonctionne-t-il qu'avec certains plugins ?
A : Non, tout plugin qui utilise des fichiers de données (JSON) .
Q : Dois-je redémarrer à chaque modification ?
R : Non. Choisissez « immédiat (en direct) » ou « @restart » . Le plugin cible se recharge automatiquement.
Q : Que se passe-t-il si je veux revenir en arrière ?
R : Conservez vos profils intermédiaires (début/milieu/fin/saisonnier) et réactivez le précédent pour revenir à l'état souhaité.
Q : Impact sur les performances ?
R : Les applications sont occasionnelles, les rechargements sont ciblés, la limite de débit est configurable — impact négligeable pour un serveur standard.
