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

FREE Artefacts : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
 using Oxide.Core.Plugins;
 using Oxide.Game.Rust.Cui;
using UnityEngine;

namespace Oxide.Plugins
{ 
    [Info("Artefacts", "CASHR#6906", "1.0.0")]
    internal class Artefacts : RustPlugin
    {
        #region Static

        private static Artefacts _ins;
        private Configuration _config;
        private string Layer = "UI_ARTEFACTS_INFO"; 
        #endregion

        #region Config

        object OnItemAction(Item item, string action, BasePlayer player)
        {
            if (action != "consume") return null;
            if (!item.info.shortname.Contains("tea")) return null;
            if (player.GetComponent<ArtefactBuff>() == null) return null;
            player.ChatMessage("Нельзя использовать чай, при активном артефакте");
            return false;
        }

        private class Configuration
        {
            [JsonProperty("Статичная картинка эффекта")]
            public string Image = "";
            [JsonProperty("Список артефактов")]
            public Dictionary<int, Artefact> ArtefactsList = new Dictionary<int, Artefact>();


            internal class Artefact
            {
                [JsonProperty("Отображать в интерфейсе")]
                public bool inInterface = false;
                [JsonProperty("Уровень артефакта")] public int ArtefactLevel;
                [JsonProperty("Краткое описание")] public string LowDest;
                [JsonProperty("Изображение артефакта")]
                public string image;
                [JsonProperty("Описание артефакта")] public string Desc;
                [JsonProperty(
                    "Название артефакта(Для апгрейда артефакта у них должны быть одинаковые имена.(Всё остальное может быть разным))")]
                public string ArtefactName;

                [JsonProperty("Настройки типа артефакта")]
                public ArtefactType ArtefactSetting;

                [JsonProperty("Shortname предмета")] public string ArtefactShortname;
                [JsonProperty("SkinID предмета")] public ulong ArtefactskinID;
                [JsonProperty("Имя предмета")] public string DisplayName;
            }

            internal class ArtefactType
            {
                [JsonProperty("Множитель урона(1 = стандарт)")]
                public float DamageScale;

                [JsonProperty("Восполнение еды")] public int FoodRestore;

                [JsonProperty("Множитель добываемых ресурсов(1 = стандарт)")]
                public float GatheringMultiply;

                [JsonProperty("Множитель для игрков(привилегия/рейт)")]
                public Dictionary<string, float> PermList;

                [JsonProperty("Множитель здоровья(0 = стандарт хп)")]
                public float HealthPercent;

                [JsonProperty("Кол-во восполняемого здоровья за 1 секунду")]
                public float HealthRestore;

                [JsonProperty("Промежуток времени, за который даётся одна радиация")]
                public float RadiationTickRate;

                [JsonProperty("Восполнение воды")] public int WaterRestore;
            }
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                _config = Config.ReadObject<Configuration>();
                if (_config == null) throw new Exception();
                SaveConfig();
            }
            catch
            {
                PrintError("Your configuration file contains an error.Using default configuration values.");
                LoadDefaultConfig();
            }
        }

        protected override void SaveConfig()
        {
            Config.WriteObject(_config);
        }

        protected override void LoadDefaultConfig()
        {
            _config = new Configuration()
            {
                ArtefactsList = new Dictionary<int, Configuration.Artefact>()
                {
                    [0] = new Configuration.Artefact()
                    {
                        ArtefactName = "Артефакт берсерка",
                        ArtefactShortname = "blood",
                        ArtefactskinID = 0,
                        ArtefactLevel = 1,
                        ArtefactSetting = new Configuration.ArtefactType()
                        {
                            HealthPercent = 2f,
                            PermList = new Dictionary<string, float>(),
                            DamageScale = 1.1f,
                            FoodRestore = 0,
                            WaterRestore = 0,
                            HealthRestore = 0,
                            GatheringMultiply = 1f,
                            RadiationTickRate = 1f
                        }
                    }
                }
            };
        }

        #endregion

        #region OxideHooks

        private void OnServerInitialized()
        {
            _ins = this;
              LoadConfig();

            foreach (var check in _config.ArtefactsList)
            {
                if (check.Value.inInterface)
                    ImageLibrary?.Call("AddImage", check.Value.image, check.Value.image);
            }
            ImageLibrary?.Call("AddImage", _config.Image,_config.Image);
            foreach (var check in _config.ArtefactsList)
            {
                foreach (var perm in check.Value.ArtefactSetting.PermList)
                {
                    permission.RegisterPermission(perm.Key, this);
                }
            }
        }

        private void Unload()
        {
            _ins = null;
            var Player = GameObject.FindObjectsOfType<ArtefactBuff>();
            foreach (var check in Player)
            {
                check?.Kill();
                GameObject.Destroy(check);
            }
        }

        private void OnItemAddedToContainer(ItemContainer container, Item item)
        {
            if (item == null || container == null) return;
            var player = container.GetOwnerPlayer();
            if (player == null) return;
            if (container != player.inventory.containerBelt) return;
            var artefact = ItemIsArtefact(item);
            if (artefact == null) return;
            PlayerSetBuff(player, artefact);
        }

        private void OnPlayerDeath(BasePlayer player, HitInfo info)
        {
            if (player == null) return;
            if (player.gameObject.GetComponent<ArtefactBuff>() != null)
                player.gameObject.GetComponent<ArtefactBuff>().Kill();
        }

        private void OnItemRemovedFromContainer(ItemContainer container, Item item)
        {
            if (item == null || container == null) return;
            var player = container.GetOwnerPlayer();
            if (player == null || container != player.inventory.containerBelt) return;
            if (player.gameObject.GetComponent<ArtefactBuff>() != null && ItemIsArtefact(item) != null)
                player.gameObject.GetComponent<ArtefactBuff>().Kill();
        }

        private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
        {
            if (entity == null || info == null || !(entity as BasePlayer) && !(entity as BaseNpc)) return;
            var attacker = info.InitiatorPlayer;
            if (attacker == null) return;
            var comp = attacker.gameObject.GetComponent<ArtefactBuff>();
            if (comp != null && attacker.HasPlayerFlag(BasePlayer.PlayerFlags.Unused1))
                info.damageTypes.ScaleAll(comp.GetDamageScale());
        }

        private void OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item)
        {
            OnDispenserBonus(dispenser, player, item);
        }

        private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item)
        {
            if (player == null) return;
            var comp = player.gameObject.GetComponent<ArtefactBuff>();
            if (comp != null && player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused2))
            {
                var amount = (int) (item.amount * comp.GetGatheringMultiply());
                item.amount = amount > 1 ? amount : 1;
            }
        }


        private object CanMoveItem(Item item, PlayerInventory playerLoot, uint targetContainer, int targetSlot,
            int amount)
        {
            if (item == null || playerLoot == null) return null;
            var player = playerLoot.GetComponent<BasePlayer>();
            if (player == null) return null;
            var container = playerLoot.FindContainer(targetContainer);
            if (container == null) return null;
            var targetItem = container.GetSlot(targetSlot);
            if (targetItem == null) return null;
            var artefact = ItemIsArtefact(item);
            if (artefact == null) return null;
            var art = ItemIsArtefact(targetItem);
            if (art == null) return null;
            if (art.ArtefactskinID != artefact.ArtefactskinID) return null;
            if (art.ArtefactName == artefact.ArtefactName && art.ArtefactLevel == artefact.ArtefactLevel)
                for (var i = 0; i < _config.ArtefactsList.Count; i++)
                {
                    var findart = _config.ArtefactsList[i];
                    if (art.ArtefactName == findart.ArtefactName && artefact.ArtefactName == findart.ArtefactName && findart.ArtefactLevel == art.ArtefactLevel + 1)
                    {
                        item.DoRemove();
                        targetItem.DoRemove();
						NextTick(()=>{
                        var NewArt = ItemManager.CreateByName(findart.ArtefactShortname, 1, findart.ArtefactskinID);
                        if (!string.IsNullOrEmpty(findart.DisplayName))
                            NewArt.name = findart.DisplayName;
                        player.GiveItem(NewArt);
						});
                        return false;
                    }
                }

            return null;
        }
		
        #endregion

        #region Interface

        [PluginReference] private Plugin ImageLibrary;
        private void ShowInfo(BasePlayer player)
        {
            var container = new CuiElementContainer();
            container.Add(new CuiPanel
            {
                CursorEnabled = true,
                RectTransform =
                    {AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"-700 -400", OffsetMax = $"700 400"},
                Image = {Color = "0 0 0 0.5", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"}
            }, "Overlay", Layer);
             container.Add(new CuiButton
                {
                    RectTransform = {AnchorMin = $"0 0", AnchorMax = $"1 1"},
                    Button = {Color = "1 1 1 0", Close = Layer},
                    Text =
                    {
                        Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
                    }
                }, Layer);
            double posx = 0.008f;
            var posy = 0.92;
            var wight = 0.4;
            var height = 0.22;
            int a = 0;
            container.Add(new CuiButton
                {
                    RectTransform = {AnchorMin = $"0.1 0.1", AnchorMax = $"0.9 0.9"},
                    Button = {Color = "1 1 1 0"},
                    Text =
                    {
                        Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
                    }
                }, Layer, Layer + ".ARTEFACT");
               
            foreach (var check in _config.ArtefactsList)
            {
                if (!check.Value.inInterface) continue;
                container.Add(new CuiButton
                {
                    RectTransform = {AnchorMin = $"{posx} {posy - height}", AnchorMax = $"{posx + wight} {posy}"},
                    Button = {Color = "0 0 0 0.9"},
                    Text =
                    {
                        Text = "", Align = TextAnchor.MiddleLeft, Font = "robotocondensed-regular.ttf", FontSize = 18
                    }
                }, Layer + ".ARTEFACT", Layer + $"{a}");
                container.Add(new CuiElement
                {
                    Parent = Layer + $"{a}",
                    Components =
                    {
                        new CuiRawImageComponent {Png = (string) ImageLibrary.Call("GetImage", check.Value.image)},
                        new CuiRectTransformComponent {AnchorMin = $"0 0", AnchorMax = $"0.28 1"}
                    }
                });
			    container.Add(new CuiElement
                {
                    Parent = Layer + $"{a}",
                    Components =
                    {
                        new CuiTextComponent
                        {
                            Text = $"{check.Value.Desc}", FontSize = 18, Font = "robotocondensed-regular.ttf",
                            Align = TextAnchor.UpperLeft
                        },
                        new CuiRectTransformComponent {AnchorMin = "0.3 0", AnchorMax = "1 0.95"},
                        new CuiOutlineComponent {Color = "0 0 0 1", Distance = "0.5 -0.5"}
                    }
                });
                a++;
                posx = posx + wight + 0.02;
                posy = posy - height/2 - 0.01F;
                if (a == 2 || a == 4 || a == 6 || a == 8) 
                {
                    posx = 0.008f;
                } 
            } 
			 container.Add(new CuiButton
            {
                Button = {Color = "0 0 0 0.8",Command = "chat.say /menu",Close = Layer},
                Text =
                {
                    Text = "НАЗАД В МЕНЮ", Font = "robotocondensed-bold.ttf", FontSize = 24, Align = TextAnchor.MiddleCenter,
                    Color = "1 1 1 1"
                }, 
                RectTransform = {AnchorMin = "0.61 0.05", AnchorMax = "0.8 0.13"}
            }, Layer);
			 container.Add(new CuiButton
            {
                Button = {Color = "0 0 0 0",Close = Layer},
                Text =
                {
                    Text = "АРТЕФАКТЫ", Font = "robotocondensed-bold.ttf", FontSize = 60, Align = TextAnchor.MiddleCenter,
                    Color = "1 1 1 1"
                }, 
                RectTransform = {AnchorMin = "0.5 0.8", AnchorMax = "0.8 0.9"}
            }, Layer);
            CuiHelper.DestroyUi(player, Layer);
            CuiHelper.AddUi(player, container);
        }

        #endregion

        #region Function

        private Configuration.Artefact ItemIsArtefact(Item item)
        {
            for (var i = 0; i < _config.ArtefactsList.Count; i++)
            {
                var art = _config.ArtefactsList[i];
                if (item.info.shortname == art.ArtefactShortname && item.skin == art.ArtefactskinID)
                    return art;
            }

            return null;
        }

        [ChatCommand("artefacts")]
        void cmdGiveArtefacts(BasePlayer player, string com, string[] args)
        {
            if (!player.IsAdmin) return;

            foreach(var art in _config.ArtefactsList)
            {

                var item = ItemManager.CreateByName(art.Value.ArtefactShortname, 1, art.Value.ArtefactskinID);
                player.GiveItem(item);
            }
        }
        private void PlayerSetBuff(BasePlayer player, Configuration.Artefact artefact)
        {
            var componentPLayer = player.GetComponent<ArtefactBuff>();
            if (componentPLayer != null)
            {
                componentPLayer.Kill();
                player.ChatMessage("Нельзя использовать два артефакта одновременно!Баффы отключены");
                return;
            }

            player.gameObject.AddComponent<ArtefactBuff>();
            var newComponenPlayer = player.gameObject.GetComponent<ArtefactBuff>();
            newComponenPlayer.ArtefactBuffcfg = artefact;
            newComponenPlayer.ArtefactActivate();
        }

        [ConsoleCommand("SHOWSTATART")]
        private void cmdChatSHOWSTATART(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null || player.GetComponent<ArtefactBuff>() == null) return;
            player.GetComponent<ArtefactBuff>().ShowText();
        }
        private class ArtefactBuff : FacepunchBehaviour
        {
            public Configuration.Artefact ArtefactBuffcfg;
            private BasePlayer player;

            private void Awake()
            {
                player = GetComponent<BasePlayer>();
                player.modifiers.RemoveAll();
            }

            public void ArtefactActivate()
            {
                var modifiers = new List<ModifierDefintion>();
                modifiers.Clear();
                var ArtSettings = ArtefactBuffcfg.ArtefactSetting;
                var HealthPercent = ArtSettings.HealthPercent;
                var RadiationTickRate = ArtSettings.RadiationTickRate;

                if (HealthPercent != 1)
                {
                    var modifier = new ModifierDefintion()
                    {
                        type = Modifier.ModifierType.Max_Health, duration = 86400, source = Modifier.ModifierSource.Tea,
                        value = HealthPercent,
                    };
                    modifiers.Add(modifier);
                    player.modifiers.Add(modifiers);
                }

                if (ArtSettings.DamageScale != 1)
                    if (!player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused1))
                        player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused1, true);

                if (ArtSettings.FoodRestore != 0) InvokeRepeating(FoodRestoration, 1f, 1f);

                if (ArtSettings.WaterRestore != 0) InvokeRepeating(WaterRestoration, 1f, 1f);

                if (ArtSettings.HealthRestore != 0) InvokeRepeating(HealthRestoration, 1f, 1f);

                if (ArtSettings.GatheringMultiply != 1)
                    if (!player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused2))
                        player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused2, true);

               // if (RadiationTickRate != 0) InvokeRepeating(RadiationAdd, RadiationTickRate, RadiationTickRate);
				ShowPanel();
            }

            private string Layer = "UI_ARTEFACTS_PANELLAYER";
            private void ShowPanel()
            {
                var container = new CuiElementContainer();
                container.Add(new CuiPanel
                {
                    RectTransform =
                        {AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-245 30", OffsetMax = "-205 70"},
                    Image = {Color = "0 0 0 0", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"}
                }, "Overlay", Layer);
                container.Add(new CuiElement
                {
                    Parent = Layer,
                    Name = Layer + "UPDATE",
                    Components =
                    {
                        new CuiRawImageComponent
                            {Png = (string) _ins.ImageLibrary.Call("GetImage", _ins._config.Image), Color = "1 1 1 0.7"},
                        new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1"}
                    }
                });
                container.Add(new CuiButton
                {
                    RectTransform = {AnchorMin = $"0 0", AnchorMax = $"1 1"},
                    Button = {Color = "0 0 0 0", Command = "SHOWSTATART"},
                    Text =
                    {
                        Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
                    }
                }, Layer + "UPDATE");
                CuiHelper.DestroyUi(player, Layer);
                CuiHelper.AddUi(player, container);
            }


            public void ShowText()
            {
                var container = new CuiElementContainer();
                container.Add(new CuiButton
                {
                    RectTransform = {AnchorMin = "-8.6 1.2", AnchorMax = "0.75 2"},
                    Button = {Color = "1 1 1 0.2"},
                    Text =
                    {
                        Text = ArtefactBuffcfg.LowDest, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
                    }
                }, Layer, Layer + ".TEXT");
                CuiHelper.DestroyUi(player, Layer + ".TEXT");
                CuiHelper.AddUi(player, container);
                Invoke(()=>{ CuiHelper.DestroyUi(player, Layer + ".TEXT");}, 5f);
            }
            private void FoodRestoration()
            {
                if (player.metabolism.calories.value >= player.metabolism.calories.max) return;
                player.metabolism.calories.value += ArtefactBuffcfg.ArtefactSetting.FoodRestore;
            }

            private void WaterRestoration()
            {
                if (player.metabolism.hydration.value >= player.metabolism.hydration.max) return;
                player.metabolism.hydration.value += ArtefactBuffcfg.ArtefactSetting.WaterRestore;
            }

            private void HealthRestoration()
            {
                if (player.health >= player._maxHealth) return;
                player.health += ArtefactBuffcfg.ArtefactSetting.HealthRestore;
            }

            private void RadiationAdd()
            {
                player.metabolism.radiation_poison.value += 1 - player.baseProtection.amounts[17];
            }

            public float GetGatheringMultiply()
            {
                return GetRate();
            }

            private float GetRate()
            {
                var def = ArtefactBuffcfg.ArtefactSetting.GatheringMultiply;

                foreach (var check in ArtefactBuffcfg.ArtefactSetting.PermList)
                {
                    if (_ins.permission.UserHasPermission(player.UserIDString, check.Key))
                        def = check.Value;
                }

                return def;
            }
            public float GetDamageScale()
            {
                return ArtefactBuffcfg.ArtefactSetting.DamageScale;
            }

            public void Kill() 
            {
                CuiHelper.DestroyUi(player, Layer);
                CancelInvoke(FoodRestoration);
                CancelInvoke(WaterRestoration);
                CancelInvoke(HealthRestoration);
                CancelInvoke(RadiationAdd);
                player.modifiers.RemoveAll();
                if (player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused1))
                    player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused1, false);
                if (player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused2))
                    player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused2, false);
                Destroy(this);
            }
        }

        #endregion
    }
}

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