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

FREE Pivo : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust;
using Oxide.Game.Rust.Cui;
using ProtoBuf;
using Rust;
using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Pivo", "molik", "1.0.0")]
    class Pivo : RustPlugin
    {
        [PluginReference] Plugin ImageLibrary, Clans, ZoneManager, CopyPaste;
        private List<Vector3> PosList = new List<Vector3>();
        private int nextCrate = 0;
        int StartTime;
        Dictionary<ulong, DBSettings> DataBonus = new Dictionary<ulong, DBSettings>();
        public class DBSettings
        {
            public string DisplayName;
            public int Points = 0;
            public Dictionary<string, int> Settings = new Dictionary<string, int>()
            {
                ["gather"] = 0,
                ["damage"] = 0,
                ["raidblock"] = 0
            };
        }

        void SaveDataBase()
        {
            Interface.Oxide.DataFileSystem.WriteObject("PosPivo", PosList);
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("Pivo/PlayerList", DataBonus);
        }
        void OnPlayerConnected(BasePlayer player)
        {
            if (!DataBonus.ContainsKey(player.userID))
                DataBonus.Add(player.userID, new DBSettings());

            DataBonus[player.userID].DisplayName = player.displayName;
        }
        private void OnServerInitialized()
        {
            if (Interface.Oxide.DataFileSystem.ExistsDatafile("Pivo/PlayerList"))
                DataBonus = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, DBSettings>>("Pivo/PlayerList");
            LoadData();
            InvokeHandler.Instance.InvokeRepeating(CallToTimer, 0f, 1f);
            foreach (var check in BasePlayer.activePlayerList)
                OnPlayerConnected(check);        }
        /*[ChatCommand("gg")]
        void gg(BasePlayer player)
        {
            HealBonus(player);
        }*/
        [ChatCommand("bonus")]
        void ShowBonus(BasePlayer player)
        {
            var sb = new StringBuilder();
            sb.Append("Ваши бонусы:\n");
            sb.AppendLine($"Бонус на добычу: {DataBonus[player.userID].Settings["gather"]} сек.");
            sb.AppendLine($"Бонус Х2 урон по пойстройкам: {DataBonus[player.userID].Settings["damage"]} сек.");
            sb.AppendLine($"Иммунитет к рейд-блоку: {DataBonus[player.userID].Settings["raidblock"]} сек.");
            player.ChatMessage(sb.ToString().TrimEnd());
        }
        bool HasBonus(BasePlayer player)
        {
            if (DataBonus[player.userID].Settings["gather"] > 0)
            {
                return true;
            }
            if (DataBonus[player.userID].Settings["raidblock"] > 0)
            {
                return true;
            }
            if (DataBonus[player.userID].Settings["damage"] > 0)
            {
                return true;
            }
            return false;
        }
        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
        {
            var player = info.InitiatorPlayer;
            if (player == null)
                return;
            if (!HasBonus(player)) return;
            if (entity.PrefabName.Contains("assets/prefabs/building core"))
            {
                info.damageTypes.ScaleAll(2f);
                return;
            }
            return;
        }
        void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item)
        {
            if (item == null || player == null) return;
            if (!HasBonus(player)) return;
            int Rate = item.amount * 2;
            item.amount = Rate;
        }
        void OnDispenserGather(ResourceDispenser disp, BasePlayer player, Item item)
        {
            if (item == null || player == null) return;
            if (!HasBonus(player)) return;
            int Rate = item.amount * 2;
            item.amount = Rate;
        }
        private void Unload()
        {
            InvokeHandler.Instance.InvokeRepeating(CallToTimer, 0f, 1f);
            SaveDataBase();
        }
        void OnItemAction(Item item, string action, BasePlayer player)
        {
            var bonus = cfg.bonusitem.FirstOrDefault(x => x.skinid == item.skin);
            if (bonus != null && action == "unwrap")
            {
                item.amount -= 1;
                item.RemoveFromContainer();
                DataBonus[player.userID].Settings[bonus.type] += 300;
                if (bonus.type == "raidblock")
                    Server.Command($"grant.permission {player.userID} noescape.ignore 5m");
                //if (bonus.type == "heal")
                    //HealBonus(player);
                // item.RemoveFromWorld();
                return;
            }
            return;
        }
        void CallToTimer()
        {
            foreach(var player in DataBonus)
            {
                TimerBonus(player.Key);
            }
        }
        void TimerBonus(ulong player)
        { 
            if (DataBonus[player].Settings["gather"] > 0)
            {
                DataBonus[player].Settings["gather"]--;
            }
            else
            {
                DestroyBonus(player, "gather");
            }
            if (DataBonus[player].Settings["raidblock"] > 0)
            {
                DataBonus[player].Settings["raidblock"]--;
            }
            else
            {
                DestroyBonus(player, "raidblock");
            }
            if (DataBonus[player].Settings["damage"] > 0)
            {
                DataBonus[player].Settings["damage"]--;
            }
            else
            {
                DestroyBonus(player, "damage");
            }
        }
        void DestroyBonus(ulong player, string Key)
        {
            DataBonus[player].Settings[Key] = 0;
        }
        void LoadData()
        {
            PosList = Interface.Oxide?.DataFileSystem?.ReadObject<List<Vector3>>("PosPivo")
                ?? new List<Vector3>();
        }
        private ConfigData cfg;
        public class ConfigData
        {
            [JsonProperty("КД спавна чинука")]
            public int spawnRate;
            [JsonProperty("Виды бонусов")]
            public List<ConfigData.BonusType> bonusitem;
            public class BonusType
            {
                [JsonProperty("Вид бонуса")]
                public string type;
                [JsonProperty("Скин предмета")]
                public ulong skinid;
                [JsonProperty("Название предмета")]
                public string displayName;
            }
        }

        protected override void LoadDefaultConfig()
        {
            var config = new ConfigData()
            {
                spawnRate = 3600,
                bonusitem = new List<ConfigData.BonusType>()
                {
                    new ConfigData.BonusType()
                    {
                        type = "damage",
                        displayName = "Бонус на урон по постройкам х2 (5 минут)",
                        skinid = 0
                    },
                    new ConfigData.BonusType()
                    {
                        type = "raidblock",
                        displayName = "Устойчивость к рейдблоку (5 минут)",
                        skinid = 0
                    },
                    new ConfigData.BonusType()
                    {
                        type = "gather",
                        displayName = "Бонус на добычу х2 (5 минут)",
                        skinid = 0
                    },
                }
            };
            SaveConfig(config);
        }
        protected override void LoadConfig()
        {
            base.LoadConfig();
            cfg = Config.ReadObject<ConfigData>();
            SaveConfig(cfg);
        }

        private void SaveConfig(object config)
        {
            Config.WriteObject(config, true);
        }
        
        #region Commands
        private Vector3 GetPos()
        {
            if (PosList.Count >= 0)
                return PosList.ElementAt(UnityEngine.Random.Range(0, PosList.Count));

            return Vector3.zero;
        }

        [ChatCommand("pos")]
        private void cmdSetCratePos(BasePlayer p)
        {
            if (p.net.connection.authLevel < 2)
            {
                return;
            }
            PosList.Add(p.GetNetworkPosition());
            SaveDataBase();
            p.ChatMessage($"Добавлена точка спавна для ивента {p.GetNetworkPosition()}");
        }
        #endregion
    }
}

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