Hey there, nice plugin!
May I suggest using a different approach for cooldowns? Yours currently only decrements the cooldown timer while the player is logged in and has to maintain timers for every player logged into the server.
I modified the plugin on my server by bypassing the LetsClock() method entirely and modified the SpawnMyMincopterChatCommand() method like this:
Merged post
I also added the System include to allow the use of DateTime (using System;)
Merged post
Oof, I can't edit but the code above has a flaw. Try this instead.
May I suggest using a different approach for cooldowns? Yours currently only decrements the cooldown timer while the player is logged in and has to maintain timers for every player logged into the server.
I modified the plugin on my server by bypassing the LetsClock() method entirely and modified the SpawnMyMincopterChatCommand() method like this:
[ChatCommand("minicopter")] private void SpawnMyMinicopterChatCommand(BasePlayer player, string command, string[] args) { var t = new TimeSpan(); t = DateTime.UtcNow - new DateTime(1970, 1, 1); int secondsSinceEpoch = (int)t.TotalSeconds; bool isspawner = permission.UserHasPermission(player.UserIDString, MinicopterSpawn); if (isspawner == false) { Player.Message(player, lang.GetMessage("NoPermMsg", this, player.UserIDString), Prefix, SteamIDIcon); return; } if (storedData.playerminiID.ContainsKey(player.userID) == true) { Player.Message(player, lang.GetMessage("AlreadyMsg", this, player.UserIDString), Prefix, SteamIDIcon); return; } bool hascooldown = permission.UserHasPermission(player.UserIDString, MinicopterCooldown); float minleft = 0; if (hascooldown == true) { if (storedData.playercounter.ContainsKey(player.userID) == false) { storedData.playercounter.Add(player.userID, secondsSinceEpoch); } else { float count = new float(); storedData.playercounter.TryGetValue(player.userID, out count); minleft = cooldownmin - ((secondsSinceEpoch - count) / 60); if (debug) Puts($"Player DID NOT reach cooldown return."); Player.Message(player, $"{lang.GetMessage("CooldownMsg", this, player.UserIDString)} ({minleft} min)", Prefix, SteamIDIcon); return; } } else { if (storedData.playercounter.ContainsKey(player.userID)) { storedData.playercounter.Remove(player.userID); } } SpawnMyMinicopter(player); }Merged post
I also added the System include to allow the use of DateTime (using System;)
Merged post
Oof, I can't edit but the code above has a flaw. Try this instead.
[ChatCommand("minicopter")] private void SpawnMyMinicopterChatCommand(BasePlayer player, string command, string[] args) { var t = new TimeSpan(); t = DateTime.UtcNow - new DateTime(1970, 1, 1); int secondsSinceEpoch = (int)t.TotalSeconds; bool isspawner = permission.UserHasPermission(player.UserIDString, MinicopterSpawn); if (isspawner == false) { Player.Message(player, lang.GetMessage("NoPermMsg", this, player.UserIDString), Prefix, SteamIDIcon); return; } if (storedData.playerminiID.ContainsKey(player.userID) == true) { Player.Message(player, lang.GetMessage("AlreadyMsg", this, player.UserIDString), Prefix, SteamIDIcon); return; } bool hascooldown = permission.UserHasPermission(player.UserIDString, MinicopterCooldown); float minleft = 0; if (hascooldown == true) { if (storedData.playercounter.ContainsKey(player.userID) == false) { storedData.playercounter.Add(player.userID, secondsSinceEpoch); } else { float count = new float(); storedData.playercounter.TryGetValue(player.userID, out count); minleft = cooldownmin - ((secondsSinceEpoch - count) / 60); if (debug) Puts($"Player DID NOT reach cooldown return."); if (minleft >= 0.0) { Player.Message(player, $"{lang.GetMessage("CooldownMsg", this, player.UserIDString)} ({minleft} min)", Prefix, SteamIDIcon); return; } else { storedData.playercounter.Remove(player.userID); } } } else { if (storedData.playercounter.ContainsKey(player.userID)) { storedData.playercounter.Remove(player.userID); } } SpawnMyMinicopter(player); }