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

FREE MinigunChanger : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Globalization;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Minigun Changer", "YaMang -w-", "1.0.0")]
    [Description("Minigun Changer")]
    public class MinigunChanger : RustPlugin
    {
        #region Fields
        private static MinigunChanger Instance { get; set; }
        [PluginReference] Plugin ImageLibrary;
        #endregion
        #region Hook

        void OnServerInitialized(bool initial)
        {
            Instance = this;
        }

        void OnActiveItemChanged(BasePlayer player, Item oldItem, Item newItem)
        {
            if (player.Connection == null || player.IsNpc) return;
            
            var comp = player.GetComponent<MinigunChangers>();

            if (newItem != null)
            {
                
                if (newItem.info.shortname != "minigun") return;
                //if (player.IsAdmin)
                //{
                //    if (newItem.contents == null)
                //    {
                //        newItem.contents = new ItemContainer();
                //        newItem.contents.ServerInitialize(null, 1);
                //        newItem.contents.GiveUID();
                //        //newItem.contents.parent = newItem;
                //        newItem.contents.AddItem(ItemManager.FindItemDefinition(-132516482), 1);
                //        //Item newContent = ItemManager.CreateByItemID(-132516482);
                //        //newContent.position = 1;
                //        //if (newContent != null)
                //        //{
                //        //    newContent.MoveToContainer(newItem.contents);
                //        //}
                //        PrintToChat("null");
                //    }
                //    else
                //    {
                //        PrintToChat("xnull");
                //        newItem.contents = null;
                //    }
                    
                //}
                var minigun = newItem.GetHeldEntity() as SpinUpWeapon;
                minigun.spinUpTime = _config.heatingTime;
                
                if (!comp)
                {
                    player.gameObject.AddComponent<MinigunChangers>();
                }
                    
            }

            if (oldItem != null)
            {
                if (oldItem.info.shortname == "minigun")
                {
                    if (comp)
                        UnityEngine.Object.DestroyImmediate(comp);
                }
            }
        }

        void Unload()
        {
            foreach (var player in BasePlayer.activePlayerList)
            {
                var comp = player.GetComponent<MinigunChangers>();
                if (comp)
                    UnityEngine.Object.DestroyImmediate(comp);
                CuiHelper.DestroyUi(player, "SA_Main");
            }
        }


        #endregion

        #region Commands
        [ConsoleCommand("minigunsa")]
        private void MinigunCMD(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null) return;

            if(arg.Args.Length == 0) return;

            if (arg.Args[0] == "close")
            {
                CuiHelper.DestroyUi(player, "SA_Main");
                return;
            }


            var active = player.GetActiveItem();
            if (active == null)
            {
                PrintToChat(player, "들고 있는 무기가 없습니다.");
                return;
            }
            if(active.info.shortname != "minigun")
            {
                PrintToChat(player, $"{active.name ?? active.info.displayName.english} 는 미니건이 아닙니다.");
                return;
            }

            var weapon = active.GetHeldEntity() as BaseProjectile;

            if (weapon != null)
            {
                switch (arg.Args[0])
                {

                    case "ammo1":
                        if(weapon.primaryMagazine.contents != 0)
                        {
                            var ammo1 = ItemManager.CreateByItemID(weapon.primaryMagazine.ammoType.itemid, weapon.primaryMagazine.contents);
                            player.GiveItem(ammo1);
                            weapon.primaryMagazine.contents = 0;
                        }

                        weapon.primaryMagazine.ammoType = ItemManager.FindItemDefinition(-1211166256);
                        PrintToChat(player, "총알이 소총탄 으로 변경 되었습니다.");
                        break;

                    case "ammo2":
                        if (weapon.primaryMagazine.contents != 0)
                        {
                            var ammo1 = ItemManager.CreateByItemID(weapon.primaryMagazine.ammoType.itemid, weapon.primaryMagazine.contents);
                            player.GiveItem(ammo1);
                            weapon.primaryMagazine.contents = 0;
                        }
                        
                        weapon.primaryMagazine.ammoType = ItemManager.FindItemDefinition(1712070256);
                        PrintToChat(player, "총알이 고속탄 으로 변경 되었습니다.");
                        break;

                    case "ammo3":
                        if (weapon.primaryMagazine.contents != 0)
                        {
                            var ammo1 = ItemManager.CreateByItemID(weapon.primaryMagazine.ammoType.itemid, weapon.primaryMagazine.contents);
                            player.GiveItem(ammo1);
                            weapon.primaryMagazine.contents = 0;
                        }

                        weapon.primaryMagazine.ammoType = ItemManager.FindItemDefinition(-1321651331);
                        PrintToChat(player, "총알이 폭발탄 으로 변경 되었습니다.");
                        break;

                    case "ammo4":
                        if (weapon.primaryMagazine.contents != 0)
                        {
                            var ammo1 = ItemManager.CreateByItemID(weapon.primaryMagazine.ammoType.itemid, weapon.primaryMagazine.contents);
                            player.GiveItem(ammo1);
                            weapon.primaryMagazine.contents = 0;
                        }

                        weapon.primaryMagazine.ammoType = ItemManager.FindItemDefinition(605467368);
                        
                        PrintToChat(player, "총알이 소이탄 으로 변경 되었습니다.");
                        break;
                }

                if(true) //Use Reload
                    weapon.TryReloadMagazine(player.inventory);

                weapon.SendNetworkUpdate();
                weapon.SendChildrenNetworkUpdateImmediate();
                CuiHelper.DestroyUi(player, "SA_Main");
            }
            
        }
        #endregion

        #region ImageLibrary
        private string TryForImage(string shortname, ulong skin = 0)
        {
            if (!ImageLibrary) return "https://i.imgur.com/yxESUQJ.png";
            if (shortname.Contains("http") || shortname.Contains("www")) return shortname;
            return GetImage(shortname, skin);
        }
        private bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname.ToLower(), skin);
        private string GetImage(string shortname, ulong skin = 0, bool returnUrl = false) => (string)ImageLibrary.Call("GetImage", shortname.ToLower(), skin, returnUrl);
        #endregion

        #region Config        
        private ConfigData _config;
        private class ConfigData
        {
            [JsonProperty(PropertyName = "Commands")] public List<string> Commands { get; set; }
            [JsonProperty(PropertyName = "Heating Timer")] public float heatingTime { get; set; }
            [JsonProperty(PropertyName = "Switch Ammo Timer")] public float switchTime { get; set; }
            [JsonProperty(PropertyName = "Reload Timer")] public float reloadTimer { get; set; }
            [JsonProperty(PropertyName = "Without WorkBench Reload")] public bool withoutWorkbenchReload { get; set; }
            [JsonProperty(PropertyName = "Without WorkBench Switch")] public bool withoutWorkbenchSwitch { get; set; }
            public Oxide.Core.VersionNumber Version { get; set; }
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();
            _config = Config.ReadObject<ConfigData>();

            if (_config.Version < Version)
                UpdateConfigValues();

            Config.WriteObject(_config, true);
        }

        protected override void LoadDefaultConfig() => _config = GetBaseConfig();

        private ConfigData GetBaseConfig()
        {
            return new ConfigData
            {
                heatingTime = 0.3f,
                reloadTimer = 2f,
                switchTime = 2f,
                Version = Version
            };
        }

        protected override void SaveConfig() => Config.WriteObject(_config, true);

        private void UpdateConfigValues()
        {
            PrintWarning("Config update detected! Updating config values...");
            _config.Version = Version;
            PrintWarning("Config update completed!");
        }

        #endregion

        #region Helper
        private static string HexToColor(string HEX, float Alpha = 100)
        {
            if (string.IsNullOrEmpty(HEX)) HEX = "#FFFFFF";

            var str = HEX.Trim('#');
            if (str.Length != 6) throw new Exception(HEX);
            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);

            return $"{(double)r / 255} {(double)g / 255} {(double)b / 255} {Alpha / 100f}";
        }

        private CuiElementContainer CreateOutLine(string parent, int size = 1)
        {
            return new CuiElementContainer
            {
                {
                    new CuiPanel
                    {
                        RectTransform = {AnchorMin = "0 0", AnchorMax = "1 0", OffsetMin = $"0 -{size}"},
                        Image = {Color = "1 1 1 1"}
                    },
                    parent
                },
                {
                    new CuiPanel
                    {
                        RectTransform = {AnchorMin = "0 1", AnchorMax = "1 1", OffsetMax = $"0 {size}"},
                        Image = {Color = "1 1 1 1" }
                    },
                    parent
                },
                {
                    new CuiPanel
                    {
                        RectTransform =
                        {
                            AnchorMin = "0 0", AnchorMax = "0 1", OffsetMin = $"-{size} -{size}",
                            OffsetMax = $"0 {size}"
                        },
                        Image = {Color = "1 1 1 1" }
                    },
                    parent
                },
                {
                    new CuiPanel
                    {
                        RectTransform =
                        {
                            AnchorMin = "1 0", AnchorMax = "1 1", OffsetMin = $"0 -{size}", OffsetMax = $"{size} {size}"
                        },
                        Image = {Color = "1 1 1 1" }
                    },
                    parent
                }
            };
        }
        #endregion

        #region Mono
        private class MinigunChangers : MonoBehaviour
        {
            private BasePlayer player;
            private InputState input;
            private bool isReloading;

            private void Awake()
            {
                player = GetComponent<BasePlayer>();
                input = player.serverInput;
                isReloading = false;
                Instance.PrintToChat(player, "미니건 활성화됨");
            }

            private void FixedUpdate()
            {
                if (!isMinigun())
                {
                    DestroyComponent();
                    return;
                }
                if (input.IsDown(BUTTON.RELOAD))
                {
                    
                    if (!isReloading)
                    {
                        isReloading = true;
                        input.Clear();
                        //UI
                        if(player.currentCraftLevel == 0 || player.currentCraftLevel == 1)
                        {
                            Instance.PrintToChat(player, "미니건 재장전은 2레벨 제작대 앞에서 해야합니다.\nR키를 누르면 탄종을 선택할 수 있고 \n인벤토리에서 reload 를 눌러야 합니다 ");
                            return;
                        }
                        if(player.currentCraftLevel == 2 || player.currentCraftLevel == 3)
                            SA_Main(player);

                        isReloading = false;
                    }
                }
                else
                {
                    isReloading = false;
                }
            }

            private void OnDestroy()
            {
                Instance.PrintToChat(player, "미니건 비활성화됨");
            }
            public void DestroyComponent()
            {
                DestroyImmediate(this);
            }

            private bool isMinigun()
            {
                var active = player.GetActiveItem();
                if (active == null) return false;

                if (active.info.shortname == "minigun") return true;
                return false;
            }
            #region UI
            private void SA_Main(BasePlayer player)
            {
                var items = player.inventory.AllItems();

                var ammo1 = 0;
                var ammo2 = 0;
                var ammo3 = 0;
                var ammo4 = 0;

                foreach (var item in items)
                {
                    if (item.info.shortname == "ammo.rifle") ammo1 = ammo1 + item.amount;
                    if (item.info.shortname == "ammo.rifle.hv") ammo2 = ammo2 + item.amount;
                    if (item.info.shortname == "ammo.rifle.explosive") ammo3 = ammo3 + item.amount;
                    if (item.info.shortname == "ammo.rifle.incendiary") ammo4 = ammo4 + item.amount;
                }


                var container = new CuiElementContainer();
                container.Add(new CuiElement
                {
                    Name = "SA_Main",
                    Parent = "Overlay",
                    DestroyUi = "SA_Main",
                    Components =
                {
                    new CuiNeedsCursorComponent(),
                    new CuiImageComponent{ Color = HexToColor("000000", 40), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" },
                    new CuiRectTransformComponent{ AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-225 -49.992", OffsetMax = "225 50.008" }
                }
                });

                container.Add(new CuiButton
                {
                    Button = { Color = "1 1 1 0", Command = "minigunsa close" },
                    Text = { Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.LowerCenter, Color = "0 0 0 1" },
                    RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-225 -50", OffsetMax = "225 50" }
                }, "SA_Main", "SA_CloseBtn");

                container.Add(new CuiButton
                {
                    Button = { Color = HexToColor("332727"), Command = "minigunsa ammo1" },
                    Text = { Text = $"<b>소총탄\n({ammo1})</b>", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.LowerCenter, Color = "1 1 1 1" },
                    RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-215 -45.655", OffsetMax = "-115 45.655" }
                }, "SA_Main", "SA_RifleBtn");

                container.Add(new CuiElement
                {
                    Name = "SA_RifleBtnI",
                    Parent = "SA_RifleBtn",
                    Components = {
                    new CuiRawImageComponent { Color = "1 1 1 1", Png = Instance.TryForImage("ammo.rifle") },
                    new CuiOutlineComponent { Color = "0 0 0 0.5", Distance = "1 -1" },
                    new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-25 -4.345", OffsetMax = "25 45.655" }
                }
                });

                container.Add(new CuiButton
                {
                    Button = { Color = HexToColor("332727"), Command = "minigunsa ammo2" },
                    Text = { Text = $"<b>고속탄\n({ammo2})</b>", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.LowerCenter, Color = "1 1 1 1" },
                    RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-104 -45.655", OffsetMax = "-4 45.655" }
                }, "SA_Main", "SA_HvBtn");

                container.Add(new CuiElement
                {
                    Name = "SA_HvBtnI",
                    Parent = "SA_HvBtn",
                    Components = {
                    new CuiRawImageComponent { Color = "1 1 1 1", Png = Instance.TryForImage("ammo.rifle.hv") },
                    new CuiOutlineComponent { Color = "0 0 0 0.5", Distance = "1 -1" },
                    new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-25 -4.345", OffsetMax = "25 45.655" }
                }
                });

                container.Add(new CuiButton
                {
                    Button = { Color = HexToColor("332727"), Command = "minigunsa ammo3" },
                    Text = { Text = $"<b>폭발탄\n({ammo3})</b>", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.LowerCenter, Color = "1 1 1 1" },
                    RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "9 -45.655", OffsetMax = "109 45.655" }
                }, "SA_Main", "SA_ExposiveBtn");

                container.Add(new CuiElement
                {
                    Name = "SA_ExposiveBtnI",
                    Parent = "SA_ExposiveBtn",
                    Components = {
                    new CuiRawImageComponent { Color = "1 1 1 1", Png = Instance.TryForImage("ammo.rifle.explosive") },
                    new CuiOutlineComponent { Color = "0 0 0 0.5", Distance = "1 -1" },
                    new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-25 -4.345", OffsetMax = "25 45.655" }
                }
                });

                container.Add(new CuiButton
                {
                    Button = { Color = HexToColor("332727"), Command = "minigunsa ammo4" },
                    Text = { Text = $"<b>소이탄\n({ammo4})</b>", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.LowerCenter, Color = "1 1 1 1" },
                    RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "117 -45.655", OffsetMax = "217 45.655" }
                }, "SA_Main", "SA_IncBtn");

                container.Add(new CuiElement
                {
                    Name = "SA_IncBtnI",
                    Parent = "SA_IncBtn",
                    Components = {
                    new CuiRawImageComponent { Color = "1 1 1 1", Png = Instance.TryForImage("ammo.rifle.incendiary") },
                    new CuiOutlineComponent { Color = "0 0 0 0.5", Distance = "1 -1" },
                    new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-25 -4.345", OffsetMax = "25 45.655" }
                }
                });


                CuiHelper.AddUi(player, container);
            }
            #endregion
        }
        #endregion
    }
}

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