using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MorphBall")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MorphBall")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("57f833e0-fd87-40ba-a798-ac42c29f3bd7")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MorphBall
{
internal static class MyPluginInfo
{
public const string PLUGIN_GUID = "com.Dummydude.MorphBall";
public const string PLUGIN_NAME = "MorphBall";
public const string PLUGIN_VERSION = "1.0.0";
}
[BepInPlugin("com.Dummydude.MorphBall", "MorphBall", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
private readonly Harmony harmony = new Harmony("com.Dummydude.MorphBall");
public static string mainAssetBundleName = "balls";
public static AssetBundle MainAssetBundle = null;
public GameObject VariaMorph;
public GameObject LightMorph;
public GameObject DarkMorph;
public GameObject PowerMorph;
public GameObject MetroidMorph;
public GameObject GravityMorph;
public GameObject[] morphGameObjects;
public static Plugin Instance { get; private set; }
public static ManualLogSource Log => ((BaseUnityPlugin)Instance).Logger;
public void Awake()
{
Instance = this;
Log.LogInfo((object)"Subscirbe to Dummydude");
harmony.PatchAll();
PopulateAssets();
}
private static string GetAssemblyName()
{
return Assembly.GetExecutingAssembly().GetName().Name.Replace(" ", "_");
}
public static void PopulateAssets()
{
if ((Object)(object)MainAssetBundle == (Object)null)
{
Console.WriteLine(GetAssemblyName() + "." + mainAssetBundleName);
using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetAssemblyName() + "." + mainAssetBundleName);
MainAssetBundle = AssetBundle.LoadFromStream(stream);
}
Instance.morphGameObjects = MainAssetBundle.LoadAllAssets<GameObject>();
Instance.VariaMorph = MainAssetBundle.LoadAsset<GameObject>("morphball8");
Instance.LightMorph = MainAssetBundle.LoadAsset<GameObject>("morphball3");
Instance.DarkMorph = MainAssetBundle.LoadAsset<GameObject>("morphball4");
Instance.PowerMorph = MainAssetBundle.LoadAsset<GameObject>("morphball5");
Instance.MetroidMorph = MainAssetBundle.LoadAsset<GameObject>("morphball6");
Instance.GravityMorph = MainAssetBundle.LoadAsset<GameObject>("morphball7");
}
}
}
namespace MorphBall.Patches
{
[HarmonyPatch(typeof(GrabbableObject))]
internal class GrabbableObjectPatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
internal static void ReplaceModel(GrabbableObject __instance)
{
((MonoBehaviour)StartOfRound.Instance).StartCoroutine(delay(__instance));
}
[HarmonyPatch("LoadItemSaveData")]
[HarmonyPrefix]
public static bool LoadSoccerBallData(GrabbableObject __instance, int saveData)
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
if (__instance.itemProperties.itemName == "Soccer ball")
{
Plugin.Log.LogInfo((object)$"Got soccerball input data. the save value is {saveData}");
__instance.useCooldown = saveData;
GameObject val = Object.Instantiate<GameObject>(Plugin.Instance.morphGameObjects[(int)(__instance.useCooldown - 1f)], ((Component)__instance).gameObject.transform);
val.transform.rotation = Quaternion.Euler(0f, 90f, 20f);
val.transform.position = ((Component)__instance).transform.position;
val.transform.localScale = new Vector3(2f, 2f, 2f);
((Renderer)((Component)__instance).gameObject.GetComponent<MeshRenderer>()).material = null;
((Component)__instance).gameObject.GetComponent<MeshFilter>().mesh = null;
}
return true;
}
[HarmonyPatch("GetItemDataToSave")]
[HarmonyPrefix]
public static bool GetSoccerBallDataToSave(GrabbableObject __instance, ref int __result)
{
if (__instance.itemProperties.itemName == "Soccer ball")
{
Plugin.Log.LogInfo((object)$"Morph Ball Variant is: {__instance.useCooldown}");
__result = (int)__instance.useCooldown;
}
return false;
}
internal static IEnumerator delay(GrabbableObject __instance)
{
yield return (object)new WaitForSeconds(0.5f);
if (__instance.itemProperties.itemName == "Soccer ball" && __instance.useCooldown == 0f)
{
Plugin.Log.LogWarning((object)"The save value of the Soccer Ball is 0. This either means there is a safe file issue, or the Soccer Ball just spawned.");
__instance.useCooldown = Random.Range(1, Plugin.Instance.morphGameObjects.Length + 1);
GameObject randomMorph = Plugin.Instance.morphGameObjects[(int)__instance.useCooldown - 1];
GameObject morphball = Object.Instantiate<GameObject>(randomMorph, ((Component)__instance).gameObject.transform);
morphball.transform.rotation = Quaternion.Euler(0f, 90f, 20f);
morphball.transform.position = ((Component)__instance).transform.position;
morphball.transform.localScale = new Vector3(2f, 2f, 2f);
((Renderer)((Component)__instance).gameObject.GetComponent<MeshRenderer>()).material = null;
((Component)__instance).gameObject.GetComponent<MeshFilter>().mesh = null;
}
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("LoadShipGrabbableItems")]
[HarmonyPrefix]
public static bool Method(StartOfRound __instance)
{
for (int i = 0; i < __instance.allItemsList.itemsList.Count; i++)
{
if (__instance.allItemsList.itemsList[i].itemName == "Soccer ball")
{
__instance.allItemsList.itemsList[i].saveItemVariable = true;
Plugin.Log.LogInfo((object)"Successfully patched the item list.");
}
}
return true;
}
}
}