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

FREE ZetaQuest : 0.1.0 0.1.0

Нет прав для скачивания
C#:
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System;
using Random = UnityEngine.Random;
using Rust;
namespace Oxide.Plugins {
    [Info("ZetaQuest", "fermenspwnz", "0.1.0")]
    [Description("Достали кактусы...")]
    class ZetaQuest : RustPlugin {
#region Plugins
        Plugin Kits => Interface.Oxide.RootPluginManager.GetPlugin("Kits");
        Plugin XKits => Interface.Oxide.RootPluginManager.GetPlugin("XKits");
        Plugin ImageLibrary => Interface.Oxide.RootPluginManager.GetPlugin("ImageLibrary");
        public string GetImage(string shortname, ulong skin = 0) => (string)ImageLibrary.Call("GetImage", shortname, skin);
        public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
#endregion
        BaseEntity scientist;
        BaseEntity bandit;
        BaseEntity chair;
        private List<ulong> _page = new List<ulong>();
        private List<ulong> _page2 = new List<ulong>();
        private Dictionary<string, baseplayer> currentquests = new Dictionary<string, baseplayer>();
        class baseplayer {
            public bool refresh = false;
            public List<string> listquests = new List<string>();
            public Dictionary<string, currentquest> quests = new Dictionary<string, currentquest>();
        }
        class currentquest {
            public int count = 0;
            public bool finish = false;
        }
        private ItemDefinition FindItem(string itemNameOrId) {
            ItemDefinition itemDef = ItemManager.FindItemDefinition(itemNameOrId.ToLower());
            if (itemDef == null) {
                int itemId;
                if (int.TryParse(itemNameOrId, out itemId)) {
                    itemDef = ItemManager.FindItemDefinition(itemId);
                }
            }
            return itemDef;
        }
        private void ItemSpawner(Item item, Vector3 dropPosition) {
            ItemContainer container = new ItemContainer();
            container.Insert(item);
            DropUtil.DropItems(container, dropPosition);
        }
        void God(BasePlayer player) {
            player._maxHealth = float.MaxValue;
            player.health = float.MaxValue;
            player.metabolism.bleeding.max = 0;
            player.metabolism.bleeding.value = 0;
            player.metabolism.calories.min = 500;
            player.metabolism.calories.value = 500;
            player.metabolism.dirtyness.max = 0;
            player.metabolism.dirtyness.value = 0;
            player.metabolism.heartrate.min = 0.5f;
            player.metabolism.heartrate.max = 0.5f;
            player.metabolism.heartrate.value = 0.5f;
            player.metabolism.hydration.min = 250;
            player.metabolism.hydration.value = 250;
            player.metabolism.oxygen.min = 1;
            player.metabolism.oxygen.value = 1;
            player.metabolism.poison.max = 0;
            player.metabolism.poison.value = 0;
            player.metabolism.radiation_level.max = 0;
            player.metabolism.radiation_level.value = 0;
            player.metabolism.radiation_poison.max = 0;
            player.metabolism.radiation_poison.value = 0;
            player.metabolism.temperature.min = 32;
            player.metabolism.temperature.max = 32;
            player.metabolism.temperature.value = 32;
            player.metabolism.wetness.max = 0;
            player.metabolism.wetness.value = 0;
            player.metabolism.SendChangesToClient();
        }
        private bool IsNPC(BasePlayer player) {
            if (player is NPCPlayer) return true;
            if (!(player.userID >= 76560000000000000L || player.userID <= 0L)) return true;
            return false;
        }
        const string MainNpcName = "Тех.Админ";
        private void OnEntityEnter(TriggerBase trigger, BaseEntity entity) {
            if (trigger == null) return;
            if (trigger.name == "QuestNPC") {
                BasePlayer player = entity.ToPlayer();
                if (player == null || IsNPC(player)) return;
                if (!_page.Contains(player.userID)) player.SendConsoleCommand("quest.open");
            }
            else if (trigger.name == "Pepa") {
                BasePlayer player = entity.ToPlayer();
                if (player == null || IsNPC(player)) return;
                if (!_page2.Contains(player.userID)) {
                    player.SendConsoleCommand("quest.bandit");
                    _page2.Add(player.userID);
                }
            }
        }
        private void OnEntityLeave(TriggerBase trigger, BaseEntity entity) {
            if (trigger == null) return;
            if (trigger.name == "QuestNPC") {
                BasePlayer player = entity.ToPlayer();
                if (player == null || IsNPC(player)) return;
                if (_page.Contains(player.userID)) player.SendConsoleCommand("quest.exit");
            }
            else if (trigger.name == "Pepa") {
                BasePlayer player = entity.ToPlayer();
                if (player == null || IsNPC(player)) return;
                if (_page2.Contains(player.userID)) _page2.Remove(player.userID);
            }
        }
        List<GameObject> gameObjects = new List<GameObject>();
        private void SpawnScientist() {
            foreach (var z in BasePlayer.sleepingPlayerList.Where(x => IsNPC(x) && x.displayName.Equals(MainNpcName))) z.Kill();
            scientist = GameManager.server.CreateEntity("assets/prefabs/player/player.prefab", compound.transform.position + new Vector3(compound.transform.forward.x * 10f, 0.3f, compound.transform.forward.z * 8f), compound.transform.rotation, true);
            if (scientist != null) {
                scientist.enableSaving = false;
                scientist.Spawn();
                BasePlayer player = scientist.GetComponent<BasePlayer>();
                player.displayName = MainNpcName;
                player._name = MainNpcName;
                God(player);
                player.SendNetworkUpdateImmediate();
                Kits?.Call("GiveKit", player, "bot", true);
                Kits?.Call("GiveKit", player, "bot", 0, true);
                XKits?.Call("GiveKit", player, "bot", true);
                GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                sphere.transform.position = player.transform.position;
                TriggerBase trigger = sphere.GetComponent<TriggerBase>() ?? sphere.gameObject.AddComponent<TriggerBase>();
                trigger.interestLayers = LayerMask.GetMask("Player (Server)");
                trigger.enabled = true;
                sphere.layer = (int)Layer.Reserved1;
                sphere.name = "QuestNPC";
                SphereCollider sphereCollider = sphere.GetComponent<SphereCollider>();
                sphereCollider.radius = 3f;
                sphereCollider.isTrigger = true;
                sphereCollider.enabled = true;
                gameObjects.Add(sphere);
            }
            bandit = GameManager.server.CreateEntity("assets/prefabs/player/player.prefab", bandit_town.transform.position);
            if (bandit != null) {
                bandit.enableSaving = false;
                bandit.Spawn();
                BasePlayer player = bandit.GetComponent<BasePlayer>();
                player.displayName = "Авдос";
                player._name = "Авдос";
                God(player);
                player.SendNetworkUpdateImmediate();
                Kits?.Call("GiveKit", player, "bot", true);
                Kits?.Call("GiveKit", player, "bot", 0, true);
                XKits?.Call("GiveKit", player, "bot", true);
                Vector3 pos2 = bandit_town.transform.position + new Vector3(bandit_town.transform.forward.x * -19f, 1.8f, bandit_town.transform.forward.z * -22f);
                chair = GameManager.server.CreateEntity("assets/bundled/prefabs/static/chair.static.prefab", pos2);
                chair.enableSaving = false;
                chair.transform.localEulerAngles = bandit_town.transform.eulerAngles + new Vector3(0f, 45f);
                chair.Spawn();
                chair.GetComponent<BaseMountable>().MountPlayer(player);
                GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                sphere.transform.position = pos2;
                TriggerBase trigger = sphere.GetComponent<TriggerBase>() ?? sphere.gameObject.AddComponent<TriggerBase>();
                trigger.interestLayers = LayerMask.GetMask("Player (Server)");
                trigger.enabled = true;
                sphere.layer = (int)Layer.Reserved1;
                sphere.name = "Pepa";
                SphereCollider sphereCollider = sphere.GetComponent<SphereCollider>();
                sphereCollider.radius = 2f;
                sphereCollider.isTrigger = true;
                sphereCollider.enabled = true;
                gameObjects.Add(sphere);
            }
        }
        void agclose(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            DestroyUI(player);
        }
        void agcloseinfo(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            CuiHelper.DestroyUi(player, "questglobal");
        }
        void agopen(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            MenuLeftUI(player);
        }
        void agopeninfo(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null || !_page.Contains(player.userID)) return;
            GUIGlobal(player);
        }
        private bool TryGetPlayerView(BasePlayer player, out Quaternion viewAngle) {
            viewAngle = new Quaternion(0f, 0f, 0f, 0f);
            if (player.serverInput?.current == null) return false;
            viewAngle = Quaternion.Euler(player.serverInput.current.aimAngles);
            return true;
        }
        void revokeitem(PlayerInventory inv, string name, int amount) {
            List<Item> source2 = inv.FindItemIDs(FindItem(name).itemid).ToList();
            int num6 = 0;
            foreach (Item obj2 in source2) {
                int split_Amount = Mathf.Min(amount - num6, obj2.amount);
                (obj2.amount > split_Amount ? obj2.SplitItem(split_Amount) : obj2).DoRemove();
                num6 += split_Amount;
                if (num6 >= amount) break;
            }
        }
#region questprogress
        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
            if (entity == null || info == null) return;
            BasePlayer attacker = info.InitiatorPlayer;
            if (entity is BaseHelicopter) {
                List<BaseCombatEntity> Keys = LastHeliHit.Keys.ToList();
                if (Keys.Contains(entity)) {
                    BasePlayer player = BasePlayer.FindByID(LastHeliHit[entity]);
                    if (player != null) ProgressQuest(player, typequest.helicopter, 1);
                    LastHeliHit.Remove(entity);
                }
            }
            if (attacker != null) {
                if (entity is Wolf) {
                    ProgressQuest(attacker, typequest.wolf, 1);
                }
                else if (entity is Bear) {
                    ProgressQuest(attacker, typequest.bear, 1);
                }
                else if (entity is BradleyAPC) {
                    ProgressQuest(attacker, typequest.tank, 1);
                }
                else if (entity is ScientistNPC) {
                    if (entity.name.Equals("assets/rust.ai/agents/npcplayer/humannpc/heavyscientist/heavyscientist.prefab")) ProgressQuest(attacker, typequest.heavynpc, 1);
                }
            }
        }
        void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) {
            BasePlayer player = entity?.ToPlayer();
            if (player != null) {
                if (item.info.shortname.Equals("wood")) ProgressQuest(player, typequest.wood, item.amount);
                if (item.info.shortname.Equals("stones")) ProgressQuest(player, typequest.stones, item.amount);
            }
        }
        void OnCollectiblePickup(Item item, BasePlayer player) {
            if (player != null) {
                if (item.info.shortname.Equals("mushroom")) {
                    string user = player.UserIDString;
                    check(user);
                    if (currentquests[user].quests.Count(x => quests[x.Key].type == typequest.spoiledapple && !x.Value.finish) == 0) return;
                    float rand = Random.Range(0, 1f);
                    if (rand < 0.2f) {
                        giveitem(player, "apple.spoiled", 1);
                    }
                }
                else if (item.info.shortname.Equals("wood")) ProgressQuest(player, typequest.wood, item.amount);
                else if (item.info.shortname.Equals("stones")) ProgressQuest(player, typequest.stones, item.amount);
            }
        }
        void OnItemCraftFinished(ItemCraftTask task, Item item) {
            var player = task.owner;
            if (player != null) {
                if (item.info.shortname.Equals("autoturret") || item.info.shortname.Equals("samsite") || item.info.shortname.Equals("guntrap") || item.info.shortname.Equals("flameturret")) ProgressQuest(player, typequest.craftturel, item.amount);
            }
        }
        void ProgressQuest(BasePlayer player, typequest typer, int count) {
            string user = player.UserIDString;
            check(user);
            if (currentquests[user].quests.Count(x => quests[x.Key].type == typer && !x.Value.finish) == 0) return;
            List<string> keys = currentquests[user].quests.Keys.Where(x => quests[x].type == typer && currentquests[user].quests[x].count < quests[x].count).ToList();
            foreach (var z in keys) {
                currentquests[user].quests[z].count += count;
                if (currentquests[user].quests[z].count >= quests[z].count) {
                    GuiInfo(player, $"Задание ⟪{z}⟫ выполнено!\nЗаберите награду в городе.");
                    currentquests[user].quests[z].count = quests[z].count;
                }
                else if (typer.Equals(typequest.online)) {
                    if (onlinetimer.ContainsKey(player.UserIDString)) {
                        Timer ss = onlinetimer[player.UserIDString];
                        timer.Destroy(ref ss);
                        onlinetimer.Remove(player.UserIDString);
                    }
                    onlinetimer.Add(player.UserIDString, timer.Once(60, () => ProgressQuest(player, typequest.online, 1)));
                }
            }
        }
#endregion
#region guiinfo
        const string GUIINFO = "[{\"name\":\"MiddlePanelquest\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.00 0.00 0.50 0.2\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.6\",\"anchormax\":\"1.7\"}]},{\"name\":\"1c685dcb8da54498a6531a1f8c74ab27\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.3 0.3 0.3 0.95\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]},{\"name\":\"5ce694cf4a684bc89633e2ad1c3a2f0b\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{text}\",\"fontSize\":20,\"align\":\"MiddleCenter\",\"color\":\"1 1 1 0.5\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 1\",\"distance\":\"0.6 0.6\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.05 0\",\"anchormax\":\"0.95 1\"}]}]";
        Dictionary<string, Timer> timers = new Dictionary<string, Timer>();
        void GuiInfo(BasePlayer player, string text, float time = 3f) {
            Effect.server.Run("assets/bundled/prefabs/fx/notice/loot.drag.grab.fx.prefab", player.transform.position);
            Timer ss;
            if (timers.TryGetValue(player.UserIDString, out ss)) ss?.Destroy();
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "MiddlePanelquest");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "AddUI", GUIINFO.Replace("{text}", text));
            timers[player.UserIDString] = timer.Once(time, () => CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "MiddlePanelquest"));
        }
#endregion
        private Dictionary<BaseCombatEntity, ulong> LastHeliHit = new Dictionary<BaseCombatEntity, ulong>();
        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (entity == null) return;
            if (entity is BaseHelicopter && info.Initiator is BasePlayer) {
                LastHeliHit[entity] = info.InitiatorPlayer.userID;
            }
        }
        private void DestroyUI(BasePlayer player) {
            if (_page.Contains(player.userID)) _page.Remove(player.userID);
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "questglobal");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "questmainui");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "questui");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "MiddlePanelquest");
        }
        enum typequest {
            wolf, wood, bot1, heavynpc, stones, cookedfish, spoiledapple, bear, craftturel, online, helicopter, tank
        }
        class quest {
            public typequest type;
            public int count;
            public string description;
            public List<items> rewards;
        }
        class items {
            public string name;
            public int count;
            public string command;
            public string image;
        }
        Dictionary<string, quest> quests = new Dictionary<string, quest>();
        void check(string user) {
            if (!currentquests.ContainsKey(user)) currentquests.Add(user, new baseplayer());
        }
        Dictionary<string, Timer> onlinetimer = new Dictionary<string, Timer>();
        void agquest(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null || !arg.HasArgs()) return;
            check(player.UserIDString);
            string name = string.Join(" ", arg.Args.Skip(0));
            if (!quests.ContainsKey(name)) {
                GuiInfo(player, "Задание не найдено!");
                return;
            }
            if (currentquests[player.UserIDString].quests.Count() >= 5) {
                GuiInfo(player, "В день можно выполнить только 5 заданий.");
                return;
            }
            if (player.Distance(scientist) > 2f) {
                GuiInfo(player, $"Взять задание можно у {scientist.ToPlayer().displayName}а в мирном городе!");
                return;
            }
            if (currentquests[player.UserIDString].quests.ContainsKey(name)) {
                GuiInfo(player, "Вы уже выполняете это задание!");
                return;
            }
            if (quests[name].type == typequest.bot1) {
                giveitem(player, "blood", 3);
            }
            if (quests[name].type == typequest.online) {
                if (onlinetimer.ContainsKey(player.UserIDString)) {
                    Timer ss = onlinetimer[player.UserIDString];
                    timer.Destroy(ref ss);
                    onlinetimer.Remove(player.UserIDString);
                }
                onlinetimer.Add(player.UserIDString, timer.Once(60, () => ProgressQuest(player, typequest.online, 1)));
            }
            currentquests[player.UserIDString].quests.Add(name, new currentquest());
            MenuLeftUI(player);
            if (quests[name].type == typequest.cookedfish || quests[name].type == typequest.spoiledapple) currentquests[player.UserIDString].quests[name].count = quests[name].count;
        }
        bool haveinventory(PlayerInventory inv, string name, int count, string desc = null) {
            List<Item> source2 = new List<Item>();
            if (FindItem(name) != null) source2 = inv.FindItemIDs(FindItem(name).itemid).ToList();
            if (source2.Count > 0) {
                int num3 = source2.Sum<Item>((Func<Item, int>)(x => x.amount));
                if (num3 >= count) return true;
            }
            return false;
        }
        void agquestbandit(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null || arg.HasArgs()) return;
            check(player.UserIDString);
            string name = quests.Where(x => x.Value.type == typequest.bot1).FirstOrDefault().Key;
            if (player.Distance(bandit) > 2f) return;
            if (!currentquests[player.UserIDString].quests.ContainsKey(name) || currentquests[player.UserIDString].quests[name].count >= quests[name].count) {
                List<string> messages = new List<string> {
                    "власть, заставляющая уважать себя на законодательном уровне, только за одно это заслуживает всего лишь презрение.", "актеры в советских фильмах с каждым годом играют все лучше.", "любой червяк может попасть в яблочко!", "я готовлю хреново, зато как наливаю!", "нa cxoдкe в Maгaданe виpyc был pacкopoнoвaн.", "иногда бывает так плохо, что не знаешь: или 03 набрать, или 0,5 открыть…", "сейчас проблема не в том, что мы пользуемся говном китайского производства, а в том, что сами и такого не производим.", "мой друг любит кофе, я предпочитаю чай, поэтому, когда мы встречаемся, то пьем водку.", "верующих много.Одни верят в Бога.Другие – в деньги.Знающих мало."
                }
                ;
                GuiInfo(player, "Авдос: " + messages[Random.Range(0, messages.Count())], 4f);
                return;
            }
            if (!haveinventory(player.inventory, "antiradpills", 1)) {
                GuiInfo(player, "Авдос: " + "без пилюлей мне не о чем с тобой разговарить!", 3f);
                return;
            }
            if (!haveinventory(player.inventory, "blood", 3)) {
                GuiInfo(player, "Авдос: " + "где кровь то?", 3f);
                return;
            }
            revokeitem(player.inventory, "blood", 3);
            revokeitem(player.inventory, "antiradpills", 1);
            ProgressQuest(player, typequest.bot1, 1);
        }
        void agquestrefresh(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null || !arg.HasArgs() || arg.Args.Length != 1) return;
            int INT;
            bool isint = int.TryParse(arg.Args[0], out INT);
            if (!isint) return;
            check(player.UserIDString);
            if (!currentquests[player.UserIDString].refresh) {
                if (currentquests[player.UserIDString].quests.Count() > 0 && !player.IsAdmin) {
                    GuiInfo(player, "Нельзя обновить задания, если у вас есть активные задания или выполненые!");
                    return;
                }
                if (!haveinventory(player.inventory, "apple", 10)) {
                    GuiInfo(player, "Для обновления заданий нужно 10 яблок!");
                    return;
                }
                revokeitem(player.inventory, "apple", 10);
            }
            if (INT == 1) refreshlist(player.UserIDString);
            currentquests[player.UserIDString].refresh = false;
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "MiddlePanelquest");
            MenuLeftUI(player);
            if (INT == 1) if (!currentquests[player.UserIDString].refresh) GuiInfo(player, "Задания обновлены!");
        }
        void refreshlist(string user) {
            List<string> list = quests.Keys.ToList();
            List<string> list2 = new List<string>();
            for (int i = 0; i < 6; i++) {
                if (list.Count() == 0) break;
                int rand = Random.Range(0, list.Count());
                list2.Add(list[rand]);
                list.Remove(list[rand]);
            }
            currentquests[user].quests.Clear();
            currentquests[user].listquests = list2;
        }
        void agquestend(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null || !arg.HasArgs()) return;
            check(player.UserIDString);
            string name = string.Join(" ", arg.Args.Skip(0));
            if (!quests.ContainsKey(name)) {
                GuiInfo(player, "Задание не найдено!");
                return;
            }
            if (!currentquests[player.UserIDString].quests.ContainsKey(name)) {
                GuiInfo(player, "У вас нет такого задания!");
                return;
            }
            if (currentquests[player.UserIDString].quests[name].count < quests[name].count) {
                GuiInfo(player, "Задание не выполнено!");
                return;
            }
            if (Vector3.Distance(player.transform.position, scientist.transform.position) > 2f) {
                GuiInfo(player, $"Награду нужно забрать у {scientist.ToPlayer().displayName}а!");
                return;
            }
            if (currentquests[player.UserIDString].quests[name].finish) {
                GuiInfo(player, "Вы уже получили награду за это задание!");
                return;
            }
            if (quests[name].type == typequest.wood && !haveinventory(player.inventory, "wood", quests[name].count)) {
                GuiInfo(player, "А где дерево? Нарубить - нарубил, а принести забыл...");
                return;
            }
            if (quests[name].type == typequest.stones && !haveinventory(player.inventory, "stones", quests[name].count)) {
                GuiInfo(player, "А где камень? Добыть - добыл, а принести забыл...");
                return;
            }
            if (quests[name].type == typequest.cookedfish && !haveinventory(player.inventory, "fish.cooked", quests[name].count)) {
                GuiInfo(player, "Ну и где же мой завтрак?");
                return;
            }
            if (quests[name].type == typequest.cookedfish && !haveinventory(player.inventory, "fish.cooked", quests[name].count)) {
                GuiInfo(player, "Ну и где же мой завтрак?");
                return;
            }
            if (quests[name].type == typequest.spoiledapple && !haveinventory(player.inventory, "fertilizer", quests[name].count)) {
                GuiInfo(player, "Принеси мне мое удобрение!");
                return;
            }
            if (quests[name].type == typequest.wood) revokeitem(player.inventory, "wood", quests[name].count);
            else if (quests[name].type == typequest.stones) revokeitem(player.inventory, "stones", quests[name].count);
            else if (quests[name].type == typequest.cookedfish) revokeitem(player.inventory, "fish.cooked", quests[name].count);
            else if (quests[name].type == typequest.spoiledapple) revokeitem(player.inventory, "fertilizer", quests[name].count);
            foreach (var z in quests[name].rewards) {
                if (z.command == null) {
                    giveitem(player, z.name, z.count);
                }
                else {
                    Server.Command(z.command.Replace("{steamid}", player.UserIDString));
                }
            }
            currentquests[player.UserIDString].quests[name].finish = true;
            MenuLeftUI(player);
            LogIt($"[{DateTime.Now.ToShortDateString()}] Выполнил задание - {player.displayName} ({player.UserIDString}) - {name}");
            if (quests[name].type == typequest.spoiledapple) GuiInfo(player, "Спасибо, с этим удобрением процессы мутации ускорились, как минимум на десять суток! Награда получена.", 3f);
            else GuiInfo(player, "Награда получена.", 2f);
        }
        void LogIt(string text) {
            logs.Add(text);
        }
        void giveitem(BasePlayer player, string name, int amount) {
            Item item = ItemManager.Create(FindItem(name));
            item.amount = amount;
            player.GiveItem(item, BaseEntity.GiveItemReason.PickedUp);
        }
        void agquestremove(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null || !arg.HasArgs()) return;
            check(player.UserIDString);
            string name = string.Join(" ", arg.Args.Skip(0));
            if (!quests.ContainsKey(name)) {
                GuiInfo(player, "Задание не найдено!");
                return;
            }
            if (Vector3.Distance(player.transform.position, scientist.transform.position) > 2f) {
                GuiInfo(player, $"Отменить задание можно у {scientist.ToPlayer().displayName}а!");
                return;
            }
            if (!currentquests[player.UserIDString].quests.ContainsKey(name)) {
                GuiInfo(player, "У вас нет такого задания!");
                return;
            }
            if (quests[name].type == typequest.bot1 && !haveinventory(player.inventory, "blood", 3)) {
                GuiInfo(player, "Это задание нельзя отменить без предметов которые вам дали для выполнения его!");
                return;
            }
            if (quests[name].type == typequest.bot1) {
                revokeitem(player.inventory, "blood", 3);
            }
            currentquests[player.UserIDString].quests.Remove(name);
            MenuLeftUI(player);
        }
#region GUI
        const string GLOBALGUI = "[{\"name\":\"questglobal\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.1 0.1 0.1 0.98\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]}{main},{\"name\":\"ea83ada0eb804d15a57f1da9d9960136\",\"parent\":\"questglobal\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"quest.infoexit\",\"material\":\"assets/content/ui/uibackgroundblur-ingamemenu.mat\",\"color\":\"0 0 0 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]}]";
        const string GLOBALMAIN = ",{\"name\":\"50dd878184b2434abd8f5a695393426c\",\"parent\":\"questglobal\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.3 0.3 0.3 0.9\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.35 {end}\",\"anchormax\":\"0.7 {start}\"}]},{\"name\":\"4d1209178ec244e6a1c09421e4401856\",\"parent\":\"questglobal\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.3 0.6 0.3 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.35 {end}\",\"anchormax\":\"{xmax} {start}\"}]},{\"name\":\"600b5e0444304a62a7711f74c59802f5\",\"parent\":\"questglobal\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{key}\",\"fontSize\":16,\"align\":\"MiddleLeft\",\"color\":\"1 1 1 0.5\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 1\",\"distance\":\"0.6 0.6\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.36 {end}\",\"anchormax\":\"0.7 {start}\"}]},{\"name\":\"6987ef1611f64b8fa4be65331d711cd5\",\"parent\":\"questglobal\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{count}\",\"fontSize\":16,\"align\":\"MiddleRight\",\"color\":\"1 1 1 0.5\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 1\",\"distance\":\"0.6 0.6\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.36 {end}\",\"anchormax\":\"0.69 {start}\"}]}";
        const string GLOBALNOMAIN = ",{\"name\":\"bb6154fe410c47f990078f31371ae657\",\"parent\":\"questglobal\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"У вас нет активных заданий\",\"fontSize\":16,\"align\":\"MiddleCenter\",\"color\":\"1 1 1 0.5\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 1\",\"distance\":\"0.6 0.6\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.4 0.55\",\"anchormax\":\"0.6 0.65\"}]}";
        private void GUIGlobal(BasePlayer player) {
            check(player.UserIDString);
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", "questglobal");
            string GUI = "";
            float start = 0.7f;
            float end = 0f;
            if (currentquests[player.UserIDString].quests.Count > 0) {
                foreach (var z in currentquests[player.UserIDString].quests.Where(x => !x.Value.finish)) {
                    end = start - 0.05f;
                    GUI += GLOBALMAIN.Replace("{count}", $"{z.Value.count}/{quests[z.Key].count}").Replace("{end}", end.ToString()).Replace("{key}", z.Key).Replace("{xmax}", (0.35f + z.Value.count * 1f / quests[z.Key].count * 0.35f).ToString()).Replace("{start}", start.ToString());
                    start -= start - end + 0.005f;
                }
            }
            else GUI += GLOBALNOMAIN;
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "AddUI", GLOBALGUI.Replace("{main}", GUI));
        }
        const string MAINGUI = "[{\"name\":\"questui\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.005 0.005 0.005 0.99\",\"fadeIn\":0.5},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"},{\"type\":\"NeedsCursor\"}]},{\"name\":\"961b572ae9bd47678cb0a9d23ea44fd2\",\"parent\":\"questui\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"quest.refresh 1\",\"material\":\"assets/content/ui/uibackgroundblur-ingamemenu.mat\",\"color\":\"1.00 0.00 0.50 0.20\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.27 0.02\",\"anchormax\":\"0.42 0.07\"}]},{\"parent\":\"961b572ae9bd47678cb0a9d23ea44fd2\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Обновить задания\",\"fontSize\":16,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\"}]},{\"name\":\"2471f5bee84246e4904e8f0eb8ab9236\",\"parent\":\"questui\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"quest.info\",\"material\":\"assets/content/ui/uibackgroundblur-ingamemenu.mat\",\"color\":\"0.00 1.00 0.00 0.20\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.44 0.02\",\"anchormax\":\"0.64 0.07\"}]},{\"parent\":\"2471f5bee84246e4904e8f0eb8ab9236\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Прогресс выполнения\",\"fontSize\":16,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\"}]},{\"name\":\"ffe15c9be17b44a9830d55c4e0319d95\",\"parent\":\"questui\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"quest.exit\",\"material\":\"assets/content/ui/uibackgroundblur-ingamemenu.mat\",\"color\":\"1.00 0.00 0.00 0.20\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.66 0.02\",\"anchormax\":\"0.8 0.07\"}]},{\"parent\":\"ffe15c9be17b44a9830d55c4e0319d95\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выйти\",\"fontSize\":16,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\"}]}]";
        private void MenuLeftUI(BasePlayer player, int type = 1, int next = 0) {
            check(player.UserIDString);
            if (currentquests[player.UserIDString].listquests.Count == 0) {
                refreshlist(player.UserIDString);
                timer.Once(0.1f, () => MenuLeftUI(player, type, next));
                return;
            }
            if (!_page.Contains(player.userID)) {
                _page.Add(player.userID);
                CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                    connection = player.net.connection
                }
                , null, "DestroyUI", "questui");
                CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                    connection = player.net.connection
                }
                , null, "AddUI", MAINGUI);
            }
            var container = LMUI.CreateElementContainer("questmain", "0 0 0 0", "0 0.1", "1 1", false, "questui");
            float start = 0.98f;
            float xline = 0.1f;
            float end = 0f;
            int i = 0;
            foreach (var z in currentquests[player.UserIDString].listquests) {
                end = start - 0.29f * 1.1f;
                LMUI.CreatePanel(ref container, "questmain", "0.3 0.3 0.3 0.4", xline + " " + end, (xline + 0.38f) + " " + start);
                if (!currentquests[player.UserIDString].quests.ContainsKey(z)) LMUI.CreateButton(ref container, "questmain", "1.00 0.50 0.00 0.20", "Выполнить", 16, (xline + 0.3f) + " " + (start - 0.05f), (xline + 0.38f) + " " + (start - 0.01f), "quest.take " + z);
                else if (currentquests[player.UserIDString].quests.ContainsKey(z) && !currentquests[player.UserIDString].quests[z].finish && currentquests[player.UserIDString].quests[z].count < quests[z].count) LMUI.CreateButton(ref container, "questmain", "0.7 0.5 0.5 0.4", "Отказаться", 16, (xline + 0.3f) + " " + (start - 0.05f), (xline + 0.38f) + " " + (start - 0.01f), "quest.remove " + z);
                else if (currentquests[player.UserIDString].quests.ContainsKey(z) && !currentquests[player.UserIDString].quests[z].finish && currentquests[player.UserIDString].quests[z].count >= quests[z].count) LMUI.CreateButton(ref container, "questmain", "0.5 0.5 0.7 0.4", "Завершить задание", 16, (xline + 0.26f) + " " + (start - 0.05f), (xline + 0.38f) + " " + (start - 0.01f), "quest.end " + z);
                else LMUI.CreateButton(ref container, "questmain", "0.5 0.5 0.7 0.4", "Выполнено", 16, (xline + 0.3f) + " " + (start - 0.05f), (xline + 0.38f) + " " + (start - 0.01f), "");
                LMUI.CreateLabel(ref container, "questmain", "1 1 1 0.9", "<b>" + z + "</b>", 19, xline + " " + (start - 0.05f), (xline + 0.3f) + " " + (start - 0.01f), TextAnchor.MiddleCenter);
                LMUI.CreateLabel(ref container, "questmain", "1 1 1 0.5", quests[z].description, 13, (xline + 0.005f) + " " + (start - 0.15f), (xline + 0.375f) + " " + (start - 0.06f), TextAnchor.UpperLeft, "Robotocondensed-regular.ttf");
                LMUI.CreateLabel(ref container, "questmain", "1 1 1 0.5", "<color=#F0E68C>НАГРАДА ЗА ВЫПОЛНЕНИЕ ЗАДАНИЯ</color>", 13, (xline + 0.005f) + " " + (start - 0.18f), (xline + 0.375f) + " " + (start - 0.15f), TextAnchor.MiddleCenter, "Droidsansmono.ttf");
                float Xstart = 0.04f;
                float Xend = 0f;
                foreach (var x in quests[z].rewards) {
                    Xend = Xstart + 0.05f;
                    LMUI.CreatePanel(ref container, "questmain", "0.3 0.3 0.3 0.4", (xline + Xstart) + " " + (start - 0.28f), (xline + Xend) + " " + (start - 0.19f));
                    LMUI.LoadImage(ref container, "questmain", GetImage(x.command == null ? x.name : x.image), (xline + Xstart + 0.005f) + " " + (start - 0.27f), (xline + Xend - 0.005f) + " " + (start - 0.2f));
                    LMUI.CreateLabel(ref container, "questmain", "1 1 1 0.5", "x" + x.count, 14, (xline + Xstart) + " " + (start - 0.28f), (xline + Xend - 0.001f) + " " + (start - 0.19f), TextAnchor.LowerRight);
                    Xstart += Xend - Xstart + 0.01f;
                }
                if (i == 2) {
                    xline = 0.52f;
                    start = 0.98f;
                }
                else start -= start - end + 0.01f;
                i++;
            }
            CuiHelper.DestroyUi(player, "questmain");
            CuiHelper.AddUi(player, container);
            if (currentquests[player.UserIDString].refresh) {
                Effect.server.Run("assets/bundled/prefabs/fx/notice/loot.drag.grab.fx.prefab", player.transform.position);
                CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                    connection = player.net.connection
                }
                , null, "DestroyUI", "MiddlePanelquest");
                CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                    connection = player.net.connection
                }
                , null, "AddUI", REFRESHUI);
            }
        }
        const string REFRESHUI = "[{\"name\":\"MiddlePanelquest\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.1 0.1 0.1 0.98\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]},{\"name\":\"db7b79d51fc348fe8f594c9270c06b28\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.005 0.005 0.005 0.9\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]},{\"name\":\"e8a1339c1c8849fa97ac73922190e28b\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.3 0.3 0.3 0.9\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.55\",\"anchormax\":\"1 0.7\"}]},{\"name\":\"fa329e2eacc545f5a4c524272654748d\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Доступно обновление квестов, обновление сбросит прогресс текущих заданий, обновить?\",\"fontSize\":20,\"align\":\"MiddleCenter\",\"color\":\"1 1 1 0.5\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 1\",\"distance\":\"0.6 0.6\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.05 0.6\",\"anchormax\":\"0.95 0.7\"}]},{\"name\":\"81a491a92be54c4f86360124fb555204\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"quest.refresh 1\",\"color\":\"0.3 0.7 0.3 0.8\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.4 0.57\",\"anchormax\":\"0.48 0.61\"}]},{\"parent\":\"81a491a92be54c4f86360124fb555204\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Да\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\"}]},{\"name\":\"04a8e472463c47ff8a55ba274bc28428\",\"parent\":\"MiddlePanelquest\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"quest.refresh 0\",\"material\":\"assets/content/ui/uibackgroundblur-ingamemenu.mat\",\"color\":\"0.7 0.3 0.3 0.8\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.52 0.57\",\"anchormax\":\"0.6 0.61\"}]},{\"parent\":\"04a8e472463c47ff8a55ba274bc28428\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Нет\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\"}]}]";
#endregion
        private void Unload() {
            if (scientist != null) scientist.Kill();
            if (bandit != null) bandit.Kill();
            if (chair != null) chair.Kill();
            foreach (var z in gameObjects.ToList()) UnityEngine.GameObject.Destroy(z);
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = Network.Net.sv.connections
            }
            , null, "DestroyUI", "questmain");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = Network.Net.sv.connections
            }
            , null, "DestroyUI", "questglobal");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = Network.Net.sv.connections
            }
            , null, "DestroyUI", "questmainui");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = Network.Net.sv.connections
            }
            , null, "DestroyUI", "questui");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = Network.Net.sv.connections
            }
            , null, "DestroyUI", "MiddlePanelquest");
            SaveData();
            SaveQuests();
        }
        private void SaveData() => Interface.Oxide.DataFileSystem.WriteObject("quest_players", currentquests);
        private void SaveQuests() {
            Interface.Oxide.DataFileSystem.WriteObject("quest_data", quests);
            Interface.Oxide.DataFileSystem.WriteObject("quest_logs", logs);
        }
        private void chatcommandquest(BasePlayer player, string cmd) {
            MenuLeftUI(player);
        }
        private void timernextday() {
            //86400 - DateTime.UtcNow.AddHours(3).Hour * 3600 - DateTime.UtcNow.Minute * 60 - DateTime.UtcNow.Second
            timer.Once(86400 - DateTime.UtcNow.AddHours(3).Hour * 3600 - DateTime.UtcNow.Minute * 60 - DateTime.UtcNow.Second, () => {
                List<string> zk = currentquests.Keys.ToList();
                foreach (var z in zk) {
                    if (!currentquests[z].refresh) currentquests[z].refresh = true;
                }
                SaveData();
                timernextday();
            }
            );
        }
        void OnPlayerDisconnected(BasePlayer player, string reason) {
            if (onlinetimer.ContainsKey(player.UserIDString)) {
                Timer ss = onlinetimer[player.UserIDString];
                timer.Destroy(ref ss);
                onlinetimer.Remove(player.UserIDString);
            }
        }
        void OnPlayerConnected(BasePlayer player) {
            ProgressQuest(player, typequest.online, 1);
        }
        static List<string> logs = new List<string>();
        private void OnServerInitialized() {
            LoadConfig();
            currentquests = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, baseplayer>>("quest_players");
            logs = Interface.Oxide.DataFileSystem.ReadObject<List<string>>("quest_logs");
            quests = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, quest>>("quest_data");
            if (quests.Count() == 0) {
                quests.Add("Скрывающийся оборотень", new quest {
                    type = typequest.wolf, count = 5, rewards = new List<items>() {
                        new items {
                            name = "rifle.ak", count = 1
                        }
                        , new items {
                            name = "wood", count = 5000
                        }
                        , new items {
                            name = "wood", count = 5000
                        }
                        , new items {
                            name = "wood", count = 5000
                        }
                        , new items {
                            name = "wood", count = 5000
                        }
                    }
                    , description = "Так как вампиры появляются ночью, у них случаются столкновения с другими ночными существами,
// ... [Code preview truncated due to length. Full source in attached file] ...

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