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

FREE Space : 1.3.8 1.3.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", "Adem", "1.3.8")]
    class Space : RustPlugin {
        [PluginReference]
        Plugin NpcSpawn, PveMode, GUIAnnouncements, DiscordMessages, Economics, ServerRewards, IQEconomic, NightVision, Friends, Clans, Notify;
#region Variables
        const bool en = false;
        static Space ins;
        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", "OnPlayerViolation", "OnLootEntity", "CanPopulateLoot", "OnCustomLootContainer", "CanEntityTakeDamage", "CanBradleySpawnNpc", "OnPlayerViolation", "OnCorpsePopulate", "CanEntityBeTargeted", "OnPlayerCorpseSpawned"
        }
        ;
        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();
            SpaceShuttle.CheckAllDuoSubmarine();
            SpaceShuttle.RespawnShuttles();
            Aerostat.CheckAllBallons();
            if (_config.mainConfig.isAutoEvent) EventManager.TryStartEvent(immediately : false);
        }
        void Unload() {
            SpaceShuttle.StopRespawnShuttles();
            EventManager.StopEvent(unload : true);
            SpaceShuttle.DestroyAllShuttles();
            Aerostat.DestroyAllAerostats();
            ins = null;
        }
        void OnPlayerDeath(BasePlayer player) {
            if (player == null) return;
            Astronaut.TryRemoveComponentFromPlayer(player.userID);
            GuiManager.DestroyGui(player);
        }
        void OnPlayerSleep(BasePlayer player) {
            if (player == null) return;
            Astronaut.TryRemoveComponentFromPlayer(player.userID);
            GuiManager.DestroyGui(player);
        }
        void CanMoveItem(Item item, PlayerInventory playerLoot, ItemContainerId 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) {
            if (!player.IsRealPlayer() || !entity.IsExists()) return;
            BaseVehicle vehicle = entity.VehicleParent();
            if (vehicle != null) {
                SubmarineDuo submarineDuo = vehicle as SubmarineDuo;
                if (submarineDuo != null) {
                    SpaceShuttle spaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarineDuo.net.ID.Value);
                    if (spaceShuttle != null) {
                        spaceShuttle.DisactivateShuttle();
                        DisableThirdViewMod(player);
                    }
                }
                Astronaut.TryAddComponentToPlayer(player);
            }
        }
        object OnPlayerWantsMount(BasePlayer player, SubmarineDuo submarineDuo) {
            if (submarineDuo == null || !player.IsRealPlayer() || submarineDuo.net == null) return null;
            SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarineDuo.net.ID.Value);
            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 && submarineDuo.net != null) {
                SpaceShuttle spaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarineDuo.net.ID.Value);
                if (spaceShuttle != null) {
                    spaceShuttle.ActivateShuttle(player);
                }
            }
        }
        object OnStructureRepair(DecorSubmarineDuo baseCombatEntity, BasePlayer player) {
            if (baseCombatEntity == null || baseCombatEntity.net == null) return null;
            if (baseCombatEntity.ShortPrefabName == "submarinesolo.entity") {
                SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByDecorSubmarineNetId(baseCombatEntity.net.ID.Value);
                if (controlledSpaceShuttle != null) controlledSpaceShuttle.OnDecorSubmarineRepair(player);
                return true;
            }
            return null;
        }
        void OnHotAirBalloonToggled(HotAirBalloon balloon, BasePlayer player) {
            if (balloon == null || balloon.net == null) return;
            Aerostat aerostat = Aerostat.GetAetostatByBallonNetId(balloon.net.ID.Value);
            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());
            }
        }
        object OnCardSwipe(CardReader cardReader, Keycard card, BasePlayer player) {
            if (cardReader == null || card == null || player == null) return null;
            if (SpaceClass.IsInSpace(cardReader.transform.position)) return SpaceStation.OnStationCardReaderSwipe(cardReader, card, player);
            return null;
        }
        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) {
                if (SpaceClass.IsInSpace(corpse.transform.position)) {
                    Rigidbody rigidBody = corpse.GetComponent<Rigidbody>();
                    if (rigidBody != null && rigidBody.useGravity) {
                        rigidBody.useGravity = false;
                        rigidBody.isKinematic = true;
                    }
                }
                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 OnPlayerCorpseSpawned(BasePlayer player, PlayerCorpse corpse) {
            if (corpse == null) return;
            if (SpaceClass.IsInSpace(corpse.transform.position)) {
                Rigidbody rigidBody = corpse.GetComponent<Rigidbody>();
                if (rigidBody != null && rigidBody.useGravity) {
                    rigidBody.useGravity = false;
                    rigidBody.isKinematic = true;
                }
            }
        }
        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 OnEntitySpawned(FireBall entity) {
            if (entity == null) return;
            if (SpaceClass.IsInSpace(entity.transform.position, false)) entity.Kill();
        }
        void OnEntityTakeDamage(SubmarineDuo submarine, HitInfo info) {
            if (!submarine.IsExists() || submarine.net == null) return;
            SpaceShuttle controlledSpaceShuttle = SpaceShuttle.GetSpaceShuttleByMainSubmarineNetId(submarine.net.ID.Value);
            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.Value);
                if (controlledSpaceShuttle != null) controlledSpaceShuttle.OnDecorSubmarineGetDamage(info);
                return true;
            }
            return null;
        }
        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;
        }
        object OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info) {
            if (scientistNPC == null || info == null) return null;
            if (SpaceClass.IsInSpace(scientistNPC.transform.position)) {
                if (info.InitiatorPlayer.IsRealPlayer() && !SpaceClass.IsInSpace(info.InitiatorPlayer.transform.position)) {
                    return true;
                }
            }
            return null;
        }
        object OnEntityTakeDamage(BradleyAPC bradleyAPC, HitInfo info) {
            if (bradleyAPC == null || info == null) return null;
            if (SpaceClass.IsInSpace(bradleyAPC.transform.position)) {
                if (info.InitiatorPlayer.IsRealPlayer() && !SpaceClass.IsInSpace(info.InitiatorPlayer.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 (!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 (!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 (!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)) {
                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;
        }
        void OnLootEntity(BasePlayer player, LootContainer container) {
            if (player == null || !container.IsExists() || container.net == null || !SpaceClass.IsInSpace(container.transform.position, false)) return;
            if (LootManager.IsEventCrate(container.net.ID.Value)) {
                LootManager.OnEventCrateLooted(container, player);
            }
        }
#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(ulong 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;
                if (hitinfo.InitiatorPlayer != null && !PveModeController.IsPveModeBlockAction(hitinfo.InitiatorPlayer)) return true;
                else return null;
            }
            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;
                if (hitinfo.InitiatorPlayer != null && !PveModeController.IsPveModeBlockAction(hitinfo.InitiatorPlayer)) return true;
                else return null;
            }
            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;
                if (hitinfo.InitiatorPlayer != null && !PveModeController.IsPveModeBlockAction(hitinfo.InitiatorPlayer)) return true;
                else return null;
            }
            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) {
                    if (victim != null && !PveModeController.IsPveModeBlockAction(victim)) return true;
                    else return null;
                }
                FlameTurret flameTurret = hitinfo.Initiator as FlameTurret;
                if (flameTurret != null) {
                    if (victim != null && !PveModeController.IsPveModeBlockAction(victim)) return true;
                    else return null;
                }
                HotAirBalloon attackerBalloon = hitinfo.Initiator as HotAirBalloon;
                if (attackerBalloon != null) {
                    if (hitinfo.InitiatorPlayer != null && !PveModeController.IsPveModeBlockAction(hitinfo.InitiatorPlayer)) return true;
                    else return null;
                }
            }
            return null;
        }
        object CanEntityBeTargeted(BasePlayer target, AutoTurret autoTurret) {
            if (!EventManager.isEventActive || autoTurret == null || !target.IsRealPlayer()) return null;
            if (SpaceClass.IsInSpace(autoTurret.transform.position)) {
                if (target != null && !PveModeController.IsPveModeBlockAction(target)) return true;
                else return null;
            }
            return null;
        }
        object CanEntityBeTargeted(BasePlayer target, FlameTurret flameTurret) {
            if (!EventManager.isEventActive || flameTurret == null || !target.IsRealPlayer()) return null;
            if (SpaceClass.IsInSpace(flameTurret.transform.position)) {
                if (target != null && !PveModeController.IsPveModeBlockAction(target)) return true;
                else return null;
            }
            return null;
        }
        void OnJetpackRemoved(BasePlayer player) {
            if (player.IsRealPlayer()) Astronaut.TryAddComponentToPlayer(player);
        }
        void OnJetpackWear(BasePlayer player) {
            if (player.IsRealPlayer()) Astronaut.TryRemoveComponentFromPlayer(player.userID);
        }
        object CanBradleySpawnNpc(BradleyAPC bradley) {
            if (bradley != null && SpaceClass.IsInSpace(bradley.transform.position)) return true;
            return null;
        }
        void SetOwnerPveMode(string eventName, BasePlayer owner) {
            if (eventName == Name) PveModeController.SetPveModeOwner(owner);
        }
        void ClearOwnerPveMode(string eventName) {
            if (eventName == Name) PveModeController.ClearPveModeOwner();
        }
#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) {
            if (arg.Player() != null) return;
            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) {
                NotifyManager.PrintError(null, "Player not found");
                return;
            }
            Item spaceCardItem = LootManager.CreateItem(_config.spaceCardConfig, amount);
            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) {
            if (arg.Player() != null) return;
            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) {
                NotifyManager.PrintError(null, "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) {
            if (arg.Player() != null) return;
            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) {
                NotifyManager.PrintError(null, "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) {
            if (arg.Player() != null) return;
            BasePlayer target = null;
            if (arg.Args.Length < 2) return;
            SpaceSuitConfig spaceSuitConfig = _config.spaceSuits.FirstOrDefault(x => x.presetName == arg.Args[0]);
            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) {
                NotifyManager.PrintError(null, "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}");
        }
        [ChatCommand("spacepoint")]
        void SpawnPointCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            _config.mainConfig.customSpawnPoints.Add(player.transform.position.ToString());
            PrintToChat(player, _config.prefix + " New spawn point <color=#738d43>successfully</color> added to the config");
            SaveConfig();
        }
        [ChatCommand("spacetest")]
        void SpaceTestCommand(BasePlayer player, string command, string[] arg) {
            SpaceShuttle.SpawnSpaceShuttle(player.transform.position, Quaternion.identity);
        }
#endregion Commands
#region Methods
        void UpdateConfig() {
            if (_config.version == null || _config.version == new VersionNumber(0, 0, 0)) {
                ins.PrintError("The configuration file is corrupted!");
                return;
            }
            if (_config.version.Minor == 0) {
                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;
                }
                if (_config.version.Patch <= 9) {
                    _config.shuttleConfig.shuttleMarkerConfig = new ShuttleMarkerConfig {
                        enable = false, name = en ? "Space Shuttle" : "Космический корабль"
                    }
                    ;
                }
                _config.version = new VersionNumber(1, 1, 0);
            }
            if (_config.version.Minor == 1) {
                if (_config.version.Patch <= 1) {
                    _config.shuttleConfig.enableCampfires = true;
                }
                if (_config.version.Patch <= 8) {
                    SpaceSuitConfig spaceSuitConfig = _config.spaceSuits.FirstOrDefault(x => x.itemConfig.shortname == "hazmatsuit" && x.itemConfig.skin == 10180);
                    if (spaceSuitConfig != null) {
                        spaceSuitConfig.itemConfig.shortname = "hazmatsuit.spacesuit";
                        spaceSuitConfig.itemConfig.skin = 0;
                    }
                }
                _config.version = new VersionNumber(1, 2, 0);
            }
            if (_config.version.Minor == 2) {
                if (_config.version.Patch == 0) {
                    _config.mainConfig.customSpawnPoints = new List<string>();
                }
                if (_config.version.Patch <= 3) {
                    if (_config.mainConfig.customSpawnPoints == null) _config.mainConfig.customSpawnPoints = new List<string>();
                }
                if (_config.version.Patch <= 6) {
                    _config.spaceSuits = new HashSet<SpaceSuitConfig> {
                        new SpaceSuitConfig {
                            presetName = "spacesuit_1", itemConfig = new ItemConfig {
                                shortname = "hazmatsuit", skin = 0, name = ""
                            }
                            , additionalAstronautParameters = new AstronautParametersConfig(canBreathe : true, soudOfBreathe : true)
                        }
                        , new SpaceSuitConfig {
                            presetName = "spacesuit_2", itemConfig = new ItemConfig {
                                shortname = "hazmatsuit", skin = 10180, name = ""
                            }
                            , additionalAstronautParameters = new AstronautParametersConfig(canBreathe : true, soudOfBreathe : true)
                        }
                        , new SpaceSuitConfig {
                            presetName = "spacesuit_3", itemConfig = new ItemConfig {
                                shortname = "diving.tank", skin = 0, name = ""
                            }
                            , additionalAstronautParameters = new AstronautParametersConfig(canBreathe : true)
                        }
                    }
                    ;
                }
                if (_config.version.Patch <= 7) {
                    foreach (EventConfig eventConfig in _config.eventConfigs) {
                        eventConfig.mainDoorConfig = new MainDoorConfig {
                            isOpenAutomatically = true, openButtonLocations = new HashSet<LocationConfig> {
                                new LocationConfig {
                                    position = "(-4.302, -1.706, -56.597)", rotation = "(0, 0, 0)"
                                }
                                , new LocationConfig {
                                    position = "(4.666, -1.807, -56.595)", rotation = "(0, 0, 0)"
                                }
                                , new LocationConfig {
                                    position = "(-4.75, -0.634, -56.72)", rotation = "(0, 180, 0)"
                                }
                                , new LocationConfig {
                                    position = "(4.75, -0.737, -56.72)", rotation = "(0, 180, 0)"
                                }
                                , new LocationConfig {
                                    position = "(-0.9, -1.251, -47.5)", rotation = "(0, 0, 0)"
                                }
                                , new LocationConfig {
                                    position = "(1.5, -1.349, -47.811)", rotation = "(0, 180, 0)"
                                }
                            }
                        }
                        ;
                    }
                }
                _config.version = new VersionNumber(1, 3, 0);
            }
            if (_config.version.Minor == 3) {
                if (_config.version.Patch == 0) {
                    _config.shuttleConfig.maxTorpedoDistance = 150;
                    _config.notifyConfig.guiConfig.offsetMinY = -56;
                }
                if (_config.version.Patch <= 1) {
                    _config.supportedPluginsConfig.pveMode.scaleDamage = new Dictionary<string, float> {
                        ["Npc"]
                        = 1f, ["Bradley"] = 2f, ["Turret"] = 1f
                    }
                    ;
                }
                if (_config.version.Patch <= 2) {
                    _config.markerConfig.isRingMarker = true;
                    _config.markerConfig.isShopMarker = true;
                }
                if (_config.version.Patch <= 7) {
                    _config.notifyConfig.gameTipConfig = new GameTipConfig {
                        isEnabled = false, style = 2,
                    }
                    ;
                }
            }
            foreach (CrateConfig crateConfig in _config.crates) {
                crateConfig.lootTable.items = crateConfig.lootTable.items.OrderBy(x => x.chance);
            }
            foreach (StorageCrateConfig storageCrateConfig in _config.storageCrates) {
                storageCrateConfig.lootTable.items = storageCrateConfig.lootTable.items.OrderBy(x => x.chance);
            }
            _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);
        }
        static void Debug(params object[] arg) {
            string result = "";
            foreach (object obj in arg) if (obj != null) result += obj.ToString() + " ";
            ins.Puts(result);
        }
#endregion Methods
#region Classes
        static class EventManager {
            internal static EventConfig eventConfig {
                get;
                private set;
            }
            internal static bool isEventActive {
                get;
                private set;
            }
            static Coroutine eventCorountine;
            internal static int eventTime = 0;
            internal static void ChangeEventTime(int newEventTimeValue) {
                if (eventTime < newEventTimeValue) return;
                eventTime = newEventTimeValue;
            }
            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() {
                if (ins._config.mainConfig.preStartTime > 0) 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, LocationDefiner.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, LocationDefiner.PositionToGridCoord(SpaceClass.GetSpaceTransform().position));
                    if (ins._config.notifyConfig.guiConfig.isCountdownGUI) {
                        int countOfCrates = LootManager.GetCountUnlootedCrates();
                        foreach (BasePlayer player in EventZone.playersInSpace) if (player != null) GuiManager.CreateGui(player, NotifyManager.GetTimeMessage(player.Us
// ... [Code preview truncated due to length. Full source in attached file] ...

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