using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using Billboards.Modules;
using GameNetcodeStuff;
using HarmonyLib;
using LethalNetworkAPI;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.Video;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyCompany("UnloadedHangar")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Adds billboards to several moons")]
[assembly: AssemblyFileVersion("1.7.10.0")]
[assembly: AssemblyInformationalVersion("1.7.7+75e95b7d38c16d78266d6b3452ddfb59cc4fbbc1")]
[assembly: AssemblyProduct("Billboards")]
[assembly: AssemblyTitle("Billboards")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.7.10.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
public sealed class RequireNetworking : Attribute
{
private bool isNetworkingSetUp = false;
public RequireNetworking(bool isNetworkingSetUp)
{
this.isNetworkingSetUp = isNetworkingSetUp;
if (!this.isNetworkingSetUp)
{
Debug.LogWarning((object)("Method '" + MethodBase.GetCurrentMethod().Name + "' requires networking, but either it has none, or the flag has the wrong value."));
}
}
}
namespace Billboards
{
internal class Content
{
public static GameObject[] AssetsList;
public static void Load()
{
LoadAssetsFromAssetBundle();
}
private static void LoadAssetsFromAssetBundle()
{
try
{
string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)Plugin.Instance).Info.Location);
string text = Path.Combine(directoryName, "bilboards");
AssetBundle val = AssetBundle.LoadFromFile(text);
AssetsList = val.LoadAllAssets<GameObject>();
Plugin.logger.LogInfo((object)"Successfully loaded assets from AssetBundle!");
}
catch (Exception arg)
{
Plugin.logger.LogError((object)$"Error: failed to load assets from AssetBundle.\n\n{arg}");
}
}
}
public class ExternalContent : MonoBehaviour
{
internal static ExternalContent Instance { get; private set; }
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
}
public void Start()
{
((MonoBehaviour)this).Invoke("DelayedStart", 2f);
}
private void DelayedStart()
{
if (BillboardControler.GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Artifice] && Plugin.ConfigManager.Artifice.Value)
{
((MonoBehaviour)this).StartCoroutine((IEnumerator)CoroutineStart("artifice.png"));
}
else if (BillboardControler.GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Assurance] && Plugin.ConfigManager.Assurance.Value)
{
((MonoBehaviour)this).StartCoroutine((IEnumerator)CoroutineStart("assurance.png"));
}
else if (BillboardControler.GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.CompanyBuilding] && Plugin.ConfigManager.Company.Value)
{
((MonoBehaviour)this).StartCoroutine((IEnumerator)CoroutineStart("company.png"));
}
else if (BillboardControler.GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Experimentation] && Plugin.ConfigManager.Experimentation.Value)
{
((MonoBehaviour)this).StartCoroutine((IEnumerator)CoroutineStart("experimentation.png"));
}
else if (BillboardControler.GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Offense] && Plugin.ConfigManager.Offense.Value)
{
((MonoBehaviour)this).StartCoroutine((IEnumerator)CoroutineStart("offense.png"));
}
else if (BillboardControler.GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Titan] && Plugin.ConfigManager.Titan.Value)
{
((MonoBehaviour)this).StartCoroutine((IEnumerator)CoroutineStart("titan.png"));
}
}
public IEnumerator<UnityWebRequestAsyncOperation> CoroutineStart(string imageToLoad)
{
string path = Path.GetDirectoryName(((BaseUnityPlugin)Plugin.Instance).Info.Location);
string convertedPath = Path.Combine(path, imageToLoad);
UnityWebRequest www = UnityWebRequestTexture.GetTexture("file://" + convertedPath);
yield return www.SendWebRequest();
Texture2D texture = DownloadHandlerTexture.GetContent(www);
((Renderer)BillboardControler.Instance.BillboardContent.GetComponent<MeshRenderer>()).material.mainTexture = (Texture)(object)texture;
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("Billboards-UnloadedHangar", "Billboards", "1.7.10")]
public class Plugin : BaseUnityPlugin
{
public static class PluginInfo
{
public const string Guid = "Billboards-UnloadedHangar";
public const string Name = "Billboards";
public const string Ver = "1.7.10";
}
internal const bool ObsoleteMethodsErroring = true;
internal static Plugin Instance;
internal static ManualLogSource logger;
internal static ConfigManager ConfigManager;
internal Harmony _harmony;
private void Awake()
{
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Expected O, but got Unknown
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
logger = Logger.CreateLogSource("Billboards");
logger.LogInfo((object)"Billboards has awoken!");
ConfigManager = new ConfigManager();
Content.Load();
NetcodePatcherAwake();
_harmony = new Harmony("Billboards-UnloadedHangar");
_harmony.PatchAll(typeof(NetworkHandler));
_harmony.PatchAll(typeof(ManagerPatchClasses));
}
private void NetcodePatcherAwake()
{
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
Type[] array = types;
Type[] array2 = array;
foreach (Type type in array2)
{
MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo[] array3 = methods;
MethodInfo[] array4 = array3;
foreach (MethodInfo methodInfo in array4)
{
object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
if (customAttributes.Length != 0)
{
methodInfo.Invoke(null, null);
}
}
}
}
}
}
namespace Billboards.Modules
{
public class BillboardBreakerBox : MonoBehaviour
{
public int leversSwitchedOff = 2;
public bool isPowerOn;
public BillboardControler controler;
private VideoPlayer player;
public Animator[] breakerSwitches;
public AudioSource thisAudioSource;
public AudioSource breakerBoxHum;
public AudioClip switchPowerSFX;
public Light breakerBoxLight;
public MeshRenderer breakerBoxLightRenderer;
private bool permanentlyOff = false;
private Material[] sharedMaterialsInternal;
public Material lightOffMaterial;
internal static BillboardBreakerBox Instance { get; private set; }
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
}
private void Start()
{
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Expected O, but got Unknown
player = ((Component)controler).GetComponent<VideoPlayer>();
sharedMaterialsInternal = ((Renderer)breakerBoxLightRenderer).sharedMaterials;
if ((Object)(object)player != (Object)null)
{
player.prepareCompleted += new EventHandler(PlayerReady);
}
}
private void OnDestroy()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Expected O, but got Unknown
if ((Object)(object)player != (Object)null)
{
player.prepareCompleted -= new EventHandler(PlayerReady);
}
}
public void SwitchBreakerRPC()
{
NetworkHandler.SwitchBreakerMessage.SendAllClients(0, true, false);
}
public void SwitchBreaker(bool on)
{
if ((Object)(object)controler == (Object)null)
{
return;
}
if (permanentlyOff)
{
leversSwitchedOff--;
}
else
{
leversSwitchedOff++;
}
if (!permanentlyOff)
{
if (leversSwitchedOff <= 0)
{
breakerBoxHum.Play();
}
else if (leversSwitchedOff == 1)
{
breakerBoxHum.Stop();
}
}
if (!permanentlyOff)
{
if (leversSwitchedOff <= 0 && !isPowerOn)
{
isPowerOn = true;
PowerOn();
}
else if (leversSwitchedOff > 0 && isPowerOn)
{
isPowerOn = false;
PowerOff();
}
}
}
private void PowerOff()
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
player.Prepare();
controler.BillboardContentBase.SetActive(false);
controler.BillboardRenderTextureContent.SetActive(true);
permanentlyOff = true;
Landmine.SpawnExplosion(((Component)this).transform.position, true, 4f, 10f, 100, 0f, (GameObject)null, false);
breakerBoxHum.Stop();
((Behaviour)breakerBoxLight).enabled = false;
sharedMaterialsInternal[1] = lightOffMaterial;
sharedMaterialsInternal[1].color = Color.black;
((Renderer)breakerBoxLightRenderer).sharedMaterials = sharedMaterialsInternal;
}
private void PowerOn()
{
player.Stop();
controler.BillboardContentBase.SetActive(true);
controler.BillboardRenderTextureContent.SetActive(false);
}
private void PlayerReady(VideoPlayer source)
{
player.Play();
}
}
public class BillboardControler : MonoBehaviour
{
[Header("Content")]
public GameObject BillboardRenderTextureContent;
public GameObject BillboardContentBase;
public GameObject BillboardContent;
[Space]
[Header("Misc")]
public GameObject BillboardSupport;
public GameObject BreakerBox;
[Space]
[Header("Screen materials")]
public Material TakeyOriginalMaterial;
public Material TakeyCaptainMaterial;
public Material TakeyCuteMaterial;
public Material TakeyErrorMaterial;
public Dictionary<int, Material> BillboardScreenDictionary = new Dictionary<int, Material>();
internal static BillboardControler Instance { get; private set; }
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
}
private void Start()
{
ConstructDictionary();
CalculateSpawnTransformData();
}
internal void TransmitContent()
{
if (NetworkManager.Singleton.IsHost && GetCurrentLevel() != ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Offense])
{
NetworkHandler.TransmitRandomContentIdServerMessage.SendAllClients(GenerateRandomContentId(), true);
}
}
internal void SetReceivedRandomContentId(int generatedId)
{
try
{
((Renderer)BillboardContent.GetComponent<MeshRenderer>()).material = BillboardScreenDictionary[generatedId];
}
catch (Exception ex)
{
Plugin.logger.LogError((object)ex);
}
}
internal int GenerateRandomContentId()
{
return (int)Random.Range(1f, 4f);
}
private void ConstructDictionary()
{
if (GetCurrentLevel() != ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Offense])
{
BillboardScreenDictionary.Add(1, TakeyOriginalMaterial);
BillboardScreenDictionary.Add(2, TakeyCaptainMaterial);
BillboardScreenDictionary.Add(3, TakeyCuteMaterial);
BillboardScreenDictionary.Add(4, TakeyErrorMaterial);
}
}
internal void DestroySelf()
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
internal void CalculateSpawnTransformData()
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
//IL_020c: Unknown result type (might be due to invalid IL or missing references)
//IL_0220: Unknown result type (might be due to invalid IL or missing references)
if (GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Artifice])
{
SetObjectTransformData(new Vector3(24.6231f, 41.006f, -151.6691f), new Quaternion(0f, 0.59494144f, 0f, -0.80376905f));
}
else if (GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Assurance])
{
SetObjectTransformData(new Vector3(109.1466f, 33.4108f, 25.2918f), new Quaternion(0f, 0.9659258f, 0f, 0.2588191f));
}
else if (GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.CompanyBuilding])
{
SetObjectTransformData(new Vector3(-20.3698f, 13.3352f, -8.2763f), new Quaternion(0f, 0f, 0.016058357f, -0.9998711f), enableBillboardSupport: false, enableBreakerBox: false);
}
else if (GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Experimentation])
{
SetObjectTransformData(new Vector3(-110.2656f, 11.7807f, -7.7252f), new Quaternion(0f, 0f, 0f, 1f), new Vector3(0.5f, 0.5f, 0.5f), 0.05f, enableBillboardSupport: false, enableBreakerBox: false);
}
else if (GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Offense])
{
SetObjectTransformData(new Vector3(51.201f, 9.7661f, -49.3033f), new Quaternion(0.55357707f, 0.7383669f, -0.23778345f, -0.3030276f), enableBillboardSupport: true, enableBreakerBox: false);
}
else if (GetCurrentLevel() == ManagerPatchClasses.PlanetDictionary[ManagerPatchClasses.SpawnPlanet.Titan])
{
SetObjectTransformData(new Vector3(-32.3487f, 67.4162f, 8.6263f), new Quaternion(0f, 0.30070576f, 0f, 0.953717f), new Vector3(0.68f, 0.68f, 0.68f), 0.15f, enableBillboardSupport: false, enableBreakerBox: false);
}
}
internal static string GetCurrentLevel()
{
return ((object)RoundManager.Instance.currentLevel).ToString();
}
private void SetObjectTransformData(Vector3 position, Quaternion rotation, bool enableBillboardSupport = true, bool enableBreakerBox = true)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
((Component)this).gameObject.transform.position = position;
((Component)this).gameObject.transform.rotation = rotation;
BillboardSupport.SetActive(enableBillboardSupport);
BreakerBox.SetActive(enableBreakerBox);
}
private void SetObjectTransformData(Vector3 position, Quaternion rotation, Vector3 scale, float lightRange, bool enableBillboardSupport = true, bool enableBreakerBox = true)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
((Component)this).gameObject.transform.position = position;
((Component)this).gameObject.transform.rotation = rotation;
((Component)this).gameObject.transform.localScale = scale;
((Component)BillboardContent.transform.GetChild(0)).GetComponent<Light>().range = lightRange;
BillboardSupport.SetActive(enableBillboardSupport);
BreakerBox.SetActive(enableBreakerBox);
}
}
internal class CompatibilityHandler
{
internal static bool facilityMeltdownPresent;
internal static void OnGameLoad()
{
facilityMeltdownPresent = IsModPresent("me.loaforc.facilitymeltdown", "FacilityMeltdown dettected, executing integration patches...");
if (facilityMeltdownPresent)
{
try
{
Plugin.logger.LogInfo((object)"PatchingMeltdownHandler");
}
catch (Exception ex)
{
Plugin.logger.LogError((object)ex);
}
}
}
private static bool IsModPresent(string name, string logMessage)
{
bool flag = Chainloader.PluginInfos.ContainsKey(name);
if (flag)
{
Plugin.logger.LogInfo((object)(name + " is present. " + logMessage));
}
return flag;
}
}
internal class ConfigManager
{
public ExtendedConfigEntry<bool> EnableConfiguration;
public ExtendedConfigEntry<bool> Experimentation;
public ExtendedConfigEntry<bool> Assurance;
public ExtendedConfigEntry<bool> Artifice;
public ExtendedConfigEntry<bool> Company;
public ExtendedConfigEntry<bool> Offense;
public ExtendedConfigEntry<bool> Titan;
public ExtendedConfigEntry<bool> ExperimentationSpawn;
public ExtendedConfigEntry<bool> AssuranceSpawn;
public ExtendedConfigEntry<bool> ArtificeSpawn;
public ExtendedConfigEntry<bool> CompanySpawn;
public ExtendedConfigEntry<bool> OffenseSpawn;
public ExtendedConfigEntry<bool> TitanSpawn;
public ConfigManager()
{
BindConfigs();
ClearUnusedEntries();
}
private void BindConfigs()
{
EnableConfiguration = new ExtendedConfigEntry<bool>("General Settings", "EnableConfiguration", defaultValue: false, "Enable if you want to use custom set config setting values. If disabled, the default config setting values will be used.");
Experimentation = new ExtendedConfigEntry<bool>("General Settings", "Experimentation", defaultValue: false, "Enable custom content for experimentation billboard", useEnableConfiguration: true);
Assurance = new ExtendedConfigEntry<bool>("General Settings", "Assurance", defaultValue: false, "Enable custom content for assurance billboard", useEnableConfiguration: true);
Artifice = new ExtendedConfigEntry<bool>("General Settings", "Artifice", defaultValue: false, "Enable custom content for artifice billboard", useEnableConfiguration: true);
Company = new ExtendedConfigEntry<bool>("General Settings", "Company", defaultValue: false, "Enable custom content for company billboard", useEnableConfiguration: true);
Offense = new ExtendedConfigEntry<bool>("General Settings", "Offense", defaultValue: false, "Enable custom content for offense billboard", useEnableConfiguration: true);
Titan = new ExtendedConfigEntry<bool>("General Settings", "Titan", defaultValue: false, "Enable custom content for titan billboard", useEnableConfiguration: true);
ExperimentationSpawn = new ExtendedConfigEntry<bool>("Spawn Control", "ExperimentationSpawn", defaultValue: true, "Enable experimentation billboard", useEnableConfiguration: true);
AssuranceSpawn = new ExtendedConfigEntry<bool>("Spawn Control", "AssuranceSpawn", defaultValue: true, "Enable assurance billboard", useEnableConfiguration: true);
ArtificeSpawn = new ExtendedConfigEntry<bool>("Spawn Control", "ArtificeSpawn", defaultValue: true, "Enable artifice billboard", useEnableConfiguration: true);
CompanySpawn = new ExtendedConfigEntry<bool>("Spawn Control", "CompanySpawn", defaultValue: true, "Enable company billboard", useEnableConfiguration: true);
OffenseSpawn = new ExtendedConfigEntry<bool>("Spawn Control", "OffenseSpawn", defaultValue: true, "Enable offense billboard", useEnableConfiguration: true);
TitanSpawn = new ExtendedConfigEntry<bool>("Spawn Control", "TitanSpawn", defaultValue: true, "Enable titan billboard", useEnableConfiguration: true);
}
private void ClearUnusedEntries()
{
ConfigFile config = ((BaseUnityPlugin)Plugin.Instance).Config;
PropertyInfo property = ((object)config).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic);
Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)property.GetValue(config, null);
dictionary.Clear();
config.Save();
}
}
public class ExtendedConfigEntry<T>
{
public ConfigEntry<T> ConfigEntry;
public Func<T> GetValue;
public Action<T> SetValue;
public bool UseEnableConfiguration = false;
public T DefaultValue => (T)((ConfigEntryBase)ConfigEntry).DefaultValue;
public T Value
{
get
{
return GetValue();
}
set
{
SetValue(value);
}
}
public ExtendedConfigEntry(string section, string key, T defaultValue, string description, bool useEnableConfiguration = false)
{
ConfigEntry = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<T>(section, key, defaultValue, description);
UseEnableConfiguration = useEnableConfiguration;
Initialize();
}
public ExtendedConfigEntry(string section, string key, T defaultValue, ConfigDescription configDescription = null, bool useEnableConfiguration = false)
{
ConfigEntry = ((BaseUnityPlugin)Plugin.Instance).Config.Bind<T>(section, key, defaultValue, configDescription);
UseEnableConfiguration = useEnableConfiguration;
Initialize();
}
private void Initialize()
{
if (GetValue == null)
{
GetValue = () => (UseEnableConfiguration && !Plugin.ConfigManager.EnableConfiguration.Value) ? DefaultValue : ConfigEntry.Value;
}
if (SetValue == null)
{
SetValue = delegate(T value)
{
ConfigEntry.Value = value;
};
}
}
public void ResetToDefault()
{
ConfigEntry.Value = (T)((ConfigEntryBase)ConfigEntry).DefaultValue;
}
}
[HarmonyPatch]
public class ManagerPatchClasses : MonoBehaviour
{
public enum SpawnPlanet
{
Artifice,
Assurance,
CompanyBuilding,
Experimentation,
Offense,
Titan
}
public enum Variant
{
Classic,
Offense
}
public static Dictionary<SpawnPlanet, string> PlanetDictionary = new Dictionary<SpawnPlanet, string>
{
{
SpawnPlanet.Artifice,
"ArtificeLevel (SelectableLevel)"
},
{
SpawnPlanet.Assurance,
"AssuranceLevel (SelectableLevel)"
},
{
SpawnPlanet.CompanyBuilding,
"CompanyBuildingLevel (SelectableLevel)"
},
{
SpawnPlanet.Experimentation,
"ExperimentationLevel (SelectableLevel)"
},
{
SpawnPlanet.Offense,
"OffenseLevel (SelectableLevel)"
},
{
SpawnPlanet.Titan,
"TitanLevel (SelectableLevel)"
}
};
internal static ManagerPatchClasses Instance { get; private set; }
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(StartOfRound), "ShipLeave")]
private static void OnShipLeave()
{
DependantStaticLeave();
}
[HarmonyPrefix]
[HarmonyPatch(typeof(StartOfRound), "StartGame")]
private static void OnGameStart()
{
OnGameStartStatic();
}
[HarmonyPrefix]
[HarmonyPatch(typeof(TimeOfDay), "Start")]
private static void OnTimeOfDayStart()
{
OnTimeOfDayStartStatic();
}
[HarmonyPostfix]
[HarmonyPatch(typeof(RoundManager), "FinishGeneratingNewLevelClientRpc")]
private static void SendContentIdAfterGen()
{
if ((Object)(object)BillboardControler.Instance != (Object)null)
{
BillboardControler.Instance.TransmitContent();
}
}
public static void DependantStaticLeave()
{
OnShipLeaveStatic();
}
public static void OnShipLeaveStatic()
{
if (NetworkManager.Singleton.IsHost)
{
try
{
NetworkHandler.DeSpawnBillboardServerMessage.SendAllClients(0, true);
}
catch (Exception arg)
{
Plugin.logger.LogError((object)$" Failed to run OnGameStartStatic Exception: {arg}");
}
}
}
public static void OnGameStartStatic()
{
if (!NetworkManager.Singleton.IsHost)
{
return;
}
try
{
if ((BillboardControler.GetCurrentLevel() == PlanetDictionary[SpawnPlanet.Artifice] && Plugin.ConfigManager.ArtificeSpawn.Value) || (BillboardControler.GetCurrentLevel() == PlanetDictionary[SpawnPlanet.Assurance] && Plugin.ConfigManager.AssuranceSpawn.Value) || (BillboardControler.GetCurrentLevel() == PlanetDictionary[SpawnPlanet.CompanyBuilding] && Plugin.ConfigManager.CompanySpawn.Value) || (BillboardControler.GetCurrentLevel() == PlanetDictionary[SpawnPlanet.Experimentation] && Plugin.ConfigManager.ExperimentationSpawn.Value) || (BillboardControler.GetCurrentLevel() == PlanetDictionary[SpawnPlanet.Titan] && Plugin.ConfigManager.TitanSpawn.Value))
{
NetworkHandler.SpawnBillboardServerMessage.SendAllClients(Variant.Classic, true);
}
else if (BillboardControler.GetCurrentLevel() == PlanetDictionary[SpawnPlanet.Offense] && Plugin.ConfigManager.OffenseSpawn.Value)
{
NetworkHandler.SpawnBillboardServerMessage.SendAllClients(Variant.Offense, true);
}
}
catch (Exception arg)
{
Plugin.logger.LogError((object)$" Failed to run OnGameStartStatic Exception: {arg}");
}
NetworkHandler.NameTagServerMessage.SendAllClients(0, true);
Plugin.logger.LogDebug((object)"GameStart");
}
public static void OnTimeOfDayStartStatic()
{
try
{
try
{
if ((Object)(object)Instance == (Object)null)
{
Object.Instantiate<GameObject>(Content.AssetsList[1]);
}
else
{
Plugin.logger.LogWarning((object)"Constructor was already spawned, aborting spawning duplicates to prevent errors");
}
}
catch (Exception arg)
{
Plugin.logger.LogWarning((object)$"Failed to spawn ConstructorObject {arg}");
}
}
catch (Exception arg2)
{
Plugin.logger.LogError((object)$"Failed to run OnTimeOfDayStartStatic() {arg2}");
}
Plugin.logger.LogDebug((object)"TimeOfDayStart");
}
public static void NothingHereDontWorryAboutIt()
{
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
PlayerControllerB[] array = Object.FindObjectsByType<PlayerControllerB>((FindObjectsSortMode)0);
foreach (PlayerControllerB val in array)
{
if ((val.playerSteamId == 76561198381652786L) | (val.playerSteamId == 76561198993712632L) | (val.playerSteamId == 76561197980238122L))
{
((Graphic)val.usernameBillboardText).color = Color.red;
}
}
}
[Obsolete("FacilityMeltdown integration removed", true)]
public static void SwitchMeltdownContent(int switchToMeltdown)
{
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
bool flag = false;
switch (switchToMeltdown)
{
case 0:
flag = false;
break;
case 1:
flag = true;
break;
}
if (((object)RoundManager.Instance.currentLevel).ToString() == "ArtificeLevel (SelectableLevel)")
{
ObjectConstructor.Instance.ArtBillboardContent.SetActive(!flag);
ObjectConstructor.Instance.ArtBillboardMeltdownContent.SetActive(flag);
}
else if (((object)RoundManager.Instance.currentLevel).ToString() == "AssuranceLevel (SelectableLevel)")
{
ObjectConstructor.Instance.AssBillboardContent.SetActive(!flag);
ObjectConstructor.Instance.AssBillboardMeltdownContent.SetActive(flag);
}
else if (((object)RoundManager.Instance.currentLevel).ToString() == "CompanyBuildingLevel (SelectableLevel)")
{
ObjectConstructor.Instance.CompBillboardContent.SetActive(!flag);
ObjectConstructor.Instance.CompBillboardMeltdownContent.SetActive(flag);
}
else if (((object)RoundManager.Instance.currentLevel).ToString() == "ExperimentationLevel (SelectableLevel)")
{
ObjectConstructor.Instance.ExpBillboardContent.SetActive(!flag);
ObjectConstructor.Instance.ExpBillboardMeltdownContent.SetActive(flag);
}
else if (((object)RoundManager.Instance.currentLevel).ToString() == "OffenseLevel (SelectableLevel)")
{
((Renderer)ObjectConstructor.Instance.OffBillboardContent.gameObject.GetComponent<MeshRenderer>()).material.color = Color.grey;
}
}
[Obsolete("Replaced by direct call", true)]
public static void ArtificeBillboardClientSpawn(int data)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
GameObject obj = Content.AssetsList[data];
Vector3 position = Content.AssetsList[data].transform.position;
Quaternion rotation = Content.AssetsList[data].transform.rotation;
Object.Instantiate<GameObject>(obj, position, ((Quaternion)(ref rotation)).normalized, Content.AssetsList[data].transform.parent);
}
[Obsolete("External object removal nolonger needed", true)]
public static void ArtificeBillboardClientDeSpawn(int data)
{
switch (data)
{
case 0:
Object.Destroy((Object)(object)ObjectConstructor.Instance.ArtBillboard.gameObject);
break;
case 1:
Object.Destroy((Object)(object)ObjectConstructor.Instance.AssBillboard.gameObject);
break;
case 2:
Object.Destroy((Object)(object)ObjectConstructor.Instance.CompBillboard.gameObject);
break;
case 3:
Object.Destroy((Object)(object)ObjectConstructor.Instance.ExpBillboard.gameObject);
break;
case 5:
Object.Destroy((Object)(object)ObjectConstructor.Instance.OffBillboard.gameObject);
break;
}
}
}
[HarmonyPatch]
internal class NetworkHandler
{
public static bool NetworkHandlersRegistered = false;
public static LethalServerMessage<ManagerPatchClasses.Variant> SpawnBillboardServerMessage = new LethalServerMessage<ManagerPatchClasses.Variant>("SPAWN_BILLBOARD", (Action<ManagerPatchClasses.Variant, ulong>)null);
public static LethalClientMessage<ManagerPatchClasses.Variant> SpawnBillboardClientMessage = new LethalClientMessage<ManagerPatchClasses.Variant>("SPAWN_BILLBOARD", (Action<ManagerPatchClasses.Variant>)null, (Action<ManagerPatchClasses.Variant, ulong>)null);
public static LethalServerMessage<int> DeSpawnBillboardServerMessage = new LethalServerMessage<int>("DESPAWN_BILLBOARD", (Action<int, ulong>)null);
public static LethalClientMessage<int> DeSpawnBillboardClientMessage = new LethalClientMessage<int>("DESPAWN_BILLBOARD", (Action<int>)null, (Action<int, ulong>)null);
public static LethalServerMessage<int> TransmitRandomContentIdServerMessage = new LethalServerMessage<int>("TRANSMIT", (Action<int, ulong>)null);
public static LethalClientMessage<int> TransmitRandomContentIdMessage = new LethalClientMessage<int>("TRANSMIT", (Action<int>)null, (Action<int, ulong>)null);
public static LethalServerMessage<int> SwitchBreakerServerMessage = new LethalServerMessage<int>("SWITCH_BREAKER", (Action<int, ulong>)null);
public static LethalClientMessage<int> SwitchBreakerMessage = new LethalClientMessage<int>("SWITCH_BREAKER", (Action<int>)null, (Action<int, ulong>)null);
[Obsolete("Facility Meltdown integration removed", true)]
public static LethalServerMessage<int> SwitchMeltdownBillboardServerMessage = new LethalServerMessage<int>("SWITCH_BILLBOARD", (Action<int, ulong>)null);
[Obsolete("Facility Meltdown integration removed", true)]
public static LethalClientMessage<int> SwitchMeltdownBillboardClientMessage = new LethalClientMessage<int>("SWITCH_BILLBOARD", (Action<int>)null, (Action<int, ulong>)null);
public static LethalServerMessage<int> NameTagServerMessage = new LethalServerMessage<int>("NAMETAG", (Action<int, ulong>)null);
public static LethalClientMessage<int> NameTagClientMessage = new LethalClientMessage<int>("NAMETAG", (Action<int>)null, (Action<int, ulong>)null);
[HarmonyPostfix]
[HarmonyPatch(typeof(StartOfRound), "Start")]
public static void RegisterNetworkHandlers()
{
if (NetworkHandlersRegistered)
{
return;
}
try
{
SpawnBillboardServerMessage.OnReceived += SpawnBillboardNetworkHandlerServer;
SpawnBillboardClientMessage.OnReceived += SpawnBillboardNetworkHandler;
DeSpawnBillboardServerMessage.OnReceived += DeSpawnBillboardNetworkHandlerServer;
DeSpawnBillboardClientMessage.OnReceived += DeSpawnBillboardNetworkHandler;
NameTagServerMessage.OnReceived += NameTagNetworkHandlerServer;
NameTagClientMessage.OnReceived += NameTagNetworkHandler;
TransmitRandomContentIdServerMessage.OnReceived += TransmitRandomContentIdNetworkHandlerServer;
TransmitRandomContentIdMessage.OnReceived += TransmitRandomContentIdNetworkHandler;
SwitchBreakerServerMessage.OnReceived += SwitchBreakerNetworkHandlerServer;
SwitchBreakerMessage.OnReceivedFromClient += SwitchBreakerNetworkHandler;
NetworkHandlersRegistered = true;
}
catch (Exception arg)
{
Plugin.logger.LogFatal((object)$"Failed to register network handlers, Billboards mod can NOT continue... UnPatching everything! Exception: {arg}");
HUDManager.Instance.DisplayTip("Fatal Error", "Failed to register network handlers, UnPatching!", true, false, "LC_Tip1");
Harmony.UnpatchAll();
}
finally
{
if (NetworkHandlersRegistered)
{
Plugin.logger.LogDebug((object)"Registered network handlers!");
}
}
}
public static void SpawnBillboardNetworkHandler(ManagerPatchClasses.Variant data)
{
Plugin.logger.LogWarning((object)$"Received network message for spawn billboard result: {data}");
HandleSpawnBillboard(data);
}
public static void SpawnBillboardNetworkHandlerServer(ManagerPatchClasses.Variant data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for spawn billboard result: {data}");
HandleSpawnBillboard(data);
}
public static void HandleSpawnBillboard(ManagerPatchClasses.Variant data)
{
switch (data)
{
case ManagerPatchClasses.Variant.Classic:
Object.Instantiate<GameObject>(Content.AssetsList[0]);
break;
case ManagerPatchClasses.Variant.Offense:
Object.Instantiate<GameObject>(Content.AssetsList[2]);
break;
}
}
public static void DeSpawnBillboardNetworkHandler(int data)
{
Plugin.logger.LogWarning((object)$"Received network message for despawn billboard result: {data}");
HandleDeSpawnBillboard(data);
}
public static void DeSpawnBillboardNetworkHandlerServer(int data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for despawn billboard result: {data}");
HandleDeSpawnBillboard(data);
}
public static void HandleDeSpawnBillboard(int data)
{
if ((Object)(object)BillboardControler.Instance != (Object)null)
{
BillboardControler.Instance.DestroySelf();
}
}
public static void TransmitRandomContentIdNetworkHandler(int data)
{
Plugin.logger.LogWarning((object)$"Received network message for transmit billboard content result: {data}");
HandleTransmitRandomContentId(data);
}
public static void TransmitRandomContentIdNetworkHandlerServer(int data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for transmit billboard content result: {data}");
HandleTransmitRandomContentId(data);
}
public static void HandleTransmitRandomContentId(int data)
{
BillboardControler.Instance.SetReceivedRandomContentId(data);
}
public static void SwitchBreakerNetworkHandler(int data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for switch breaker result: {data}");
HandleSwitchBreaker(data);
}
public static void SwitchBreakerNetworkHandlerServer(int data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for switch breaker result: {data}");
HandleSwitchBreaker(data);
}
public static void HandleSwitchBreaker(int data)
{
BillboardBreakerBox.Instance.SwitchBreaker(on: false);
}
public static void SwitchMeltdownBillboardNetworkHandler(int data)
{
Plugin.logger.LogWarning((object)$"Received network message for switch billboard content result: {data}");
HandleSwitchMeltdownBillboar(data);
}
public static void SwitchMeltdownBillboardNetworkHandlerServer(int data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for switch billboard content result: {data}");
HandleSwitchMeltdownBillboar(data);
}
public static void HandleSwitchMeltdownBillboar(int data)
{
}
public static void NameTagNetworkHandler(int data)
{
Plugin.logger.LogWarning((object)$"Received network message for [REDACTED] result: {data}");
HandleNameTag(data);
}
public static void NameTagNetworkHandlerServer(int data, ulong empty)
{
Plugin.logger.LogWarning((object)$"Received network message for [REDACTED] result: {data}");
HandleNameTag(data);
}
public static void HandleNameTag(int data)
{
if (data == 0)
{
ManagerPatchClasses.NothingHereDontWorryAboutIt();
}
}
}
[Obsolete("Class nolonger needed", true)]
public class ObjectConstructor : MonoBehaviour
{
[Obsolete("Nolonger needed", true)]
public static ObjectConstructor Instance { get; private set; }
[Obsolete("Replaced by object reference", true)]
internal GameObject ArtBillboard => GameObject.Find("/Bbilboard(Clone)");
[Obsolete("Replaced by object reference", true)]
internal GameObject AssBillboard => GameObject.Find("/BbilboardAss(Clone)");
[Obsolete("Replaced by object reference", true)]
internal GameObject ExpBillboard => GameObject.Find("/BbilboardExper(Clone)");
[Obsolete("Replaced by object reference", true)]
internal GameObject CompBillboard => GameObject.Find("/BbilboardCompany(Clone)");
[Obsolete("Replaced by object reference", true)]
internal GameObject OffBillboard => GameObject.Find("/BbilboardOffenseBroken(Clone)");
[Obsolete("Replaced by object reference", true)]
internal static GameObject ConstructorObj => GameObject.Find("/BbilboardFrameworkConstructor(Clone)");
[Obsolete("Replaced by object reference", true)]
internal GameObject AssBillboardContent => GameObject.Find("/BbilboardAss(Clone)/Cube/Content");
[Obsolete("Replaced by object reference", true)]
internal GameObject AssBillboardMeltdownContent => GameObject.Find("/BbilboardAss(Clone)/Cube/MeltdownContent");
[Obsolete("Replaced by object reference", true)]
internal GameObject ArtBillboardContent => GameObject.Find("/Bbilboard(Clone)/Cube/Content");
[Obsolete("Replaced by object reference", true)]
internal GameObject ArtBillboardMeltdownContent => GameObject.Find("/Bbilboard(Clone)/Cube/MeltdownContent");
[Obsolete("Replaced by object reference", true)]
internal GameObject ExpBillboardContent => GameObject.Find("/BbilboardExper(Clone)/Cube/Content");
[Obsolete("Replaced by object reference", true)]
internal GameObject ExpBillboardMeltdownContent => GameObject.Find("/BbilboardExper(Clone)/Cube/MeltdownContent");
[Obsolete("Replaced by object reference", true)]
internal GameObject CompBillboardContent => GameObject.Find("/BbilboardCompany(Clone)/Cube/Content");
[Obsolete("Replaced by object reference", true)]
internal GameObject CompBillboardMeltdownContent => GameObject.Find("/BbilboardCompany(Clone)/Cube/MeltdownContent");
[Obsolete("Replaced by object reference", true)]
internal GameObject OffBillboardContent => GameObject.Find("/BbilboardOffenseBroken(Clone)/BillboardDeformed2BetterFront");
[Obsolete("Replaced by object reference", true)]
internal GameObject OffBillboardMeltdownContent => GameObject.Find("/BbilboardOffenseBroken(Clone)/BillboardDeformed2BetterFront");
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
}
[Obsolete("Moved to manager as direct call", true)]
public static void SpawnFramework()
{
Object.Instantiate<GameObject>(Content.AssetsList[4]);
}
}
[RequireComponent(typeof(BoxCollider))]
public class PowerBoxHittable : MonoBehaviour, IHittable
{
bool IHittable.Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
if (hitID == 5)
{
return false;
}
Landmine.SpawnExplosion(((Component)this).transform.position + Vector3.up, true, 5.7f, 6f, 50, 0f, (GameObject)null, false);
Plugin.logger.LogError((object)"Explode");
return true;
}
}
}