Plugin causing server to not auto save
Hey there,

I have noticed a weird issue, my server has stopped auto saving after a few hours of running. So I was digging through the console logs and noticed that the auto saves stop when the Paratrooper event occurs. I've currently removed the mod and I'm going to see if the server stops saving for some other reason.

Cheers,
KptnStabbin
Check your config file. 
The mods config or the server config? any idea what I'm looking for?
validate your paratroopers confgi file on the json validator online - I ran into that last night 
I checked a number of validators, all said everything is fine.

Here is my config:

{
  "Event Automation": {
    "Automatically spawn Paratroopers Events on a timer": true,
    "Auto-spawn time minimum (seconds)": 7200.0,
    "Auto-spawn time maximum (seconds)": 14400.0,
    "Minimum amount of online players to trigger the event": 1,
    "Paratrooper Plane Jump Height": 200.0,
    "Paratrooper Plane incoming speed": 80.0,
    "Static Paratrooper Jump Point X Coordinate": 0.0,
    "Static Paratrooper Jump Point Z Coordinate": 0.0
  },
  "Map Marker Settings": {
    "Paratrooper Marker Refresh rate (seconds)": 15.0,
    "Create Paratroopers Drop Zone Marker on map": true,
    "Paratroopers Drop Zone Radius": 1.0,
    "Paratroopers Drop Zone Alpha Shading": 0.4,
    "Create Individual Paratrooper Landing Zone Markers on map": true,
    "Paratroopers individual Landing Zone Radius": 0.5,
    "Paratroopers individual Landing Zone Alpha Shading": 0.35
  },
  "Notification Options": {
    "Show notification when Paratroopers are inbound": true,
    "Show notification when Paratroopers begin Jumping": true,
    "Show notification when a NPC has been killed": true,
    "Show notification when a NPC commited Suicide/Drowned/Despawned": true,
    "Show notification when the Bradley APC has been destroyed": true,
    "Show notification when the Bradley APC SelfDestruct/Recalled": true,
    "Show notifications in Console": true
  },
  "Paratrooper Chute Options": {
    "Parachute drag force": 2.0,
    "Wind force": 2.0,
    "Paratrooper Spread Distance": 8,
    "Deploy Paratroopers with Smoke Trail while parachuting down": false
  },
  "NPC Paratrooper Options": {
    "Amount of NPC Paratroopers to spawn": 10,
    "NPC Paratrooper display name (chosen at random)": [
      "Omni_Demonic",
      "Nussabu",
      "Local Nutcase",
      "Wood",
      "obgaidze.76",
      "Чайный Пьяница..",
      "Big Chungus",
      "Mr.PoopyButthole",
      "RickyRicardo",
      "Bubbles",
      "Школьный Даунит",
      "Gajna"
    ],
    "NPC Paratrooper Kit to be used (chosen at random)": [
      "paratrooper",
      "paratrooper1",
      "paratrooper2",
      "paratrooper3",
      "paratrooper4",
      "paratrooper5",
      "paratrooper6",
      "paratrooper7",
      "paratrooper8",
      "paratrooper9",
      "paratrooper10",
      "paratrooper11",
      "paratrooper12"
    ],
    "NPC Health": 400,
    "NPC Paratroopers attack Accuracy (0 - 100)": 65,
    "NPC Paratroopers attack Damage Scale (0 - 100)": 100,
    "NPC Paratroopers Aggrovation Range": 180,
    "NPC Paratroopers DeAggrovation Range": 140,
    "NPC Paratroopers use Peace Keeper mode": false,
    "NPC Paratroopers use Peace Keeper Cooldown": 5,
    "Always use Light Sources if available": true,
    "Chance of being wounded when landing (x / 100)": 0,
    "Wounded duration minimum time (seconds)": 60,
    "Wounded duration maximum time (seconds)": 180,
    "Chance of recovery from being wounded(x / 100)": 50,
    "Amount of time the NPCs will be alive before suiciding (seconds, 0=disable)": 3600,
    "Roam distance from landing position": 50.0,
    "Loot type (Default, Inventory, Random)": "default",
    "Random loot items": {
      "Minimum amount of items": 5,
      "Maximum amount of items": 12,
      "Items": [
        {
          "Item shortname": "apple",
          "Item skin ID": 0,
          "Minimum amount of item": 2,
          "Maximum amount of item": 6,
          "Item Display Name": "Apple"
        },
        {
          "Item shortname": "bearmeat.cooked",
          "Item skin ID": 0,
          "Minimum amount of item": 2,
          "Maximum amount of item": 4,
          "Item Display Name": "Cooked Bear Meat"
        },
        {
          "Item shortname": "blueberries",
          "Item skin ID": 0,
          "Minimum amount of item": 4,
          "Maximum amount of item": 8,
          "Item Display Name": "Blueberries"
        },
        {
          "Item shortname": "corn",
          "Item skin ID": 0,
          "Minimum amount of item": 4,
          "Maximum amount of item": 8,
          "Item Display Name": "Corn"
        },
        {
          "Item shortname": "fish.raw",
          "Item skin ID": 0,
          "Minimum amount of item": 2,
          "Maximum amount of item": 4,
          "Item Display Name": "Raw Fish"
        },
        {
          "Item shortname": "granolabar",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 4,
          "Item Display Name": "Granola Bar"
        },
        {
          "Item shortname": "meat.pork.cooked",
          "Item skin ID": 0,
          "Minimum amount of item": 4,
          "Maximum amount of item": 8,
          "Item Display Name": "Cooked Pork"
        },
        {
          "Item shortname": "syringe.medical",
          "Item skin ID": 0,
          "Minimum amount of item": 2,
          "Maximum amount of item": 6,
          "Item Display Name": "Medical Syringe"
        },
        {
          "Item shortname": "largemedkit",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 2,
          "Item Display Name": "Large Medkit"
        },
        {
          "Item shortname": "bandage",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 4,
          "Item Display Name": "Bandage"
        },
        {
          "Item shortname": "antiradpills",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 3,
          "Item Display Name": "Anti-Radiation Pills"
        },
        {
          "Item shortname": "ammo.rifle",
          "Item skin ID": 0,
          "Minimum amount of item": 10,
          "Maximum amount of item": 100,
          "Item Display Name": "5.56 Rifle Ammo"
        },
        {
          "Item shortname": "ammo.pistol",
          "Item skin ID": 0,
          "Minimum amount of item": 10,
          "Maximum amount of item": 100,
          "Item Display Name": "Pistol Bullet"
        },
        {
          "Item shortname": "ammo.rocket.basic",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 10,
          "Item Display Name": "Rocket"
        },
        {
          "Item shortname": "ammo.shotgun.slug",
          "Item skin ID": 0,
          "Minimum amount of item": 10,
          "Maximum amount of item": 20,
          "Item Display Name": "12 Gauge Slug"
        },
        {
          "Item shortname": "pistol.m92",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "M92 Pistol"
        },
        {
          "Item shortname": "rifle.l96",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "L96 Rifle"
        },
        {
          "Item shortname": "rifle.lr300",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "LR-300 Assault Rifle"
        },
        {
          "Item shortname": "rifle.ak",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Assault Rifle"
        },
        {
          "Item shortname": "rifle.bolt",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Bolt Action Rifle"
        },
        {
          "Item shortname": "rocket.launcher",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Rocket Launcher"
        },
        {
          "Item shortname": "pistol.revolver",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Revolver"
        }
      ]
    }
  },
  "Loot Container Options": {
    "Enable Loot Box to drop with Paratroopers": true,
    "What type of Loot box to drop with Paratroopers (supplydrop|hackablecrate)": "hackablecrate",
    "Amount of time before despawning Loot Box (seconds, 0=disable)": 3600,
    "Loot Box Effects Settings": {
      "Enable Loot Effects": true,
      "Enable Parachute Loot Box for either Supply Drop or HackableCrate": true,
      "Supply Drop Drag Force (without parachute)": 1.0,
      "Supply Drop Mass Weigth (without parachute": 10.25,
      "Hackable Crate Drag Force": 2.0,
      "Hackable Crate Weigth": 5.25,
      "Hackable Crate time to unlock (seconds)": 450,
      "Bradley ACP - Air drop a Bradley APC with Paratroopers": true,
      "Bradley APC - Enable Parachute for Air Drop": true,
      "Bradley ACP - Amount of Crates to drop after death (0=disable)": 0,
      "Bradley APC - Health Amount": 1500.0,
      "Bradley ACP - Amount of time before despawning (seconds, 0=disable)": 3600,
      "Bradley ACP - Allow to explode instead of despawning": false,
      "Enable Smoke trail Loot Box and Bradley APC on drop": false,
      "Enable Spinning Light trail Loot Box on drop": false,
      "Enable Spinning Light trail Loot Box on drop at night only": false,
      "Enable Siren Alarm trail Loot Box on drop": false,
      "Enable Siren Alarm trail Loot Box on drop at night only": false
    },
    "Loot container items": {
      "Minimum amount of items": 8,
      "Maximum amount of items": 10,
      "Items": [
        {
          "Item shortname": "multiplegrenadelauncher",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Multiple Grenade Launcher"
        },
        {
          "Item shortname": "ammo.grenadelauncher.buckshot",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 10,
          "Item Display Name": "40mm Shotgun Round"
        },
        {
          "Item shortname": "ammo.grenadelauncher.he",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 5,
          "Item Display Name": "40mm HE Grenade"
        },
        {
          "Item shortname": "ammo.grenadelauncher.smoke",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 10,
          "Item Display Name": "40mm Smoke Grenade"
        },
        {
          "Item shortname": "ammo.rocket.fire",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 3,
          "Item Display Name": "Incendiary Rocket"
        },
        {
          "Item shortname": "ammo.rocket.hv",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 3,
          "Item Display Name": "High Velocity Rocket"
        },
        {
          "Item shortname": "syringe.medical",
          "Item skin ID": 0,
          "Minimum amount of item": 2,
          "Maximum amount of item": 6,
          "Item Display Name": "Medical Syringe"
        },
        {
          "Item shortname": "largemedkit",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 2,
          "Item Display Name": "Large Medkit"
        },
        {
          "Item shortname": "ammo.rifle",
          "Item skin ID": 0,
          "Minimum amount of item": 10,
          "Maximum amount of item": 100,
          "Item Display Name": "5.56 Rifle Ammo"
        },
        {
          "Item shortname": "ammo.pistol",
          "Item skin ID": 0,
          "Minimum amount of item": 10,
          "Maximum amount of item": 100,
          "Item Display Name": "Pistol Bullet"
        },
        {
          "Item shortname": "ammo.rocket.basic",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 2,
          "Item Display Name": "Rocket"
        },
        {
          "Item shortname": "ammo.shotgun.slug",
          "Item skin ID": 0,
          "Minimum amount of item": 10,
          "Maximum amount of item": 20,
          "Item Display Name": "12 Gauge Slug"
        },
        {
          "Item shortname": "pistol.m92",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "M92 Pistol"
        },
        {
          "Item shortname": "rifle.l96",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "L96 Rifle"
        },
        {
          "Item shortname": "rifle.lr300",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "LR-300 Assault Rifle"
        },
        {
          "Item shortname": "rifle.ak",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Assault Rifle"
        },
        {
          "Item shortname": "rifle.bolt",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Bolt Action Rifle"
        },
        {
          "Item shortname": "rocket.launcher",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Rocket Launcher"
        },
        {
          "Item shortname": "pistol.revolver",
          "Item skin ID": 0,
          "Minimum amount of item": 1,
          "Maximum amount of item": 1,
          "Item Display Name": "Revolver"
        }
      ]
    }
  },
  "Command Cooldowns Timers (permission / time in minutes)": {
    "paratroopers.cancall.default": 120,
    "paratroopers.cancall.vip": 60
  },
  "Version": {
    "Major": 2,
    "Minor": 3,
    "Patch": 4
  }
}​

I am having the same issue. The server save process stops after the first Paratrooper auto-spawn event occurs. 

I save every 5 mins, and after reviewing my log files, I do not see any more saves after the first paratroop auto-spawn event (after a server restart). I have not been able to test if reloading the plugin rectifies the issue. 

As a bandaid, I'm using TimedExecute to do a server.save every 5 mins.

Sadly, I discovered this after reviewing my log files when my server crashed tonight and instead of rolling back 5 mins, the last save had been 11 hours before (needless to say my players were pissed).

Note: I tried reloading the plugin and the server.save did not resume. Looks like a server restart is only way I know of restarting server.save.

This shouldn't be stopping anything as the only thing it saves is the cooldowns if any for players. Same as any other plugins, same exact method as well. I will investigate this further regardless.
I did further testing on my private server. The only plugin loaded is Paratroopers.
I also have RustEdit extension installed.

I set the server to save every 60 seconds.
I set the Paratroopers plugin to auto-spawn every 6-120 seconds.
You can see by my env.time timestamps the server save stops.

Note: using most up to date Steam, Oxide, and RustEdit updates.

(13:06:36) | Saving complete
(13:07:36) | Saved 53 ents, cache(0.00), write(0.02), disk(0.01).
(13:07:36) | Saving complete
(13:08:16) | [Paratroopers] A random Paratroopers Event will occur near J2
(13:08:16) | [Paratroopers] A Paratroopers Events has just started.
(13:08:16) | [Paratroopers] A random Paratroopers Event will occur in 85.02094s
(13:09:07) | [Paratroopers] Elite Cobalt Paratroopers have deployed near map grid marker I2
(13:09:25) | env.time: "9"
(13:09:41) | [Paratroopers] A random Paratroopers Event will occur near G8
(13:09:41) | [Paratroopers] A Paratroopers Events has just started.
(13:09:41) | [Paratroopers] A random Paratroopers Event will occur in 86.26733s
(13:09:43) | env.time: "9"​


I ran a second test with using the "/pt random" command and it stopped the server save as well.
I set the auto-spawn to false in the config.
Restarted the server.
Logged in and ran the command.

(13:26:28) | Saved 76 ents, cache(0.00), write(0.01), disk(0.01).
(13:26:28) | Saving complete
(13:27:28) | Saved 76 ents, cache(0.00), write(0.01), disk(0.01).
(13:27:28) | Saving complete
(13:28:28) | Saved 76 ents, cache(0.00), write(0.01), disk(0.01).
(13:28:28) | Saving complete
(13:29:24) | Group 'admin' granted permission 'paratroopers.admin'
(13:29:28) | Config Saved
(13:29:29) | Saved 76 ents, cache(0.00), write(0.01), disk(0.01).
(13:29:29) | Saving complete
(13:29:38) | [Paratroopers] A random Paratroopers Event will occur near F4
(13:29:38) | [Paratroopers] A Paratroopers Events has just started.
(13:30:25) | [Paratroopers] Elite Cobalt Paratroopers have deployed near map grid marker E4
(13:31:31) | [CHAT] beerock[76561197983572166] : test
(13:32:49) | [CHAT] beerock[76561197983572166] : test 2

You have something different going on with your server then because this literally uses a universal structure found in most plugins that save cooldown info.

#region Data Management
        private void SaveData() => data.WriteObject(storedData);

        private void LoadData()
        {
            try
            {
                storedData = data.ReadObject<StoredData>();
            }
            catch
            {
                storedData = new StoredData();
            }
        }

        private class StoredData
        {
            public Dictionary<ulong, double> cooldowns = new Dictionary<ulong, double>();

            private double CurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;

            public void AddCooldown(BasePlayer player, int time)
            {
                if (cooldowns.ContainsKey(player.userID))
                    cooldowns[player.userID] = CurrentTime() + (time * 60);
                else cooldowns.Add(player.userID, CurrentTime() + (time * 60));
            }

            public bool IsOnCooldown(BasePlayer player)
            {
                if (!cooldowns.ContainsKey(player.userID))
                    return false;

                if (cooldowns[player.userID] < CurrentTime())
                    return false;

                return true;
            }

            public double GetTimeRemaining(BasePlayer player)
            {
                if (!cooldowns.ContainsKey(player.userID))
                    return 0;

                return cooldowns[player.userID] - CurrentTime();
            }
        }
        #endregion

And that is only called when the server does a save

private void OnServerSave() => SaveData();

I have tested this on all 30+ servers I have all that have well over 275+ other plugins and I cannot reproduce your issue. 

Merged post

68bc145aa41b601b5340d3d36adcaef8.png
https://gyazo.com/68bc145aa41b601b5340d3d36adcaef8

Just an example it has saved multiple times and save after a Paratroopers Event has started as well

Is it possible you are executing a server.save command somewhere?
Not in the plugin no. You can search the code yourself. There is no reason for the plugin or any plugin to ever execute that command when there is a OnServerSave method in Oxide
Hey @FastBurst - to help remove any doubt, I created a completely new, isolated private server on my personal PC.

Note: this is occurring on my live server which is on a hosting provider and the tests on my personal PC.
  • Updated install to latest Rust and Oxide versions
  • Installed only Paratroopers and Kits plugins
  • No extensions
  • Set server.saveinterval to 60 seconds to save every minute
  • Used default configs/data/lang files for Paratroopers
  • Entered a valid skin in Paratroopers config
I ran the "/pt random" command and the server saves halted.

You'll see I unload the plugin to see if the saves resume and they do not.

I hope this helps! Thanks for your work on the plugin

(15:30:14) | [Paratroopers] Found dependecy Kits
(15:30:14) | [Paratroopers] Random Paratroopers Events will occur in 2838.151s
(15:30:24) | Checking for new Steam Item Definitions..
(15:31:15) | Saved 1,356 ents, cache(0.00), write(0.02), disk(0.01).
(15:31:15) | Saving complete
(15:32:15) | Saved 1,414 ents, cache(0.00), write(0.00), disk(0.01).
(15:32:15) | Saving complete
(15:33:15) | Saved 1,447 ents, cache(0.00), write(0.00), disk(0.01).
(15:33:15) | Saving complete
(15:34:15) | Saved 1,459 ents, cache(0.00), write(0.00), disk(0.01).
(15:34:15) | Saving complete
(15:34:46) | 192.168.1.75:49964/76561197983572166/beerock has auth level 2
(15:35:01) | beerock with steamid 76561197983572166 joined from ip 192.168.1.75:49964
(15:35:01) | NetworkId 76561197983572166 is 6518 (beerock)
(15:35:01) | beerock[76561197983572166] has spawned
(15:35:11) | [CHAT] beerock[76561197983572166] : issuing /pt random command
(15:35:13) | [Paratroopers] A random Paratroopers Event will occur near G3
(15:35:13) | [Paratroopers] A Paratroopers Events has just started.
(15:35:50) | [Paratroopers] Paratroopers have deployed near map grid marker G3
(15:37:30) | Invalid Position: generic_world[7117] scrap (world) (209.4, -506.0, -600.4) (destroying)
(15:38:32) | Pvt. Sossaman[6143561] was suicide by Generic
(15:39:01) | Maj. Smith[6995198] was suicide by Generic
(15:50:52) | Sgt. Morris[6834926] was suicide by Generic
(15:50:58) | Capt. Willams[2121138] was suicide by Generic
(15:51:03) | Pvt. Sossaman[3117540] was suicide by Generic
(15:51:04) | Invalid Position: servergibs_bradley[8025] (165.5, -501.9, 270.3) (destroying)
(15:51:05) | Pfc. Garcia[6715848] was suicide by Generic
(15:51:13) | Capt. Willams[6345183] was suicide by Generic
(15:51:13) | Pvt. Sossaman[6647452] was suicide by Generic
(15:51:13) | Sgt. Morris[7520379] was suicide by Generic
(15:51:16) | Maj. Smith[7569979] was suicide by Generic
(16:00:18) | Failed to sample navmesh
(16:03:52) | [Paratroopers] Save files, destroy timers, etc
(16:03:52) | Unloaded plugin Paratroopers v2.3.4 by FastBurst
(16:07:17) | [event] assets/prefabs/npc/cargo plane/cargo_plane.prefab
(16:08:08) | [CHAT] beerock[76561197983572166] : time
The may be that your trying to save every 60 secs.
My live server saves every 300 seconds and this issue still persists. The 60 seconds is for testing purposes.
I am having the exact same issue on my server, this plugin is causing my server not to save for several hours at a time. Removing the plugin rectified the issue.