using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Xml;
using System.Xml.Serialization;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using LLBML.Utils;
using LLHandlers;
using StageBackground;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace LLB_StageSwapper;
[HarmonyPatch(typeof(BG), "StartUp")]
public class StartPatch
{
public static void Postfix()
{
Plugin.Log.LogInfo((object)QualitySettings.shadowDistance);
Plugin.Log.LogInfo((object)BG.instance.fixedCamPosY);
StageSwapper component = ((Component)BG.instance).gameObject.GetComponent<StageSwapper>();
if ((Object)(object)component != (Object)null)
{
Object.DestroyImmediate((Object)(object)component);
}
((Component)BG.instance).gameObject.AddComponent<StageSwapper>();
}
}
[HarmonyPatch(typeof(BG), "StartMatchIntro")]
public class IntroCamPatch
{
public static void Prefix()
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
Plugin.Log.LogInfo((object)"Start match intro called!");
string text = ((object)(Stage)(ref JOMBNFKIHIC.GIGAKBJGFDI.OOEPDFABFIP)).ToString().ToLower();
string path = Path.Combine(Plugin.PluginDir.ToString(), text + ".xml");
StageSettings stageSettings = Plugin.LoadXML(path);
if (stageSettings != null)
{
List<IntroCamShot> list = new List<IntroCamShot>();
CamShot[] shots = stageSettings.shots;
foreach (CamShot camShot in shots)
{
IntroCamShot item = default(IntroCamShot);
item.StartPoint = Plugin.FromCamTransform(camShot.StartCam);
item.EndPoint = Plugin.FromCamTransform(camShot.EndCam);
item.Duration = camShot.Duration;
item.isConstantSpeed = !camShot.Smooth;
list.Add(item);
}
BG.instance.introCamShots = Enumerable.ToArray(list).ToArray();
}
}
}
[BepInPlugin("com.github.andylobjois.llb-stageswapper", "Stage Swapper", "1.0.6")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public static Plugin instance;
private static IDictionary<string, AssetBundle> StageBundles = new Dictionary<string, AssetBundle>();
public static DirectoryInfo PluginDir => ModdingFolder.GetModSubFolder(((BaseUnityPlugin)instance).Info);
internal static ManualLogSource Log { get; private set; }
private void Awake()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Expected O, but got Unknown
instance = this;
Log = ((BaseUnityPlugin)this).Logger;
Harmony val = new Harmony("Stage Swapper");
val.PatchAll();
Log.LogInfo((object)PluginDir);
}
private void Start()
{
((MonoBehaviour)this).StartCoroutine(LoadSwaps());
}
private IEnumerator LoadSwaps()
{
yield return (object)new WaitForSeconds(4f);
if (StageHandler.stagesAll == null)
{
Log.LogError((object)"Stage handler wasn't loaded yet - please report this bug");
}
foreach (Stage item in StageHandler.stagesAll)
{
Stage stage = item;
string stagePath = Path.Combine(PluginDir.ToString(), ((object)(Stage)(ref stage)).ToString().ToLower());
if (File.Exists(stagePath))
{
Log.LogInfo((object)("Loading assetbundle: " + stagePath));
AssetBundle bund = AssetBundle.LoadFromFile(stagePath);
StageBundles[((object)(Stage)(ref stage)).ToString()] = bund;
}
}
}
public static AssetBundle GetBundle(string name)
{
if (StageBundles.ContainsKey(name))
{
return StageBundles[name];
}
return null;
}
public static bool HasSwap(string name)
{
return StageBundles.ContainsKey(name);
}
public static StageSettings LoadXML(string path)
{
if (File.Exists(path))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(StageSettings));
using XmlReader xmlReader = XmlReader.Create(path);
return (StageSettings)xmlSerializer.Deserialize(xmlReader);
}
return null;
}
public static Transform FromCamTransform(CamTransform cam)
{
//IL_0012: 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)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
Log.LogInfo((object)cam.ToString());
Transform transform = new GameObject().transform;
transform.localPosition = new Vector3(cam.x, cam.y, cam.z);
transform.localEulerAngles = new Vector3(cam.rotX, cam.rotY, cam.rotZ);
return transform;
}
}
public static class PluginInfos
{
public const string PLUGIN_ID = "com.github.andylobjois.llb-stageswapper";
public const string PLUGIN_NAME = "Stage Swapper";
public const string PLUGIN_VERSION = "1.0.6";
}
[Serializable]
public class StageSettings
{
public int ShadowDistance;
public float CameraPositionY;
[XmlArray("NormalObjects")]
[XmlArrayItem("string")]
public string[] normal;
[XmlArray("EclipseObjects")]
[XmlArrayItem("string")]
public string[] eclipse;
[XmlArray("IntroCamShots")]
[XmlArrayItem("CamShot")]
public CamShot[] shots;
}
[Serializable]
public class CamShot
{
public CamTransform StartCam;
public CamTransform EndCam;
public float Duration;
public bool Smooth;
}
[Serializable]
public class CamTransform
{
public float x;
public float y;
public float z;
public float rotX;
public float rotY;
public float rotZ;
public override string ToString()
{
return $"Pos({x},{y},{z}), Rot({rotX},{rotY},{rotZ})";
}
}
public class StageSwapper : MonoBehaviour
{
public AssetBundle sceneBundle;
public string[] normalNames;
public string[] eclipseNames;
public CamShot[] camShots;
public bool active = false;
private void Start()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
if ((int)DNPFJHMAIBP.HHMOGKIMBNM() == 21)
{
return;
}
Scene activeScene = SceneManager.GetActiveScene();
if (((Scene)(ref activeScene)).name == "title")
{
return;
}
ManualLogSource log = Plugin.Log;
activeScene = SceneManager.GetActiveScene();
log.LogInfo((object)((Scene)(ref activeScene)).name);
string text = ((object)(Stage)(ref JOMBNFKIHIC.GIGAKBJGFDI.OOEPDFABFIP)).ToString();
sceneBundle = Plugin.GetBundle(text);
if ((Object)(object)sceneBundle != (Object)null)
{
active = true;
string path = Path.Combine(Plugin.PluginDir.ToString(), text + ".xml");
StageSettings stageSettings = Plugin.LoadXML(path);
if (stageSettings != null)
{
QualitySettings.shadowDistance = stageSettings.ShadowDistance;
BG.instance.fixedCamPosY = stageSettings.CameraPositionY;
BG.instance.maxPosY = BG.instance.fixedCamPosY + 0.5f;
normalNames = stageSettings.normal;
eclipseNames = stageSettings.eclipse;
camShots = stageSettings.shots;
}
else
{
normalNames = new string[1] { "StageSwapperNormal" };
eclipseNames = new string[1] { "StageSwapperEclipse" };
}
((MonoBehaviour)this).StartCoroutine(ReplaceStage());
}
else
{
QualitySettings.shadowDistance = 40f;
}
}
private IEnumerator ReplaceStage()
{
yield return (object)new WaitForEndOfFrame();
BG.instance.obsEclipse = null;
BG.instance.obsNormal = null;
BG.instance.eclipseMaterials = null;
BG.instance.replaceMaterials = null;
BG.instance.eclipseColorRenderers = null;
BG.instance.introCamShots = null;
((UnityEventBase)BG.instance.eclipseEvents).RemoveAllListeners();
ClearStage(GameObject.Find("Background"));
ClearStage(GameObject.Find("Eclipse"));
ClearStage(GameObject.Find("BGLayer2_Animated"));
ClearStage(GameObject.Find("PedestriansLayer"));
ClearStage(GameObject.Find("Blimp_Animated 1"));
ClearStage(GameObject.Find("Blimp_Animated 2"));
ClearStage(GameObject.Find("Blimp_Animated 3"));
((MonoBehaviour)this).StartCoroutine("ChangeShadowsPlane");
Plugin.Log.LogInfo((object)"Cleared stage objects");
string[] scenePath = sceneBundle.GetAllScenePaths();
SceneManager.LoadScene(scenePath[0], (LoadSceneMode)1);
((MonoBehaviour)this).StartCoroutine(SetupScene());
}
private IEnumerator SetupScene()
{
yield return (object)new WaitForEndOfFrame();
List<GameObject> normal = new List<GameObject>();
List<GameObject> eclipse = new List<GameObject>();
string[] array = normalNames;
foreach (string objName in array)
{
GameObject obj = GameObject.Find(objName);
if ((Object)(object)obj == (Object)null)
{
Plugin.Log.LogWarning((object)("Could not find obj with name '" + objName + "' for normal objects"));
}
else
{
normal.Add(obj);
}
}
string[] array2 = eclipseNames;
foreach (string objName2 in array2)
{
GameObject obj2 = GameObject.Find(objName2);
if ((Object)(object)obj2 == (Object)null)
{
Plugin.Log.LogWarning((object)("Could not find obj with name '" + objName2 + "' for eclipse objects"));
}
else
{
eclipse.Add(obj2);
}
}
BG.instance.obsNormal = Enumerable.ToArray(normal);
BG.instance.obsEclipse = Enumerable.ToArray(eclipse);
Plugin.Log.LogInfo((object)(BG.instance.obsNormal.Length + " elements in normal"));
Plugin.Log.LogInfo((object)(BG.instance.obsEclipse.Length + " elements in eclipse"));
GameObject[] obsEclipse = BG.instance.obsEclipse;
foreach (GameObject ele in obsEclipse)
{
ele.SetActive(false);
}
GameObject light = GameObject.Find("shadowCastLight");
light.GetComponent<Light>().shadows = (LightShadows)0;
GameObject[] obsEclipse2 = BG.instance.obsEclipse;
foreach (GameObject obj3 in obsEclipse2)
{
obj3.SetActive(false);
}
}
private static void ClearStage(GameObject gameObject)
{
if (!((Object)(object)gameObject != (Object)null))
{
return;
}
for (int i = 0; i < gameObject.transform.childCount; i++)
{
bool flag = ((Object)gameObject.transform.GetChild(i)).name.Contains("Positions");
bool flag2 = ((Object)gameObject.transform.GetChild(i)).name.Contains("Light");
if (!flag && !flag2)
{
((Component)gameObject.transform.GetChild(i)).gameObject.SetActive(false);
}
}
}
private IEnumerator ChangeShadowsPlane()
{
yield return (object)new WaitForSeconds(0.1f);
if (Object.op_Implicit((Object)(object)GameObject.Find("CustomReceiveShadowsPlane")))
{
GameObject originalPlane = GameObject.Find("receiveShadowsPlane");
GameObject customPlane = GameObject.Find("CustomReceiveShadowsPlane");
originalPlane.GetComponent<MeshFilter>().mesh = customPlane.GetComponent<MeshFilter>().mesh;
originalPlane.transform.position = customPlane.transform.position;
originalPlane.transform.rotation = customPlane.transform.rotation;
originalPlane.transform.localScale = customPlane.transform.localScale;
customPlane.SetActive(false);
}
else
{
Plugin.Log.LogMessage((object)"There is no 'CustomReceiveShadowsPlane' gameObject in the scene, if it's intentional, ignore this message.\nIf you want to create a custom ReceiveShadowsPlane, please create a gameObject with the exact name 'CustomReceiveShadowsPlane'.\nAdd a MeshFilter Component on this gameObject and assign your mesh.\nMake sure to let this gameObject active before building your stage bundle.");
}
}
}