Иконка ресурса

FREE HealthTick : 1.0.9 1.0.9

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Newtonsoft.Json;
using Oxide.Core;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("HealthTick", "FourTeen", "1.0.9")]
    [Description("HealthTick")]
    public class HealthTick : RustPlugin {
        private List<ulong> off = new List<ulong>();
        string permuse = "healthtick.use";
        private Dictionary<ulong, int> playerRegenData = new Dictionary<ulong, int>();
        void OnServerInitialized() {
            LoadConfig();
            LoadData();
            RegisterPermissions();
            if (cfg.mdregen == true) {
                timer.Every(cfg.Секунды, () => HTick());
                Unsubscribe(nameof(OnTick));
            }
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            cfg = Config.ReadObject<PluginConfig>();
            Config.WriteObject(cfg, true);
        }
        private void RegisterPermissions() {
            permission.RegisterPermission(permuse, this);
            foreach (var kvp in cfg.regen) {
                permission.RegisterPermission(kvp.Key, this);
            }
        }
        object xl96plHook(string key, BasePlayer player) {
            if (key == "off") {
                off.Add(player.userID.Get());
            }
            if (key == "on") {
                off.Remove(player.userID.Get());
            }
            return null;
        }
        [ChatCommand("regen")]
        void regenCMD(BasePlayer player, string command, string[] args) {
            if (!permission.UserHasPermission(player.UserIDString, permuse)) {
                player.ChatMessage("Нет прав!");
                return;
            }
            if (args.Length < 1) {
                int maxRegen = GetMaxRegenForPlayer(player);
                player.ChatMessage(off.Contains(player.userID) ? "У вас выключена регенерация!" : "У вас включена регенерация!");
                player.ChatMessage($"Некорректное значение регенерации.\nИспользуйте /regen set (от 1 до {maxRegen}).\nИли используйте /regen (on - off).");
                return;
            }
            switch (args[0].ToLower()) {
                case "off" : if (off.Contains(player.userID)) {
                    player.ChatMessage("У вас уже выключена регенерация!");
                    return;
                }
                off.Add(player.userID);
                player.ChatMessage("Вы успешно выключили регенерацию");
                SaveData();
                break;
                case "on" : if (!off.Contains(player.userID)) {
                    player.ChatMessage("У вас уже включена регенерация!");
                    return;
                }
                off.Remove(player.userID);
                player.ChatMessage("Вы успешно включили регенерацию");
                SaveData();
                break;
                case "set" : if (args.Length == 2 && int.TryParse(args[1], out int regenAmount) && regenAmount > 0) {
                    int maxRegen1 = GetMaxRegenForPlayer(player);
                    if (regenAmount > maxRegen1) {
                        player.ChatMessage($"Вы не можете установить значение регенерации более {maxRegen1}.Используйте меньшее значение.");
                        return;
                    }
                    playerRegenData[player.userID] = regenAmount;
                    player.ChatMessage($"Вы установили регенерацию в {regenAmount} единиц(у).");
                    SaveData();
                }
                else {
                    int maxRegen2 = GetMaxRegenForPlayer(player);
                    player.ChatMessage($"Некорректное значение регенерации.\nИспользуйте /regen set (от 1 до {maxRegen2}).\nИли используйте /regen (on - off).");
                }
                break;
                default : int maxRegen = GetMaxRegenForPlayer(player);
                player.ChatMessage(off.Contains(player.userID) ? "У вас выключена регенерация!" : "У вас включена регенерация!");
                player.ChatMessage($"Некорректное значение регенерации.\nИспользуйте /regen set (от 1 до {maxRegen}).\nИли используйте /regen (on - off).");
                break;
            }
        }
        int GetMaxRegenForPlayer(BasePlayer player) {
            int maxRegen = 0;
            foreach (var kvp in cfg.regen) {
                string perm = kvp.Key;
                int regenAmount = (int)kvp.Value;
                if (permission.UserHasPermission(player.UserIDString, perm) && regenAmount > maxRegen) {
                    maxRegen = regenAmount;
                }
                int cregen = 0;
                if (playerRegenData.TryGetValue(player.userID.Get(), out cregen)) {
                    if (maxRegen < cregen) {
                        playerRegenData.Remove(player.userID.Get());
                    }
                }
            }
            return maxRegen;
        }
        private int GetCurrentRegenPlayer(BasePlayer player) {
            if (playerRegenData.ContainsKey(player.userID.Get())) {
                return playerRegenData[player.userID.Get()];
            }
            return GetMaxRegenForPlayer(player);
        }
        [ConsoleCommand("hticki")]
        void Commandhticki(ConsoleSystem.Arg args) {
            if (args.Player() != null) {
                return;
            }
            BasePlayer player = BasePlayer.FindByID(ulong.Parse(args.Args[0]));
            if (player == null) {
                PrintError($"Игрок не найден!");
                return;
            }
            float maxRegen = 0.0f;
            string maxPerm = null;
            foreach (var perm in cfg.regen) {
                if (permission.UserHasPermission(player.UserIDString, perm.Key) && perm.Value > maxRegen) {
                    maxRegen = perm.Value;
                    maxPerm = perm.Key;
                }
            }
            if (maxPerm != null) {
                string nextPerm = null;
                bool foundCurrent = false;
                foreach (var perm in cfg.regen) {
                    if (foundCurrent) {
                        if (maxRegen >= 100) {
                            player.ChatMessage($"Приобрести более <color=#FF8000>100 единиц регенерации</color> через магазин невозможно.Пожалуйста, свяжитесь с <color=#674ea7>создателем</color> лично\n[DS = <color=#674ea7>maicrof</color>, VK = <color=#674ea7>https://vk.com/maic_rof</color>]");
                            PrintWarning($"{player} Попытка купить больше 100 единиц регенерации.");
                            return;
                        }
                        nextPerm = perm.Key;
                        break;
                    }
                    if (perm.Key == maxPerm) {
                        foundCurrent = true;
                    }
                }
                if (nextPerm != null) {
                    rust.RunServerCommand($"grantperm {player.UserIDString} {nextPerm} 999d");
                    Match match = Regex.Match(nextPerm, @"\d+");
                    if (int.TryParse(match.Value, out int number)) {
                        player.ChatMessage($"Успешно получен(а) {number} единиц(а) регенерации");
                    }
                }
                else {
                    PrintError("Не удалось найти следующий уровень разрешения.");
                }
            }
            else {
                player.ChatMessage($"Успешно получен(a) 1 единиц(а) регенерации");
                rust.RunServerCommand($"grantperm {player.UserIDString} HealthTick.1 999d");
            }
        }
        private PluginConfig cfg;
        public class PluginConfig {
            [JsonProperty("Настраиваемый режим")]
            public bool mdregen = false;
            public float Секунды = 1;
            [JsonProperty("Настройки регена")]
            public Dictionary<string, float> regen = new Dictionary<string, float>() {
                ["HealthTick.1"]
                = 1, ["HealthTick.2"] = 2, ["HealthTick.3"] = 3, ["HealthTick.4"] = 4, ["HealthTick.5"] = 5, ["HealthTick.6"] = 6, ["HealthTick.7"] = 7, ["HealthTick.8"] = 8, ["HealthTick.9"] = 9
            }
            ;
        }
        void OnTick() {
            if (cfg.mdregen == false) {
                foreach (var player in BasePlayer.activePlayerList) {
                    if (player == null) continue;
                    if (player.health >= player.MaxHealth()) continue;
                    if (off.Contains(player.userID.Get())) continue;
                    int regen = 0;
                    regen = GetCurrentRegenPlayer(player);
                    if (regen != 0) player.Heal(regen);
                }
            }
        }
        void HTick() {
            if (cfg.mdregen == true) {
                foreach (var player in BasePlayer.activePlayerList) {
                    if (player == null) continue;
                    if (player.health >= player.MaxHealth()) continue;
                    if (off.Contains(player.userID.Get())) continue;
                    int regen = 0;
                    regen = GetCurrentRegenPlayer(player);
                    if (regen != 0) player.Heal(regen);
                }
            }
        }
        private void LoadData() {
            playerRegenData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, int>>($"{Title}/PlayerRegenData");
            off = Interface.Oxide.DataFileSystem.ReadObject<List<ulong>>($"{Title}/off");
        }
        private void SaveData() {
            Interface.Oxide.DataFileSystem.WriteObject($"{Title}/PlayerRegenData", playerRegenData);
            Interface.Oxide.DataFileSystem.WriteObject($"{Title}/off", off);
        }
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху