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