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

FREE Payback : 1.9.9 1.9.9

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using System.Collections.Generic;
using UnityEngine;
using System.Collections;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using System;
using System.Linq;
using Oxide.Core.Plugins;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
using Oxide.Core.Libraries.Covalence;
using Rust;

namespace Oxide.Plugins
{
    [Info("Payback", "1928Tommygun/Kira", "1.9.9")]
    [Description("Special Admin Commands To Mess With Cheaters")]
    public class Payback : RustPlugin
    {
#pragma warning disable CS0649
        [PluginReference] private Plugin Payback2;
#pragma warning restore CS0649

        private enum Card   
        { 
            Pacifism = 0, //zeros all outgoing damage from target player
            Butterfingers = 1, //on dealing damage to any player, chance to drop current held weapon.InstantKarma = 4, //reflects damage back to the player
            Dud = 5, //prevents damage to non-player entities
            DogDoo = 6, //landmine under target player when the access stashes
            BSOD = 7, //give target player fake BSOD
            Sit = 8, //force player to sit
            Naked = 9, //force player to drop everything they have in their inventory
            Camomo = 10, //apply a combination of abilities Camomo has selected
            HigherGround = 11, //target player is teleported 100m into the air
            Thirsty = 12, //target player becomes thirsty very quickly
            DrNo = 13, // target player no longer receives health from healing items
            Dana = 14, // steal target player's inventory and place it in your own
            Pinyata = 15, // target player's inventory explodes out of them when they die
            Rocketman, // strap target player to a rocket and launch them!
            NoRest, // No Rest For The Wicked! Force the player to respawn!
            ChickenChaser, // Spawns a horde of chickens with super speed that only attack target player!
            ViewLoot, // View target entities loot
            Burn, // Gives a player a flamethrower that will make his foes scream and burn
            Hammer, // hammer - gives target player a hammer that will destroy all the entities owned by the hammer's target
            Bag, // Bag - Print all players that have bagged target player in, and print all players that have been bagged.Include "discord" after the command to log the results to discord
            Shocker, // Shocker - Shock target player to death.Affects nearby players so be careful.Make sure to disable it after use.//Cowboy, // Cowboy - Ride target player like a wild hog -> couldn't get this to work
            Masochist, // Masochist - Stop player from F1 killing themselves
            Emote, // Emote - options: 
            Shark, // Jaws - shark comes to eat the cheater
        }

        private Dictionary<Card, string> descriptions = new Dictionary<Card, string>()
        {
            {Card.Butterfingers, "% chance for target player to drop their weapon when damaging an enemy"},
            {Card.Dud, "target player deals no damage to NON-PLAYER entities.Also prevents farming / tool use"},
            {
                Card.InstantKarma,
                "target player deals no damage to enemies and 35% of the damage is reflected back to them"
            },
            {
                Card.Pacifism,
                "target player deals no player damage to non-teammates; add 'silent' to not send a message about it to other players."
            },
            {Card.DogDoo, "landmine under target player when the access stashes"},
            {Card.BSOD, "target player receives a fake blue-screen-of-death"},
            {
                Card.Sit,
                "spawns a chair in front of you and forces the cheater to sit.Doesn't let them get up and will place them back in if they die."
            },
            {Card.Naked, "force player to drop everything they have in their inventory"},
            {Card.Camomo, "apply a combination of abilities Camomo has selected [pf,bf,in,dog,dud,dr]"},
            {Card.HigherGround, "target player is teleported 100m into the air"},
            {Card.Thirsty, "target player becomes thirsty very quickly"},
            {Card.DrNo, "target player can no longer heal"},
            {Card.Dana, "steal target player's inventory and place it in your own"},
            {Card.Pinyata, "target player's inventory explodes out of them when they die"},
            {Card.Rocketman, "strap target player to a rocket and launch them!"},
            {Card.NoRest, "No Rest For The Wicked! Force the player to respawn when they die!"},
            {
                Card.ChickenChaser,
                "Spawns a horde of chickens with super speed that only attack target player! add 'wolf' 'stag' 'bear' or 'boar' after the command to change the animal"
            },
            {Card.ViewLoot, "View target player's loot"},
            {Card.Burn, "Gives a player a flamethrower that will make his foes scream and burn"},
            {
                Card.Hammer,
                "Gives admin a hammer that will destroy all the entities owned by the hammer's target.Add -noloot to also delete the loot"
            },
            {
                Card.Bag,
                "Print all players that have bagged target player in, and print all players that have been bagged.Include \"discord\" after the command to log the results to discord"
            },
            {
                Card.Shocker,
                "Shock target player to death.Affects nearby players so be careful.Make sure to disable it after use."
            },
            //{Card.Cowboy, "Cowboy - Ride target player like a wild hog" },
            {Card.Masochist, "Masochist - Stop player from F1 killing themselves"},
            {Card.Emote, "Emote - force player to do an emote."},
            {Card.Shark, "shark comes to eat the cheater"},
        };

        Dictionary<string, Card> cardAliases = new Dictionary<string, Card>()
        {
            {"bf", Card.Butterfingers},
            {"dud", Card.Dud},
            {"in", Card.InstantKarma},
            {"pf", Card.Pacifism},
            {"dog", Card.DogDoo},
            {"bs", Card.BSOD},
            {"nk", Card.Naked},
            {"cumnum", Card.Camomo},
            {"hg", Card.HigherGround},
            {"th", Card.Thirsty},
            {"dr", Card.DrNo},
            {"dana", Card.Dana},
            {"steal", Card.Dana},
            {"pin", Card.Pinyata},
            {"rm", Card.Rocketman},
            {"nr", Card.NoRest},
            {"res", Card.NoRest},
            {"ch", Card.ChickenChaser},
            {"loot", Card.ViewLoot},
            {"bu", Card.Burn},
            {"ham", Card.Hammer},
            {"bg", Card.Bag},
            {"sh", Card.Shocker},
            //{ "cow", Card.Cowboy},
            {"ms", Card.Masochist},
            {"em", Card.Emote},
            {"jaws", Card.Shark},
        };

        private void GiveCard(ulong userID, Card card, string[] args = null, BasePlayer admin = null)
        {
            HashSet<Card> cards;
            if (!cardMap.TryGetValue(userID, out cards))
            {
                cards = new HashSet<Card>();
                cardMap[userID] = cards;
            }

            cards.Add(card);

            var player = BasePlayer.FindByID(userID);
            if (player == null) return;
            switch (card)
            {
                case Card.BSOD:
                {
                    var playPublic = args.Contains("public");
                    DoBSOD(player, playPublic);
                    break;
                }
                case Card.Sit:
                    DoSitCommand(player, admin);
                    break;
                case Card.Naked:
                    DoNakedCommand(player);
                    break;
                case Card.Camomo:
                    DoCamomoCommand(player);
                    break;
                case Card.HigherGround:
                    DoHigherGround(player);
                    break;
                case Card.Thirsty:
                    DoThirsty(player);
                    break;
                case Card.Dana:
                    DoDana(player, admin);
                    break;
                case Card.Pacifism:
                {
                    silentPacifism = false;
                    if (args != null)
                        if (args.Contains("silent"))
                            silentPacifism = true;
                    break;
                }
                case Card.Rocketman:
                    RocketManTarget(player);
                    break;
                case Card.NoRest:
                {
                    if (player.IsDead()) player.Respawn();
                    break;
                }
                case Card.ChickenChaser:
                    AdminSpawnChickens(admin, player, args);
                    TakeCard(player, Card.ChickenChaser);
                    break;
                case Card.ViewLoot:
                    ViewTargetPlayerInventory(player, admin);
                    TakeCard(player, Card.ViewLoot);
                    break;
                case Card.Burn:
                    GivePlayerFlamethrower(player);
                    break;
                case Card.Hammer:
                {
                    GiveAdminHammer(player);
                    if (args.Contains("noloot"))
                    {
                        flag_kill_no_loot = true;
                        PrintToPlayer(admin, $"Hammer set to remove loot!");
                    }
                    else flag_kill_no_loot = false;

                    break;
                }
                case Card.Shocker:
                    DoShocker(player, args, admin);
                    break;
                case Card.Emote:
                    DoEmote(player, args, admin);
                    break;
                case Card.Shark:
                    DoShark(player, args, admin);
                    break;
            }
        }

        private bool silentPacifism;

        private void DoShark(BasePlayer player, string[] args, BasePlayer admin = null)
        {
            Worker.StaticStartCoroutine(SharkCo2(player, args, admin));
        }

        // ReSharper disable once UnusedParameter.Local
        private IEnumerator SharkCo2(BasePlayer player, string[] args, BasePlayer admin = null)
        {
            TakeCard(player, Card.Shark);
            SimpleShark shark;
            const string sharkPrefab = "assets/rust.ai/agents/fish/simpleshark.prefab";

            var position = player.transform.position;
            var entity = GameManager.server.CreateEntity(sharkPrefab,
                position + new Vector3(-100, -100, -100));

            shark = entity as SimpleShark;
            entity.Spawn();

            shark.enabled = false;

            var playerForward = player.eyes.HeadForward();
            playerForward.y = 0;
            playerForward.Normalize();

            shark.transform.LookAt(position + Vector3.up * 100 + playerForward);

            yield return Worker.StaticStartCoroutine(MoveSharkCo(shark, player));
        }

        private const string sfx_watersplash = "assets/bundled/prefabs/fx/explosions/water_bomb.prefab";

        private IEnumerator MoveSharkCo(SimpleShark shark, BasePlayer player)
        {
            const float duration = 4f;
            var ts = Time.realtimeSinceStartup;
            var transform = player.transform;
            var position = transform.position;
            var sharkStartPos = position + Vector3.down * 30f;
            var playerStartPosition = position;
            var playerForward = player.eyes.HeadForward();
            playerForward.y = 0;
            playerForward.Normalize();

            var didSit = false;
            BaseEntity chair = null;
            float p;
            float y;
            while (Time.realtimeSinceStartup - ts < duration && player != null && shark != null)
            {
                p = (Time.realtimeSinceStartup - ts) / duration;
                y = Mathf.Sin(p * Mathf.PI);
                if (p < 0.24)
                {
                    var transform1 = player.transform;
                    var position1 = transform1.position;
                    playerStartPosition = position1 + Vector3.up * 10f;
                    shark.transform.LookAt(position1 + Vector3.up * 100 + playerForward);
                }
                else
                {
                    if (!didSit)
                    {
                        var position1 = player.transform.position;
                        Effect.server.Run(shark.bloodCloud.resourcePath, position1 + Vector3.up, Vector3.forward);
                        Effect.server.Run(sfx_watersplash, position1 + Vector3.up, Vector3.forward);

                        timer.Once(0.2f, () =>
                        {
                            if (player == null) return;
                            PlayGesture(player, "friendly");
                        });

                        if (HasCard(player.userID, Card.Sit)) TakeCard(player.userID, Card.Sit);
                        var playerFacing = player.eyes.HeadForward();
                        playerFacing.y = 0;
                        playerFacing.Normalize();
                        chair = InvisibleSit(player);
                        chair.SetParent(shark, true, true);
                        chair.transform.LookAt(chair.transform.position + playerFacing);
                        didSit = true;
                    }

                    var transform1 = shark.transform;
                    var position2 = transform1.position;
                    var up = transform1.up;
                    chair.transform.position = position2 + transform1.forward * 0.88f + up * 0.19f;
                    chair.transform.LookAt(position2 + up * -1 + Vector3.up * 0.15f);
                }

                shark.transform.position = Vector3.Lerp(sharkStartPos, playerStartPosition, y);
                Transform transform2;
                (transform2 = shark.transform).LookAt(player.transform.position + Vector3.up * 100 + playerForward);
                shark.transform.Rotate(transform2.right, -15f);
                yield return new WaitForFixedUpdate();
            }

            shark.transform.position += Vector3.down * 100000;
            shark.SendNetworkUpdate();

            yield return null;

            player.GetMounted()?.DismountPlayer(player, true);
            chair.Kill();
            player.Die();
            shark.Kill();
        }

        private void DoEmote(BasePlayer player, string[] args, BasePlayer admin = null)
        {
            if (player == null) return;
            var gesture = "wave";

            if (args.Length > 1)
            {
                gesture = args[1];

                var g = player.gestureList.StringToGesture(gesture);
                if (g == null)
                {
                    var output =
                        player.gestureList.AllGestures.Aggregate("\n",
                            (current, gg) => current + (gg.convarName + "\n"));
                    PrintToPlayer(admin, $"Gesture not found: {gesture}\nAvailable Gestures:{output}");
                }
            }
            else PrintToPlayer(admin, "to see all emotes use: /emote <target> list");

            PlayGesture(player, gesture);
            TakeCard(player, Card.Emote);
        }

        // ReSharper disable once UnusedMember.Local
        // ReSharper disable once UnusedParameter.Local
        private bool? CanUseGesture(BasePlayer player, GestureConfig gesture)
        {
            if (HasAnyCard(player.userID)) return true;
            return null;
        }


        // ReSharper disable once UnusedMember.Local
        // ReSharper disable once UnusedParameter.Local
        private void ResolveConflictingCommands(BasePlayer player, BasePlayer admin = null)
        {
            if (HasCard(player.userID, Card.Sit)) TakeCard(player, Card.Sit);
            if (player.isMounted)
            {
                var car = player.GetMountedVehicle();
                if (car != null) car.Kill(BaseNetworkable.DestroyMode.Gib);
            }

            TakeCard(player, Card.Rocketman);
        }

        private Dictionary<ulong, BaseEntity> coilMap = new Dictionary<ulong, BaseEntity>();

        // ReSharper disable once UnusedParameter.Local
        private void DoShocker(BasePlayer player, string[] args, BasePlayer admin = null)
        {
            if (player == null) return;

            BaseEntity coilEnt;
            if (coilMap.TryGetValue(player.userID, out coilEnt))
            {
                if (coilEnt != null)
                {
                    coilEnt.Kill();
                }

                coilMap.Remove(player.userID);
                return;
            }

            var coil = (TeslaCoil) GameManager.server.CreateEntity(
                "assets/prefabs/deployable/playerioents/teslacoil/teslacoil.deployed.prefab");
            var transform = coil.transform;
            var position = player.transform.position;
            position += Vector3.down * 1;
            transform.position = position;
            coil.Spawn();
            coil.SetFlag(BaseEntity.Flags.Reserved8, true);
            coil.UpdateFromInput(7, 0);
            coilMap.Add(player.userID, coil);
            coil.SetParent(player, true, true);
            coil.SendNetworkUpdateImmediate();
            var los = coil.GetComponentInChildren<TargetTrigger>();
            los.losEyes = null;
            los.OnEntityEnter(player);
            DestroyGroundCheck(coil);
            Timer t = null;
            t = timer.Every(0.2f, () =>
            {
                if (coil == null || player == null) t.Destroy();
                else
                {
                    if (Vector3.Distance(player.transform.position, coil.transform.position) < 5)
                        los.OnEntityEnter(player);
                    else los.OnEntityLeave(player);
                }
            });
        }

        private void DoBagSearch(ulong userID, string[] args, BasePlayer admin = null)
        {
            if (userID == 0) return;
            TakeCard(userID, Card.Bag);
            Worker.StaticStartCoroutine(args.Contains("discord")
                ? BagSearchCo(userID, true, admin)
                : BagSearchCo(userID, false, admin));
        }

        private IEnumerator BagSearchCo(ulong userID, bool logToDiscord = false, BasePlayer admin = null)
        {
            yield return null;
            var timestamp = Time.realtimeSinceStartup;
            var maxTimeBetweenFrames = 1 / 20f;
            var allBags = BaseNetworkable.serverEntities.OfType<SleepingBag>();
            var useridsBaggedByTarget = new HashSet<ulong>();
            var useridsWhoBaggedTarget = new HashSet<ulong>();

            foreach (var bag in allBags)
            {
                if (Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames)
                {
                    yield return null;
                    timestamp = Time.realtimeSinceStartup;
                }

                ulong ownerid = 0;
                var creator = bag.creatorEntity;
                if (creator != null)
                {
                    var player = creator as BasePlayer;
                    if (player != null) ownerid = player.userID;
                }
                else ownerid = bag.OwnerID;

                if (ownerid == userID && bag.deployerUserID != userID) useridsBaggedByTarget.Add(bag.deployerUserID);
                if (userID == bag.deployerUserID && ownerid != userID) useridsWhoBaggedTarget.Add(ownerid);
            }

            var messageData = new Dictionary<string, string>();
            var targetInfo = $"{TryGetDisplayName(userID)}";
            var baggedByString = "";
            var output = $"Players bagged by {targetInfo}:";
            foreach (var userid in useridsBaggedByTarget)
            {
                var displayname = TryGetDisplayName(userid);
                output += $"\n{userid} : {displayname}";
                baggedByString += $"{userid} : {displayname}\n";
            }

            messageData.Add($"Players bagged by {targetInfo}", baggedByString.Length > 0 ? baggedByString : "none");
            output += $"\nSteamids who bagged in {targetInfo}:";
            var baggedInString = "";
            foreach (var userid in useridsWhoBaggedTarget)
            {
                var displayname = TryGetDisplayName(userid);
                output += $"\n{userid} : {displayname}";
                baggedInString += $"\n{userid} : {displayname}";
            }

            messageData.Add($"Players who bagged in {targetInfo}", baggedInString.Length > 0 ? baggedInString : "none");
            PrintToPlayer(admin, $"{output}");
            if (logToDiscord) SendToDiscordWebhook(messageData, $"Bag Search [{userID}]");
        }

        private bool flag_kill_no_loot;

        private static void GiveAdminHammer(BasePlayer admin)
        {
            if (admin == null) return;
            var item = ItemManager.CreateByName("hammer", 1, 2375073548);
            if (item != null) GiveItemOrDrop(admin, item);
        }

        // ReSharper disable once UnusedMember.Local
        private object OnStructureRepair(BaseCombatEntity entity, BasePlayer player)
        {
            if (HasCard(player.userID, Card.Hammer))
                Worker.StaticStartCoroutine(DeleteByCo(entity.OwnerID, player.transform.position, player));
            return null;
        }

        private IEnumerator DeleteByCo(ulong steamid, Vector3 position, BasePlayer admin = null)
        {
            yield return null;
            if (steamid == 0UL) yield break;
            const float maxTimeBetweenFrames = 1 / 60f;
            const int maxEntitiesPerFrame = 1;
            const float delayBetweenFrames = 1 / 20f;
            var timestamp = Time.realtimeSinceStartup;
            var entities = new List<BaseNetworkable>(BaseNetworkable.serverEntities);
            var fxTimestamp = Time.realtimeSinceStartup;
            const float fxCooldown = 0.75f;
            var ownedEntities = new List<BaseEntity>();
            foreach (var entity in entities.Select(x => x as BaseEntity))
            {
                if (!(entity == null) && entity.OwnerID == steamid) ownedEntities.Add(entity);
                if (!(Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames)) continue;
                yield return null;
                timestamp = Time.realtimeSinceStartup;
            }

            ownedEntities.Sort((x, y) =>
                Vector3.Distance(x.transform.position, position).CompareTo(Vector3.Distance(y.transform.position, position)));
            timestamp = Time.realtimeSinceStartup;
            var i = 0;
            var count = 0;
            if (admin != null) PlaySound("assets/bundled/prefabs/fx/headshot.prefab", admin, false);
            var lastPosition = Vector3.zero;
            if (flag_kill_no_loot)
            {
                foreach (var storage in ownedEntities.OfType<StorageContainer>())
                {
                    foreach (var item in new List<Item>(storage.inventory.itemList))
                    {
                        item.GetHeldEntity()?.KillMessage();
                        ItemManager.RemoveItem(item);
                    }

                    ItemManager.DoRemoves();
                }
            }


            while (i < ownedEntities.Count)
            {
                if (Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames || count >= maxEntitiesPerFrame)
                {
                    yield return new WaitForSeconds(delayBetweenFrames);
                    timestamp = Time.realtimeSinceStartup;
                    count = 0;
                }

                var baseEntity = ownedEntities[i];
                if (!(baseEntity == null) && baseEntity.OwnerID == steamid)
                {
                    if (admin != null)
                    {
                        if (Time.realtimeSinceStartup - fxTimestamp > fxCooldown)
                        {
                            PlaySound("assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", admin);
                            fxTimestamp = Time.realtimeSinceStartup;
                        }
                    }

                    lastPosition = baseEntity.transform.position;
                    baseEntity.Kill(BaseNetworkable.DestroyMode.Gib);
                    count++;
                }

                i++;
            }

            if (admin != null)
            {
                PlaySound("assets/prefabs/locks/keypad/effects/lock.code.lock.prefab", admin);
                timer.Once(0.75f, () =>
                {
                    PlaySound("assets/prefabs/npc/autoturret/effects/targetacquired.prefab", admin);

                    if (flag_kill_no_loot) return;
                    var effect =
                        GameManager.server.CreateEntity("assets/prefabs/deployable/fireworks/mortarred.prefab",
                            lastPosition);
                    effect.Spawn();
                    var firework = effect as BaseFirework;
                    firework.fuseLength = 0;
                    firework.Ignite(firework.transform.position - Vector3.down);
                });
            }

            yield return null;
        }

        private HashSet<ulong> currentlyScreamingPlayers = new HashSet<ulong>();
        private const string sound_scream = "assets/bundled/prefabs/fx/player/beartrap_scream.prefab";
        private const string effect_onfire = "assets/bundled/prefabs/fx/player/onfire.prefab";

        private static void GivePlayerFlamethrower(BasePlayer player)
        {
            if (player == null) return;
            GiveItemOrDrop(player, ItemManager.CreateByName("flamethrower"));
        }

        // ReSharper disable once UnusedMember.Global
        public void Line(BasePlayer player, Vector3 from, Vector3 to, Color color, float duration)
        {
            player.SendConsoleCommand("ddraw.line", duration, color, from, to);
        }

        private void AdminSpawnChickens(BasePlayer player, BasePlayer target, string[] args)
        {
            if (player == null) return;
            RaycastHit hit;
            if (Physics.Raycast(player.eyes.HeadRay(), out hit)) SpawnChickens(target, hit.point, args);
        }

        private HashSet<BaseCombatEntity> chickens = new HashSet<BaseCombatEntity>();

        private void SpawnChickens(BasePlayer player, Vector3 spawnposition, string[] args)
        {
            for (var i = 0; i < 10; i++) Worker.StaticStartCoroutine(AnimalAttackCo(player, spawnposition, args));
        }

        private IEnumerator AnimalAttackCo(BasePlayer player, Vector3 spawnposition, string[] args)
        {
            RaycastHit hit;
            var ray = new Ray(
                UnityEngine.Random.Range(-5f, 5f) * Vector3.forward + UnityEngine.Random.Range(-5f, 5f) * Vector3.left +
                spawnposition + Vector3.up * 20, Vector3.down);
            if (!Physics.Raycast(ray, out hit)) yield break;
            var aiPrefab = "assets/rust.ai/agents/chicken/chicken.prefab";
            if (args.Contains("bear")) aiPrefab = "assets/rust.ai/agents/bear/bear.prefab";
            else if (args.Contains("boar")) aiPrefab = "assets/rust.ai/agents/boar/boar.prefab";
            else if (args.Contains("wolf")) aiPrefab = "assets/rust.ai/agents/wolf/wolf.prefab";
            else if (args.Contains("stag")) aiPrefab = "assets/rust.ai/agents/stag/stag.prefab";
            var entity = GameManager.server.CreateEntity(aiPrefab, hit.point + Vector3.up * 0.2f);
            var chicken = entity as BaseAnimalNPC;
            entity.Spawn();
            chicken.Stats.Speed = 200;
            chicken.Stats.TurnSpeed = 100;
            chicken.Stats.Acceleration = 50;
            chicken.AttackRange = 3;
            chicken.AttackDamage *= 2;
            chicken.Stats.VisionRange = 300;
            chickens.Add(chicken);
            chicken.AttackTarget = player;
            var transform = player.transform;
            chicken.ChaseTransform = transform;
            chicken.Stats.AggressionRange = 100000;
            chicken.Stats.DeaggroRange = 100000;
            chicken.Stats.IsAfraidOf = new BaseNpc.AiStatistics.FamilyEnum[0];
            chicken.Destination = transform.position;
            chicken.Stats.VisionCone = -1;
            yield return new WaitForSeconds(0.25f);
            chicken.LegacyNavigation = true;
            var doLoop = true;
            while (doLoop)
            {
                if (chicken != null && player != null)
                {
                    if (player.IsDead())
                    {
                        if (chicken != null) chicken.Kill();
                        doLoop = false;
                    }
                    else
                    {
                        if (chicken.NavAgent != null && chicken.NavAgent.isOnNavMesh)
                        {
                            var transform1 = player.transform;
                            chicken.ChaseTransform = transform1;
                            chicken.AttackTarget = player;
                            chicken.Destination = transform1.position;
                            chicken.TargetSpeed = chicken.Stats.Speed * 100;
                        }
                    }
                }
                else
                {
                    if (chicken != null) chicken.Kill();
                    doLoop = false;
                }

                yield return null;
            }


            timer.Once(120, () =>
            {
                if (chicken != null) chicken.Kill();
            });
            timer.Once(130f, () => { chickens.RemoveWhere(x => x == null); });
        }

        // ReSharper disable once UnusedMember.Local
        private void OnPlayerRespawned(BasePlayer player)
        {
            if (!HasCard(player.userID, Card.NoRest)) return;
            player.EndSleeping();
            player.SendNetworkUpdate();
        }

        // ReSharper disable once UnusedMember.Local
        // ReSharper disable once UnusedParameter.Local
        private void OnEntityKill(BaseNetworkable entity, HitInfo info)
        {
            if (entity == null) return;
            if (!entitiesWatchingForKilledMounts.Contains(entity)) return;
            var chair = entity.GetComponentInChildren<BaseMountable>();
            if (chair.IsMounted())
            {
                var player = chair.GetMounted();
                player.GetMounted().DismountPlayer(player, true);
                player.Teleport(chair.transform.position);
                player.Die();
            }

            entitiesWatchingForKilledMounts.Remove(entity);

            timer.Once(0.5f, () =>
            {
                if (entitiesWatchingForKilledMounts.Count == 0)
                    Unsubscribe("OnEntityKill");
            });
        }

        private HashSet<BaseNetworkable> entitiesWatchingForKilledMounts = new HashSet<BaseNetworkable>();

        private void RocketManTarget(BasePlayer player)
        {
            var hasSit = false;
            if (HasCard(player.userID, Card.Sit))
            {
                hasSit = true;
                TakeCard(player, Card.Sit);
            }

            if (player.isMounted)
            {
                var mount = player.GetMounted();
                mount.DismountPlayer(player, true);
            }

            TakeCard(player, Card.Rocketman);

            Subscribe("OnEntityKill");

            var position = player.transform.position;
            player.Teleport(position + Vector3.up * 2f);
            var rocket = GameManager.server.CreateEntity("assets/prefabs/ammo/rocket/rocket_hv.prefab",
                position + Vector3.up * 2f);

            rocket.creatorEntity = player;
            var projectile = rocket.GetComponent<ServerProjectile>();
            projectile.InitializeVelocity(Vector3.up * 1f);
            rocket.Spawn();
            rocket.transform.LookAt(Vector3.up + rocket.transform.position);
            entitiesWatchingForKilledMounts.Add(rocket);
            var collider = rocket.gameObject.GetComponent<Collider>();
            if (collider != null) collider.enabled = false;
            var chair = InvisibleSit(player);
            chair.SetParent(rocket, true);
            Transform transform;
            (transform = chair.transform).LookAt(chair.transform.position + Vector3.up);
            var position1 = transform.position;
            var up = transform.up;
            position1 += up * -0.35f;
            position1 += transform.forward * 0.7f;
            transform.position = position1;
            chair.transform.LookAt(position1 + Vector3.up + up * -1f);

            rocket.transform.position = player.transform.position;
            if (hasSit) rocket.transform.position += Vector3.up * 1;
            Worker.StaticStartCoroutine(AccelerateRocketOverTime(projectile));
        }

        private static IEnumerator AccelerateRocketOverTime(ServerProjectile projectile)
        {
            const float duration = 5f;
            var startTime = Time.realtimeSinceStartup;
            while (Time.realtimeSinceStartup - startTime < duration)
            {
                var p = (Time.realtimeSinceStartup - startTime) / duration;
                if (projectile != null) projectile.InitializeVelocity(Vector3.up * 20f * p);
                yield return new WaitForFixedUpdate();
            }
        }

        private const string invisibleChairPrefab = "assets/bundled/prefabs/static/chair.invisible.static.prefab";

        private HashSet<BaseMountable> chairsPreventingDismount = new HashSet<BaseMountable>();

        private BaseEntity InvisibleSit(BasePlayer targetPlayer)
        {
            var chair = GameManager.server.CreateEntity(invisibleChairPrefab, targetPlayer.transform.position);
            var mount = chair as BaseMountable;
            chair.Spawn();
            chairsPreventingDismount.Add(mount);
            UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<DestroyOnGroundMissing>());
            UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<GroundWatch>());
            if (targetPlayer.isMounted) targetPlayer.GetMounted().DismountPlayer(targetPlayer, true);
            Timer t = null;
            t = timer.Every(0.25f, () =>
            {
                if (chair == null || chair.IsDestroyed)
                {
                    t.Destroy();
                    return;
                }

                if (targetPlayer != null)
                {
                    if (targetPlayer.isMounted) return;
                    targetPlayer.Teleport(chair.transform.position);
                    mount.MountPlayer(targetPlayer);
                    chair.SendNetworkUpdateImmediate();
                }
                else
                {
                    chair.Kill();
                    t.Destroy();
                }
            });
            return chair;
        }

        private List<string> sounds_kill_quad = new List<string>()
        {
            "assets/prefabs/weapons/python/effects/close_cylinder.prefab",
            "assets/prefabs/weapons/mace/effects/hit.prefab",
            "assets/prefabs/misc/halloween/lootbag/effects/gold_open.prefab",
        };

        private void DoPinyataEffect(BasePlayer player)
        {
            var baseMagnitude = 1.35f;
            var baseForceUp = 0.1f;
            var randomForceUp = 8f * baseMagnitude;
            var forceHorz = 10f * baseMagnitude;
            var q = Quaternion.Euler(new Vector3(360 * Random(), 360 * Random(), 360 * Random()));
            var seedVelocity = Vector3.up * baseForceUp + q * Vector3.forward;

            var itemCount = player.inventory.AllItems().Length;
            var items = new List<Item>(player.inventory.AllItems());
            if (items == null) throw new ArgumentNullException(nameof(items));
            var literalShit = new List<Item>();
            const int targetItems = 20;
            if (itemCount < targetItems)
            {
                for (var count = 0; count < (targetItems - itemCount); count++)
                {
                    var item = ItemManager.CreateByName("horsedung");
                    GiveItemOrDrop(player, item);
                    literalShit.Add(item);
                    items.Add(item);
                }
            }

            var angleIncrement = 360f / Mathf.Max(itemCount, targetItems);
            PlaySound(sounds_kill_quad, player, false);
            float mag = 0;
            var i = 0;
            foreach (var unused in player.inventory.AllItems())
            {
                var velocity = Quaternion.Euler(0, angleIncrement * i, 0) * seedVelocity;
                var randomUp = Vector3.up * Mathf.Max(0.5f, Random()) * randomForceUp;
                mag += velocity.magnitude;
                velocity.y = 0;
                velocity *= Mathf.Max(0.55f, Random()) * forceHorz;
                velocity += randomUp;
                var horz = velocity;
                horz.y = 0;
                i++;
            }

            timer.Once(10f, () =>
            {
                literalShit.ForEach(x =>
                {
                    x?.RemoveFromContainer();
                    x?.Remove();
                });
            });
        }

        private void DoDana(BasePlayer player, BasePlayer admin)
        {
            if (player != null && admin != null)
            {
                foreach (var item in new List<Item>(player.inventory.containerBelt.itemList))
                    GiveItemOrDrop(admin, item);
                foreach (var item in new List<Item>(player.inventory.AllItems())) GiveItemOrDrop(admin, item);
            }

            TakeCard(player, Card.Dana);
        }

        private static void GiveItemOrDrop(BasePlayer player, Item item, bool stack = false)
        {
            var success = item.MoveToContainer(player.inventory.containerBelt, -1, stack);
            if (!success) success = item.MoveToContainer(player.inventory.containerMain, -1, stack);
            if (!success) success = item.MoveToContainer(player.inventory.containerWear, -1, stack);
            if (!success) item.Drop(player.transform.position + Vector3.up, Vector3.zero);
        }


        private HashSet<ulong> thirstyPlayers = new HashSet<ulong>();
        private Dictionary<ulong, BasePlayer> basePlayerMap = new Dictionary<ulong, BasePlayer>();
        private Coroutine thirstyCoroutine;

        private void DoThirsty(BasePlayer player)
        {
            thirstyPlayers.Add(player.userID);
            if (thirstyCoroutine == null) thirstyCoroutine = Worker.StaticStartCoroutine(DoThirstyCo());
        }

        private IEnumerator DoThirstyCo()
        {
            while (thirstyPlayers.Count > 0)
            {
                foreach (var userID in new HashSet<ulong>(thirstyPlayers))
                {
                    if (HasCard(userID, Card.Thirsty))
                    {
                        BasePlayer player;
                        if (!basePlayerMap.TryGetValue(userID, out player)) player = BasePlayer.FindByID(userID);
                        if (player != null)
                        {
                            player.metabolism.hydration.MoveTowards(0, 10f);
                            player.SendNetworkUpdateImmediate();
                        }
                        else thirstyPlayers.Remove(userID);
                    }
                    else thirstyPlayers.Remove(userID);
                }

                yield return new WaitForSeconds(0.25f);
            }

            thirstyCoroutine = null;
        }

        private void DoHigherGround(BasePlayer player)
        {
            player.Teleport(player.transform.position + Vector3.up * 100);
            TakeCard(player, Card.HigherGround);
        }

        private void DoCamomoCommand(BasePlayer player)
        {
            var camomoCards = new List<Card>
            {
                Card.Pacifism,
                Card.Butterfingers,
                Card.InstantKarma,
                Card.DogDoo,
                Card.Dud,
                Card.DrNo,
            };
            foreach (var card in camomoCards) GiveCard(player.userID, card, Array.Empty<string>());
            TakeCard(player.userID, Card.Camomo);
        }

        private void DoNakedCommand(BasePlayer targetPlayer)
        {
            Worker.StaticStartCoroutine(NakedOverTime(targetPlayer));
            TakeCard(targetPlayer.userID, Card.Naked);
        }

        private IEnumerator NakedOverTime(BasePlayer targetPlayer)
        {
            yield return new WaitForSeconds(2);
            foreach (var item in targetPlayer.inventory.AllItems())
            {
                if (item == null) continue;
                var droppedEntity = item.Drop(targetPlayer.eyes.HeadRay().origin,
                    targetPlayer.eyes.HeadRay().direction * 5 + Vector3.up * 5 +
                    new Vector3(UnityEngine.Random.Range(-1f, 1f), 0, UnityEngine.Random.Range(-1f, 1f)));
                droppedEntity.transform.LookAt(targetPlayer.eyes.HeadRay().origin +
                                               Quaternion.Euler(0, UnityEngine.Random.Range(-90, 90),
                                                   UnityEngine.Random.Range(-90, 90)) *
                                               targetPlayer.eyes.HeadRay().direction * 2);
                var body = droppedEntity.GetComponentInChildren<Rigidbody>();
                if (body != null)
                {
                    const float power = 1;
                    body.AddForceAtPosition(targetPlayer.eyes.HeadRay().direction * power,
                        droppedEntity.transform.position + Vector3.up * 10f);
                }

                droppedEntity.SendNetworkUpdate();
                yield return null;
            }


            float startTime = Time.realtimeSinceStartup;
            while (Time.realtimeSinceStartup - startTime < 15)
            {
                //targetPlayer.SendConsoleCommand("gesture wave");
                yield return new WaitForSeconds(0.5f);
            }
        }

        private const string chairPrefab = "assets/prefabs/deployable/secretlab chair/secretlabchair.deployed.prefab";

        private Dictionary<ulong, BaseEntity> sitChairMap = new Dictionary<ulong, BaseEntity>();

        private void DoSitCommand(BasePlayer targetPlayer, BasePlayer adminPlayer)
        {
            if (targetPlayer == null) return;

            if (HasCard(targetPlayer.userID, Card.Sit))
            {
                if (adminPlayer == null) return;

                if (targetPlayer.isMounted)
                {
                    targetPlayer.GetMounted().DismountPlayer(targetPlayer, true);

                    var car = targetPlayer.GetMountedVehicle();
                    if (car != null) car.Kill(BaseNetworkable.DestroyMode.Gib);
                    BaseEntity chair;
                    if (sitChairMap.TryGetValue(targetPlayer.userID, out chair)) chair.Kill();
                }

                RaycastHit hitinfo;
                if (Physics.Raycast(adminPlayer.eyes.HeadRay(), out hitinfo, 50))
                {
                    var chair = GameManager.server.CreateEntity(chairPrefab, hitinfo.point);
                    var mount = chair as BaseMountable;
                    chair.Spawn();
                    sitChairMap[targetPlayer.userID] = chair;
                    //targetPlayer.Teleport(chair.transform.position + chair.transform.forward * 0.5f);
                    targetPlayer.EndSleeping();

                    UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<DestroyOnGroundMissing>());
                    UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<GroundWatch>());

                    var lookAtPosition = adminPlayer.transform.position;
                    lookAtPosition.y = mount.transform.position.y;

                    timer.Once(0.25f, () =>
                    {
                        if (targetPlayer != null)
                        {
                            mount.MountPlayer(targetPlayer);


                            chair.transform.LookAt(lookAtPosition);
                            chair.SendNetworkUpdateImmediate();

                            Worker.StaticStartCoroutine(SitCo(targetPlayer));
                        }
                        else chair.Kill();
                    });
                }
            }
            else
            {
                BaseEntity chair;
                if (!sitChairMap.TryGetValue(targetPlayer.userID, out chair)) return;
                if (chair != null) chair.Kill();
            }
        }

        private IEnumerator SitCo(BasePlayer player)
        {
            yield return new WaitForSeconds(0.25f);
            BaseEntity chair;
            sitChairMap.TryGetValue(player.userID, out chair);
            var mount = chair as BaseMountable;

            while (player != null && chair != null && HasCard(player.userID, Card.Sit))
            {
                if (player != null)
                {
                    if (player.IsSleeping())
                    {
                        player.EndSleeping();
                    }

                    if (player.isMounted)
                    {
                        var playerMount = player.GetMounted();
                        if (playerMount != mount) player.GetMounted().DismountPlayer(player, true);
                    }

                    var dist = Vector3.Distance(chair.transform.position, player.transform.position);
                    if (dist > 2)
                    {
                        var transform = chair.transform;
                        player.Teleport(transform.position + transform.forward * 0.5f);
                    }

                    if (!player.isMounted && dist < 2) player.MountObject(mount);
                }
                else chair.Kill();

                yield return new WaitForSeconds(0.25f);
            }

            if (chair != null) chair.Kill();
        }

        // ReSharper disable once UnusedMember.Local
        private object CanDismountEntity(BasePlayer player, BaseMountable entity)
        {
            if (cardMap.Count == 0 && chairsPreventingDismount.Count == 0) return null;

            if (HasCard(player.userID, Card.Sit)) return false;
            foreach (var chair in new HashSet<BaseMountable>(chairsPreventingDismount).Where(chair =>
                         chair == null || chair.IsDestroyed)) chairsPreventingDismount.Remove(chair);
            if (chairsPreventingDismount.Contains(entity)) return false;
            return null;
        }


        private const string guid_BSOD = "guid_BSOD";
        private const string url_bsod = "https://i.imgur.com/36oaKDW.png";

        private void DoBSOD(BasePlayer player, bool playPublic)
        {
            if (player.net.connection == null) return;
            UI2.guids.Add(guid_BSOD);
            var elements = new CuiElementContainer();
            UI2.CreatePanel(elements, "Overlay", guid_BSOD, "1 1 1 1", UI2.vectorFullscreen, url_bsod, true);
            UI2.CreatePanel(elements, guid_BSOD, "blackpreloader", "0 0 0 1", UI2.vectorFullscreen, null, true);
            if (IsAdmin(player))
                UI2.CreateButton(elements, guid_BSOD, "exitbutton", "0 0 0 0", "", 12, UI2.v
// ... [Code preview truncated due to length. Full source in attached file] ...

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