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

FREE MonumentProtection : 1.0.4 1.0.4

Нет прав для скачивания
C#:
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using UnityEngine;
using static Oxide.Plugins.MonumentProtectionEx.MonumentProtectionEx;
using System.Linq;

namespace Oxide.Plugins
{
    [Info( "Monument Protection", "Waggy", "1.0.4", ResourceId = 154 )]
    [Description( "" )]

    public class MonumentProtection : RustPlugin
    {
        private static MonumentProtection PluginInstance;
        private List<SamSite> SamSites = new List<SamSite>();

        public Dictionary<Vector3, MonumentInfo> SamPositions = new Dictionary<Vector3, MonumentInfo>();

        private Timer RespawnTimer;

        //[ChatCommand( "localpos" )]
        //void LocalPosition( BasePlayer player, string command, string[] args )
        //{
        //    var samSite = RaycastLookDirection<SamSite>( player );
        //    if ( samSite != null )
        //    {
        //        float lowestDist = float.MaxValue;
        //        MonumentInfo closest = null;
        //        foreach ( var monument in UnityEngine.Object.FindObjectsOfType<MonumentInfo>()/*.Where(x => x.GetMonumentName() == MonumentName.LaunchSite) */)
        //        {
        //            float dist = Vector3.Distance( player.transform.position, monument.transform.position );
        //            if ( dist < lowestDist )
        //            {
        //                lowestDist = dist;
        //                closest = monument;
        //            }
        //        }

        //        var localPos = closest.transform.InverseTransformPoint( samSite.transform.position );
        //        var rotation = samSite.transform.rotation;
        //        PrintToChat( $"Pos: {localPos.ToString( "F4" )} Rotation: {rotation.ToString( "F4" )}" );
        //    }
        //}

        #region Entity Raycast

        int layer = LayerMask.GetMask( "AI", "Construction", "Deployed", "Default", "Debris", "Ragdoll", "Tree", "Vehicle Movement" );

        private T RaycastLookDirection<T>( BasePlayer player, string prefabName = "" ) where T : BaseEntity
        {
            RaycastHit hit;
            if ( !Physics.Raycast( player.eyes.BodyRay(), out hit, 5f, layer ) )
            {
                return null;
            }
            T entity = hit.GetEntity() as T;
            return entity;
        }

        #endregion

        public void SpawnSAMSites()
        {
            foreach ( var monument in UnityEngine.Object.FindObjectsOfType<MonumentInfo>() )
            {
                bool canSpawn = false;
                var monumentName = monument.GetMonumentName();
                if ( !config.MonumentWithSAMs.TryGetValue( monumentName, out canSpawn ) || !canSpawn )
                    continue;

                switch ( monumentName )
                {
                    default: continue;
                    case MonumentName.LaunchSite:
                        {
                            SamPositions.Add( new Vector3( 222.5791f, 20.7363f, 24.2286f ), monument );
                            SamPositions.Add( new Vector3( 226.3754f, 20.7363f, -23.9451f ), monument );
                            SamPositions.Add( new Vector3( 117.1534f, 12.0363f, 31.9013f ), monument );

                            break;
                        }
                    case MonumentName.Trainyard:
                        {
                            SamPositions.Add( new Vector3( 58.4138f, 30.2905f, 12.3804f ), monument );
                            SamPositions.Add( new Vector3( 49.1168f, 30.2773f, 18.5964f ), monument );
                                                                                        
                            break;                                                      
                        }                                                               
                    case MonumentName.Dome:                                             
                        {                                                               
                            SamPositions.Add( new Vector3( 35.9377f, 18.0663f, 41.2695f ), monument );
                            SamPositions.Add( new Vector3( 19.5758f, 59.4494f, -7.3288f ), monument );
                            SamPositions.Add( new Vector3( -24.5651f, 59.4994f, -8.7703f ), monument );
                            SamPositions.Add( new Vector3( -19.7446f, 3.1654f, -34.9776f ), monument );
                            SamPositions.Add( new Vector3( 20.3374f, 3.4097f, 50.4880f ), monument );
                                                                                         
                            break;                                                       
                        }                                                                
                    case MonumentName.Powerplant:                                        
                        {                                                                
                            SamPositions.Add( new Vector3( -38.0946f, 22.7686f, 8.9574f ), monument );
                            SamPositions.Add( new Vector3( -43.0134f, 18.2407f, 18.9424f ), monument );
                            SamPositions.Add( new Vector3( -27.4102f, 21.2407f, 12.9824f ), monument );
                            SamPositions.Add( new Vector3( -28.3916f, 21.3069f, 6.2423f ), monument );

                            break;
                        }
                    case MonumentName.WaterTreatment:
                        {
                            SamPositions.Add( new Vector3( 68.9818f, 12.1657f, 22.3747f ), monument );
                            SamPositions.Add( new Vector3( 71.332f, 12.2664f, -20.8726f ), monument );

                            break;
                        }
                    case MonumentName.OilRig_Small:
                        {
                            SamPositions.Add( new Vector3( 38.7308f, 31.4891f, 0.8049f ), monument );
                            SamPositions.Add( new Vector3( 38.5506f, 31.4891f, -21.4670f ), monument );
                            SamPositions.Add( new Vector3( 10.2068f, 30, -32.2483f ), monument );
                            SamPositions.Add( new Vector3( 6.2874f, 30, 2.1386f ), monument );
                            SamPositions.Add( new Vector3( -4.6217f, 0.9817f, -28.4416f ), monument );
                            SamPositions.Add( new Vector3( -4.4660f, 0.9220f, -6.0966f ), monument );
                            SamPositions.Add( new Vector3( 30.7479f, 2.0713f, -25.8844f ), monument );
                            SamPositions.Add( new Vector3( 16.7402f, 0.1f, 4.6281f ), monument );

                            break;
                        }
                    case MonumentName.OilRig_Large:
                        {
                            SamPositions.Add( new Vector3( 27.4640f, 45.1916f, 16.0521f ), monument );
                            SamPositions.Add( new Vector3( 27.8638f, 45.1916f, -6.1706f ), monument );
                            SamPositions.Add( new Vector3( 7.1513f, 42.1259f, 36.2357f ), monument );
                            SamPositions.Add( new Vector3( 12.1727f, 39.1474f, -25.9371f ), monument );
                            SamPositions.Add( new Vector3( -16.6521f, 40.5907f, 1.6809f ), monument );
                            SamPositions.Add( new Vector3( -0.3493f, 39.1000f, -38.5986f ), monument );
                            SamPositions.Add( new Vector3( 16.4913f, 2.7f, -10.6589f ), monument );
                            SamPositions.Add( new Vector3( 16.3649f, 3f, 10.6897f ), monument );
                            SamPositions.Add( new Vector3( -15.16f, 2.8703f, -32.5268f ), monument );
                            SamPositions.Add( new Vector3( -15.0637f, 2.8798f, 32.5015f ), monument );
                            SamPositions.Add( new Vector3( 15.0416f, 2.9619f, 32.4463f ), monument );
                            SamPositions.Add( new Vector3( 14.9828f, 2.8417f, -32.4670f ), monument );

                            break;
                        }
                    case MonumentName.Airfield:
                        {
                            SamPositions.Add( new Vector3( -46.9147f, 21.4142f, -87.9877f ), monument );
                            SamPositions.Add( new Vector3( -29.0119f, 9.4142f, -90.7702f ), monument );
                            SamPositions.Add( new Vector3( -3.6652f, 9.4142f, -102.1889f ), monument );
                            SamPositions.Add( new Vector3( -73.6783f, 3.1142f, -87.7945f ), monument );
                            SamPositions.Add( new Vector3( -117.6489f, 18.0142f, 50.3876f ), monument );
                            SamPositions.Add( new Vector3( 9.2417f, 13.4142f, 39.8607f ), monument );
                            SamPositions.Add( new Vector3( 48.8095f, 1.9142f, -64.6002f ), monument );

                            break;
                        }
                }
            }

            foreach ( var monument in UnityEngine.Object.FindObjectsOfType<MonumentInfo>() )
            {
                foreach ( var position in SamPositions )
                {
                    if ( position.Value == monument )
                    {
                        var samPosition = monument.transform.TransformPoint( position.Key );
                        var samSite = GameManager.server.CreateEntity( "assets/prefabs/npc/sam_site_turret/sam_static.prefab", samPosition ) as SamSite;
                        samSite.lifestate = BaseCombatEntity.LifeState.Alive;
                        samSite.health = samSite._maxHealth;
                        samSite.SetFlag( BaseEntity.Flags.Reserved1, false, true );
                        samSite.Spawn();
                        samSite.SendNetworkUpdateImmediate();

                        SamSites.Add( samSite );

                        //Puts( $"Spawning one of {monument.GetMonumentName().ToString()}'s SAMs at {samSite.transform.position.ToString()}" );
                    }
                }
            }
        }

        public void RespawnSamSites()
        {
            foreach ( var sam in SamSites )
            {
                sam?.Kill();
            }

            SamSites.Clear();

            SpawnSAMSites();
        }

        #region Hooks

        private void Init()
        {
            config = Config.ReadObject<ConfigData>();
            PluginInstance = this;
        }

        [HookMethod( "OnServerInitialized" )]
        void OnServerInitialized()
        {
            SpawnSAMSites();

            if ( !config.InvincibleSams )
                RespawnTimer = timer.Every( config.RespawnTimer * 60, RespawnSamSites );
        }

        [HookMethod( "Unload" )]
        void Unload()
        {
            foreach ( var sam in SamSites )
            {
                sam?.Kill();
            }

            SamSites.Clear();

            RespawnTimer?.Destroy();

            PluginInstance = null;
        }

        object OnEntityTakeDamage( BaseCombatEntity entity, HitInfo info )
        {
            if ( config.InvincibleSams && entity.ShortPrefabName == "sam_static" )
                return false;

            return null;
        }

        #endregion

        #region Configuration

        private ConfigData config;

        protected override void LoadDefaultConfig()
        {
            Config.WriteObject( new ConfigData(), true );
        }

        private new void SaveConfig()
        {
            Config.WriteObject( config, true );
        }

        public class ConfigData
        {
            [JsonProperty( "Monuments with SAMs" )]
            public Dictionary<MonumentName, bool> MonumentWithSAMs = new Dictionary<MonumentName, bool>()
            {
                { MonumentName.Trainyard, true },
                { MonumentName.Dome, true },
                { MonumentName.Powerplant, true },
                { MonumentName.WaterTreatment, true },
                { MonumentName.OilRig_Small, true },
                { MonumentName.OilRig_Large, true },
                { MonumentName.Airfield, true },
                { MonumentName.LaunchSite, true },
            };

            [JsonProperty( "Monument SAM Site Indestructible" )]
            public bool InvincibleSams = true;

            [JsonProperty( "Respawn Timer for Sams" )]
            public float RespawnTimer = 30;
        }

        #endregion
    }

    namespace MonumentProtectionEx
    {
        public static class MonumentProtectionEx
        {
            public enum MonumentName
            {
                Unknown = 0,
                Lighthouse,
                MiningOutpost,
                Dome,
                SatelliteDish,
                SewerBranch,
                Powerplant,
                Trainyard,
                Airfield,
                MilitaryTunnel,
                WaterTreatment,
                SulfurQuarry,
                StoneQuarry,
                HqmQuarry,
                GasStation,
                Supermarket,
                LaunchSite,
                Outpost,
                BanditCamp,
                Harbor_A,
                Harbor_B,
                Junkyard,
                OilRig_Small,
                OilRig_Large,
            }

            private static Dictionary<string, MonumentName> MonumentToName = new Dictionary<string, MonumentName>()
            {
                { "assets/bundled/prefabs/autospawn/monument/small/warehouse.prefab", MonumentName.MiningOutpost },
                { "assets/bundled/prefabs/autospawn/monument/lighthouse/lighthouse.prefab", MonumentName.Lighthouse },
                { "assets/bundled/prefabs/autospawn/monument/small/satellite_dish.prefab", MonumentName.SatelliteDish },
                { "assets/bundled/prefabs/autospawn/monument/small/sphere_tank.prefab", MonumentName.Dome },
                { "assets/bundled/prefabs/autospawn/monument/harbor/harbor_1.prefab", MonumentName.Harbor_A },
                { "assets/bundled/prefabs/autospawn/monument/harbor/harbor_2.prefab", MonumentName.Harbor_B },
                { "assets/bundled/prefabs/autospawn/monument/large/airfield_1.prefab", MonumentName.Airfield },
                { "assets/bundled/prefabs/autospawn/monument/large/junkyard_1.prefab", MonumentName.Junkyard },
                { "assets/bundled/prefabs/autospawn/monument/large/launch_site_1.prefab", MonumentName.LaunchSite },
                { "assets/bundled/prefabs/autospawn/monument/large/military_tunnel_1.prefab", MonumentName.MilitaryTunnel },
                { "assets/bundled/prefabs/autospawn/monument/large/powerplant_1.prefab", MonumentName.Powerplant },
                { "assets/bundled/prefabs/autospawn/monument/large/trainyard_1.prefab", MonumentName.Trainyard },
                { "assets/bundled/prefabs/autospawn/monument/large/water_treatment_plant_1.prefab", MonumentName.WaterTreatment },
                { "assets/bundled/prefabs/autospawn/monument/medium/bandit_town.prefab", MonumentName.BanditCamp },
                { "assets/bundled/prefabs/autospawn/monument/medium/compound.prefab", MonumentName.Outpost },
                { "assets/bundled/prefabs/autospawn/monument/medium/radtown_small_3.prefab", MonumentName.SewerBranch },
                { "assets/bundled/prefabs/autospawn/monument/small/gas_station_1.prefab", MonumentName.GasStation },
                { "assets/bundled/prefabs/autospawn/monument/small/mining_quarry_a.prefab", MonumentName.SulfurQuarry },
                { "assets/bundled/prefabs/autospawn/monument/small/mining_quarry_b.prefab", MonumentName.StoneQuarry },
                { "assets/bundled/prefabs/autospawn/monument/small/mining_quarry_c.prefab", MonumentName.HqmQuarry },
                { "assets/bundled/prefabs/autospawn/monument/offshore/oilrig_2.prefab", MonumentName.OilRig_Small },
                { "assets/bundled/prefabs/autospawn/monument/offshore/oilrig_1.prefab", MonumentName.OilRig_Large },
            };

            public static MonumentName GetMonumentName( this MonumentInfo monument )
            {
                MonumentName name;

                var gameObject = monument.gameObject;

                while ( gameObject.name.StartsWith( "assets/" ) == false && gameObject.transform.parent != null )
                {
                    gameObject = gameObject.transform.parent.gameObject;
                }

                MonumentToName.TryGetValue( gameObject.name, out name );

                return name;
            }
        }
    }
}

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