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

FREE Space : 1.0.8 1.0.8

Нет прав для скачивания
C#:
using System.Collections.Generic;
using Newtonsoft.Json;
using CompanionServer.Handlers;
using Oxide.Plugins.SpaceExtensionMethods;
using UnityEngine;
using System;
using Oxide.Core.Plugins;
using Rust;
using System.Collections;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System.Reflection;
using System.IO;
using Facepunch;
namespace Oxide.Plugins {
    [Info("Space", "Sempai#3239", "1.0.8")]
    class Space : RustPlugin {
#region Variables
        const bool en = false;
        static Space ins;
        [PluginReference]
        Plugin NpcSpawn, PveMode, GUIAnnouncements, DiscordMessages, Economics, ServerRewards, IQEconomic, NightVision;
        HashSet<string> allHooks = new HashSet<string> {
            "OnPlayerDeath", "OnPlayerSleep", "CanMoveItem", "OnItemRemovedFromContainer", "OnLootSpawn", "OnItemDropped", "OnEntityDismounted", "OnPlayerWantsMount", "OnEntityMounted", "OnStructureRepair", "OnHotAirBalloonToggled", "CanBuild", "CanAffordUpgrade", "OnStructureRotate", "OnEntityBuilt", "OnCardSwipe", "OnButtonPress", "OnTurretTarget", "CanBeTargeted", "OnDoorOpened", "OnEntitySpawned", "OnEntityTakeDamage", "OnEntityDeath", "OnEntityKill", "CanPopulateLoot", "OnCustomLootContainer", "CanEntityTakeDamage", "CanBradleySpawnNpc", "OnPlayerViolation", "OnCorpsePopulate", "CanEntityBeTargeted",
        }
        ;
        HashSet<string> permanentHooks = new HashSet<string> {
            "OnLootSpawn", "OnEntityMounted", "OnEntityDismounted", "OnEntityBuilt", "OnSamSiteTarget"
        }
        ;
#endregion Variables
#region API
        bool IsPositionInSpace(Vector3 position) {
            if (position == null) return false;
            return SpaceClass.IsInSpace(position, false);
        }
        float GetMinSpaceAltitude() {
            return _config.mainConfig.spaceHeight - _config.mainConfig.spaceRadius;
        }
        bool IsEventActive() {
            return EventManager.isEventActive;
        }
#endregion API
#region Hooks
        void Init() => Unsubscribes(true);
        void OnServerInitialized() {
            ins = this;
            Subscribes(false);
            GuiManager.LoadImages();
            UpdateConfig();
            LoadDefaultMessages();
            PostLoadCheck();
            EventManager.TryStartEvent(immediately : false);
            NextTick(() => {
                SpaceShuttle.CheckAllDuoSubmarine();
                SpaceShuttle.RespawnShuttles();
                Aerostat.CheckAllBallons();
            }
            );
        }
        void Unload() {
            EventManager.StopEvent(unload : true);
            SpaceShuttle.StopRespawnShuttles();
            SpaceShuttle.DestroyAllShuttles();
            Aerostat.DestroyAllAerostats();
            ins = null;
        }
        void OnPlayerDeath(BasePlayer player) {
            if (player == null) return;
            Astronaut.TryRemoveComponentFromPlayer(player.userID);
            GuiManager.DestroyAllGuiForPlayer(player);
        }
        void OnPlayerSleep(BasePlayer player) {
            if (player == null) return;
            Astronaut.TryRemoveComponentFromPlayer(player.userID);
            GuiManager.DestroyAllGuiForPlayer(player);
        }
        void CanMoveItem(Item item, PlayerInventory playerLoot, uint targetContainer, int targetSlot, int amount) {
            if (item == null) return;
            else if (item.info.isWearable) {
                Astronaut Astronaut = Astronaut.GetComponentFromUserId(playerLoot.containerWear.playerOwner.userID);
                if (Astronaut != null) NextTick(() => Astronaut.OnWearContainerChanged());
            }
        }
        void OnItemRemovedFromContainer(ItemContainer container, Item item) {
            if (item == null || !item.info.isWearable || container == null || container.playerOwner == null) return;
            else if (container.uid == container.playerOwner.inventory.containerWear.uid) {
                Astronaut Astronaut = Astronaut.GetComponentFromUserId(container.playerOwner.userID);
                if (Astronaut != null) NextTick(() => Astronaut.OnWearContainerChanged());
            }
        }
        void OnLootSpawn(LootContainer container) {
            if (container == null || container.inventory == null) return;
            float itemChance;
            if (_config.shuttleConfig.itemConfig.inLootSpawn && _config.shuttleConfig.itemConfig.crateChanses.TryGetValue(container.PrefabName, out itemChance)) {
                LootManager.TrySpawnItemInDefaultCrate(container, _config.shuttleConfig.itemConfig, itemChance, 0);
            }
            if (_config.spaceCardConfig.inLootSpawn && _config.spaceCardConfig.crateChanses.TryGetValue(container.PrefabName, out itemChance)) {
                LootManager.TrySpawnItemInDefaultCrate(container, _config.spaceCardConfig, itemChance, 1);
            }
            if (_config.aerostatConfig.itemConfig.inLootSpawn && _config.aerostatConfig.itemConfig.crateChanses.TryGetValue(container.PrefabName, out itemChance)) {
                LootManager.TrySpawnItemInDefaultCrate(container, _config.aerostatConfig.itemConfig, itemChance, 2);
            }
        }
        void OnItemDropped(Item item, BaseEntity entity) {
            if (entity == null || !EventManager.isEventActive) return;
            if (SpaceClass.IsInSpace(entity.transform.position)) SpaceClass.OnItemDropInSpace(entity);
        }
        void OnEntityDismounted(BaseMountable entity, BasePlayer player) {
            BaseVehicle vehicle = entity.VehicleParent();
            if (vehicle == null) return;
            if (!player.IsRealPlayer()) return;
            SubmarineDuo submarineDuo = vehicle as SubmarineDuo;
            if (submarineDuo != null) {
                SpaceShuttle spaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarineDuo.net.ID);
                if (spaceShuttle != null) {
                    spaceShuttle.DisactivateShuttle();
                    DisableThirdViewMod(player);
                }
            }
            NextTick(() => Astronaut.TryAddComponentToPlayer(player));
        }
        object OnPlayerWantsMount(BasePlayer player, SubmarineDuo submarineDuo) {
            if (submarineDuo == null) return null;
            SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarineDuo.net.ID);
            if (controlledSpaceShuttle != null) {
                if (!SpaceClass.IsInSpace(submarineDuo.transform.position) && Vector3.Angle(Vector3.up, submarineDuo.transform.up) > 90) return null;
                Astronaut.TryRemoveComponentFromPlayer(player.userID);
                submarineDuo.AttemptMount(player, false);
                return true;
            }
            return null;
        }
        void OnEntityMounted(BaseMountable entity, BasePlayer player) {
            BaseVehicle vehicle = entity.VehicleParent();
            if (vehicle == null) return;
            SubmarineDuo submarineDuo = vehicle as SubmarineDuo;
            if (submarineDuo != null) {
                SpaceShuttle spaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarineDuo.net.ID);
                if (spaceShuttle != null) {
                    spaceShuttle.ActivateShuttle();
                }
            }
        }
        object OnStructureRepair(DecorSubmarineDuo baseCombatEntity, BasePlayer player) {
            if (baseCombatEntity == null) return null;
            if (baseCombatEntity.ShortPrefabName == "submarinesolo.entity") {
                SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByDecorSubmarineNetId(baseCombatEntity.net.ID);
                if (controlledSpaceShuttle != null) controlledSpaceShuttle.OnDecorSubmarineRepair(player);
                return true;
            }
            return null;
        }
        void OnHotAirBalloonToggled(HotAirBalloon balloon, BasePlayer player) {
            if (balloon == null) return;
            Aerostat aerostat = Aerostat.GetAetostatByBallonNetId(balloon.net.ID);
            if (aerostat != null) aerostat.OnAerostatToggle();
        }
        object CanBuild(Planner planner, Construction prefab, Construction.Target target) {
            if (!EventManager.isEventActive || planner == null) return null;
            BasePlayer player = planner.GetOwnerPlayer();
            if (player != null && SpaceClass.IsInSpace(player.transform.position)) return false;
            return null;
        }
        object CanAffordUpgrade(BasePlayer player, BuildingBlock block, BuildingGrade.Enum grade) {
            if (!EventManager.isEventActive || player == null) return null;
            if (player != null && SpaceClass.IsInSpace(player.transform.position)) return false;
            else return null;
        }
        object OnStructureRotate(BuildingBlock block, BasePlayer player) {
            if (!EventManager.isEventActive || player == null) return null;
            if (player != null && SpaceClass.IsInSpace(player.transform.position)) return true;
            else return null;
        }
        void OnEntityBuilt(Planner plan, GameObject go) {
            if (plan == null || go == null) return;
            Item item = plan.GetItem();
            if (item == null) return;
            if (item.info.shortname == ins._config.shuttleConfig.itemConfig.shortname && item.skin == ins._config.shuttleConfig.itemConfig.skin) {
                BaseEntity entity = go.ToBaseEntity();
                if (entity == null) return;
                SpaceShuttle.SpawnSpaceShuttle(entity.transform.position, entity.transform.rotation);
                ins.NextTick(() => entity.Kill());
            }
            else if (item.info.shortname == ins._config.aerostatConfig.itemConfig.shortname && item.skin == ins._config.aerostatConfig.itemConfig.skin) {
                BaseEntity entity = go.ToBaseEntity();
                if (entity == null) return;
                Aerostat.SpawnAerostat(entity.transform.position, entity.transform.rotation);
                ins.NextTick(() => entity.Kill());
            }
        }
        void OnCardSwipe(CardReader cardReader, Keycard card, BasePlayer player) {
            if (cardReader == null || card == null || player == null) return;
            if (SpaceClass.IsInSpace(cardReader.transform.position)) SpaceStation.OnStationCardReaderSwipe(cardReader, card, player);
        }
        void OnButtonPress(PressButton button, BasePlayer player) {
            if (button == null) return;
            if (SpaceClass.IsInSpace(button.transform.position)) SpaceStation.OnStationButtonPress(button);
        }
        object OnTurretTarget(AutoTurret turret, BasePlayer player) {
            if (!EventManager.isEventActive || turret == null) return null;
            if (SpaceClass.IsInSpace(turret.transform.position) && !player.IsRealPlayer()) return true;
            return null;
        }
        object CanBeTargeted(BasePlayer player, FlameTurret flameTurret) {
            if (!EventManager.isEventActive || !player.IsRealPlayer() || flameTurret == null) return null;
            if (SpaceClass.IsInSpace(flameTurret.transform.position)) return true;
            return null;
        }
        void OnDoorOpened(Door door, BasePlayer player) {
            if (!EventManager.isEventActive || door == null) return;
            if (SpaceClass.IsInSpace(door.transform.position)) SpaceStation.OnDoorOpened(door);
        }
        void OnCorpsePopulate(BasePlayer entity, NPCPlayerCorpse corpse) {
            if (!EventManager.isEventActive || entity == null || corpse == null) return;
            if (entity is ScientistNPC) {
                NpcConfig npcConfig = _config.npcConfigs.FirstOrDefault(x => x.name == entity.displayName);
                if (npcConfig == null) return;
                NextTick(() => {
                    if (corpse == null) return;
                    ItemContainer container = corpse.containers[0];
                    LootManager.UpdateLootContainerLootTable(container, npcConfig.lootTable, npcConfig.typeLootTable);
                    if (npcConfig.deleteCorpse && !corpse.IsDestroyed) corpse.Kill();
                }
                );
            }
        }
        void OnEntitySpawned(PlayerCorpse entity) {
            if (entity == null) return;
            if (SpaceClass.IsInSpace(entity.transform.position)) {
                Rigidbody rigidBody = entity.GetComponent<Rigidbody>();
                if (rigidBody == null || !rigidBody.useGravity) return;
                rigidBody.useGravity = false;
            }
        }
        void OnEntitySpawned(DroppedItemContainer entity) {
            if (entity == null) return;
            if (SpaceClass.IsInSpace(entity.transform.position)) {
                Rigidbody rigidBody = entity.GetComponent<Rigidbody>();
                if (rigidBody == null || !rigidBody.useGravity) return;
                rigidBody.useGravity = false;
            }
        }
        void OnEntitySpawned(HelicopterDebris entity) {
            if (!EventManager.isEventActive || entity == null) return;
            if (SpaceClass.IsInSpace(entity.transform.position) && entity.IsExists()) entity.Kill();
        }
        void OnEntitySpawned(HotAirBalloon entity) {
            if (_config.aerostatConfig.allBallons && !SpaceClass.IsInSpace(entity.transform.position) && entity.skinID == 0) Aerostat.AttachAerostatClass(entity);
        }
        void OnEntityTakeDamage(SubmarineDuo submarine, HitInfo info) {
            if (!submarine.IsExists() || submarine.net == null) return;
            SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarine.net.ID);
            if (controlledSpaceShuttle != null) controlledSpaceShuttle.OnMainSubmarineGetDamage();
            return;
        }
        object OnEntityTakeDamage(DecorSubmarineDuo baseCombatEntity, HitInfo info) {
            if (!baseCombatEntity.IsExists() || baseCombatEntity.net == null) return null;
            if (baseCombatEntity.ShortPrefabName == "submarinesolo.entity") {
                SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByDecorSubmarineNetId(baseCombatEntity.net.ID);
                if (controlledSpaceShuttle != null) controlledSpaceShuttle.OnDecorSubmarineGetDamage(info);
                return true;
            }
            return null;
        }
        private object OnEntityTakeDamage(BasePlayer player, HitInfo info) {
            if (!EventManager.isEventActive || player == null || info == null || info.Initiator == null) return null;
            HotAirBalloon attackerBalloon = info.Initiator as HotAirBalloon;
            if (attackerBalloon != null && SpaceClass.IsInSpace(attackerBalloon.transform.position)) return true;
            return null;
        }
        void OnEntityDeath(ScientistNPC scientistNPC, HitInfo info) {
            if (!EventManager.isEventActive || scientistNPC == null || info == null) return;
            if (info.InitiatorPlayer.IsRealPlayer() && SpaceClass.IsInSpace(scientistNPC.transform.position)) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Npc");
        }
        void OnEntityDeath(BradleyAPC entity, HitInfo info) {
            if (!_config.supportedPluginsConfig.economy.enable || !EventManager.isEventActive || entity == null || info == null) return;
            if (info.InitiatorPlayer.IsRealPlayer() && SpaceClass.IsInSpace(entity.transform.position)) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Bradley");
        }
        void OnEntityDeath(AutoTurret entity, HitInfo info) {
            if (!_config.supportedPluginsConfig.economy.enable || !EventManager.isEventActive || entity == null || info == null) return;
            if (info.InitiatorPlayer.IsRealPlayer() && SpaceClass.IsInSpace(entity.transform.position)) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Turret");
        }
        void OnEntityDeath(FlameTurret entity, HitInfo info) {
            if (!_config.supportedPluginsConfig.economy.enable || !EventManager.isEventActive || entity == null || info == null) return;
            if (info.InitiatorPlayer.IsRealPlayer() && SpaceClass.IsInSpace(entity.transform.position)) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "FlameTurret");
        }
        void OnEntityDeath(Door entity, HitInfo info) {
            if (!EventManager.isEventActive || entity == null || info == null) return;
            if (info.InitiatorPlayer.IsRealPlayer() && SpaceClass.IsInSpace(entity.transform.position)) {
                if (_config.supportedPluginsConfig.economy.enable) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Door");
            }
        }
        void OnEntityKill(Door entity) {
            if (!EventManager.isEventActive || entity == null) return;
            if (SpaceClass.IsInSpace(entity.transform.position)) {
                SpaceStation.OnDoorOpened(entity);
            }
        }
        object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount) {
            if (EventManager.isEventActive && type == AntiHackType.FlyHack && SpaceClass.IsInSpace(player.transform.position)) {
                return true;
            }
            return null;
        }
#region SupportedPLugins
        object CanPopulateLoot(ScientistNPC entity, NPCPlayerCorpse corpse) {
            if (!EventManager.isEventActive || entity == null) return null;
            NpcConfig roamNpcConfig = ins._config.npcConfigs.FirstOrDefault(x => x.name == entity.displayName);
            if (roamNpcConfig != null) {
                if (roamNpcConfig.typeLootTable != 2) return true;
                return null;
            }
            return null;
        }
        object CanPopulateLoot(LootContainer container) {
            if (!EventManager.isEventActive || container == null) return null;
            if (SpaceClass.IsInSpace(container.transform.position)) {
                CrateConfig crateConfig = _config.crates.FirstOrDefault(x => x.prefab == container.PrefabName);
                if (crateConfig != null && crateConfig.typeLootTable != 2) return true;
            }
            return null;
        }
        object OnCustomLootContainer(uint netID) {
            string cratePrefabName = null;
            cratePrefabName = SpaceStation.GetContainerPrefabNameBynetId(netID);
            if (cratePrefabName == null) SpaceClass.GetContainerPrefabNameBynetId(netID);
            if (cratePrefabName != null) {
                CrateConfig crateConfig = _config.crates.FirstOrDefault(x => x.prefab == cratePrefabName);
                if (crateConfig != null && crateConfig.typeLootTable != 3) return true;
            }
            return null;
        }
        object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo hitinfo) {
            if (!EventManager.isEventActive || autoTurret == null || hitinfo == null) return null;
            if (SpaceClass.IsInSpace(autoTurret.transform.position)) {
                if (!hitinfo.InitiatorPlayer.IsRealPlayer()) return false;
                else return true;
            }
            return null;
        }
        object CanEntityTakeDamage(FlameTurret flameTurret, HitInfo hitinfo) {
            if (!EventManager.isEventActive || flameTurret == null || hitinfo == null) return null;
            if (SpaceClass.IsInSpace(flameTurret.transform.position)) {
                if (!hitinfo.InitiatorPlayer.IsRealPlayer()) return false;
                else return true;
            }
            return null;
        }
        object CanEntityTakeDamage(Door door, HitInfo hitinfo) {
            if (!EventManager.isEventActive || door == null || hitinfo == null) return null;
            if (SpaceClass.IsInSpace(door.transform.position)) {
                if (!hitinfo.InitiatorPlayer.IsRealPlayer()) return false;
                else return true;
            }
            return null;
        }
        object CanEntityTakeDamage(ScientistNPC scientistNPC, HitInfo hitinfo) {
            if (!EventManager.isEventActive || scientistNPC == null || hitinfo == null) return null;
            if (SpaceClass.IsInSpace(scientistNPC.transform.position)) {
                AutoTurret autoTurret = hitinfo.Initiator as AutoTurret;
                if (autoTurret != null) return false;
            }
            return null;
        }
        object CanEntityTakeDamage(BasePlayer victim, HitInfo hitinfo) {
            if (!EventManager.isEventActive || victim == null || hitinfo == null || !victim.IsRealPlayer()) return null;
            BasePlayer attacker = hitinfo.InitiatorPlayer;
            if (attacker.IsRealPlayer()) {
                if (_config.zoneConfig.isCreateZonePVP && EventZone.playersInSpace.Contains(victim) && EventZone.playersInSpace.Contains(attacker)) return true;
            }
            else if (hitinfo.Initiator != null && SpaceClass.IsInSpace(hitinfo.Initiator.transform.position)) {
                AutoTurret autoTurret = hitinfo.Initiator as AutoTurret;
                if (autoTurret != null) return true;
                FlameTurret flameTurret = hitinfo.Initiator as FlameTurret;
                if (flameTurret != null) return true;
                HotAirBalloon attackerBalloon = hitinfo.Initiator as HotAirBalloon;
                if (attackerBalloon != null) return false;
            }
            return null;
        }
        object CanEntityBeTargeted(BasePlayer target, AutoTurret autoTurret) {
            if (!EventManager.isEventActive || autoTurret == null || !target.IsRealPlayer()) return null;
            if (SpaceClass.IsInSpace(autoTurret.transform.position)) return true;
            return null;
        }
        object CanEntityBeTargeted(BasePlayer target, FlameTurret flameTurret) {
            if (!EventManager.isEventActive || flameTurret == null || !target.IsRealPlayer()) return null;
            if (SpaceClass.IsInSpace(flameTurret.transform.position)) return true;
            return null;
        }
        object CanBradleySpawnNpc(BradleyAPC bradley) {
            if (!EventManager.isEventActive || bradley == null) return null;
            if (SpaceClass.IsInSpace(bradley.transform.position)) return true;
            return null;
        }
#endregion SupportedPLugins
#endregion Hooks
#region Commands
        [ChatCommand("spacestart")]
        void ChatStartCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (arg.Length > 0) EventManager.TryStartEvent(true, arg[0], player);
            else EventManager.TryStartEvent(immediately : true, initiator : player);
        }
        [ConsoleCommand("spacestart")]
        void ConsoleStartCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            if (arg.Args != null && arg.Args.Length > 0) EventManager.TryStartEvent(true, arg.Args[0]);
            else EventManager.TryStartEvent(immediately : true);
        }
        [ChatCommand("spacestop")]
        void ChatStopCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            EventManager.StopEvent();
        }
        [ConsoleCommand("spacestop")]
        void ConsoleStopCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() == null) EventManager.StopEvent();
        }
        [ChatCommand("zerogravity")]
        void ChatZeroGravityCommand(BasePlayer player, string command, string[] arg) {
            if (Astronaut.GetComponentFromUserId(player.userID) != null) Astronaut.TryRemoveComponentFromPlayer(player.userID);
            else Astronaut.TryAddComponentToPlayer(player);
        }
        [ChatCommand("spawnshuttle")]
        void ChatShuttleCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            SpaceShuttle spaceShuttle = SpaceShuttle.SpawnSpaceShuttle(player.transform.position, Quaternion.identity);
            spaceShuttle.AddFuel(100);
        }
        [ChatCommand("spawnaerostat")]
        void ChatAerostatCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            Aerostat.SpawnAerostat(player.transform.position, Quaternion.identity);
        }
        [ChatCommand("giveshuttle")]
        void ChatGiveShuttleCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            Item shuttleItem = LootManager.CreateItem(_config.shuttleConfig.itemConfig, 1);
            LootManager.GiveItemToPLayer(player, shuttleItem);
        }
        [ChatCommand("giveaerostat")]
        void ChatGiveAetostatCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            Item aerostatItem = LootManager.CreateItem(_config.aerostatConfig.itemConfig, 1);
            LootManager.GiveItemToPLayer(player, aerostatItem);
        }
        [ConsoleCommand("givepurplecard")]
        void GivePurpleCardCommand(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            BasePlayer target = null;
            int amount = 1;
            if (arg.Args.Length >= 1) target = BasePlayer.FindByID(Convert.ToUInt64(arg.Args[0]));
            if (arg.Args.Length >= 2) amount = Convert.ToInt32(arg.Args[1]);
            if (target == null) {
                PrintToConsole(player, "Player not found");
                return;
            }
            Item spaceCardItem = LootManager.CreateItem(_config.spaceCardConfig, 1);
            LootManager.GiveItemToPLayer(target, spaceCardItem);
            PrintToChat(target, GetMessage("GetSpaceCard", target.UserIDString, _config.prefix));
            Puts($"A space card was given to {target.displayName}");
        }
        [ConsoleCommand("giveshuttle")]
        void GiveShuttleCommand(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            BasePlayer target = null;
            int amount = 1;
            if (arg.Args.Length >= 1) target = BasePlayer.FindByID(Convert.ToUInt64(arg.Args[0]));
            if (arg.Args.Length >= 2) amount = Convert.ToInt32(arg.Args[1]);
            if (target == null) {
                PrintToConsole(player, "Player not found");
                return;
            }
            Item spaceCardItem = LootManager.CreateItem(_config.shuttleConfig.itemConfig, amount);
            LootManager.GiveItemToPLayer(target, spaceCardItem);
            PrintToChat(target, GetMessage("GetSpaceShuttle", target.UserIDString, _config.prefix));
            Puts($"A shuttle was given to {target.displayName}");
        }
        [ConsoleCommand("giveaerostat")]
        void GiveAerostatCommand(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            BasePlayer target = null;
            int amount = 1;
            if (arg.Args.Length >= 1) target = BasePlayer.FindByID(Convert.ToUInt64(arg.Args[0]));
            if (arg.Args.Length >= 2) amount = Convert.ToInt32(arg.Args[1]);
            if (target == null) {
                PrintToConsole(player, "Player not found");
                return;
            }
            Item spaceCardItem = LootManager.CreateItem(_config.aerostatConfig.itemConfig, amount);
            LootManager.GiveItemToPLayer(target, spaceCardItem);
            PrintToChat(target, GetMessage("GetAerostat", target.UserIDString, _config.prefix));
            Puts($"An aerostat was given to {target.displayName}");
        }
        [ConsoleCommand("givespacesuit")]
        void GiveSuitCommand(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            BasePlayer target = null;
            if (arg.Args.Length < 2) return;
            SpaceSuitConfig spaceSuitConfig = _config.spaceSuits.FirstOrDefault(x => x.presetName == arg.Args[0]);
            if (spaceSuitConfig == null) {
                PrintToConsole(player, "Space Suit not found");
                return;
            }
            int amount = 1;
            if (arg.Args.Length >= 2) target = BasePlayer.FindByID(Convert.ToUInt64(arg.Args[1]));
            if (arg.Args.Length >= 3) amount = Convert.ToInt32(arg.Args[2]);
            if (target == null) {
                PrintToConsole(player, "Player not found");
                return;
            }
            Item spaceCardItem = LootManager.CreateItem(spaceSuitConfig.itemConfig, amount);
            LootManager.GiveItemToPLayer(target, spaceCardItem);
            PrintToChat(target, GetMessage("GetSpaceSuit", target.UserIDString, _config.prefix));
            Puts($"An Space Suit was given to {target.displayName}");
        }
#endregion Commands
#region Methods
        void UpdateConfig() {
            foreach (CrateConfig crateConfig in ins._config.crates) {
                crateConfig.lootTable.items = crateConfig.lootTable.items.OrderBy(x => x.chance);
            }
            foreach (StorageCrateConfig storageCrateConfig in ins._config.storageCrates) {
                storageCrateConfig.lootTable.items = storageCrateConfig.lootTable.items.OrderBy(x => x.chance);
            }
            if (_config.version.Patch == 0) {
                _config.shuttleConfig.control = new ShuttleControl {
                    invertX = false, invertY = false,
                }
                ;
                foreach (StorageCrateConfig storageCrateConfig in ins._config.storageCrates) {
                    foreach (LootItemConfig lootItemConfig in storageCrateConfig.lootTable.items) {
                        if (lootItemConfig.shortname == "chocholate") {
                            lootItemConfig.shortname = "potato";
                        }
                    }
                }
            }
            if (_config.version.Patch == 1) {
                _config.astronautConfig.thirdPerson = false;
            }
            if (_config.version.Patch < 4) {
                _config.mainConfig.spaceHeight = 700;
                _config.shuttleConfig.samSiteConfig = new SamSiteConfig {
                    enable = true, bigRangeAndSpeed = false
                }
                ;
                _config.shuttleConfig.respawnConfig.eventBegignigSpawnConfig = new ShuttleEventBegignigSpawnConfig {
                    deleteShuttles = true, roadShuttlesNumber = 0
                }
                ;
            }
            if (_config.version.Patch < 5) {
                _config.mainConfig.spaceRadius = 200;
            }
            _config.version = Version;
            SaveConfig();
        }
        void PostLoadCheck() {
            NpcManager.CheckNPCSpawn();
        }
        void Unsubscribes(bool all) {
            foreach (string hook in allHooks) if (all || !permanentHooks.Contains(hook)) Unsubscribe(hook);
        }
        void Subscribes(bool all) {
            foreach (string hook in allHooks) {
                if (all || permanentHooks.Contains(hook)) {
                    Subscribe(hook);
                }
            }
        }
        void EnableThirdViewMod(BasePlayer player) {
            player.SetPlayerFlag(BasePlayer.PlayerFlags.ThirdPersonViewmode, true);
        }
        void DisableThirdViewMod(BasePlayer player) {
            player.SetPlayerFlag(BasePlayer.PlayerFlags.ThirdPersonViewmode, false);
        }
#endregion Methods
#region Classes
        static class EventManager {
            internal static EventConfig eventConfig {
                get;
                private set;
            }
            internal static bool isEventActive {
                get;
                private set;
            }
            static Coroutine eventCorountine;
            static int eventTime = 0;
            internal static void StopEvent(bool unload = false) {
                ins.Unsubscribes(unload);
                if (isEventActive) {
                    isEventActive = false;
                    SpaceClass.DestroySpace();
                    LootManager.DestroyEventCrates();
                    if (eventCorountine != null) ServerMgr.Instance.StopCoroutine(eventCorountine);
                    if (ins._config.supportedPluginsConfig.economy.enable) EconomyManager.SendBalance();
                    eventCorountine = null;
                    eventConfig = null;
                    eventTime = 0;
                    if (ins._config.supportedPluginsConfig.pveMode.pve && ins.plugins.Exists("PveMode")) ins.PveMode.Call("EventRemovePveMode", ins.Name, false);
                    NotifyManager.SendMessageToAll("EndEvent", ins._config.prefix);
                    Astronaut.RemoveAllComponents();
                    SpaceShuttle.OnEventStop();
                    Interface.CallHook("OnSpaceEventStop");
                }
                if (!unload) TryStartEvent(immediately : false);
                else if (eventCorountine != null && unload) ServerMgr.Instance.StopCoroutine(eventCorountine);
                GuiManager.DestroyGuiForAllPLayers();
            }
            internal static void TryStartEvent(bool immediately, string presetName = "", BasePlayer initiator = null) {
                if (isEventActive) {
                    NotifyManager.PrintError(initiator, "EventActive_Exeption");
                    return;
                }
                eventConfig = DefineEventConfig(presetName);
                if (eventConfig == null) {
                    NotifyManager.PrintError(initiator, "СonfigurationNotFound_Exeption");
                    return;
                }
                if (eventCorountine != null) ServerMgr.Instance.StopCoroutine(eventCorountine);
                if (immediately) StartPeriodicEvent(true);
                else DelayedStartPeriodicEvent();
                if (immediately && initiator == null) ins.Puts("The event is activated!");
            }
            static EventConfig DefineEventConfig(string eventPresetName) {
                if (eventPresetName != "") {
                    return ins._config.eventConfigs.FirstOrDefault(x => x.presetName == eventPresetName);
                }
                else {
                    if (!ins._config.eventConfigs.Any(x => x.chance != 0)) return null;
                    float sumChance = 0;
                    foreach (EventConfig eventConfig in ins._config.eventConfigs) {
                        sumChance += eventConfig.chance;
                    }
                    float random = UnityEngine.Random.Range(0, sumChance);
                    foreach (EventConfig eventConfig in ins._config.eventConfigs) {
                        sumChance -= eventConfig.chance;
                        if (sumChance <= 0) return eventConfig;
                    }
                    return null;
                }
            }
            static void DelayedStartPeriodicEvent() {
                if (eventCorountine != null) ServerMgr.Instance.StopCoroutine(eventCorountine);
                eventCorountine = ServerMgr.Instance.StartCoroutine(DelayStartPeriodicEventCoroutine());
            }
            static IEnumerator DelayStartPeriodicEventCoroutine() {
                yield return CoroutineEx.waitForSeconds(UnityEngine.Random.Range(ins._config.mainConfig.minTimeBetweenEvent, ins._config.mainConfig.maxTimeBetweenEvent));
                eventCorountine = null;
                StartPeriodicEvent();
            }
            static void StartPeriodicEvent(bool over = false) {
                eventTime = eventConfig.eventTime;
                if (!over && eventCorountine != null) return;
                if (eventCorountine != null) ServerMgr.Instance.StopCoroutine(eventCorountine);
                eventCorountine = ServerMgr.Instance.StartCoroutine(StartPeriodicEventCoroutine());
            }
            static IEnumerator StartPeriodicEventCoroutine() {
                NotifyManager.SendMessageToAll("PreStartEvent", ins._config.prefix, eventConfig.displayName, ins._config.mainConfig.preStartTime);
                yield return CoroutineEx.waitForSeconds(ins._config.mainConfig.preStartTime);
                StartEvent();
            }
            static void StartEvent() {
                SpaceClass.CreateSpaceFirstStage();
                isEventActive = true;
                ins.Subscribes(true);
                if (eventCorountine != null) ServerMgr.Instance.StopCoroutine(eventCorountine);
                eventCorountine = ServerMgr.Instance.StartCoroutine(PeriodicEventCorountine());
            }
            internal static void PostStartEvent() {
                NotifyManager.SendMessageToAll("StartEvent", ins._config.prefix, eventConfig.displayName, PhoneController.PositionToGridCoord(SpaceClass.GetSpaceTransform().position));
                SpaceShuttle.OnEventStart();
                Interface.CallHook("OnSpaceEventStart");
            }
            static IEnumerator PeriodicEventCorountine() {
                while (eventTime > 0 || (ins._config.mainConfig.dontStopIfPlayerInSpace && EventZone.playersInSpace.Any(x => x != null && x.IsConnected && !x.IsSleeping() && x.transform != null && SpaceClass.IsInSpace(x.transform.position, false)))) {
                    if (ins._config.mainConfig.remainTimeNotifications.Contains(eventTime)) NotifyManager.SendMessageToAll("RemainTime", ins._config.prefix, eventConfig.displayName, eventTime);
                    if (ins._config.mainConfig.descriptionNotifications.Contains(eventTime)) NotifyManager.SendMessageToAll("EventDescription", ins._config.prefix, eventConfig.displayName, PhoneController.PositionToGridCoord(SpaceClass.GetSpaceTransform().position));
                    GuiManager.UpdateCountdownGui(eventTime);
                    MapMarker.UpdateMapMarkerTime(eventTime);
                    eventTime--;
                    yield return CoroutineEx.waitForSeconds(1);
                }
                StopEvent();
            }
        }
        sealed class SpaceClass : FacepunchBehaviour {
            internal const float maxSpaceHeight = 980;
            static SpaceClass spaceClass;
            EventZone spaceZone;
            HashSet<BaseEntity> crates = new HashSet<BaseEntity>();
            HashSet<BaseEntity> meteors = new HashSet<BaseEntity>();
            HashSet<ScientistNPC> spaceRoamNpcs = new HashSet<ScientistNPC>();
            HashSet<SpaceShuttle> spaceShuttles = new HashSet<SpaceShuttle>();
            HashSet<Aerostat> aerostats = new HashSet<Aerostat>();
            HashSet<BaseEntity> droppedItems = new HashSet<BaseEntity>();
            internal static HashSet<BaseEntity> GetSpaceCrates() {
                if (spaceClass == null) return null;
                return spaceClass.crates;
            }
            internal static HashSet<ScientistNPC> GetSpaceNPCs() {
                if (spaceClass == null) return null;
                return spaceClass.spaceRoamNpcs;
            }
            internal static void CreateSpaceFirstStage() {
                if (spaceClass != null) return;
                GameObject gameObject = new GameObject();
                if (ins._config.mainConfig.onlyOceanSpawn) {
                    float randomx = UnityEngine.Random.Range(-TerrainMeta.Size.x / 2, TerrainMeta.Size.x / 2);
                    float randomz = UnityEngine.Random.Range(-TerrainMeta.Size.x / 2, TerrainMeta.Size.x / 2);
                    if (Math.Abs(randomx) > Math.Abs(randomz)) {
                        if (randomx > 0) randomx = TerrainMeta.Size.x / 2;
                        else randomx = -TerrainMeta.Size.x / 2;
                    }
                    else {
                        if (randomz > 0) randomz = TerrainMeta.Size.x / 2;
                        else randomz = -TerrainMeta.Size.x / 2;
                    }
                    gameObject.transform.position = new Vector3(randomx, ins._config.mainConfig.spaceHeight, randomz);
                }
                else gameObject.transform.position = new Vector3(UnityEngine.Random.Range(-TerrainMeta.Size.x / 2, TerrainMeta.Size.x / 2), ins._config.mainConfig.spaceHeight, UnityEngine.Random.Range(-TerrainMeta.Size.x / 2, TerrainMeta.Size.x / 2));
                gameObject.transform.rotation = Quaternion.Euler(0, UnityEngine.Random.Range(0.0f, 360.0f), 0);
                gameObject.layer = (int)Layer.Reserved1;
                spaceClass = gameObject.AddComponent<SpaceClass>();
                if (EventManager.eventConfig.spaceStationConfig.enable) SpaceStation.SpawnSpaceStation(EventManager.eventConfig.spaceStationConfig.presetName);
                else CreateSpaceSecondStage();
            }
            internal static void CreateSpaceSecondStage() {
                if (spaceClass == null) return;
                RespawnSpaceEntities(true);
            }
            internal static void CreateSpaceThirdStage() {
                if (spaceClass == null) return;
                if (spaceClass.spaceZone == null) spaceClass.spaceZone = EventZone.AddZoneComponrntToGameObject(spaceClass);
                MapMarker.CreateMapMarker(spaceClass.transform.position);
                EventManager.PostStartEvent();
                SpaceWeather.StartSpaceWeatherChange();
            }
            internal static void RespawnSpaceEntities(bool first = false) {
                if (spaceClass == null) return;
                SpaceObjects.RespawnObjects(first);
            }
            internal static void OnItemDropInSpace(BaseEntity entity) {
                if (spaceClass == null) return;
                Rigidbody rigidbody = entity.GetComponent<Rigidbody>();
                if (rigidbody == null) return;
                rigidbody.useGravity = false;
                rigidbody.drag = 0.5f;
                spaceClass.droppedItems.Add(entity);
            }
            internal static void DestroySpace() {
                if (spaceClass != null) UnityEngine.Object.Destroy(spaceClass.gameObject);
            }
            internal static Transform GetSpaceTransform() {
                if (spaceClass == null) return null;
                return spaceClass.transform;
            }
            internal static bool IsInSpace(Vector3 position, bool checkMaxHeight = true) {
                return EventManager.isEventActive && position.y >= ins._config.mainConfig.spaceHeight - ins._config.mainConfig.spaceRadius && (!checkMaxHeight || position.y <= maxSpaceHeight);
            }
            internal static string GetContainerPrefabNameBynetId(uint netId) {
                if (spaceClass == null) return null;
                BaseEntity crate = spaceClass.crates.FirstOrDefault(x => x != null && x.net.ID == netId);
                if (crate != null) return crate.PrefabName;
                return null;
            }
            void OnDestroy() {
                MapMarker.DeleteMapMarker();
                SpaceObjects.StopRespawn();
                SpaceStation.DestroySpaceStation();
                DestroySpaceObjects();
                CheckRemainSpaceObjects();
                SpaceWeather.StopSpaceWeatherChange();
            }
            void DestroySpaceObjects() {
                foreach (BaseEntity entity in crates) if (entity.IsExists()) entity.Kill();
                foreach (BaseEntity entity in meteors) if (entity.IsExists()) entity.Kill();
                foreach (ScientistNPC scientistNPC in spaceRoamNpcs) if (scientistNPC.IsExists()) scientistNPC.Kill();
                foreach (SpaceShuttle spaceShuttle in spaceShuttles) if (spaceShuttle != null && !spaceShuttle.IsAnyMounted()) spaceShuttle.KillSubmarine();
                foreach (Aerostat aerostat in aerostats) if (aerostat != null && !aerostat.IsAnyMounted()) aerostat.KillAerostat();
                foreach (BaseEntity entity in droppedItems) if (entity.IsExists()) entity.Kill();
            }
            void CheckRemainSpaceObjects() {
                foreach (Collider collider in UnityEngine.Physics.OverlapSphere(transform.position, 300)) {
                    BaseEntity entity = collider.ToBaseEntity();
                    if (entity == null) continue;
                    if (entity.IsExists() && (entity is BaseCorpse || entity is DroppedItemContainer)) entity.Kill();
                }
            }
            static class SpaceObjects {
                static Coroutine respawnCorountine;
                internal static void RespawnObjects(bool first) {
                    spaceClass.crates.RemoveWhere(x => !x.IsExists());
                    spaceClass.meteors.RemoveWhere(x => !x.IsExists());
                    spaceClass.spaceRoamNpcs.RemoveWhere(x => x == null);
                    if (respawnCorountine != null) ServerMgr.Instance.StopCoroutine(respawnCorountine);
                    respawnCorountine = ServerMgr.Instance.StartCoroutine(RespawnCorountine(first));
                }
                internal static void StopRespawn() {
                    if (respawnCorountine != null) ServerMgr.Instance.StopCoroutine(respawnCorountine);
                    respawnCorountine = null;
                }
                static IEnumerator RespawnCorountine(bool first) {
                    if (EventManager.eventConfig.spaceLootCrateConfig.enable && EventManager.eventConfig.spaceLootCrateConfig.probability.Any(x => x.Value > 1)) {
                        while (spaceClass.crates.Count < EventManager.eventConfig.spaceLootCrateConfig.crateCount) {
                            SpaceCrate.SpawnRandomCrate();
                            yield return CoroutineEx.waitForSeconds(0.01f);
                        }
                    }
                    if (EventManager.eventConfig.meteorsConfig.enable) {
                        while (spaceClass.meteors.Count < EventManager.eventConfig.meteorsConfig.meteorCount) {
                            MeteorClass.SpawnRandomMeteor();
                            yield return CoroutineEx.waitForSeconds(0.01f);
                        }
                    }
                    if (EventManager.eventConfig.roamNpcSpawnConfig.enable) {
                        while (spaceClass.spaceRoamNpcs.Count < EventManager.eventConfig.roamNpcSpawnConfig.npcsCount) {
                            if (!RoamSpaceNpc.SpawnRandomRoamNpc()) break;
                            yield return CoroutineEx.waitForSeconds(0.01f);
                        }
                    }
                    if (EventManager.eventConfig.spaceShuttleInSpaceSpawnConfig.enable) {
                        while (spaceClass.spaceShuttles.Count < EventManager.eventConfig.spaceShuttleInSpaceSpawnConfig.count) {
                            Vector3 position = LocationDefiner.GetRandomSpacePoint();
                            if (position == Vector3.zero) break;
                            SpaceShuttle spaceShuttle = SpaceShuttle.SpawnSpaceShuttle(position, LocationDefiner.GetRandomRotation());
                            if (spaceShuttle != null) spaceShuttle.AddFuel(EventManager.eventConfig.spaceShuttleInSpaceSpawnConfig.fuelAmountInShuttle);
                            spaceClass.spaceShuttles.Add(spaceShuttle);
                            yield return CoroutineEx.waitForSeconds(0.01f);
                        }
      
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху