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

FREE IncursionHoldingArea : 0.1.0 0.1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
//Requires: ZoneManager
//Requires: IemUtils
//Requires: IemObjectPlacement
//Requires: IemGameBase
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using Newtonsoft.Json;
using UnityEngine;
using System;

namespace Oxide.Plugins
{

    [Info("Incursion Holding Area", "tolland", "0.1.0")]
    public class IncursionHoldingArea : RustPlugin
    {

        [PluginReference]
        Plugin ZoneManager;

        [PluginReference]
        IemUtils IemUtils;

        [PluginReference]
        IemGameBase IemGameBase;

        [PluginReference]
        IemObjectPlacement IemObjectPlacement;

        List<string> zonelist = new List<string>();

        static IncursionHoldingArea me = null;

        void Init()
        {
            me = this;
        }

        static MethodInfo updatelayer;

        void Loaded()
        {
            LoadData();
            updatelayer = typeof(BuildingBlock).GetMethod("UpdateLayer",
                (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
        }

        void Unload()
        {
            foreach (var zone in zonelist)
            {
                ZoneManager.Call("EraseZone", zone);
            }
        }

        float mapSize;

        void OnServerInitialized()
        {

            mapSize = TerrainMeta.Size.x;
            DestroyAllSpheres();
            //CloseDoors();
        }

        public delegate void EnteredZone(string ZoneID, BasePlayer player);

        private static EnteredZone PlayerEnteredZone = delegate { };


        void OnEnterZone(string ZoneID, BasePlayer player)
        {                        //is this a team zone?
            PlayerEnteredZone(ZoneID, player);

        }

        //void OnExitZone(string ZoneID, BasePlayer player)
        //bool AddPlayerToZoneKeepinlist(string ZoneID, BasePlayer player)


        /// <summary>
        /// The HoldingArea class represents a generic closed area in which players
        /// can be held during periods of the game
        /// </summary>
        /// <param name="data"></param>

        public class HoldingArea
        {
            public Vector3 location;
            Quaternion rotation;

            protected HoldingArea(Vector3 position)
            {
                location = position;
            }

            public HoldingArea()
            {

            }
        }




        public class TeamSelectLobby : HoldingArea
        {
            public IemObjectPlacement.CopyPastePlacement partition;
            IemGameBase.IemTeamGame teamGame;   

            List<string> zonelist = new List<string>();
            List<BaseEntity> spheres = new List<BaseEntity>();

            public TeamSelectLobby(string copypastefile, IemGameBase.IemTeamGame newTeamGame)
            {
                teamGame = newTeamGame; 
                
                location = me.IemUtils.NextFreeLocation();

                me.Puts("yield new vector " + location);

                //location = new Vector3(x, y, z);
                Vector3 centre_location = new Vector3(location.x - 7, location.y, location.z - 2);


                partition = new IemObjectPlacement.CopyPastePlacement(
                    copypastefile, location);
                CreateZoneForLobby();

                int i = 0;
                foreach (var team in teamGame.Teams)
                {
                    //  me.Puts("centre loc is " + centre_location);
                    // me.Puts("loc is " + locs[i]);
                    spheres.Add(IemUtils.CreateZone("team_" + team.Value.GetGuid(),
                        locs[i] + centre_location, 6));

                    zonelist.Add("zone_team_" + team.Value.GetGuid());
                    me.zonelist.Add("zone_team_" + team.Value.GetGuid());

                    i++;
                }
                PlayerEnteredZone += PlayerEnteredTeamZone;

            }

            public void OpenDoors()
            {
                List<Door> doors = IemUtils.FindComponentsNearToLocation<Door>(location, 50);
                foreach (var door in doors)
                {
                    door.SetFlag(BaseEntity.Flags.Open, true);
                }
            }

            public void CloseDoors()
            {
                List<Door> doors = IemUtils.FindComponentsNearToLocation<Door>(location, 50);
                foreach (var door in doors)
                {
                    door.SetFlag(BaseEntity.Flags.Open, false);
                }
            }

            void PlayerEnteredTeamZone(string ZoneID, BasePlayer player)
            {
                if (ZoneID.StartsWith("zone_team_"))
                {
                    //OnPlayerEnterTeamArea(player, GetTeamFromZone(ZoneID));
                    me.Puts("player is " + player.displayName + " has entered zone " + ZoneID);
                    var team = GetTeamFromZone(ZoneID);

                    if (teamGame.Players.ContainsKey(player.UserIDString))
                    {
                        var iemplayer = teamGame.Players[player.UserIDString];

                        if (iemplayer != null)
                        {
                            me.Puts("iemplayer is " + iemplayer.Name);
                        }


                        if (team == null)
                        {
                            me.Puts("team is null");
                        }

                        if (team != null && iemplayer != null)
                        {
                            team.AddPlayer((IemUtils.IIemTeamPlayer)iemplayer);
                            IemUI.UpdateUiForPlayers(teamGame);
                            me.Puts("can game start " + teamGame.CanStart());
                            if (teamGame.CanStart())
                            {
                                teamGame.StartGame();
                            }
                        }
                    }

                }
            }

            IemUtils.IIemTeam GetTeamFromZone(string ZoneID)
            {
                //IemUtils.DLog("team substring is " + ZoneID.Substring(10));
                foreach (var team in teamGame.Teams)
                {
                    // IemUtils.DLog("checking team is " + team.Key);
                    if (team.Key == ZoneID.Substring(10))
                    {
                        IemUtils.DLog("returning team is " + team.Value.Name);
                        return team.Value;
                    }
                }
                return null;
            }

            //new Vector3(-235, 3, 18)
            List<Vector3> locs = new List<UnityEngine.Vector3>() {
                new Vector3(29 , 0, -1),
            new Vector3(-26, 0, 3),
            new Vector3(27, 0, 8),
            new Vector3(20, 0, -2),
            new Vector3(7, 0, -10)};

            public void Destroy()
            {
                partition?.Remove();
                foreach (BasePlayer player in BasePlayer.activePlayerList)
                    IemUI.RemoveTeamUiForPlayer(player, teamGame);
                foreach (var zone in zonelist)
                {
                    me.Puts("erasing zone " + zone);
                    me.ZoneManager.Call("EraseZone", zone);
                }

                foreach (BaseEntity sphere in spheres)
                {

                    uint prefabID = 2327559662;

                    if (sphere.prefabID == prefabID)
                    {
                         me.Puts("found entity with prefabID "
                                  + sphere.prefabID.ToString());

                        sphere.KillMessage();
                        //entity.Kill (); 
                    }else
                    {
                        me.Puts("found entity with other prefabID "
                                 + sphere.prefabID.ToString());

                    }

                }

            }




            void CreateZoneForLobby()
            {
                Vector3 centre_location = new Vector3(location.x - 7, location.y, location.z - 2);
                // me.CreateZone("lobby", new Vector3(-235, 3, 18), 16);
                me.zonelist.Add("lobby_" + centre_location.ToString());
                zonelist.Add("lobby_" + centre_location.ToString());
                me.ZoneManager.Call("CreateOrUpdateZone",
                    "lobby_" + centre_location.ToString(),
                    new string[]
                    {
                    "radius", "34",
                    "autolights", "true",
                    "eject", "false",
                    "enter_message", "",
                    "leave_message", "",
                    "killsleepers", "true",
                    "nosuicide", "false",
                    "undestr", "true",
                    "nobuild", "true",
                    "nodecay", "true",
                    "nocorpse", "true",
                    "nogather", "true",
                    "noplayerloot", "true",
                    "nowounded", "true",
                    "nodrown", "true",
                    "nostability", "true",
                    "noupgrade", "true",
                    "nobleed", "true",
                    "pvpgod", "true",
                    "nodeploy", "true"
                    }, location);

                spheres.Add(IemUtils.CreateSphere(centre_location, (34 * 2) + 1));
            }


        }

        static void CreateZonesForArenas(Vector3 location)
        {
            //  Puts("");
            //Puts(" >>>>>createArenaZones");s
            IemUtils.CreateZone("team_1", new Vector3(-255, 2, -1), 5);
            IemUtils.CreateZone("team_2", new Vector3(-214, 2, 38), 5);
            IemUtils.CreateZone("team_4", new Vector3(-262, 2, 26), 5);
            IemUtils.CreateZone("team_5", new Vector3(-215, 2, -2), 5);
            IemUtils.CreateZone("team_6", new Vector3(-228, 2, -10), 5);
        }

        static void CreateZonesForLobby()
        {

            // me.CreateZone("lobby", new Vector3(-235, 3, 18), 16);
            me.ZoneManager.Call("CreateOrUpdateZone",
                "lobby",
                new string[]
                {
                    "radius", "34",
                    "autolights", "true",
                    "eject", "false",
                    "enter_message", "",
                    "leave_message", "",
                    "killsleepers", "true",
                    "nosuicide", "false",
                    //"undestr", "true",nosuicide
                    "nobuild", "true",
                    "nodecay", "true",
                    //"nocorpse", "true",
                    "nogather", "true",
                    "noplayerloot", "true",
                    //"nowounded", "true",
                    "nodrown", "true",
                    "nostability", "true",
                    "noupgrade", "true",
                    //"nobleed", "true",
                    //"pvpgod", "true",
                    "nodeploy", "true"
                }, new Vector3(-235, 3, 18));

            IemUtils.CreateSphere(new Vector3(-235, 3, 18), (34 * 2) + 1);
        }


        protected void OpenDoors()
        {
            Door[] doors = GameObject.FindObjectsOfType<Door>();

            if (doors.Length > 0)
            {
                foreach (Door target in doors.ToList())
                {
                    target.SetFlag(BaseEntity.Flags.Open, true);
                }
            }
        }

        protected void CloseDoors()
        {
            Door[] doors = GameObject.FindObjectsOfType<Door>();

            if (doors.Length > 0)
            {
                foreach (Door target in doors.ToList())
                {
                    target.SetFlag(BaseEntity.Flags.Open, false);
                }
            }
            KeyLock[] keyLocks = GameObject.FindObjectsOfType<KeyLock>();

            if (keyLocks.Length > 0)
            {
                foreach (KeyLock keyLock in keyLocks.ToList())
                {
                    keyLock.SetFlag(BaseEntity.Flags.Locked, true);
                }
            }
        }

        void OnDoorClosed(Door door, BasePlayer player)

        {
            //Puts("OnDoorOpened works!");
            //Puts("door is " + door.name);
            //Puts("door is " + door.GetHashCode().ToString());
            //Puts("door is " + door.GetInstanceID().ToString());

            //CloseDoors();
        }

        bool? CanUseDoor(BasePlayer player, BaseLock door)
        {
            Puts("CanUseDoor works!");
            Puts("BaseLock is " + door.GetInstanceID().ToString());
            if (door.GetInstanceID().Equals(-267990) || door.GetInstanceID().Equals(-267932))
            {
                Puts("is blue team keylock");
                return true;
            }

            if (door.GetInstanceID().Equals(-268258) || door.GetInstanceID().Equals(-268200))
            {
                Puts("is red team keylock");
                return true;
            }

            return null;
        }


        void OnDoorOpened(Door door, BasePlayer player)
        {
            Puts("OnDoorOpened works!");
            Puts("door is " + door.name);
            Puts("door is " + door.GetHashCode().ToString());
            Puts("door is " + door.GetInstanceID().ToString());

            if (door.GetInstanceID().Equals(-57154) || door.GetInstanceID().Equals(-57260))
            {
                Puts("is blue team door");
            }

            if (door.GetInstanceID().Equals(-57154) || door.GetInstanceID().Equals(-57260))
            {
                Puts("is red team door");
            }



            //OpenDoors();

            var buildingBlock = door.GetComponent<BuildingBlock>();
            if (buildingBlock == null)
            {
                Puts("is null");
                return;
            }
            var buildingId = buildingBlock.buildingID;

            var removeList = UnityEngine.GameObject.FindObjectsOfType<BuildingBlock>().Where(x => x.buildingID == buildingId).ToList();

            foreach (var foo in removeList)
            {
                Puts("foo is" + foo.blockDefinition.ToString());

            }
        }
        public static void OpenTeamDoors()
        {
            if (teamLobbyDoors.Count > 0)
            {
                foreach (KeyValuePair<Vector3, TeamLobbyDoor> teamLobbyDoor in teamLobbyDoors)
                {
                    teamLobbyDoor.Value.OpenDoor();
                }
            }
        }

        public static void OpenTeamDoors111()
        {

            Door[] doors = GameObject.FindObjectsOfType<Door>();

            if (doors.Length > 0)
            {
                foreach (Door door in doors.ToList())
                {
                    if (door.GetInstanceID().Equals(-57154) || door.GetInstanceID().Equals(-57260))
                    {
                        me.Puts("is blue team door");
                        door.SetFlag(BaseEntity.Flags.Open, true);
                    }

                    if (door.GetInstanceID().Equals(-67716) || door.GetInstanceID().Equals(-63844))
                    {
                        me.Puts("is red team door");
                        door.SetFlag(BaseEntity.Flags.Open, true);
                    }

                }
            }

        }



        public static void CloseTeamDoors()
        {
            if (teamLobbyDoors.Count > 0)
            {
                foreach (KeyValuePair<Vector3, TeamLobbyDoor> teamLobbyDoor in teamLobbyDoors)
                {
                    teamLobbyDoor.Value.CloseDoor();
                }
            }
        }

        public static void CloseTeamDoors1111()
        {

            Door[] doors = GameObject.FindObjectsOfType<Door>();

            if (doors.Length > 0)
            {
                foreach (Door door in doors.ToList())
                {
                    if (door.GetInstanceID().Equals(-57154) || door.GetInstanceID().Equals(-57260))
                    {
                        me.Puts("is blue team door");
                        door.SetFlag(BaseEntity.Flags.Open, false);
                    }

                    if (door.GetInstanceID().Equals(-67716) || door.GetInstanceID().Equals(-63844))
                    {
                        me.Puts("is red team door");
                        door.SetFlag(BaseEntity.Flags.Open, false);
                    }

                }
            }
        }


        public class Lobby : HoldingArea
        {
            public Lobby(Vector3 position)
            {
                location = position;

                CreateZonesForArenas(location);
                CreateZonesForLobby();
            }
        }

        public class TeamLobby : HoldingArea
        {


        }

        public void DestroyAllSpheres()
        {

            //Vis.Entit
            //Puts("  >>>>>>Destroy all spheres");

            //foreach (SphereEntity se in BaseEntity.FindObjectsOfType<SphereEntity> ()) {
            //se.KillMessage ();
            //Puts ("here");
            //}

            var foundentities = UnityEngine.Object.FindObjectsOfType<BaseEntity>();
            uint prefabID = 2327559662;
            foreach (var entity in foundentities)
            {
                if (entity.prefabID == prefabID)
                {
                    // Puts("found entity with prefabID "
                    //          + entity.prefabID.ToString());

                    entity.KillMessage();
                    //entity.Kill ();
                }
            }
        }

        List<MonumentInfo> FindMonuments(string name)
        {
            var monuments = new List<MonumentInfo>();
            foreach (var info in IemUtils.monuments)
            {
                if (info.name.Contains(name))
                {
                    monuments.Add(info);
                }
            }

            return monuments;
        }

        void FindWarehouses()
        {
            var warehouses = FindMonuments("warehouse");

            foreach (var warehouse in warehouses)
            {
                //CreateArena(monument_gobject, pos, "Lighthouse", 80);
                //DLog("CreateEsmLobby at " + monument_gobject.GetInstanceID());
                //esm.eventLobby = new me.Lobby(pos);
                //esm.eventLobby = new me.Lobby(new Vector3(-231, 2, 14));
            }
        }

        static int doorColl = UnityEngine.LayerMask.GetMask(new string[] { "Construction Trigger", "Construction" });

        class TeamLobbyDoor
        {
            Door door;
            public Vector3 position = default(Vector3);

            public string team;

            public TeamLobbyDoor()
            {
            }

            public TeamLobbyDoor(Vector3 pos)
            {
                this.position = pos;
                team = "red";
            }

            public void OpenDoor()
            {
                Door door;
                if (!TryGetDoor(out door))
                {
                    return;
                }

                door.SendNetworkUpdateImmediate(false);
                door.SetFlag(BaseEntity.Flags.Open, true);
                door.SendNetworkUpdateImmediate(true);
            }

            public void CloseDoor()
            {
                Door door;
                if (!TryGetDoor(out door))
                {
                    return;
                }

                door.SendNetworkUpdateImmediate(false);
                door.SetFlag(BaseEntity.Flags.Open, false);
                door.SendNetworkUpdateImmediate(true);
            }

            bool TryGetDoor(out Door door)
            {
                if (this.door != null)
                {
                    door = this.door;
                    return true;
                }

                List<Door> doors = new List<Door>();
                Vis.Entities<Door>(position, 1f, doors, doorColl);

                if (doors.Count == 0)
                {
                    door = null;
                    return false;
                    // Plugins.IemUtils.DLog("found the door");
                }
                door = doors[0];
                return true;
            }
        }

        static Hash<Vector3, TeamLobbyDoor> teamLobbyDoors
            = new Hash<Vector3, TeamLobbyDoor>();

        void LoadData()
        {
            teamLobbyDoors.Clear();
            try
            {
                storedData = Interface.Oxide.DataFileSystem.ReadObject<StoredData>("TeamLobbyDoors");
            }
            catch
            {
                storedData = new StoredData();
            }
            foreach (var remote in storedData.TeamLobbyDoors)
                teamLobbyDoors[remote.position] = remote;
        }

        void Unloaded()
        {
            // SaveData();
        }

        void SaveData()
        {
            DynamicConfigFile file = Interface.Oxide.DataFileSystem.GetDatafile("TeamLobbyDoors");
            file.Settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // allows you to store Vector3
            file.WriteObject<StoredData>(storedData);
        }

        static StoredData storedData;

        class StoredData
        {
            public HashSet<TeamLobbyDoor> TeamLobbyDoors = new HashSet<TeamLobbyDoor>();

            public StoredData()
            {
            }
        }

        //&& hitinfo.Initiator is BasePlayer

        private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitinfo)
        {
            if (entity == null || entity.GetComponent<ResourceDispenser>() != null)
                return;
            var door = entity as Door;
            if (door != null)
            {
                // IemUtils.DLog("test " + entity.GetType());

                // IemUtils.DLog(door.gameObject.name);

                // IemUtils.DLog(door.transform.position.ToString());
                // IemUtils.DLog(door.gameObject.transform.position.ToString());

                if (hitinfo.Weapon != null)
                {
                    if (hitinfo.Weapon.LookupPrefab().name == "bone_club.entity")
                    {
                        TeamLobbyDoor teamLobbyDoor = new TeamLobbyDoor(door.transform.position);
                        teamLobbyDoor.team = "red";
                        storedData.TeamLobbyDoors.Remove(teamLobbyDoor);
                        storedData.TeamLobbyDoors.Add(teamLobbyDoor);
                        teamLobbyDoors[door.transform.position] = teamLobbyDoor;
                        SaveData();
                    }
                    if (hitinfo.Weapon.LookupPrefab().name == "knife_bone.entity")
                    {
                        TeamLobbyDoor teamLobbyDoor = new TeamLobbyDoor(door.transform.position);
                        teamLobbyDoor.team = "blue";
                        storedData.TeamLobbyDoors.Remove(teamLobbyDoor);
                        storedData.TeamLobbyDoors.Add(teamLobbyDoor);
                        teamLobbyDoors[door.transform.position] = teamLobbyDoor;
                        SaveData();
                    }
                }
                //IemUtils.DLog(teamLobbyDoors.Count.ToString());
                //foreach (KeyValuePair<Vector3, TeamLobbyDoor> pair in teamLobbyDoors)
                //{
                //    IemUtils.DLog("key is " + pair.Key);
                //    IemUtils.DLog("value is " + pair.Value);
                //}

                //storedData.RemoteActivators.Remove(remoteActivators[remoteActivate]);
                //remoteActivators[remoteActivate].listedDoors.Add(new RemoteDoor(goodPos));
                //storedData.RemoteActivators.Add(remoteActivators[remoteActivate]);
                //
                //  else
                //    var rigidbody = door.AddComponent<TeamLobbyDoor>();


            }


            if (hitinfo.Weapon != null)
            {
                if (hitinfo.Weapon.LookupPrefab().name == "bone_club.entity")
                {

                    IemUtils.DDLog("entity net id is: " + entity.net.ID);
                }

            }

        }

        [ConsoleCommand("resetteamdoors")]
        void ccmdEvent14324(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg)) return;
            storedData.TeamLobbyDoors.Clear();
            teamLobbyDoors.Clear();
            SaveData();
        }


        [ConsoleCommand("door1")]
        void ccmdEvent1(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg)) return;
            OpenTeamDoors();
        }

        [ConsoleCommand("door")]
        void ccmdEvent(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg)) return;
            OpenTeamDoors();
        }

        [ConsoleCommand("opendoors")]
        void ccmd2Event(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg)) return;
            OpenDoors();
        }

        [ConsoleCommand("closedoors")]
        void ccmd21Event(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg)) return;
            CloseDoors();
        }
        [ConsoleCommand("closeteamdoors")]
        void ccmdCloseDoors(ConsoleSystem.Arg arg)
        {
            if (!IemUtils.hasAccess(arg)) return;
            CloseTeamDoors();
        }
    }
}

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