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

FREE Payback : 1.9.7 1.9.7

Нет прав для скачивания
C#:
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;
using Rust.Ai;
using Network;
namespace Oxide.Plugins {
    [Info("Payback", "Skuli Dropek", "1.9.7")]
    [Description("Специальные команды администратора для борьбы с читерами")]
    class Payback : RustPlugin {
        //| ==============================================================
        //| Definitions
        //| ==============================================================
        public enum Card {
            Pacifism = 0,  //обнуляет весь исходящий урон от целевого игрока
            Butterfingers = 1,  //при нанесении урона любому игроку, шанс бросить текущее оружие.InstantKarma = 4,//отражает урон обратно игроку
            Dud = 5,  //предотвращает повреждение неигровых объектов
            DogDoo = 6,  //мина под игроком-мишенью, когда тот получает доступ к тайникам
            BSOD = 7,  //дать целевому игроку поддельное сообщение о критическом сбое в ОС
            Sit = 8,  //заставить игрока сесть
            Naked = 9,  //заставить игрока бросить все, что у него есть в инвентаре
            Camomo = 10,  //применить комбинацию способностей, которую выбрал Камомо
            HigherGround = 11,  //целевой игрок телепортируется на 100 м в воздух
            Thirsty = 12,  //целевой игрок очень быстро испытывает жажду
            DrNo = 13,  // целевой игрок больше не получает здоровье от исцеляющих предметов
            Dana = 14,  // украсть инвентарь целевого игрока и поместить его в свой
            Pinyata = 15,  // инвентарь целевого игрока вылетает из него, когда он умирает
            Rocketman,  // привяжите целевого игрока к ракете и запустите его!
            NoRest,  // Нет мира для нечестивых! Заставьте игрока переродиться!
            ChickenChaser,  // Порождает орду цыплят с суперскоростью, которые атакуют только целевого игрока!
            ViewLoot,  // Просмотреть добычу целевых объектов
            Burn,  // Дает игроку огнемет, который заставит его врагов кричать и гореть.Hammer, // молот - дает целевому игроку молот, который уничтожает все сущности, принадлежащие цели молота
            Bag,  // Мешок — вывести всех игроков, в которых попал целевой игрок, и всех игроков, которые попали в мешки.Включите «discord» после команды для записи результатов в discord.Shocker, // Шокер - поразить игрока до смерти.Затрагивает игроков поблизости, поэтому будьте осторожны.Обязательно отключите его после использования.//Cowboy, // Ковбой - оседлайте целевого игрока как дикую свинью -> не удалось заставить это работать
            Masochist,  // Мазохист - остановить игрока от самоубийства в F1
            Emote,  // Эмоция - варианты:
            Shark,  // Челюсти - акула приходит, чтобы съесть мошенника
        }
        Dictionary<Card, string> descriptions = new Dictionary<Card, string>() {
            {
                Card.Butterfingers, "% шанс для целевого игрока бросить оружие при нанесении урона противнику"
            }
            , {
                Card.Dud, "целевой игрок не наносит урона существам НЕ-ИГРОКАМ.Также предотвращает фермерство / tool use"
            }
            , {
                Card.InstantKarma, "целевой игрок не наносит врагам никакого урона, а 35% урона отражается обратно к нему"
            }
            , {
                Card.Pacifism, "целевой игрок не наносит игрового урона товарищам по команде; добавьте 'silent', чтобы не посылать сообщение об этом другим игрокам."
            }
            , {
                Card.DogDoo, "мина под целевым игроком, когда он получает доступ к тайнику"
            }
            , {
                Card.BSOD, "целевой игрок получает фальшивый синий экран смерти"
            }
            , {
                Card.Sit, "Порождает стул перед вами и заставляет читера сесть.Не позволяет ему встать и усаживает его обратно, если он умирает."
            }
            , {
                Card.Naked, "заставить игрока бросить все, что у него есть в инвентаре"
            }
            , {
                Card.Camomo, "применять комбинацию способностей, выбранных Камомо [pf,bf,in,dog,dud,dr]"
            }
            , {
                Card.HigherGround, "целевой игрок телепортируется на 100 м в воздух"
            }
            , {
                Card.Thirsty, "целевой игрок очень быстро испытывает жажду"
            }
            , {
                Card.DrNo, "целевой игрок больше не может лечиться"
            }
            , {
                Card.Dana, "украсть инвентарь целевого игрока и поместить его в свой"
            }
            , {
                Card.Pinyata, "инвентарь целевого игрока вылетает из него, когда он умирает"
            }
            , {
                Card.Rocketman, "привяжите целевого игрока к ракете и запустите его!"
            }
            , {
                Card.NoRest, "Нет покоя злым! Заставьте игрока возрождаться после смерти!"
            }
            , {
                Card.ChickenChaser, "Порождает орду цыплят с супер скоростью, которые атакуют только целевого игрока! добавить «волк» «олень» «медведь» или «кабан» после команды смены животного"
            }
            , {
                Card.ViewLoot, "Просмотр добычи целевого игрока"
            }
            , {
                Card.Burn, "Дает игроку огнемет, который заставит его врагов кричать и гореть."
            }
            , {
                Card.Hammer, "Дает администратору молот, который уничтожит все объекты, принадлежащие цели молота.Добавьте -noloot, чтобы также удалить добычу"
            }
            , {
                Card.Bag, "Выведите всех игроков, которые забили целевого игрока, и выведите всех игроков, которые попали в мешки.Включите \"discord\" после команды, чтобы записать результаты в дискорд"
            }
            , {
                Card.Shocker, "Поразить игрока до смерти.Поражает игроков, находящихся поблизости, поэтому будьте осторожны.Обязательно отключите его после использования."
            }
            ,  //{Card.Cowboy, "Ковбой - ездить на целевом игроке, как на дикой свинье" },
            {
                Card.Masochist, "Мазохист - остановить игрока из F1 убить себя"
            }
            , {
                Card.Emote, "Эмоция - заставить игрока использовать эмоцию."
            }
            , {
                Card.Shark, "акула приходит съесть мошенника"
            }
            ,
        }
        ;
        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
            }
            ,
        }
        ;
        //| ==============================================================
        //| Giving
        //| ==============================================================
        public 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);
            //Puts($"Payback card {card} given to {userID}");
            BasePlayer player = BasePlayer.FindByID(userID);
            if (player != null) {
                if (card == Card.BSOD) {
                    bool playPublic = args.Contains("public");
                    DoBSOD(player, playPublic);
                }
                else if (card == Card.Sit) {
                    DoSitCommand(player, admin);
                }
                else if (card == Card.Naked) {
                    DoNakedCommand(player);
                }
                else if (card == Card.Camomo) {
                    DoCamomoCommand(player);
                }
                else if (card == Card.HigherGround) {
                    DoHigherGround(player);
                }
                else if (card == Card.Thirsty) {
                    DoThirsty(player);
                }
                else if (card == Card.Dana) {
                    DoDana(player, admin);
                }
                else if (card == Card.Pacifism) {
                    silentPacifism = false;
                    if (args != null) {
                        if (args.Contains("silent")) {
                            silentPacifism = true;
                        }
                    }
                }
                else if (card == Card.Rocketman) {
                    RocketManTarget(player);
                }
                else if (card == Card.NoRest) {
                    if (player.IsDead()) {
                        player.Respawn();
                    }
                }
                else if (card == Card.ChickenChaser) {
                    AdminSpawnChickens(admin, player, args);
                    TakeCard(player, Card.ChickenChaser);
                }
                else if (card == Card.ViewLoot) {
                    ViewTargetPlayerInventory(player, admin);
                    TakeCard(player, Card.ViewLoot);
                }
                else if (card == Card.Burn) {
                    GivePlayerFlamethrower(player);
                }
                else if (card == Card.Hammer) {
                    GiveAdminHammer(player);
                    if (args.Contains("noloot")) {
                        flag_kill_no_loot = true;
                        PrintToPlayer(admin, $"Молоток для удаления добычи!");
                    }
                    else {
                        flag_kill_no_loot = false;
                    }
                }
                else if (card == Card.Shocker) {
                    DoShocker(player, args, admin);
                }
                else if (card == Card.Emote) {
                    DoEmote(player, args, admin);
                }
                else if (card == Card.Shark) {
                    DoShark(player, args, admin);
                }
                //if (card == Card.Cowboy)
                //{
                //    DoCowboy(player, args, admin);
                //}
            }
        }
        bool silentPacifism = false;
        //| ==============================================================
        //| COMMAND Implementation
        //| ==============================================================
        void DoShark(BasePlayer player, string[] args, BasePlayer admin = null) {
            Worker.StaticStartCoroutine(SharkCo2(player, args, admin));
        }
        IEnumerator SharkCo2(BasePlayer player, string[] args, BasePlayer admin = null) {
            TakeCard(player, Card.Shark);
            ////| KILL ALL EXISTING SHARKS FOR DEBUGGING
            //SimpleShark[] sharks = GameObject.FindObjectsOfType<SimpleShark>();
            //foreach (var s in sharks)
            //{
            //    s.Kill();
            //}
            //| SPAWN THE SHARK
            SimpleShark shark;
            string sharkPrefab = "assets/rust.ai/agents/fish/simpleshark.prefab";
            BaseEntity entity = GameManager.server.CreateEntity(sharkPrefab, player.transform.position + new Vector3(-100, -100, -100));
            shark = entity as SimpleShark;
            entity.Spawn();
            shark.enabled = false;
            Vector3 playerForward = player.eyes.HeadForward();
            playerForward.y = 0;
            playerForward.Normalize();
            shark.transform.LookAt(player.transform.position + Vector3.up * 100 + playerForward);
            yield return Worker.StaticStartCoroutine(MoveSharkCo(shark, player));
        }
        string sfx_bloodHit = "assets/bundled/prefabs/fx/impacts/stab/flesh/fleshbloodimpact.prefab";
        string sfx_watersplash = "assets/bundled/prefabs/fx/explosions/water_bomb.prefab";
        IEnumerator MoveSharkCo(SimpleShark shark, BasePlayer player) {
            float duration = 4f;
            //float duration = 20f;
            float ts = Time.realtimeSinceStartup;
            Vector3 sharkStartPos = player.transform.position + Vector3.down * 30f;
            Vector3 playerStartPosition = player.transform.position;
            Vector3 playerForward = player.eyes.HeadForward();
            playerForward.y = 0;
            playerForward.Normalize();
            bool didSit = false;
            BaseEntity chair = null;
            //bool didEmote = false;
            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.34)
                if (p < 0.24) {
                    //playerStartPosition = player.transform.position + Vector3.up * 4f;//|V2
                    playerStartPosition = player.transform.position + Vector3.up * 10f;
                    shark.transform.LookAt(player.transform.position + Vector3.up * 100 + playerForward);
                }
                else {
                    if (!didSit) {
                        //| PLAY SFX
                        //PlaySound(sfx_bloodHit, player, false, player.transform.position + Vector3.up);
                        //PlaySound(sfx_watersplash, player, false, player.transform.position);
                        global : : Effect.server.Run(shark.bloodCloud.resourcePath, player.transform.position + Vector3.up, Vector3.forward, null, false);
                        global : : Effect.server.Run(sfx_watersplash, player.transform.position + Vector3.up, Vector3.forward, null, false);
                        timer.Once(0.2f, () => {
                            if (player == null) return;
                            PlayGesture(player, "friendly");
                        }
                        );
                        //| Dismount the player if mounted
                        if (HasCard(player.userID, Card.Sit)) {
                            TakeCard(player.userID, Card.Sit);
                        }
                        Vector3 playerFacing = player.eyes.HeadForward();
                        playerFacing.y = 0;
                        playerFacing.Normalize();
                        //| Sit the player
                        chair = InvisibleSit(player);
                        chair.SetParent(shark, true, true);
                        //| V2
                        chair.transform.LookAt(chair.transform.position + playerFacing);
                        didSit = true;
                    }
                    //chair.transform.position = shark.transform.position + shark.transform.forward * 0.88f + shark.transform.up * 0.15f;
                    chair.transform.position = shark.transform.position + shark.transform.forward * 0.88f + shark.transform.up * 0.19f;
                    //chair.transform.LookAt(shark.transform.up * -1 + shark.transform.position + Vector3.up * 0.25f);
                    chair.transform.LookAt(shark.transform.position + shark.transform.up * -1 + Vector3.up * 0.15f);
                }
                shark.transform.position = Vector3.Lerp(sharkStartPos, playerStartPosition, y);
                shark.transform.LookAt(player.transform.position + Vector3.up * 100 + playerForward);
                shark.transform.Rotate(shark.transform.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();
        }
        void DoEmote(BasePlayer player, string[] args, BasePlayer admin = null) {
            if (player == null) return;
            string gesture = "wave";
            if (args.Length > 1) {
                gesture = args[1];
                var g = player.gestureList.StringToGesture(gesture);
                if (g == null) {
                    string output = "\n";
                    foreach (var gg in player.gestureList.AllGestures) {
                        output += gg.convarName + "\n";
                    }
                    PrintToPlayer(admin, $"Жест не найден: {gesture}\nДоступные жесты:{output}");
                }
            }
            else {
                PrintToPlayer(admin, $"чтобы увидеть, как используются все эмоции: /emote <target> список");
            }
            PlayGesture(player, gesture);
            TakeCard(player, Card.Emote);
        }
        bool? CanUseGesture(BasePlayer player, GestureConfig gesture) {
            if (HasAnyCard(player.userID)) return true;
            return null;
        }
        void ResolveConflictingCommands(BasePlayer player, BasePlayer admin = null) {
            bool hasSit = false;
            if (HasCard(player.userID, Card.Sit)) {
                hasSit = true;
                TakeCard(player, Card.Sit);
            }
            if (player.isMounted) {
                var car = player.GetMountedVehicle();
                if (car != null) {
                    car.Kill(BaseNetworkable.DestroyMode.Gib);
                }
            }
            TakeCard(player, Card.Rocketman);
        }
        //object CanNetworkTo(BaseNetworkable entity, BasePlayer target)
        //{
        //    if (cowboynetworkables.ContainsKey(target.userID) && cowboynetworkables[target.userID].Contains(entity))
        //    {
        //        PrintToChat($"CanNetworkTo: {entity.ShortPrefabName} {target.displayName}");
        //        return true;
        //    }
        //    return null;
        //}
        //Dictionary<ulong, List<BaseNetworkable>> cowboynetworkables = new Dictionary<ulong, List<BaseNetworkable>>();
        //void DoCowboy(BasePlayer player, string[] args, BasePlayer admin = null) {
        //    //disabled for testing
        //    if (player == null) return;
        //    if (HasCard(admin.userID, Card.Cowboy))
        //    {
        //        List<BaseNetworkable> existing;
        //        if (cowboynetworkables.TryGetValue(admin.userID, out existing))
        //        {
        //            if (existing != null)
        //            {
        //                existing.ForEach(x => x.Kill());
        //                existing.Clear();
        //            }
        //            cowboynetworkables.Remove(admin.userID);
        //        }
        //    }
        //    //down target player
        //    //disabled for testing
        //    player.BecomeWounded();
        //    player.ProlongWounding(100000000000);
        //    ResolveConflictingCommands(player, admin);
        //    //|====================================================
        //    //| create the chair for the person to ride
        //    //string innertube = "assets/prefabs/misc/summer_dlc/inner_tube/innertube.deployed.prefab";
        //    var chair = GameManager.server.CreateEntity(invisibleChairPrefab, player.transform.position + Vector3.up * 0.5f);
        //    //var chair = GameManager.server.CreateEntity(chairPrefab, player.transform.position + Vector3.up * 0.5f);
        //    //var chair = GameManager.server.CreateEntity(innertube, player.transform.position + Vector3.up * 0.75f);
        //    var mount = chair as BaseMountable;
        //    chair.Spawn();
        //    GameObject.DestroyImmediate(chair.GetComponentInChildren<DestroyOnGroundMissing>());
        //    GameObject.DestroyImmediate(chair.GetComponentInChildren<GroundWatch>());
        //    chair.GetComponentInChildren<Collider>().enabled = false;
        //    //|====================================================
        //    //| create something for the chair to parent to
        //    Item muzzle = ItemManager.CreateByPartialName("muzzlebrake");
        //    var dropped = muzzle.Drop(player.transform.position, Vector2.zero);
        //    DroppedItem droppedItem = dropped as DroppedItem;
        //    droppedItem.allowPickup = false;
        //    droppedItem.GetComponent<Rigidbody>().collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
        //    droppedItem.GetComponent<Rigidbody>().isKinematic = true;
        //    droppedItem.GetComponent<Rigidbody>().useGravity = false;
        //    SetDespawnDuration(droppedItem, 60 * 15);
        //    //|====================================================
        //    //| Do the parenting
        //    dropped.transform.position += Vector3.up * 0.5f;
        //    //chair.SetParent(dropped, true, true);
        //    //now we can either parent to the player, or we need to run a coroutine to bind the chair to the player
        //    //may need to replace this with something to track a downed player instead of rocket
        //    //Worker.StaticStartCoroutine(AccelerateRocketOverTime(projectile));
        //    //dropped.SetParent(player, true, true);
        //    //chair.SetParent(player, true, true);
        //    //timer.Once (3f, () => {
        //    //    //chair.limitNetworking = true;
        //    //});
        //    //timer.Once(0.25f, () => {
        //    //    if (chair != null && admin != null)
        //    //    {
        //    //        PrintToChat("on");
        //    //        chair.net.SwitchGroup(Net.sv.visibility.Get(13371));
        //    //        admin.net.SwitchGroup(Net.sv.visibility.Get(13371));
        //    //        //admin.net.AddVisibleFromNear(Net.sv.visibility.GetGroup(admin.transform.position), new List<Network.Visibility.Group>());
        //    //        admin.net.subscriber.Subscribe(Net.sv.visibility.GetGroup(player.transform.position));
        //    //    }
        //    //});
        //    //timer.Once(15f, () => {
        //    //    if (chair != null && admin != null)
        //    //    {
        //    //        //chair.limitNetworking = true;
        //    //        PrintToChat("off");
        //    //        chair.net.SwitchGroup(Net.sv.visibility.GetGroup(admin.transform.position));
        //    //        admin.net.SwitchGroup(Net.sv.visibility.GetGroup(admin.transform.position));
        //    //    }
        //    //});
        //    //chair._limitedNetworking = true;
        //    Worker.StaticStartCoroutine(MoveCowboyOverTime(player, chair));
        //    //mount.MountPlayer(admin);
        //    cowboynetworkables[admin.userID] = new List<BaseNetworkable>() { chair };
        //}
        //IEnumerator MoveCowboyOverTime(BasePlayer player, BaseEntity entity)
        //{
        //    Vector3 offset = entity.transform.position - player.transform.position;
        //    ulong userid = player.userID;
        //    while (HasCard(player.userID, Card.Cowboy))
        //    {
        //        if (player != null && player.net.connection != null)
        //        {
        //            //entity.transform.position += Vector3.forward * 0.01f;
        //            entity.transform.position = player.transform.position + offset;
        //            var forward = player.eyes.HeadForward();
        //            forward.y = 0;
        //            entity.transform.LookAt(entity.transform.position + forward);
        //            entity.SendNetworkUpdateImmediate();
        //            yield return new WaitForFixedUpdate();
        //        } else
        //        {
        //            break;
        //        }
        //    }
        //    if (entity != null)
        //    {
        //        entity?.Kill();
        //    }
        //    TakeCard(userid, Card.Cowboy);
        //}
        Dictionary<ulong, BaseEntity> coilMap = new Dictionary<ulong, BaseEntity>();
        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;
            }
            TeslaCoil coil = GameManager.server.CreateEntity("assets/prefabs/deployable/playerioents/teslacoil/teslacoil.deployed.prefab", player.transform.position) as TeslaCoil;
            coil.transform.position += Vector3.down * 1;
            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();
                    return;
                }
                else {
                    if (Vector3.Distance(player.transform.position, coil.transform.position) < 5) {
                        los.OnEntityEnter(player);
                    }
                    else {
                        los.OnEntityLeave(player);
                    }
                }
            }
            );
        }
        void DoBagSearch(ulong userID, string[] args, BasePlayer admin = null) {
            if (userID == 0) return;
            TakeCard(userID, Card.Bag);
            if (args.Contains("discord")) {
                Worker.StaticStartCoroutine(BagSearchCo(userID, true, admin));
            }
            else {
                Worker.StaticStartCoroutine(BagSearchCo(userID, false, admin));
            }
        }
        IEnumerator BagSearchCo(ulong userID, bool logToDiscord = false, BasePlayer admin = null) {
            yield return null;
            float timestamp = Time.realtimeSinceStartup;
            float maxTimeBetweenFrames = 1 / 20f;
            //| Get bags owned by player
            var allBags = BaseNetworkable.serverEntities.OfType<SleepingBag>();
            //var deployedByTargetBags = new List<SleepingBag>();
            var useridsBaggedByTarget = new HashSet<ulong>();
            var useridsWhoBaggedTarget = new HashSet<ulong>();
            //find the bags that target placed
            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;
                }
                //target bagged someone else
                if (ownerid == userID && bag.deployerUserID != userID) {
                    //deployedByTargetBags.Add(bag);
                    useridsBaggedByTarget.Add(bag.deployerUserID);
                }
                //someone bagged in target
                if (userID == bag.deployerUserID && ownerid != userID) {
                    useridsWhoBaggedTarget.Add(ownerid);
                }
            }
            var messageData = new Dictionary<string, string>();
            string targetInfo = $"{TryGetDisplayName(userID)}";
            string baggedByString = "";
            string output = $"Players bagged by {targetInfo}:";
            foreach (var userid in useridsBaggedByTarget) {
                var displayname = TryGetDisplayName(userid);
                output += $"\n{userid} : {displayname}";
                baggedByString += $"{userid} : {displayname}\n";
            }
            if (baggedByString.Length > 0) {
                messageData.Add($"Players bagged by {targetInfo}", baggedByString);
            }
            else {
                messageData.Add($"Players bagged by {targetInfo}", "none");
            }
            output += $"\nSteamids who bagged in {targetInfo}:";
            string baggedInString = "";
            foreach (var userid in useridsWhoBaggedTarget) {
                var displayname = TryGetDisplayName(userid);
                output += $"\n{userid} : {displayname}";
                baggedInString += $"\n{userid} : {displayname}";
            }
            if (baggedInString.Length > 0) {
                messageData.Add($"Players who bagged in {targetInfo}", baggedInString);
            }
            else {
                messageData.Add($"Players who bagged in {targetInfo}", "none");
            }
            PrintToPlayer(admin, $"{output}");
            if (logToDiscord) {
                SendToDiscordWebhook(messageData, $"Bag Search [{userID}]");
            }
        }
        bool flag_kill_no_loot = false;
        void GiveAdminHammer(BasePlayer admin) {
            if (admin == null) return;
            var item = ItemManager.CreateByName("hammer", 1, 2375073548);
            if (item != null) {
                GiveItemOrDrop(admin, item, false);
            }
        }
        object OnStructureRepair(BaseCombatEntity entity, BasePlayer player) {
            if (HasCard(player.userID, Card.Hammer)) {
                Worker.StaticStartCoroutine(DeleteByCo(entity.OwnerID, player.transform.position, player));
            }
            return null;
        }
        IEnumerator DeleteByCo(ulong steamid, Vector3 position, BasePlayer admin = null) {
            yield return null;
            if (steamid == 0UL) {
                yield break;
            }
            float maxTimeBetweenFrames = 1 / 60f;
            int maxEntitiesPerFrame = 1;
            float delayBetweenFrames = 1 / 20f;
            float timestamp = Time.realtimeSinceStartup;
            var entities = new List<BaseNetworkable>(BaseNetworkable.serverEntities);
            float fxTimestamp = Time.realtimeSinceStartup;
            float fxCooldown = 0.75f;
            //float fxCooldown = 0.2f;
            var ownedEntities = new List<BaseEntity>();
            foreach (var x in entities) {
                var entity = x as BaseEntity;
                if (!(entity == null) && entity.OwnerID == steamid) {
                    ownedEntities.Add(entity);
                }
                if (Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames) {
                    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;
            int i = 0;
            int count = 0;
            bool playSound = true;
            if (admin != null) PlaySound("assets/bundled/prefabs/fx/headshot.prefab", admin, false);
            Vector3 lastPosition = Vector3.zero;
            //| LOOT REMOVAL PASS
            if (flag_kill_no_loot) {
                foreach (var baseEntity in ownedEntities) {
                    var storage = baseEntity as StorageContainer;
                    if (storage != null) {
                        foreach (var item in new List<Item>(storage.inventory.itemList)) {
                            //PrintToPlayer(admin, $"Removing: {item.info.displayName.english}");
                            item.GetHeldEntity()?.KillMessage();
                            //item.DoRemove();
                            //item.Remove();
                            ItemManager.RemoveItem(item);
                        }
                        ItemManager.DoRemoves();
                        //storage.inventory.Clear();
                    }
                }
            }
            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 && playSound) {
                        if (Time.realtimeSinceStartup - fxTimestamp > fxCooldown) {
                            //var effect = GameManager.server.CreateEntity("assets/prefabs/deployable/fireworks/mortarred.prefab", baseEntity.transform.position);
                            //effect.Spawn();
                            //var firework = effect as BaseFirework;
                            //firework.fuseLength = 0;
                            //firework.Ignite();
                            //var effect = GameManager.server.CreateEntity("assets/prefabs/ammo/rocket/rocket_basic.prefab", baseEntity.transform.position);
                            //effect.Spawn();
                            //var explosive = effect as TimedExplosive;
                            //explosive.Explode();
                            PlaySound("assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", admin, true);
                            fxTimestamp = Time.realtimeSinceStartup;
                            //"assets/bundled/prefabs/fx/impacts/blunt/glass/glass1.prefab"
                            ////PlaySound(new List<string>() { "assets/bundled/prefabs/fx/survey_explosion.prefab" }, admin,  admin.transform.position - baseEntity.transform.position, false);
                            //PlaySound(new List<string>() { "assets/bundled/prefabs/fx/survey_explosion.prefab" }, admin, baseEntity.transform.position, false);
                            //PlaySound(new List<string>() { "assets/bundled/prefabs/fx/impacts/bullet/glass/glass1.prefab" }, admin, baseEntity.transform.position, false);
                            //PlaySound(new List<string>() { "assets/content/effects/weather/pfx_lightning_strong.prefab" }, admin, baseEntity.transform.position + Vector3.back * 300, false);
                            //PlaySound(new List<string>() { "assets/content/effects/weather/pfx_lightningstorm_looptest.prefab" }, admin, baseEntity.transform.position + Vector3.back * 300, false);
                            //PlaySound(new List<string>() { "assets/bundled/prefabs/fx/impacts/blunt/glass/glass1.prefab" }, admin, baseEntity.transform.position, false);
                            ///sound assets/content/effects/weather/pfx_lightning_strong.prefab
                        }
                    }
                    //baseEntity.Invoke(new Action(baseEntity.KillMessage), 0);
                    lastPosition = baseEntity.transform.position;
                    baseEntity.Kill(BaseNetworkable.DestroyMode.Gib);
                    count++;
                    //assets/bundled/prefabs/fx/building/stone_gib.prefab
                }
                i++;
            }
            if (admin != null) {
                PlaySound("assets/prefabs/locks/keypad/effects/lock.code.lock.prefab", admin, true);
                timer.Once(0.75f, () => {
                    PlaySound("assets/prefabs/npc/autoturret/effects/targetacquired.prefab", admin, true);
                    if (!flag_kill_no_loot) {
                        var effect = GameManager.server.CreateEntity("assets/prefabs/deployable/fireworks/mortarred.prefab", lastPosition);
                        effect.Spawn();
                        var firework = effect as BaseFirework;
                        firework.fuseLength = 0;
                        firework.Ignite(new Vector3());
                    }
                }
                );
            }
            yield return null;
        }
        HashSet<ulong> currentlyScreamingPlayers = new HashSet<ulong>();
        public const string sound_scream = "assets/bundled/prefabs/fx/player/beartrap_scream.prefab";
        public const string effect_onfire = "assets/bundled/prefabs/fx/player/onfire.prefab";
        void GivePlayerFlamethrower(BasePlayer player) {
            if (player == null) return;
            GiveItemOrDrop(player, ItemManager.CreateByName("flamethrower", 1, 0), false);
        }
        public void Line(BasePlayer player, Vector3 from, Vector3 to, Color color, float duration) {
            player.SendConsoleCommand("ddraw.line", duration, color, from, to);
        }
        void AdminSpawnChickens(BasePlayer player, BasePlayer target, string[] args) {
            if (player == null) return;
            RaycastHit hit;
            if (Physics.Raycast(player.eyes.HeadRay(), out hit)) {
                //Line(player, hit.point, hit.point + Vector3.up * 10, Color.white, 5);
                SpawnChickens(target, hit.point, args);
            }
        }
        HashSet<BaseCombatEntity> chickens = new HashSet<BaseCombatEntity>();
        void SpawnChickens(BasePlayer player, Vector3 spawnposition, string[] args) {
            //if (!IsAdmin(player)) return;
            for (int i = 0; i < 10; i++) {
                Worker.StaticStartCoroutine(AnimalAttackCo(player, spawnposition, args));
            }
        }
        IEnumerator AnimalAttackCo(BasePlayer player, Vector3 spawnposition, string[] args) {
            RaycastHit hit;
            Ray 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)) {
                string 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";
                }
                //assets/rust.ai/agents/wolf/wolf.prefab
                var entity = GameManager.server.CreateEntity(aiPrefab, hit.point + Vector3.up * 0.2f);
                //var entity = GameManager.server.CreateEntity("assets/rust.ai/agents/wolf/wolf.prefab", hit.point + Vector3.up * 0.2f);
                //var entity = GameManager.server.CreateEntity("assets/rust.ai/agents/bear/bear.prefab", hit.point + Vector3.up * 0.2f);
                BaseAnimalNPC chicken = entity as BaseAnimalNPC;
                entity.Spawn();
                //chicken.Stats.Speed = 20;
                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;
                chicken.ChaseTransform = player.transform;
                chicken.Stats.AggressionRange = 100000;
                chicken.Stats.DeaggroRange = 100000;
                chicken.Stats.IsAfraidOf = new BaseNpc.AiStatistics.FamilyEnum[0];
                chicken.Destination = player.transform.position;
                chicken.Stats.VisionCone = -1;
                yield return new WaitForSeconds(0.25f);
                //chicken.LegacyNavigation = true;
                //chicken.Stats.DistanceVisibility = AnimationCurve.Linear(0, 0, 1, 1);
                chicken.LegacyNavigation = true;
                bool 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) {
                                chicken.ChaseTransform = player.transform;
                                chicken.AttackTarget = player;
                                chicken.Destination = player.transform.position;
                                chicken.TargetSpeed = chicken.Stats.Speed * 100;
                                //if (chicken.AiContext == null)
                                //{
                                //    chicken.AiContext = new BaseContext(chicken);
                                //}
                                //if (chicken.AiContext != null)
                                //{
                                //    chicken.AiContext.EnemyPlayer = player;
                                //    chicken.AiContext.LastEnemyPlayerScore = float.MaxValue;
                                //    chicken.AiContext.AIAgent.AttackTarget = player;
                                //    chicken.SetFact(BaseNpc.Facts.HasEnemy, 1, true, true);
                                //}
                                //chicken.SetFact(BaseNpc.Facts.EnemyRange, (byte)enemyRangeEnum, true, true);
                                //chicken.SetFact(BaseNpc.Facts.AfraidRange, (byte)value, true, true);
                                //chicken.SetFact(BaseNpc.Facts.IsAggro, 0, true, false);
                                //chicken.SetFact(BaseNpc.Facts.HasEnemy, 0, true, false);
                                //chicken.SetFact(BaseNpc.Facts.IsAfraid, 0, true, false);
                                //chicken.Attack(player);
                                //chicken.CurrentBehaviour = BaseNpc.Behaviour.Attack;
                                //chicken.TargetSpeed = chicken.Stats.Speed;
                                //Puts($"TSpeed: {chicken.TargetSpeed} s: {chicken.NavAgent.speed}  statspeed: {chicken.Stats.Speed}");
                            }
                        }
                        //Puts($"Attack target: {chicken.AttackTarget} Chase: {chicken.ChaseTransform} ARate: {chicken.AttackRate} CombatTarget: {chicken.CombatTarget}");
                        //chicken.TickNavigation();
                    }
                    else {
                        if (chicken != null) {
                            chicken.Kill();
                        }
                        doLoop = false;
                    }
                    yield return null;
                    //yield return new WaitForSeconds(0.25f);
                }
                timer.Once(120, () => {
                    if (chicken != null) {
                        chicken.Kill();
                    }
                }
                );
                timer.Once(130f, () => {
                    chickens.RemoveWhere(x => x == null);
                }
                );
            }
        }
        void OnPlayerRespawned(BasePlayer player) {
            if (HasCard(player.userID, Card.NoRest)) {
                player.EndSleeping();
                player.SendNetworkUpdate();
            }
        }
        void OnEntityKill(BaseNetworkable entity, HitInfo info) {
            if (entity == null) return;
            if (entitiesWatchingForKilledMounts.Contains(entity)) {
                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");
                }
                );
            }
        }
        HashSet<BaseNetworkable> entitiesWatchingForKilledMounts = new HashSet<BaseNetworkable>();
        void RocketManTarget(BasePlayer player) {
            bool 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);
                //var car = player.GetMountedVehicle();
                //if (car != null)
                //{
                //    car.Kill(BaseNetworkable.DestroyMode.Gib);
                //}
            }
            TakeCard(player, Card.Rocketman);
            Subscribe("OnEntityKill");
            player.Teleport(p
// ... [Code preview truncated due to length. Full source in attached file] ...

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