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] ...