using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using HarmonyLib;
using LastMovesListMod;
using MelonLoader;
using RUMBLE.Players.Subsystems;
using RUMBLE.Poses;
using RumbleModUI;
using RumbleModdingAPI;
using UnhollowerBaseLib;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(LMLClass), "LastMoveslist", "1.0.6", "CactusGod", null)]
[assembly: MelonGame("Buckethead Entertainment", "RUMBLE")]
[assembly: MelonColor(ConsoleColor.Red)]
[assembly: AssemblyTitle("LastMovesListMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LastMovesListMod")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("313c2611-9dd1-49fe-911c-7b1199662b22")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace LastMovesListMod;
public class LMLClass : MelonMod
{
[HarmonyPatch(typeof(PlayerPoseSystem), "OnPoseSetCompleted", new Type[] { typeof(PoseSet) })]
private static class PosePatch
{
private static void Postfix(PoseSet set)
{
switch (((Object)set).name)
{
case "PoseSetSpawnPillar":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Pillar")));
break;
case "PoseSetBall":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Ball")));
break;
case "PoseSetSpawnCube":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Cube")));
break;
case "PoseSetWall_Grounded":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Wall")));
break;
case "PoseSetDisc":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Disc")));
break;
case "PoseSetParry":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Parry")));
break;
case "PoseSetFlick":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Flick")));
break;
case "PoseSetStomp":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Stomp")));
break;
case "PoseSetStraight":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Straight")));
break;
case "PoseSetUppercut":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Uppercut")));
break;
case "PoseSetKick":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Kick")));
break;
case "PoseSetExplode":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Explode")));
break;
case "PoseSetDash":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Dash")));
break;
case "PoseSetRockjump":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Jump")));
break;
case "PoseSetHoldRight":
case "PoseSetHoldLeft":
AddSprite(Texture2DToSprite(images.Find((Texture2D x) => ((Object)x).name == "Hold")));
break;
}
}
}
public GameObject playerController;
public GameObject playerRightArm;
public GameObject wallInsMain;
public GameObject wallIns;
public static GameObject ui = new GameObject();
public Stopwatch stopWatch = new Stopwatch();
public string picsPath = "UserData\\LastMovesList\\StruPics";
public static List<Texture2D> images;
public bool WBOOLNAME;
public static List<Sprite> spriteList = new List<Sprite>();
public static int maxSprites = 5;
public static Image[] imageComponents = (Image[])(object)new Image[5];
public UI modingUI = UI.instance;
public Mod modRef = new Mod();
public ModSetting<bool> onOrOff;
public bool runMod;
public static InputActionMap map = new InputActionMap("Rest Xr Map");
public static InputAction rightThumbstick = InputActionSetupExtensions.AddAction(map, "Right Joysitck Click", (InputActionType)1, "<XRController>{RightHand}/thumbstickClick", (string)null, (string)null, (string)null, (string)null);
public static InputAction leftThumbstick = InputActionSetupExtensions.AddAction(map, "Left Joystick Click", (InputActionType)1, "<XRController>{LeftHand}/thumbstickClick", (string)null, (string)null, (string)null, (string)null);
public static float clickCounter = 0f;
public static float neededClicks = 2f;
public static float stopAtClicks = 0f;
public static Stopwatch clickStopwatch = new Stopwatch();
public override void OnLateInitializeMelon()
{
images = FileToTexture(picsPath);
modRef.ModName = "LastMovesList";
modRef.ModVersion = "1.0.6";
modRef.SetFolder("LastMovesList");
modRef.AddToList("Description", (AvailableTypes)0, "", "Toggle the Bool on or off to enable and disable the mod.");
onOrOff = modRef.AddToList("On or off", true, 0, "");
modRef.GetFromFile();
}
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
{
if (sceneName != "Loader" && runMod)
{
map.Enable();
stopWatch.Stop();
stopWatch.Restart();
stopWatch.Start();
}
}
public void SetupUI()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Expected O, but got Unknown
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
//IL_01b2: Expected O, but got Unknown
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0217: Unknown result type (might be due to invalid IL or missing references)
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
//IL_023d: Unknown result type (might be due to invalid IL or missing references)
//IL_0243: Expected O, but got Unknown
//IL_0288: Unknown result type (might be due to invalid IL or missing references)
//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
//IL_02d5: Expected O, but got Unknown
//IL_031f: Unknown result type (might be due to invalid IL or missing references)
//IL_0340: Unknown result type (might be due to invalid IL or missing references)
//IL_035c: Unknown result type (might be due to invalid IL or missing references)
ui = new GameObject();
ui.transform.parent = wallIns.transform;
((Object)ui).name = "UI";
ui.SetActive(true);
ui.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
ui.transform.localPosition = new Vector3(0f, 0f, 0.265f);
GameObject val = new GameObject();
((Object)val).name = "image1";
val.transform.parent = ui.transform;
val.AddComponent<Image>();
val.AddComponent<Canvas>();
val.transform.localPosition = new Vector3(0f, 0.1f, 0f);
val.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
val.GetComponent<RectTransform>().sizeDelta = new Vector2(0.05f, 0.05f);
GameObject val2 = new GameObject();
((Object)val2).name = "image2";
val2.transform.parent = ui.transform;
val2.AddComponent<Image>();
val2.AddComponent<Canvas>();
val2.transform.localPosition = new Vector3(0f, 0.05f, 0f);
val2.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
val2.GetComponent<RectTransform>().sizeDelta = new Vector2(0.05f, 0.05f);
GameObject val3 = new GameObject();
((Object)val3).name = "image3";
val3.transform.parent = ui.transform;
val3.AddComponent<Image>();
val3.AddComponent<Canvas>();
val3.transform.localPosition = new Vector3(0f, 0f, 0f);
val3.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
val3.GetComponent<RectTransform>().sizeDelta = new Vector2(0.05f, 0.05f);
GameObject val4 = new GameObject();
((Object)val4).name = "image4";
val4.transform.parent = ui.transform;
val4.AddComponent<Image>();
val4.AddComponent<Canvas>();
val4.transform.localPosition = new Vector3(0f, -0.05f, 0f);
val4.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
val4.GetComponent<RectTransform>().sizeDelta = new Vector2(0.05f, 0.05f);
GameObject val5 = new GameObject();
((Object)val5).name = "image5";
val5.transform.parent = ui.transform;
val5.AddComponent<Image>();
val5.AddComponent<Canvas>();
val5.transform.localPosition = new Vector3(0f, -0.1f, 0f);
val5.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
val5.GetComponent<RectTransform>().sizeDelta = new Vector2(0.05f, 0.05f);
imageComponents[0] = val.GetComponent<Image>();
imageComponents[1] = val2.GetComponent<Image>();
imageComponents[2] = val3.GetComponent<Image>();
imageComponents[3] = val4.GetComponent<Image>();
imageComponents[4] = val5.GetComponent<Image>();
}
public void SetupWall()
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
wallInsMain = ((Component)((Component)Structures.GetPoolWall().transform.GetChild(0)).transform.GetChild(0)).gameObject;
wallIns = Object.Instantiate<GameObject>(wallInsMain, playerRightArm.transform);
Object.Destroy((Object)(object)wallIns.GetComponent<BoxCollider>());
((Object)wallIns).name = "wristWall";
wallIns.transform.localPosition = new Vector3(0f, 0.12f, 0.06f);
wallIns.transform.localScale = new Vector3(0.12f, 0.12f, 0.1f);
SetupUI();
}
public void SetupPlayer()
{
playerController = ((Component)Managers.GetPlayerManager().localPlayer.Controller).gameObject;
playerRightArm = ((Component)((Component)((Component)((Component)((Component)((Component)((Component)((Component)playerController.transform.GetChild(5)).transform.GetChild(7)).transform.GetChild(0)).transform.GetChild(2)).transform.GetChild(0)).transform.GetChild(2)).transform.GetChild(0)).transform.GetChild(0)).gameObject;
SetupWall();
}
public override void OnLateUpdate()
{
float num = rightThumbstick.ReadValue<float>();
float num2 = leftThumbstick.ReadValue<float>();
if ((num == 1f && stopAtClicks != 2f) || (num2 == 1f && stopAtClicks != 2f))
{
clickCounter += 1f;
stopAtClicks += 1f;
clickStopwatch.Stop();
clickStopwatch.Restart();
clickStopwatch.Start();
}
if (stopWatch.IsRunning && stopWatch.ElapsedMilliseconds == 3000 && (num != 1f || num2 != 1f))
{
clickCounter = 0f;
clickStopwatch.Stop();
}
if ((clickCounter <= neededClicks && num == 1f) || (clickCounter <= neededClicks && num2 == 1f))
{
imageComponents[0].sprite = null;
imageComponents[1].sprite = null;
imageComponents[2].sprite = null;
imageComponents[3].sprite = null;
imageComponents[4].sprite = null;
spriteList.Clear();
clickCounter = 0f;
}
if (stopWatch.IsRunning && stopWatch.ElapsedMilliseconds >= 5000)
{
SetupPlayer();
stopWatch.Stop();
}
if (modingUI.GetInit() && !modRef.GetUIStatus())
{
modingUI.AddMod(modRef);
}
if (modRef.GetSaveStatus())
{
modRef.ConfirmSave();
if (((ModSetting)onOrOff).GetValueAsString() == "true")
{
MelonLogger.Msg("on!");
runMod = true;
}
else if (((ModSetting)onOrOff).GetValueAsString() == "false")
{
runMod = false;
MelonLogger.Msg("off!");
}
}
}
public static void AddSprite(Sprite newSprite)
{
spriteList.Insert(0, newSprite);
if (spriteList.Count >= maxSprites)
{
spriteList.RemoveAt(5);
}
UpdateImages();
}
private static void UpdateImages()
{
for (int i = 0; i < imageComponents.Length; i++)
{
if (i < spriteList.Count)
{
imageComponents[i].sprite = spriteList[i];
((Behaviour)imageComponents[i]).enabled = true;
}
else
{
((Behaviour)imageComponents[i]).enabled = false;
}
}
}
private List<Texture2D> FileToTexture(string path)
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
bool flag = false;
string[] files = Directory.GetFiles(path);
List<Texture2D> list = new List<Texture2D>();
string[] array = files;
foreach (string text in array)
{
list.Add(new Texture2D(2, 2));
byte[] array2 = File.ReadAllBytes(text);
ImageConversion.LoadImage(list.Last(), Il2CppStructArray<byte>.op_Implicit(array2));
((Object)list.Last()).name = text.Split(new char[1] { '\\' }).Last().Split(new char[1] { '.' })[0];
((Object)list.Last()).hideFlags = (HideFlags)61;
if (flag)
{
MelonLogger.Msg("Image Imported: " + ((Object)list.Last()).name);
}
}
return list;
}
private static Sprite Texture2DToSprite(Texture2D Input, bool DoBorders = false, float border = 20f)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
Rect val = default(Rect);
((Rect)(ref val)).x = 0f;
((Rect)(ref val)).y = 0f;
((Rect)(ref val)).width = ((Texture)Input).width;
((Rect)(ref val)).height = ((Texture)Input).height;
Rect val2 = val;
if (DoBorders)
{
Vector4 val3 = default(Vector4);
((Vector4)(ref val3))..ctor(border, border, border, border);
return Sprite.Create(Input, val2, new Vector2(0f, 0f), (float)((Texture)Input).width, 0u, (SpriteMeshType)0, val3);
}
return Sprite.Create(Input, val2, new Vector2(0f, 0f));
}
}