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

FREE FarmEvent : 1.1.1 1.1.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using System;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using System.Linq;
using Oxide.Core;
namespace Oxide.Plugins {
    [Info("FarmEvent", "Hougan", "1.1.1")]
    [Description("In-game event, farming resources with GUI, Log, TOP, e.t.c.")]
    class FarmEvent : RustPlugin {
#region Variable
        private Dictionary<ulong, int> playerFarm = new Dictionary<ulong, int>();
        private Dictionary<string, DateTime> playerComplete = new Dictionary<string, DateTime>();
        List<RandomEvent> randomEvent = new List<RandomEvent>();
        private string adminPermission = "farmevent.start";
        private Event currentEvent = new Event();
        class Event {
            public string Name = "Default";
            public string Item;
            public Timer Time;
            public Timer Broad;
            public int Goal;
            public int Places;
        }
        class RandomEvent {
            public string Name = "AUTO";
            public string Item;
            public int Time;
            public int Goal;
            public int Places;
        }
        private int broadcastInterval;
        private bool autoMode;
        private int autoModeInterval;
#endregion
#region Commands
        [ChatCommand("fe.start")]
        void eventStart(BasePlayer player, string command, string[] args) {
            if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                SendReply(player, msg("Permission", player.UserIDString));
                return;
            }
            if (currentEvent.Name != "Default") {
                SendReply(player, msg("Started", player.UserIDString));
                return;
            }
            if (args.Length != 5) {
                SendReply(player, msg("Syntax", player.UserIDString));
                return;
            }
            currentEvent.Name = args[0];
            currentEvent.Item = args[1];
            currentEvent.Goal = Int32.Parse(args[2]);
            currentEvent.Places = Int32.Parse(args[3]);
            currentEvent.Time = timer.Once(Int32.Parse(args[4]), () => {
                stopEvent();
            }
            );
            currentEvent.Broad = timer.Every(broadcastInterval, () => {
                Server.Broadcast(String.Format(msg("DO_NOT_CHANGE"), eventStat()));
            }
            );
            foreach (var check in BasePlayer.activePlayerList) {
                if (!playerFarm.ContainsKey(check.userID)) playerFarm.Add(check.userID, 0);
                updateGUI(check);
            }
            Server.Broadcast(String.Format(msg("Start"), currentEvent.Goal, ItemManager.FindItemDefinition(currentEvent.Item).displayName.english));
            LogToFile("FarmEvent", "--------------------------------", this, false);
            LogToFile("FarmEvent", $"[Name: {currentEvent.Name}] Event started at: {DateTime.Now} | Farm: {currentEvent.Item}\nGoal: {currentEvent.Goal} | Time: {args[4]} | Started by: {player.net.connection.userid}\n\n", this, false);
        }
        [ChatCommand("fe.add")]
        void eventAdd(BasePlayer player, string command, string[] args) {
            if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                SendReply(player, msg("Permission", player.UserIDString));
                return;
            }
            if (args.Length != 4) {
                SendReply(player, msg("Syntax", player.UserIDString));
                return;
            }
            RandomEvent newE = new RandomEvent();
            newE.Item = args[0];
            newE.Goal = Int32.Parse(args[1]);
            newE.Places = Int32.Parse(args[2]);
            newE.Time = Int32.Parse(args[3]);
            randomEvent.Add(newE);
            Server.Broadcast(String.Format(msg("Added")));
        }
        [ChatCommand("fe.stop")]
        void eventStop(BasePlayer player, string command, string[] args) {
            if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                SendReply(player, msg("Permission", player.UserIDString));
                return;
            }
            if (currentEvent.Name == "Default") {
                SendReply(player, msg("Stopped", player.UserIDString));
                return;
            }
            if (args.Length != 0) {
                SendReply(player, msg("SyntaxS", player.UserIDString));
                return;
            }
            stopEvent();
        }
        [ChatCommand("fe.stat")]
        void playerEventStat(BasePlayer player) {
            if (currentEvent.Name != "Default") SendReply(player, string.Format(msg("DO_NOT_CHANGE"), eventStat()));
        }
#endregion
#region Function
        void stopEvent() {
            Server.Broadcast(string.Format(msg("DO_NOT_CHANGE"), eventStat(true)));
            LogToFile("FarmEvent", "Event results:", this, false);
            LogToFile("FarmEvent", String.Format(msg("DO_NOT_CHANGE"), eventStat()), this, false);
            LogToFile("FarmEvent", "--------------------------------", this, false);
            currentEvent.Time.Destroy();
            currentEvent.Broad.Destroy();
            currentEvent = new Event();
            playerFarm.Clear();
            playerComplete.Clear();
            foreach (var check in BasePlayer.activePlayerList) CuiHelper.DestroyUi(check, "FarmGUI");
        }
        string eventStat(bool Finish = false) {
            string result = "";
            if (!Finish) result = string.Format(msg("WinnerHeader"));
            else result = string.Format(msg("Finnish"));
            int i = 1;
            foreach (var check in playerComplete) {
                result += String.Format(msg("WinnerPlace"), i, check.Key, check.Value.ToShortTimeString());
                i++;
            }
            foreach (var uid in playerFarm.OrderByDescending(p => p.Value).Take(currentEvent.Places - i + 1)) {
                bool foundSorryForUselessMethodToCheck = false;
                foreach (var check in BasePlayer.activePlayerList) {
                    if (check.net.connection.userid == uid.Key) {
                        result += String.Format(msg("EncouragingPlace"), i, BasePlayer.FindByID(uid.Key).net.connection.username, uid.Value);
                        foundSorryForUselessMethodToCheck = true;
                    }
                }
                if (!foundSorryForUselessMethodToCheck) result += String.Format(msg("EncouragingPlace"), i, uid.Key, uid.Value);
                foundSorryForUselessMethodToCheck = false;
                i++;
            }
            result += msg("Congratulation");
            return result;
        }
        object GetVariable(string menu, string datavalue, object defaultValue) {
            var data = Config[menu] as Dictionary<string, object>;
            if (data == null) {
                data = new Dictionary<string, object>();
                Config[menu] = data;
            }
            object value;
            if (!data.TryGetValue(datavalue, out value)) {
                value = defaultValue;
                data[datavalue] = value;
            }
            return value;
        }
        string msg(string key, string id = null) => lang.GetMessage(key, this, id);
#endregion
#region Hooks
        protected override void LoadDefaultConfig() {
            broadcastInterval = Convert.ToInt32(GetVariable("Main", "Auto-broadcast interval", 30));
            autoMode = Convert.ToBoolean(GetVariable("Main", "Auto-mode", false));
            autoModeInterval = Convert.ToInt32(GetVariable("Main", "Auto-mode interval (min)", 1));
            SaveConfig();
        }
        void Unload() {
            Interface.Oxide.DataFileSystem.WriteObject("FarmEvent_Random", randomEvent);
        }
        void Init() {
            LoadDefaultConfig();
            permission.RegisterPermission(adminPermission, this);
            lang.RegisterMessages(new Dictionary<string, string> {
                //chat
                ["WinnerHeader"]
                = "Current event <color=#DC143C>results</color>:\n", ["Added"] = "You successful added new event!", ["Finnish"] = "Event <color=#DC143C>ENDED</color>, results:\n", ["WinnerPlace"] = "\n[<color=#DC143C>{0}</color>] <color=#b8b8b8>{1}</color> finished at <color=#DC143C>{2}</color>!", ["EncouragingPlace"] = "\n[<color=#b8b8b8>{0}</color>] <color=#b8b8b8>{1}</color> farmed <color=#DC143C>{2}</color>!",  //
                ["Finished"]
                = "Congratulation! <color=#DC143C>{0}</color> finished at <color=#DC143C>{1}</color>", ["LFinished"] = "Congratulation! <color=#DC143C>{0}</color> finished at <color=#DC143C>{1}</color>, but it is too <color=#DC143C>late</color>",  //
                ["Start"]
                = "Event started, you should farm <color=#DC143C>{0}</color>x of <color=#DC143C>{1}</color>!", ["Congratulation"] = "\n\nThank you for <color=#DC143C>participating</color>!",  //
                ["Permission"]
                = "You have no permission!", ["Syntax"] = "Use: /fe.start EventNAME ResourceNAME ResourcesAMOUNT WinPlacesAMOUNT TIMEINSEC!", ["SyntaxA"] = "Use: /fe.add ResourceNAME ResourcesAMOUNT WinPlacesAMOUNT TIMEINSEC!", ["SyntaxS"] = "Use: /fe.stop!", ["Started"] = "Already started, stop!", ["Stopped"] = "Already stopped, start!", ["DO_NOT_CHANGE"] = "{0}"
            }
            , this);
            randomEvent = Interface.Oxide.DataFileSystem.ReadObject<List<RandomEvent>>("FarmEvent_Random");
            if (autoMode) {
                timer.Every(autoModeInterval * 60, () => {
                    if (currentEvent.Name != "Default") {
                        return;
                    }
                    RandomEvent newE = randomEvent[Oxide.Core.Random.Range(0, randomEvent.Count - 1)];
                    currentEvent.Name = newE.Name;
                    currentEvent.Item = newE.Item;
                    currentEvent.Goal = newE.Goal;
                    currentEvent.Places = newE.Places;
                    currentEvent.Time = timer.Once(newE.Time, () => {
                        stopEvent();
                    }
                    );
                    currentEvent.Broad = timer.Every(broadcastInterval, () => {
                        Server.Broadcast(String.Format(msg("DO_NOT_CHANGE"), eventStat()));
                    }
                    );
                    foreach (var check in BasePlayer.activePlayerList) {
                        if (!playerFarm.ContainsKey(check.userID)) playerFarm.Add(check.userID, 0);
                        updateGUI(check);
                    }
                    Server.Broadcast(String.Format(msg("Start"), currentEvent.Goal, ItemManager.FindItemDefinition(currentEvent.Item).displayName.english));
                    LogToFile("FarmEvent", "--------------------------------", this, false);
                    LogToFile("FarmEvent", $"[Name: {currentEvent.Name}] Event started at: {DateTime.Now} | Farm: {currentEvent.Item}\nGoal: {currentEvent.Goal} | Time: {newE.Time} | Started by: AUTO\n\n", this, false);
                }
                );
            }
        }
        void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) {
            if (currentEvent.Name != "Default" && !playerComplete.ContainsKey(entity.net.connection.username)) {
                if (item.info.shortname == currentEvent.Item) {
                    playerFarm[entity.GetComponent<BasePlayer>().net.connection.userid] += item.amount;
                    if (playerFarm[entity.GetComponent<BasePlayer>().net.connection.userid] >= currentEvent.Goal) {
                        if (playerComplete.Count < currentEvent.Places) {
                            playerComplete.Add(entity.GetComponent<BasePlayer>().net.connection.username, DateTime.Now);
                            CuiHelper.DestroyUi(entity.GetComponent<BasePlayer>(), "FarmGUI");
                            Server.Broadcast(String.Format(msg("Finished"), entity.GetComponent<BasePlayer>().net.connection.username, DateTime.Now.ToShortTimeString()));
                            playerFarm.Remove(entity.GetComponent<BasePlayer>().net.connection.userid);
                            return;
                        }
                        else {
                            CuiHelper.DestroyUi(entity.GetComponent<BasePlayer>(), "FarmGUI");
                            return;
                        }
                    }
                    updateGUI(entity.GetComponent<BasePlayer>());
                }
            }
        }
        void OnPlayerInit(BasePlayer player) {
            if (!playerFarm.ContainsKey(player.userID)) playerFarm.Add(player.userID, 0);
            if (currentEvent.Name != "Default") updateGUI(player);
        }
        void OnPlayerSleepEnded(BasePlayer player) {
            if (currentEvent.Name != "Default") updateGUI(player);
        }
#endregion
#region GUI
        private void updateGUI(BasePlayer player) {
            CuiHelper.DestroyUi(player, "FarmGUI");
            FarmGUI(player);
        }
        private void FarmGUI(BasePlayer player) {
            var FarmElements = new CuiElementContainer();
            var Choose = FarmElements.Add(new CuiPanel {
                Image = {
                    Color = $"0.1 0.1 0.1 0"
                }
                , RectTransform = {
                    AnchorMin = "0.0078125 0.002777774", AnchorMax = "0.1838542 0.03518518"
                }
                , CursorEnabled = false,
            }
            , "HUD", "FarmGUI");
            FarmElements.Add(new CuiButton {
                Button = {
                    Color = $"0.34 0.34 0.34 0", Close = Choose
                }
                , RectTransform = {
                    AnchorMin = "0 0", AnchorMax = $"1 1"
                }
                , Text = {
                    Text = $"You farmed: <color=#DC143C>{playerFarm[player.userID]}</color> {ItemManager.FindItemDefinition(currentEvent.Item).displayName.english}  [<color=#DC143C>{currentEvent.Goal - playerFarm[player.userID]}</color> left]", Align = TextAnchor.MiddleLeft, Color = "1 1 1 1", FontSize = 14
                }
            }
            , Choose);
            CuiHelper.AddUi(player, FarmElements);
        }
#endregion
#region Debug
        [ChatCommand("fe.fake")]
        void fakeTest(BasePlayer player, string command, string[] args) {
            if (!player.IsAdmin) {
                return;
            }
            playerFarm.Add(ulong.Parse(args[0]), Int32.Parse(args[1]));
        }
#endregion
    }
}

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