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

FREE SleeperMark : 1.0.23 1.0.23

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Rust;
using System.Linq;
using System.Globalization;
using Facepunch;
using UnityEngine.SceneManagement;
using Newtonsoft.Json;
namespace Oxide.Plugins {
    [Info("Sleeper Mark", "Ts3Hosting", "1.0.23")]
    [Description("Create a event to mark sleepers to be killed by players")]
    public class SleeperMark : RustPlugin {
        [PluginReference]
        Plugin GUIAnnouncements, ServerRewards;
        Dictionary<ulong, HitInfo> LastWounded = new Dictionary<ulong, HitInfo>();
        static HashSet<PlayerData> LoadedPlayerData = new HashSet<PlayerData>();
        List<UIObject> UsedUI = new List<UIObject>();
        PlayerEntity pcdData;
        private DynamicConfigFile PCDDATA;
        private bool Changed;
        public bool debug = false;
        private int cooldownTime = 120;
        private bool useRewards = false;
        private bool useguiAnnounce = false;
        private bool useAirdrop = true;
        private bool useBloon = false;
        private int LastSeenSeconds = 259200;
        private int reward = 250;
        public bool EventStarted = false;
        public bool hitBalloon = false;
        public bool hitPlayer = false;
        public bool lockcrate = false;
        public bool usedirection = true;
        private int locktime = 120;
        private int CrateAmount;
        public uint BloonNetID;
        public BasePlayer eventplayer;
        public LockedByEntCrate locked;
        public bool Effects = true;
        float max = TerrainMeta.Size.x / 2;
        const string bloonprefab = "assets/prefabs/deployable/hot air balloon/hotairballoon.prefab";
        const string c4Explosion = "assets/prefabs/npc/patrol helicopter/effects/rocket_explosion.prefab";
        const string boom = "assets/prefabs/npc/patrol helicopter/effects/heli_explosion.prefab";
        const string crates = "assets/prefabs/npc/patrol helicopter/heli_crate.prefab";
        const string supply = "assets/prefabs/misc/supply drop/supply_drop.prefab";
        const string fireball = "assets/bundled/prefabs/oilfireballsmall.prefab";
        private HashSet<LockedByEntCrate> lockedCrates = new HashSet<LockedByEntCrate>();
        public StorageContainer fuelTank;
        string colorTextMsg;
        string colorTextMsgB;
        private new void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["Location"]
                = "Kill the sleeper <color=green>{0}</color> at Loc X= <color=red>{1}</color>, Z= <color=red>{2}</color> and get a reward!", ["noperm"] = "You do not have permissions to use this command!", ["found"] = "<color=green> {0}</color> has been found by <color=red>{1}</color>!", ["dead"] = "<color=green> {0}</color> has been killed by <color=red>{1}</color> and he received <color=orange>{2}</color> RP for his service!", ["msgNorth"] = "North", ["msgNorthEast"] = "NorthEast", ["msgEast"] = "East", ["msgSouthEast"] = "SouthEast", ["msgSouth"] = "South", ["msgSouthWest"] = "SouthWest", ["msgWest"] = "West", ["msgNorthWest"] = "NorthWest", ["NoRewards"] = "<color=green> {0}</color> has been killed by <color=red>{1}</color>", ["noSleepers"] = "No sleepers have been sleeping to long to start event!", ["eventstarted"] = "There is one event already started!", ["reset"] = "Sleep data reset events!", ["NoEvent"] = "There is no event running!", ["CoolDown"] = "You are on cooldown, Try again in {0} seconds!", ["LocationBloon"] = "Kill the sleeper <color=green>{0}</color> at Loc X= <color=red>{1}</color>, Z= <color=red>{2}</color> He is flying around in the bloon and get a reward!", ["LocationBloonDirection"] = "Kill the sleeper <color=green>{2}</color> He is flying around in the bloon at Loc X= <color=red>{3}</color>, Z= <color=red>{4}</color> and get a reward!\nThey are  <color=yellow>{0:F0}m</color> away from you at direction <color=yellow>{1}</color>", ["LocationDirection"] = "Kill the sleeper <color=green>{2}</color> at Loc X= <color=red>{3}</color>, Z= <color=red>{4}</color> and get a reward!\nThey are  <color=yellow>{0:F0}m</color> away from you at direction <color=yellow>{1}</color>", ["help"] = "/sleeper commands are - event - score - topscore -",
            }
            , this);
        }
        void Unload() {
            EventEnd();
            foreach (BasePlayer player in BasePlayer.activePlayerList.ToList()) {
                foreach (var ui in UsedUI) ui.Destroy(player);
            }
        }
        void Init() {
            PCDDATA = Interface.Oxide.DataFileSystem.GetFile("SleeperMark/SleeperMark_Player");
            LoadData();
            LoadVariables();
            RegisterPermissions();
            resetdataboot();
        }
        void OnServerInitialized() {
            CheckDependencies();
            lockedCrates = new HashSet<LockedByEntCrate>(GameObject.FindObjectsOfType<LockedByEntCrate>());
            foreach (var player in BasePlayer.activePlayerList.ToList()) {
                PlayerData.TryLoad(player);
                LoadSleepers();
            }
        }
        private void RegisterPermissions() {
            permission.RegisterPermission("SleeperMark.admin", this);
            permission.RegisterPermission("SleeperMark.ignore", this);
            permission.RegisterPermission("SleeperMark.use", this);
        }
        object GetConfig(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;
                Changed = true;
            }
            object value;
            if (!data.TryGetValue(datavalue, out value)) {
                value = defaultValue;
                data[datavalue] = value;
                Changed = true;
            }
            return value;
        }
        void LoadVariables() {
            debug = Convert.ToBoolean(GetConfig("SETTINGS", "Debug", false));
            useRewards = Convert.ToBoolean(GetConfig("SETTINGS", "useRewards", false));
            LastSeenSeconds = Convert.ToInt32(GetConfig("SETTINGS", "LastSeenSeconds", 259200));
            reward = Convert.ToInt32(GetConfig("SETTINGS", "reward", 250));
            useguiAnnounce = Convert.ToBoolean(GetConfig("SETTINGS", "usegui", false));
            useBloon = Convert.ToBoolean(GetConfig("SETTINGS", "useBloon", false));
            usedirection = Convert.ToBoolean(GetConfig("Generic", "Broadcast direction in chat messages", true));
            useAirdrop = Convert.ToBoolean(GetConfig("LootDrops", "useLootCrates", true));
            lockcrate = Convert.ToBoolean(GetConfig("LootDrops", "LockLootCrates", true));
            locktime = Convert.ToInt32(GetConfig("LootDrops", "LockTimeCrate", 120));
            CrateAmount = Convert.ToInt32(GetConfig("LootDrops", "CrateAmount", 3));
            cooldownTime = Convert.ToInt32(GetConfig("SETTINGS", "cooldownTime", 120));
            colorTextMsg = Convert.ToString(GetConfig("Generic", "UI Broadcast messages color", "yellow"));
            colorTextMsgB = Convert.ToString(GetConfig("Generic", "UI Broadcast messages Background color", "purple"));
            Puts("Config Loaded");
            if (Changed) {
                SaveConfig();
                Changed = false;
            }
        }
        protected override void LoadDefaultConfig() {
            Puts("Creating a new configuration file!");
            LoadVariables();
        }
        private void CheckDependencies() {
            if (ServerRewards == null) {
                PrintWarning($"ServerRewards could not be found! Disabling RP feature");
                useRewards = false;
            }
            if (ServerRewards && !useRewards) {
                Puts("ServerReward found but not enabled in config.");
            }
            if (GUIAnnouncements == null) {
                PrintWarning($"guiAnnounce could not be found! Disabling guiAnnounce feature");
                useguiAnnounce = false;
            }
            if (GUIAnnouncements && !useguiAnnounce) {
                Puts("GUIAnnouncements found but not enabled in config.");
            }
        }
        void LoadData() {
            try {
                pcdData = Interface.Oxide.DataFileSystem.ReadObject<PlayerEntity>("SleeperMark/SleeperMark_Player");
            }
            catch {
                Puts("Couldn't load Sleep data, creating new Playerfile");
                pcdData = new PlayerEntity();
            }
        }
        class PlayerEntity {
            public Dictionary<ulong, PCDInfo> pEntity = new Dictionary<ulong, PCDInfo>();
            public PlayerEntity() {
            }
        }
        class PCDInfo {
            public long LogOutDay;
            public float LocEntityX;
            public float LocEntityY;
            public float LocEntityZ;
            public uint BloonID;
            public long Cooldown;
            public PCDInfo() {
            }
            public PCDInfo(long cd) {
            }
        }
        void SaveData() {
            PCDDATA.WriteObject(pcdData);
        }
        private void OnPlayerDisconnected(BasePlayer player) {
            ulong playerId = player.userID;
            double timeStamp = GrabCurrentTime();
            if (!pcdData.pEntity.ContainsKey(playerId)) {
                pcdData.pEntity.Add(playerId, new PCDInfo());
                pcdData.pEntity[playerId].LogOutDay = (long)timeStamp;
                pcdData.pEntity[playerId].LocEntityX = player.transform.position.x;
                pcdData.pEntity[playerId].LocEntityY = player.transform.position.y;
                pcdData.pEntity[playerId].LocEntityZ = player.transform.position.z;
                SaveData();
            }
            else {
                pcdData.pEntity[playerId].LogOutDay = (long)timeStamp;
                pcdData.pEntity[playerId].LocEntityX = player.transform.position.x;
                pcdData.pEntity[playerId].LocEntityY = player.transform.position.y;
                pcdData.pEntity[playerId].LocEntityZ = player.transform.position.z;
                SaveData();
            }
        }
        readonly Dictionary<ulong, Timer> timers = new Dictionary<ulong, Timer>();
        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (info == null) return;
            if (info.Initiator == null) return;
            if (entity == null) return;
            if (!EventStarted) return;
            if (!hitBalloon && entity is HotAirBalloon && EventStarted && entity.net.ID == BloonNetID && (info.Initiator is BasePlayer)) {
                var controller = entity.GetComponent<HotAirBalloon>();
                hitBalloon = true;
                controller.SetFlag(BaseEntity.Flags.On, false);
                controller.windForce = 1000f;
                if (Effects) {
                    Effect.server.Run(boom, entity.transform.position + Vector3.up * 6);
                    timer.Repeat(2, 10, () => {
                        if (entity != null && EventStarted) Effect.server.Run(c4Explosion, entity.transform.position + Vector3.up * 6);
                    }
                    );
                }
                timer.Once(160, () => {
                    hitBalloon = false;
                    controller.SetFlag(BaseEntity.Flags.On, true);
                    controller.windForce = 0f;
                }
                );
            }
            if (!entity || !(entity is BasePlayer) || !(info.Initiator is BasePlayer) || info.Initiator is NPCMurderer || info.Initiator is BaseNpc || info.Initiator is NPCPlayerApex || entity is NPCMurderer || entity is BaseNpc || entity is NPCPlayerApex || entity is HTNPlayer || info.Initiator is HTNPlayer) return;
            BasePlayer player = entity as BasePlayer;
            var attacker = info.Initiator as BasePlayer;
            if (!player.userID.IsSteamId() || !attacker.userID.IsSteamId()) return;
            if (!player.IsSleeping()) return;
            ulong playerId = player.userID;
            double timeStamp = GrabCurrentTime();
            var t = pcdData.pEntity[playerId].LogOutDay + LastSeenSeconds;
            if (player.IsSleeping() && (playerId == eventplayer.userID) && (timeStamp > t) && (!hitPlayer) && (EventStarted)) {
                PrintToChat(string.Format(lang.GetMessage("found", this), player.displayName, attacker.displayName));
                hitPlayer = true;
                return;
            }
        }
        void OnPlayerInit(BasePlayer player) {
            PlayerData.TryLoad(player);
        }
        void rewardplayer(BasePlayer player, BasePlayer attacker) {
            if (debug) Puts("Debug running rewards Start...");
            PlayerData victimData = PlayerData.Find(player);
            PlayerData attackerData = PlayerData.Find(attacker);
            if (victimData != null || attackerData != null) {
                if (debug) Puts("Debug running Scoreboard under rewards Start...");
                attackerData.kills++;
                victimData.deaths++;
                attackerData.Save();
                victimData.Save();
            }
            if (useAirdrop && attacker != null) {
                SpawnLoot(CrateAmount, attacker);
            }
            if (useRewards) {
                if (debug) Puts("Running Use Rewards");
                PrintToChat(string.Format(lang.GetMessage("dead", this), player.displayName, attacker.displayName, reward));
                Effect.server.Run("assets/bundled/prefabs/fx/explosions/explosion_01.prefab", attacker.transform.position);
                EventEnd();
                ServerRewards?.Call("AddPoints", attacker.userID, (int)reward);
            }
            else {
                if (debug) Puts("Running Not Use Rewards");
                PrintToChat(string.Format(lang.GetMessage("NoRewards", this), player.displayName, attacker.displayName));
                Effect.server.Run("assets/bundled/prefabs/fx/explosions/explosion_01.prefab", attacker.transform.position);
                EventEnd();
            }
        }
        void OnEntityDeath(BaseCombatEntity victimEntity, HitInfo info) {
            if (info == null) return;
            if (info.Initiator == null) return;
            if (victimEntity == null) return;
            if (!EventStarted) return;
            if (info.Initiator is NPCMurderer || info.Initiator is BaseNpc || info.Initiator is NPCPlayerApex || victimEntity is NPCMurderer || victimEntity is BaseNpc || victimEntity is NPCPlayerApex || victimEntity is HTNPlayer || info.Initiator is HTNPlayer) return;
            if (debug) Puts("Running OnEntityDeath");
            if ((victimEntity is BasePlayer) && !(info.Initiator is BasePlayer)) {
                BasePlayer player4 = victimEntity as BasePlayer;
                if (player4.userID == eventplayer.userID) EventEnd();
                if (debug) Puts("Player killed By Unknown.");
            }
            if ((victimEntity is HotAirBalloon) && !(info.Initiator is BasePlayer) && victimEntity.net.ID == BloonNetID) {
                EventEnd();
                if (debug) Puts("Bloon Destroyed By Unknown");
            }
            if ((victimEntity is HotAirBalloon) && (info.Initiator is BasePlayer) && victimEntity.net.ID == BloonNetID) {
                if (eventplayer != null && eventplayer.IsSleeping()) eventplayer.Hurt(1000);
                rewardplayer(eventplayer, (BasePlayer)info.Initiator);
                return;
            }
            if (!victimEntity || !(victimEntity is BasePlayer) || !(info.Initiator is BasePlayer) || info.Initiator is NPCMurderer || info.Initiator is BaseNpc || info.Initiator is NPCPlayerApex || victimEntity is NPCMurderer || victimEntity is BaseNpc || victimEntity is NPCPlayerApex || victimEntity is HTNPlayer || info.Initiator is HTNPlayer) return;
            BasePlayer player = victimEntity as BasePlayer;
            if (!player.IsSleeping()) return;
            ulong playerId = player.userID;
            double timeStamp = GrabCurrentTime();
            var attacker = info.Initiator as BasePlayer;
            if (!player.userID.IsSteamId() || !attacker.userID.IsSteamId()) return;
            var t = pcdData.pEntity[playerId].LogOutDay + LastSeenSeconds;
            var bloonEntity = BaseNetworkable.serverEntities.Find(BloonNetID) as BaseEntity;
            if (eventplayer.userID != playerId) return;
            if (player.IsSleeping() && (pcdData.pEntity.ContainsKey(playerId)) && (timeStamp > t) && (EventStarted)) {
                rewardplayer(eventplayer, attacker);
            }
        }
        static double GrabCurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
        [ConsoleCommand("sleepermark")]
        void cmdRun(ConsoleSystem.Arg arg) {
            FindPositionsleep(null);
        }
        [ChatCommand("sleepermark")]
        private void sleepermark(BasePlayer player) {
            if (!permission.UserHasPermission(player.UserIDString, "SleeperMark.admin")) {
                SendReply(player, string.Format(lang.GetMessage("noperm", this, player.UserIDString)));
                return;
            }
            else {
                FindPositionsleep(player);
            }
        }
        [ChatCommand("sleeper")]
        private void sleeperevent(BasePlayer player, string command, string[] args) {
            if (!permission.UserHasPermission(player.UserIDString, "SleeperMark.use")) {
                SendReply(player, string.Format(lang.GetMessage("noperm", this, player.UserIDString)));
                return;
            }
            else if (args.Length == 0) {
                SendReply(player, string.Format(lang.GetMessage("help", this, player.UserIDString)));
                return;
            }
            else if (args[0] == "topscore") {
                DrawKDRWindow(player);
                return;
            }
            else if (args[0] == "score") {
                GetCurrentStats(player);
                return;
            }
            else if (EventStarted && args[0] == "event") {
                var loc = new Vector3(eventplayer.transform.position.x, 20, eventplayer.transform.position.z);
                double timeStamp = GrabCurrentTime();
                var cdTime = pcdData.pEntity[player.userID].Cooldown;
                // Get the cooldown time of the User
                if (cdTime > timeStamp) {
                    SendReply(player, string.Format(lang.GetMessage("CoolDown", this, player.UserIDString), (int)(cdTime - timeStamp)));
                    return;
                }
                if (!useBloon && !usedirection) {
                    SendReply(player, string.Format(lang.GetMessage("Location", this, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z));
                }
                else if (!useBloon && usedirection) {
                    var msg1 = string.Format(lang.GetMessage("LocationDirection", this, player.UserIDString), Vector3.Distance(player.transform.position, loc), GetDirectionAngle(Quaternion.LookRotation((loc - player.eyes.position).normalized).eulerAngles.y, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z);
                    MessageToPlayer(player, msg1);
                }
                else if (useBloon && !usedirection) {
                    SendReply(player, string.Format(lang.GetMessage("LocationBloon", this, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z));
                }
                else {
                    var msg = string.Format(lang.GetMessage("LocationBloonDirection", this, player.UserIDString), Vector3.Distance(player.transform.position, loc), GetDirectionAngle(Quaternion.LookRotation((loc - player.eyes.position).normalized).eulerAngles.y, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z);
                    MessageToPlayer(player, msg);
                }
                pcdData.pEntity[player.userID].Cooldown = (long)timeStamp + cooldownTime;
                SaveData();
            }
            else if (!EventStarted && args[0] == "event") {
                SendReply(player, string.Format(lang.GetMessage("NoEvent", this, player.UserIDString)));
            }
        }
        private void SpawnLoot(int amount, BaseEntity EntitySpawn) {
            if (amount == 0) return;
            for (int j = 0; j < amount; j++) {
                Vector3 randsphere = UnityEngine.Random.onUnitSphere;
                Vector3 entpos = (EntitySpawn.transform.position + new Vector3(0f, 1.5f, 0f)) + (randsphere * UnityEngine.Random.Range(-2f, 3f));
                var ent = crates;
                BaseEntity crate = GameManager.server.CreateEntity(ent, entpos, Quaternion.LookRotation(randsphere), true);
                if (crate == null) return;
                crate.Spawn();
                Rigidbody rigidbody;
                rigidbody = crate.gameObject.AddComponent<Rigidbody>();
                FireBall fireBall = GameManager.server.CreateEntity(fireball) as FireBall;
                if (fireBall == null) return;
                //SpawnFireball(crate);
                if (rigidbody != null) {
                    rigidbody.isKinematic = false;
                    rigidbody.useGravity = true;
                    rigidbody.mass = 0.55f;
                    rigidbody.interpolation = RigidbodyInterpolation.Interpolate;
                    rigidbody.drag = 0.25f;
                    rigidbody.angularDrag = 0.1f;
                    rigidbody.AddForce((EntitySpawn.transform.forward + (EntitySpawn.transform.right * UnityEngine.Random.Range(-5f, 5f))) * 50);
                    Puts("Calling for fireballs.");
                    fireBall.Spawn();
                    fireBall.SetParent(crate);
                    fireBall.GetComponent<Rigidbody>().isKinematic = true;
                    fireBall.GetComponent<Collider>().enabled = false;
                    fireBall.Invoke(fireBall.Extinguish, locktime);
                    if (lockcrate) {
                        var cratelock = (crate as LockedByEntCrate);
                        cratelock.SetLocked(true);
                        locked = cratelock;
                        timer.Once(locktime, () => {
                            UnlockCrate(cratelock);
                            locked = null;
                        }
                        );
                    }
                }
            }
        }
        private void UnlockCrate(LockedByEntCrate crate) {
            if (debug) Puts("Running UnlockCrate");
            if (crate == null || (crate?.IsDestroyed ?? true)) return;
            var lockingEnt = (crate?.lockingEnt != null) ? crate.lockingEnt.GetComponent<FireBall>() : null;
            if (lockingEnt != null && !lockingEnt.IsDestroyed) {
                lockingEnt.enableSaving = false;
                //again trying to fix issue with savelist
                lockingEnt.CancelInvoke(lockingEnt.Extinguish);
                lockingEnt.Invoke(lockingEnt.Extinguish, 30f);
            }
            crate.CancelInvoke(crate.Think);
            crate.SetLocked(false);
            crate.lockingEnt = null;
        }
        [ChatCommand("sleepermarkfind")]
        private void test(BasePlayer player) {
            if (debug) Puts("Running sleepermarkfind");
            if (!permission.UserHasPermission(player.UserIDString, "SleeperMark.admin")) {
                SendReply(player, string.Format(lang.GetMessage("noperm", this, player.UserIDString)));
                return;
            }
            if (permission.UserHasPermission(player.UserIDString, "SleeperMark.admin")) {
                FindPositionsleepsetup();
            }
        }
        private BaseEntity InstantiateEntity(string type, Vector3 position, Quaternion rotation) {
            var gameObject = Instantiate.GameObject(GameManager.server.FindPrefab(type), position, rotation);
            gameObject.name = type;
            SceneManager.MoveGameObjectToScene(gameObject, Rust.Server.EntityScene);
            UnityEngine.Object.Destroy(gameObject.GetComponent<Spawnable>());
            if (!gameObject.activeSelf) gameObject.SetActive(true);
            BaseEntity component = gameObject.GetComponent<BaseEntity>();
            return component;
        }
        private void EventEnd() {
            if (useBloon && EventStarted) {
                var targetEntity = BaseNetworkable.serverEntities.Find(BloonNetID) as BaseEntity;
                var player = BasePlayer.sleepingPlayerList.ToList().Find(o => o.userID == eventplayer.userID);
                if (targetEntity != null) {
                    targetEntity.Kill();
                }
                if(player == null) {
                    player = BasePlayer.activePlayerList.ToList().Find(o => o.userID == eventplayer.userID);
                }
                if (player != null) {
                    player.Teleport(new Vector3(pcdData.pEntity[eventplayer.userID].LocEntityX, pcdData.pEntity[eventplayer.userID].LocEntityY, pcdData.pEntity[eventplayer.userID].LocEntityZ));
                }
                hitPlayer = false;
                EventStarted = false;
                hitBalloon = false;
                eventplayer = null;
                BloonNetID = 0;
            }
        }
        private void FindPositionsleep(BasePlayer player1) {
            var onetimer = timer.Repeat(2.5f, 1, () => {
                SendReply(player1, string.Format(lang.GetMessage("noSleepers", this)));
                ;
            }
            );
            if (EventStarted) {
                SendReply(player1, string.Format(lang.GetMessage("eventstarted", this)));
                onetimer.Destroy();
                if (eventplayer == null) EventEnd();
                if (!useBloon && eventplayer != null) PrintToChat(string.Format(lang.GetMessage("Location", this), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z));
                if (useBloon && eventplayer != null) PrintToChat(string.Format(lang.GetMessage("LocationBloon", this), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z));
                return;
            }
            foreach (BasePlayer player in BasePlayer.sleepingPlayerList.ToList()) {
                if (EventStarted && player.userID == eventplayer.userID) return;
                double timeStamp = GrabCurrentTime();
                ulong playerId = player.userID;
                FindPositionsleepsetup();
                if (!pcdData.pEntity.ContainsKey(playerId)) return;
                var t = pcdData.pEntity[playerId].LogOutDay + LastSeenSeconds;
                var a = pcdData.pEntity[playerId].LocEntityX;
                var b = pcdData.pEntity[playerId].LocEntityY;
                var c = pcdData.pEntity[playerId].LocEntityZ;
                if (pcdData.pEntity.ContainsKey(playerId) && (timeStamp > t) && !useBloon && !permission.UserHasPermission(player.UserIDString, "SleeperMark.ignore")) {
                    Effect.server.Run("assets/bundled/prefabs/fx/explosions/explosion_01.prefab", player.transform.position);
                    SaveData();
                    EventStarted = true;
                    eventplayer = player;
                    if (useguiAnnounce) MessageToAllGui(string.Format(lang.GetMessage("Location", this), player.displayName, a, c));
                    NotifyOnEvent(player);
                    onetimer.Destroy();
                    break;
                }
                if (pcdData.pEntity.ContainsKey(playerId) && (timeStamp > t) && useBloon && !permission.UserHasPermission(player.UserIDString, "SleeperMark.ignore")) {
                    var playerPos = player.transform.position + new Vector3(0, 250.1f, 0);
                    var playerRot = player.transform.rotation;
                    BaseEntity entity = InstantiateEntity(bloonprefab, (Vector3)playerPos, playerRot);
                    entity.Spawn();
                    EventStarted = true;
                    var controller = entity.GetComponent<HotAirBalloon>();
                    fuelTank = controller.fuelStorageInstance.Get(true).GetComponent<StorageContainer>();
                    Item item = ItemManager.CreateByItemID(-946369541, 5);
                    item.MoveToContainer(fuelTank.inventory, -1, true);
                    controller.SetFlag(BaseEntity.Flags.Reserved6, true);
                    controller.SetFlag(BaseEntity.Flags.On, true);
                    controller.SetFlag(BaseEntity.Flags.Locked, true);
                    controller.windForce = 0f;
                    controller.inflationLevel = 1f;
                    controller.fuelPerSec = 0f;
                    var playermount = entity.transform.position + new Vector3(0, 0.4f, 0);
                    var x = entity.transform.position.x;
                    var z = entity.transform.position.z;
                    player.transform.position = playermount;
                    BloonNetID = entity.net.ID;
                    eventplayer = player;
                    SaveData();
                    NotifyOnEvent(player);
                    onetimer.Destroy();
                    if (useguiAnnounce) MessageToAllGui(string.Format(lang.GetMessage("LocationBloon", this), player.displayName, x, z));
                    break;
                }
            }
        }
        [ChatCommand("sleepermarkreset")]
        private void resetdata(BasePlayer reset1) {
            SendReply(reset1, string.Format(lang.GetMessage("reset", this, reset1.UserIDString)));
            foreach (BasePlayer player in BasePlayer.sleepingPlayerList.ToList()) {
                ulong playerId = player.userID;
                FindPositionsleepsetup();
                SaveData();
                EventEnd();
            }
        }
        private void resetdataboot() {
            foreach (BasePlayer player in BasePlayer.sleepingPlayerList.ToList()) {
                ulong playerId = player.userID;
                FindPositionsleepsetup();
                SaveData();
                EventStarted = false;
                hitPlayer = false;
                hitBalloon = false;
            }
        }
        private void FindPositionsleepsetup() {
            foreach (BasePlayer player in BasePlayer.sleepingPlayerList.ToList()) {
                ulong playerId = player.userID;
                double timeStamp = GrabCurrentTime();
                if (!pcdData.pEntity.ContainsKey(playerId)) {
                    pcdData.pEntity.Add(playerId, new PCDInfo());
                    pcdData.pEntity[playerId].LogOutDay = (long)timeStamp;
                    pcdData.pEntity[playerId].LocEntityX = player.transform.position.x;
                    pcdData.pEntity[playerId].LocEntityY = player.transform.position.y;
                    pcdData.pEntity[playerId].LocEntityZ = player.transform.position.z;
                    SaveData();
                    Puts(player.displayName);
                }
            }
        }
        void MessageToAllGui(string message) {
            foreach (var player in BasePlayer.activePlayerList.ToList()) {
                GUIAnnouncements?.Call("CreateAnnouncement", message, colorTextMsgB, colorTextMsg, player);
            }
        }
        void OnPlayerSleepEnded(BasePlayer player) {
            ulong playerId = player.userID;
            double timeStamp = GrabCurrentTime();
            if (!pcdData.pEntity.ContainsKey(playerId)) {
                pcdData.pEntity.Add(playerId, new PCDInfo());
                SaveData();
            }
            {
                pcdData.pEntity[playerId].LogOutDay = (long)timeStamp;
                pcdData.pEntity[playerId].LocEntityX = player.transform.position.x;
                pcdData.pEntity[playerId].LocEntityY = player.transform.position.y;
                pcdData.pEntity[playerId].LocEntityZ = player.transform.position.z;
                SaveData();
            }
        }
        private void OnPlayerConnected(BasePlayer player) {
            ulong playerId = player.userID;
            double timeStamp = GrabCurrentTime();
            PlayerData.TryLoad(player);
            if (!pcdData.pEntity.ContainsKey(playerId)) {
                pcdData.pEntity.Add(playerId, new PCDInfo());
                SaveData();
            }
            {
                pcdData.pEntity[playerId].LogOutDay = (long)timeStamp;
                pcdData.pEntity[playerId].LocEntityX = player.transform.position.x;
                pcdData.pEntity[playerId].LocEntityY = player.transform.position.y;
                pcdData.pEntity[playerId].LocEntityZ = player.transform.position.z;
                SaveData();
            }
            if (playerId == eventplayer.userID) {
                EventEnd();
                EventStarted = false;
                hitPlayer = false;
                hitBalloon = false;
            }
        }
        void MessageToPlayer(BasePlayer player, string message) {
            PrintToChat(player, string.Format(message));
        }
        string GetDirectionAngle(float angle, string UserIDString) {
            if (angle > 337.5 || angle < 22.5) return lang.GetMessage("msgNorth", this, UserIDString);
            else if (angle > 22.5 && angle < 67.5) return lang.GetMessage("msgNorthEast", this, UserIDString);
            else if (angle > 67.5 && angle < 112.5) return lang.GetMessage("msgEast", this, UserIDString);
            else if (angle > 112.5 && angle < 157.5) return lang.GetMessage("msgSouthEast", this, UserIDString);
            else if (angle > 157.5 && angle < 202.5) return lang.GetMessage("msgSouth", this, UserIDString);
            else if (angle > 202.5 && angle < 247.5) return lang.GetMessage("msgSouthWest", this, UserIDString);
            else if (angle > 247.5 && angle < 292.5) return lang.GetMessage("msgWest", this, UserIDString);
            else if (angle > 292.5 && angle < 337.5) return lang.GetMessage("msgNorthWest", this, UserIDString);
            return "";
        }
        void NotifyOnEvent(BasePlayer loc) {
            foreach (var player in BasePlayer.activePlayerList.ToList()) {
                if (!useBloon && !usedirection) {
                    SendReply(player, string.Format(lang.GetMessage("Location", this, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z));
                }
                else if (!useBloon && usedirection) {
                    var msg1 = string.Format(lang.GetMessage("LocationDirection", this, player.UserIDString), Vector3.Distance(player.transform.position, loc.transform.position), GetDirectionAngle(Quaternion.LookRotation((loc.transform.position - player.eyes.position).normalized).eulerAngles.y, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z);
                    MessageToPlayer(player, msg1);
                }
                else if (useBloon && !usedirection) {
                    SendReply(player, string.Format(lang.GetMessage("LocationBloon", this, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z));
                }
                else if (useBloon && usedirection) {
                    var msg = string.Format(lang.GetMessage("LocationBloonDirection", this, player.UserIDString), Vector3.Distance(player.transform.position, loc.transform.position), GetDirectionAngle(Quaternion.LookRotation((loc.transform.position - player.eyes.position).normalized).eulerAngles.y, player.UserIDString), eventplayer.displayName, eventplayer.transform.position.x, eventplayer.transform.position.z);
                    MessageToPlayer(player, msg);
                }
            }
        }
        class PlayerData {
            public ulong id;
            public string name;
            public int kills;
            public int deaths;
            internal float KDR => deaths == 0 ? kills : (float)Math.Round(((float)kills) / deaths, 1);
            internal static void TryLoad(BasePlayer player) {
                if (Find(player) != null) return;
                PlayerData data = Interface.Oxide.DataFileSystem.ReadObject<PlayerData>($"SleeperMark/gui/{player.userID}");
                if (data == null || data.id == 0) {
                    data = new PlayerData {
                        id = player.userID, name = player.displayName
                    }
                    ;
                }
                else data.Update(player);
                data.Save();
                LoadedPlayerData.Add(data);
            }
            internal void Update(BasePlayer player) {
                name = player.displayName;
                Save();
            }
            internal void Save() => Interface.Oxide.DataFileSystem.WriteObject($"SleeperMark/gui/{id}", this, true);
            internal static PlayerData Find(BasePlayer player) {
                PlayerData data = LoadedPlayerData.ToList().Find((p) => p.id == player.userID);
                return data;
            }
        }
        // UI Classes - Created by LaserHydra
        class UIColor {
            double red;
            double green;
            double blue;
            double alpha;
            public UIColor(double red, double green, double blue, double alpha) {
                this.red = red;
                this.green = green;
                this.blue = blue;
                this.alpha = alpha;
            }
            public override string ToString() {
                return $"{red.ToString()} {green.ToString()} {blue.ToString()} {alpha.ToString()}";
            }
        }
        class UIObject {
            List<object> ui = new List<object>();
            List<string> objectList = new List<string>();
            public UIObject() {
            }
            public string RandomString() {
                string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
                List<char> charList = chars.ToList();
                string random = "";
                for (int i = 0; i <= UnityEngine.Random.Range(5, 10);
                i++) random = random + charList[UnityEngine.Random.Range(0, charList.Count - 1)];
                return random;
            }
            public void Draw(BasePlayer player) {
                CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
                    connection = player.net.connection
                }
                , null, "AddUI", JsonConvert.SerializeObject(ui).Replace("{NEWLINE}", Environment.NewLine));
            }
            public void Destroy(BasePlayer player) {
                foreach (string uiName in objectList) CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
                    connection = player.net.connection
                }
                , null, "DestroyUI", uiName);
            }
            public string AddPanel(string name, double left, double top, double width, double height, UIColor color, bool mouse = false, string parent = "Overlay") {
                name = name + RandomString();
                string type = "";
                if (mouse) type = "NeedsCursor";
                ui.Add(new Dictionary<string, object> {
                    {
                        "name", name
                    }
                    , {
                        "parent", parent
                    }
                    , {
                        "components", new List<object> {
                            new Dictionary<string, string> {
                                {
                                    "type", "UnityEngine.UI.Image"
                                }
                                , {
                                    "color", color.ToString()
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", "RectTransform"
                                }
                                , {
                                    "anchormin", $"{left.ToString()} {((1 - top) - height).ToString()}"
                                }
                                , {
                                    "anchormax", $"{(left + width).ToString()} {(1 - top).ToString()}"
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", type
                                }
                            }
                        }
                    }
                }
                );
                objectList.Add(name);
                return name;
            }
            public string AddText(string name, double left, double top, double width, double height, UIColor color, string text, int textsize = 15, string parent = "Overlay", int alignmode = 0) {
                name = name + RandomString();
                text = text.Replace("\n", "{NEWLINE}");
                string align = "";
                switch (alignmode) {
                    case 0 : {
                        align = "LowerCenter";
                        break;
                    }
                    ;
                    case 1 : {
                        align = "LowerLeft";
                        break;
                    }
                    ;
                    case 2 : {
                        align = "LowerRight";
                        break;
                    }
                    ;
                    case 3 : {
                        align = "MiddleCenter";
                        break;
                    }
                    ;
                    case 4 : {
                        align = "MiddleLeft";
                        break;
                    }
                    ;
                    case 5 : {
                        align = "MiddleRight";
                        break;
                    }
                    ;
                    case 6 : {
                        align = "UpperCenter";
                        break;
                    }
                    ;
                    case 7 : {
                        align = "UpperLeft";
                        break;
                    }
                    ;
                    case 8 : {
                        align = "UpperRight";
                        break;
                    }
                    ;
                }
                ui.Add(new Dictionary<string, object> {
                    {
                        "name", name
                    }
                    , {
                        "parent", parent
                    }
                    , {
                        "components", new List<object> {
                            new Dictionary<string, string> {
                                {
                                    "type", "UnityEngine.UI.Text"
                                }
                                , {
                                    "text", text
                                }
                                , {
                                    "fontSize", textsize.ToString()
                                }
                                , {
                                    "color", color.ToString()
                                }
                                , {
                                    "align", align
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", "RectTransform"
                                }
                                , {
                                    "anchormin", $"{left.ToString()} {((1 - top) - height).ToString()}"
                                }
                                , {
                                    "anchormax", $"{(left + width).ToString()} {(1 - top).ToString()}"
                                }
                            }
                        }
                    }
                }
                );
                objectList.Add(name);
                return name;
            }
            public string AddButton(string name, double left, double top, double width, double height, UIColor color, string command = "", string parent = "Overlay", string closeUi = "") {
                name = name + RandomString();
                ui.Add(new Dictionary<string, object> {
                    {
                        "name", name
                    }
                    , {
                        "parent", parent
                    }
                    , {
                        "components", new List<object> {
                            new Dictionary<string, string> {
                                {
                                    "type", "UnityEngine.UI.Button"
                                }
                                , {
                                    "close", closeUi
                                }
                                , {
                                    "command", command
                                }
                                , {
                                    "color", color.ToString()
                                }
                                , {
                                    "imagetype", "Tiled"
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", "RectTransform"
                                }
                                , {
                                    "anchormin", $"{left.ToString()} {((1 - top) - height).ToString()}"
                                }
                                , {
                                    "anchormax", $"{(left + width).ToString()} {(1 - top).ToString()}"
                                }
                            }
                        }
                    }
                }
                );
                objectList.Add(name);
                return name;
            }
            public string AddImage(string name, double left, double top, double width, double height, UIColor color, string url = "http://oxidemod.org/data/avatars/l/53/53411.jpg?142748
// ... [Code preview truncated due to length. Full source in attached file] ...

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