League of Maidens Cheat Tutorial

Add topics here with methods, analysis, code snippets, mods etc. for a certain game that normally won't make it in the Tables or Requests sections.
DarKunor
Cheater
Cheater
Posts: 34
Joined: Sat Mar 13, 2021 6:34 am
Reputation: 5

Re: League of Maidens Cheat Tutorial

Post by DarKunor »

x1nam82 wrote:
Fri Mar 19, 2021 8:44 pm
Unlocking items Part 2: Making Sure It Survives Game Restart
Spoiler
When the game restart, there's 2 phase on applying the saved data to your maiden. Namely SaveManager.LoadValue and LeagueData.ApplyLook. Both checks for premium items and if you have bought it. If not, it will reset the data on memory to default values, and if you enter the Customization screen, write it to the savegame. So to ensure your customization using premium items survives, those two methods need to be edited.

The goal is simple, remove all references to variables inside Steaminit. It's easier said than done.

First, LeagueData.ApplyLook, cos it's the easier of the two. Here's the resulting full code after edit. Mind you, all the caps variable names will be different in yours, so read and edit carefully.

Code: Select all

	public void ApplyLook(int JHBEGOOKAEL)
	{
			GlobalVar.CurrentLeagueCharacterData[0].BodyType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyType;
			GlobalVar.CurrentLeagueCharacterData[0].Part1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part3Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part4Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part4Colour;
			GlobalVar.CurrentLeagueCharacterData[0].OutfitPlug = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].OutfitPlug;
			GlobalVar.CurrentLeagueCharacterData[0].F_Setting.BodyRoughness = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyRoughness;

			GlobalVar.CurrentLeagueCharacterData[0].WeaponSkinID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponSkinID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWeapon = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWeapon;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponPos;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponRot;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponScale;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponColour;

			GlobalVar.CurrentLeagueCharacterData[0].ShieldType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowShield = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowShield;
			GlobalVar.CurrentLeagueCharacterData[0].ShieldColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldColour;

			GlobalVar.CurrentLeagueCharacterData[0].WingType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWing = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWing;
			GlobalVar.CurrentLeagueCharacterData[0].WingColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingColour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Glass = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Glass;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_MaskColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_MaskColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].CapeID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeID;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour1;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour2;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour3;
			GlobalVar.CurrentLeagueCharacterData[0].CapePos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapePos;
			GlobalVar.CurrentLeagueCharacterData[0].CapeRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeRot;
			GlobalVar.CurrentLeagueCharacterData[0].CapeScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeScale;

			GlobalVar.CurrentLeagueCharacterData[0].PoseID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].PoseID;

			GlobalVar.CurrentLeagueCharacterData[0].GauntletID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowGauntlet = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowGauntlet;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor1;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor2;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor3;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor4 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor4;

			GlobalVar.CurrentLeagueCharacterData[0].HairType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairType;
			GlobalVar.CurrentLeagueCharacterData[0].HairColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairColour;

			GlobalVar.CurrentLeagueCharacterData[0].TattooType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].TattooType;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo3Colour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Ear = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Ear;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Tails = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Tails;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsScale;

		if (GlobalVar.Player != null && !GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ccMode)
		{
			GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ApplyLook();
		}
	}
There's a bunch of lines removed from the original, mainly the if lines. Just make sure to make your code similar to that using the "Edit C# Method".

The hard part is editing SaveManager.LoadValue, cos it requires editing the IL code. And no, it won't just involves setting some fields to ldc.i4.1, cos you need to turn codes such as this:

Code: Select all

if (SteamInit.NPBOPBKMFNH[num3] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
to this

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
That will be a long "short" tutorial in IL for that kind of edit, and, mind you, the edit is repeated for each item categories. My dll is already filled with junk from unsuccessful edits to post it cos I can't guarantee what havoc it can do on your system.

Suffice to say, anyone who are adventurous can do this workflow:

Return to the edits made on NewUI_CC_IconItem.Update on my previous post. Remember this kind of edits

Code: Select all

    case NewUI_CC_IconItem.JJPCBOAFJFJ.Outfit:
    	SteamInit.NPBOPBKMFNH[this.MyID] = true;
        this.unlocked = true;

Right click on NPBOPBKMFNH, then "Analyze"->"get"->"Used By"->"SaveManager.LoadValue"->"Show Reference in Method (New Tab)". Then you get the corresponding line highlighted, then "Edit IL Instruction". The corresponding lines is then highlighted in IL Editor. The hard part is deciding what to edit.

For outfit, you get these lines highlighted in IL Editor:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
3328	291B	ldelem.u1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
Now remove the highlight, and only highlight the 1st 2 lines:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
Now right click, and select "NOP Instruction".

After that, click the ldelem.u1 part of the 3rd line:

Code: Select all

3328	291B	ldelem.u1
Select ldc.i4.1. The code now reads as follow:

Code: Select all

3326	2914	nop
3327	2919	nop
3328	291B	ldc.i4.1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
After closing the window by clicking OK, you'll get this:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Now repeat the process for all item categories.

There are variations of the edit above. Let's look at Tattoos:

Code: Select all

if (SteamInit.PBJIILLFFBE[Mathf.Max(0, num3 - 1)] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Getting there by the same process like before, you'll get these il codes:

Code: Select all

3371	2967	call	bool[] Steamworks.SteamInit::get_TattooUnlocked()
3372	296C	ldc.i4.0
3373	296D	ldloc.s	V_7 (7)
3374	296F	ldc.i4.1
3375	2970	sub
3376	2971	call	int32 [UnityEngine.CoreModule]UnityEngine.Mathf::Max(int32, int32)
3377	2976	ldelem.u1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
So, highlight the 6 first line, right click, then "NOP Instruction". At the 7th line, change ldelem.u1 to ldc.i4.1. The code now reads:

Code: Select all

3371	2967	nop
3372	296C	nop
3373	296D	nop
3374	296F	nop
3375	2970	nop
3376	2971	nop
3377	2976	ldc.i4.1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
After clicking OK, you'll get:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Do you see a pattern here?
For codes like these:

Code: Select all

if ((SteamInit. ....
The IL code will always start with:

Code: Select all

call	bool[] Steamworks.SteamInit::get_ ...
What you want to do is look for the combo of this 2 lines immediately after:

Code: Select all

ldelem.u1
brtrue.s ...
Then, select the lines from the call bool[] Steamworks:: to one line directly above ldelem.u1, and NOP them. Afterward, change the ldelem.u1 to ldc.i4.1

Let's try something harder:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !SteamInit.JACFFEPMKKI[characterData.Acc_Glass - 1] && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
The corresponding IL code:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D9D) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2444	1D76	call	bool[] Steamworks.SteamInit::get_GlassUnlock()
2445	1D7B	ldloc.1
2446	1D7C	ldfld	int32 CharacterData::Acc_Glass
2447	1D81	ldc.i4.1
2448	1D82	sub
2449	1D83	ldelem.u1
2450	1D84	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2451	1D86	ldarg.2
2452	1D87	brfalse.s	2456 (1D8D) ldloc.1 
2453	1D89	ldarg.2
2454	1D8A	ldc.i4.1
2455	1D8B	bne.un.s	2463 (1D9D) ldloc.s V_4 (4)
Remember the guideline above? Select the lines from call bool[] Steamworks.SteamInit:: to one line above the next ldelem.u1, that is line 2444 to 2448, then NOP them. Afterward, change ldelem.u1 to ldc.i4.1.

The code now looks like this:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D95) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2444	1D76	nop
2445	1D77	nop
2446	1D78	nop
2447	1D79	nop
2448	1D7A	nop
2449	1D7B	ldc.i4.1
2450	1D7C	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2451	1D7E	ldarg.2
2452	1D7F	brfalse.s	2456 (1D85) ldloc.1 
2453	1D81	ldarg.2
2454	1D82	ldc.i4.1
2455	1D83	bne.un.s	2463 (1D95) ldloc.s V_4 (4)
And the corresponding C# code:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !true && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
Hope this is enough to get you going.
great job man you found a safer way than mine just made it and everything work fine nice job there

Alex985
Expert Cheater
Expert Cheater
Posts: 69
Joined: Thu Jul 27, 2017 5:09 pm
Reputation: 4

Re: League of Maidens Cheat Tutorial

Post by Alex985 »

x1nam82 wrote:
Fri Mar 19, 2021 9:04 pm

Step 3: Go to LeagueData.CanCreateLeague
Find

Code: Select all

if (SaveManager.instance != null && this.LeagueFiles.Count < SteamInit.MMHKGNLENEE)
Change to

Code: Select all

if (SaveManager.instance != null)
Step 4: Go to LeagueData.CanCreateLeague
Find

Code: Select all

if (SaveManager.instance != null && this.LeagueFiles.Count < SteamInit.MMHKGNLENEE)
Change to

Code: Select all

if (SaveManager.instance != null)
So why 4 steps, not just edit SteamInit.MMHKGNLENEE. Yeah, I tried, and it broke the game, cos it turns out that variable is obfuscated. Changing it yields to erratic value in game and you won't be able to switch characters. So it's safer this way.

BTW the edits are achievable with "Edit C# Method".
Excuse me, where exactly do I find each of the last two files? Since I have modified the first one and I have unlocked all 12 slots but I can only create 3 characters

xathu0904
Expert Cheater
Expert Cheater
Posts: 82
Joined: Wed Dec 18, 2019 6:01 am
Reputation: 7

Re: League of Maidens Cheat Tutorial

Post by xathu0904 »

x1nam82 wrote:
Fri Mar 19, 2021 8:44 pm
Unlocking items Part 2: Making Sure It Survives Game Restart

When the game restart, there's 2 phase on applying the saved data to your maiden. Namely SaveManager.LoadValue and LeagueData.ApplyLook. Both checks for premium items and if you have bought it. If not, it will reset the data on memory to default values, and if you enter the Customization screen, write it to the savegame. So to ensure your customization using premium items survives, those two methods need to be edited.

The goal is simple, remove all references to variables inside Steaminit. It's easier said than done.

First, LeagueData.ApplyLook, cos it's the easier of the two. Here's the resulting full code after edit. Mind you, all the caps variable names will be different in yours, so read and edit carefully.

Code: Select all

	public void ApplyLook(int JHBEGOOKAEL)
	{
			GlobalVar.CurrentLeagueCharacterData[0].BodyType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyType;
			GlobalVar.CurrentLeagueCharacterData[0].Part1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part3Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part4Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part4Colour;
			GlobalVar.CurrentLeagueCharacterData[0].OutfitPlug = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].OutfitPlug;
			GlobalVar.CurrentLeagueCharacterData[0].F_Setting.BodyRoughness = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyRoughness;

			GlobalVar.CurrentLeagueCharacterData[0].WeaponSkinID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponSkinID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWeapon = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWeapon;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponPos;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponRot;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponScale;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponColour;

			GlobalVar.CurrentLeagueCharacterData[0].ShieldType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowShield = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowShield;
			GlobalVar.CurrentLeagueCharacterData[0].ShieldColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldColour;

			GlobalVar.CurrentLeagueCharacterData[0].WingType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWing = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWing;
			GlobalVar.CurrentLeagueCharacterData[0].WingColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingColour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Glass = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Glass;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_MaskColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_MaskColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].CapeID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeID;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour1;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour2;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour3;
			GlobalVar.CurrentLeagueCharacterData[0].CapePos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapePos;
			GlobalVar.CurrentLeagueCharacterData[0].CapeRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeRot;
			GlobalVar.CurrentLeagueCharacterData[0].CapeScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeScale;

			GlobalVar.CurrentLeagueCharacterData[0].PoseID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].PoseID;

			GlobalVar.CurrentLeagueCharacterData[0].GauntletID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowGauntlet = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowGauntlet;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor1;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor2;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor3;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor4 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor4;

			GlobalVar.CurrentLeagueCharacterData[0].HairType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairType;
			GlobalVar.CurrentLeagueCharacterData[0].HairColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairColour;

			GlobalVar.CurrentLeagueCharacterData[0].TattooType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].TattooType;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo3Colour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Ear = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Ear;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Tails = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Tails;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsScale;

		if (GlobalVar.Player != null && !GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ccMode)
		{
			GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ApplyLook();
		}
	}
There's a bunch of lines removed from the original, mainly the if lines. Just make sure to make your code similar to that using the "Edit C# Method".

The hard part is editing SaveManager.LoadValue, cos it requires editing the IL code. And no, it won't just involves setting some fields to ldc.i4.1, cos you need to turn codes such as this:

Code: Select all

if (SteamInit.NPBOPBKMFNH[num3] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
to this

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
That will be a long "short" tutorial in IL for that kind of edit, and, mind you, the edit is repeated for each item categories. My dll is already filled with junk from unsuccessful edits to post it cos I can't guarantee what havoc it can do on your system.

Suffice to say, anyone who are adventurous can do this workflow:

Return to the edits made on NewUI_CC_IconItem.Update on my previous post. Remember this kind of edits

Code: Select all

    case NewUI_CC_IconItem.JJPCBOAFJFJ.Outfit:
    	SteamInit.NPBOPBKMFNH[this.MyID] = true;
        this.unlocked = true;

Right click on NPBOPBKMFNH, then "Analyze"->"get"->"Used By"->"SaveManager.LoadValue"->"Show Reference in Method (New Tab)". Then you get the corresponding line highlighted, then "Edit IL Instruction". The corresponding lines is then highlighted in IL Editor. The hard part is deciding what to edit.

For outfit, you get these lines highlighted in IL Editor:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
3328	291B	ldelem.u1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
Now remove the highlight, and only highlight the 1st 2 lines:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
Now right click, and select "NOP Instruction".

After that, click the ldelem.u1 part of the 3rd line:

Code: Select all

3328	291B	ldelem.u1
Select ldc.i4.1. The code now reads as follow:

Code: Select all

3326	2914	nop
3327	2919	nop
3328	291B	ldc.i4.1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
After closing the window by clicking OK, you'll get this:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Now repeat the process for all item categories.

There are variations of the edit above. Let's look at Tattoos:

Code: Select all

if (SteamInit.PBJIILLFFBE[Mathf.Max(0, num3 - 1)] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Getting there by the same process like before, you'll get these il codes:

Code: Select all

3371	2967	call	bool[] Steamworks.SteamInit::get_TattooUnlocked()
3372	296C	ldc.i4.0
3373	296D	ldloc.s	V_7 (7)
3374	296F	ldc.i4.1
3375	2970	sub
3376	2971	call	int32 [UnityEngine.CoreModule]UnityEngine.Mathf::Max(int32, int32)
3377	2976	ldelem.u1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
So, highlight the 6 first line, right click, then "NOP Instruction". At the 7th line, change ldelem.u1 to ldc.i4.1. The code now reads:

Code: Select all

3371	2967	nop
3372	296C	nop
3373	296D	nop
3374	296F	nop
3375	2970	nop
3376	2971	nop
3377	2976	ldc.i4.1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
After clicking OK, you'll get:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Do you see a pattern here?
For codes like these:

Code: Select all

if ((SteamInit. ....
The IL code will always start with:

Code: Select all

call	bool[] Steamworks.SteamInit::get_ ...
What you want to do is look for the combo of this 2 lines immediately after:

Code: Select all

ldelem.u1
brtrue.s ...
Then, select the lines from the call bool[] Steamworks:: to one line directly above ldelem.u1, and NOP them. Afterward, change the ldelem.u1 to ldc.i4.1

Let's try something harder:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !SteamInit.JACFFEPMKKI[characterData.Acc_Glass - 1] && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
The corresponding IL code:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D9D) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2444	1D76	call	bool[] Steamworks.SteamInit::get_GlassUnlock()
2445	1D7B	ldloc.1
2446	1D7C	ldfld	int32 CharacterData::Acc_Glass
2447	1D81	ldc.i4.1
2448	1D82	sub
2449	1D83	ldelem.u1
2450	1D84	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2451	1D86	ldarg.2
2452	1D87	brfalse.s	2456 (1D8D) ldloc.1 
2453	1D89	ldarg.2
2454	1D8A	ldc.i4.1
2455	1D8B	bne.un.s	2463 (1D9D) ldloc.s V_4 (4)
Remember the guideline above? Select the lines from call bool[] Steamworks.SteamInit:: to one line above the next ldelem.u1, that is line 2444 to 2448, then NOP them. Afterward, change ldelem.u1 to ldc.i4.1.

The code now looks like this:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D95) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2444	1D76	nop
2445	1D77	nop
2446	1D78	nop
2447	1D79	nop
2448	1D7A	nop
2449	1D7B	ldc.i4.1
2450	1D7C	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2451	1D7E	ldarg.2
2452	1D7F	brfalse.s	2456 (1D85) ldloc.1 
2453	1D81	ldarg.2
2454	1D82	ldc.i4.1
2455	1D83	bne.un.s	2463 (1D95) ldloc.s V_4 (4)
And the corresponding C# code:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !true && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
Hope this is enough to get you going.
thx you, this is most long ass guide i ever try but worth it

DarKunor
Cheater
Cheater
Posts: 34
Joined: Sat Mar 13, 2021 6:34 am
Reputation: 5

Re: League of Maidens Cheat Tutorial

Post by DarKunor »

xathu0904 wrote:
Sat Mar 20, 2021 7:50 am
Spoiler
x1nam82 wrote:
Fri Mar 19, 2021 8:44 pm
Unlocking items Part 2: Making Sure It Survives Game Restart

When the game restart, there's 2 phase on applying the saved data to your maiden. Namely SaveManager.LoadValue and LeagueData.ApplyLook. Both checks for premium items and if you have bought it. If not, it will reset the data on memory to default values, and if you enter the Customization screen, write it to the savegame. So to ensure your customization using premium items survives, those two methods need to be edited.

The goal is simple, remove all references to variables inside Steaminit. It's easier said than done.

First, LeagueData.ApplyLook, cos it's the easier of the two. Here's the resulting full code after edit. Mind you, all the caps variable names will be different in yours, so read and edit carefully.

Code: Select all

	public void ApplyLook(int JHBEGOOKAEL)
	{
			GlobalVar.CurrentLeagueCharacterData[0].BodyType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyType;
			GlobalVar.CurrentLeagueCharacterData[0].Part1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part3Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part4Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part4Colour;
			GlobalVar.CurrentLeagueCharacterData[0].OutfitPlug = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].OutfitPlug;
			GlobalVar.CurrentLeagueCharacterData[0].F_Setting.BodyRoughness = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyRoughness;

			GlobalVar.CurrentLeagueCharacterData[0].WeaponSkinID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponSkinID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWeapon = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWeapon;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponPos;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponRot;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponScale;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponColour;

			GlobalVar.CurrentLeagueCharacterData[0].ShieldType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowShield = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowShield;
			GlobalVar.CurrentLeagueCharacterData[0].ShieldColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldColour;

			GlobalVar.CurrentLeagueCharacterData[0].WingType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWing = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWing;
			GlobalVar.CurrentLeagueCharacterData[0].WingColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingColour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Glass = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Glass;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_MaskColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_MaskColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].CapeID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeID;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour1;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour2;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour3;
			GlobalVar.CurrentLeagueCharacterData[0].CapePos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapePos;
			GlobalVar.CurrentLeagueCharacterData[0].CapeRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeRot;
			GlobalVar.CurrentLeagueCharacterData[0].CapeScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeScale;

			GlobalVar.CurrentLeagueCharacterData[0].PoseID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].PoseID;

			GlobalVar.CurrentLeagueCharacterData[0].GauntletID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowGauntlet = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowGauntlet;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor1;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor2;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor3;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor4 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor4;

			GlobalVar.CurrentLeagueCharacterData[0].HairType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairType;
			GlobalVar.CurrentLeagueCharacterData[0].HairColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairColour;

			GlobalVar.CurrentLeagueCharacterData[0].TattooType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].TattooType;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo3Colour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Ear = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Ear;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Tails = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Tails;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsScale;

		if (GlobalVar.Player != null && !GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ccMode)
		{
			GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ApplyLook();
		}
	}
There's a bunch of lines removed from the original, mainly the if lines. Just make sure to make your code similar to that using the "Edit C# Method".

The hard part is editing SaveManager.LoadValue, cos it requires editing the IL code. And no, it won't just involves setting some fields to ldc.i4.1, cos you need to turn codes such as this:

Code: Select all

if (SteamInit.NPBOPBKMFNH[num3] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
to this

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
That will be a long "short" tutorial in IL for that kind of edit, and, mind you, the edit is repeated for each item categories. My dll is already filled with junk from unsuccessful edits to post it cos I can't guarantee what havoc it can do on your system.

Suffice to say, anyone who are adventurous can do this workflow:

Return to the edits made on NewUI_CC_IconItem.Update on my previous post. Remember this kind of edits

Code: Select all

    case NewUI_CC_IconItem.JJPCBOAFJFJ.Outfit:
    	SteamInit.NPBOPBKMFNH[this.MyID] = true;
        this.unlocked = true;

Right click on NPBOPBKMFNH, then "Analyze"->"get"->"Used By"->"SaveManager.LoadValue"->"Show Reference in Method (New Tab)". Then you get the corresponding line highlighted, then "Edit IL Instruction". The corresponding lines is then highlighted in IL Editor. The hard part is deciding what to edit.

For outfit, you get these lines highlighted in IL Editor:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
3328	291B	ldelem.u1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
Now remove the highlight, and only highlight the 1st 2 lines:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
Now right click, and select "NOP Instruction".

After that, click the ldelem.u1 part of the 3rd line:

Code: Select all

3328	291B	ldelem.u1
Select ldc.i4.1. The code now reads as follow:

Code: Select all

3326	2914	nop
3327	2919	nop
3328	291B	ldc.i4.1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
After closing the window by clicking OK, you'll get this:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Now repeat the process for all item categories.

There are variations of the edit above. Let's look at Tattoos:

Code: Select all

if (SteamInit.PBJIILLFFBE[Mathf.Max(0, num3 - 1)] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Getting there by the same process like before, you'll get these il codes:

Code: Select all

3371	2967	call	bool[] Steamworks.SteamInit::get_TattooUnlocked()
3372	296C	ldc.i4.0
3373	296D	ldloc.s	V_7 (7)
3374	296F	ldc.i4.1
3375	2970	sub
3376	2971	call	int32 [UnityEngine.CoreModule]UnityEngine.Mathf::Max(int32, int32)
3377	2976	ldelem.u1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
So, highlight the 6 first line, right click, then "NOP Instruction". At the 7th line, change ldelem.u1 to ldc.i4.1. The code now reads:

Code: Select all

3371	2967	nop
3372	296C	nop
3373	296D	nop
3374	296F	nop
3375	2970	nop
3376	2971	nop
3377	2976	ldc.i4.1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
After clicking OK, you'll get:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Do you see a pattern here?
For codes like these:

Code: Select all

if ((SteamInit. ....
The IL code will always start with:

Code: Select all

call	bool[] Steamworks.SteamInit::get_ ...
What you want to do is look for the combo of this 2 lines immediately after:

Code: Select all

ldelem.u1
brtrue.s ...
Then, select the lines from the call bool[] Steamworks:: to one line directly above ldelem.u1, and NOP them. Afterward, change the ldelem.u1 to ldc.i4.1

Let's try something harder:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !SteamInit.JACFFEPMKKI[characterData.Acc_Glass - 1] && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
The corresponding IL code:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D9D) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2444	1D76	call	bool[] Steamworks.SteamInit::get_GlassUnlock()
2445	1D7B	ldloc.1
2446	1D7C	ldfld	int32 CharacterData::Acc_Glass
2447	1D81	ldc.i4.1
2448	1D82	sub
2449	1D83	ldelem.u1
2450	1D84	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2451	1D86	ldarg.2
2452	1D87	brfalse.s	2456 (1D8D) ldloc.1 
2453	1D89	ldarg.2
2454	1D8A	ldc.i4.1
2455	1D8B	bne.un.s	2463 (1D9D) ldloc.s V_4 (4)
Remember the guideline above? Select the lines from call bool[] Steamworks.SteamInit:: to one line above the next ldelem.u1, that is line 2444 to 2448, then NOP them. Afterward, change ldelem.u1 to ldc.i4.1.

The code now looks like this:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D95) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2444	1D76	nop
2445	1D77	nop
2446	1D78	nop
2447	1D79	nop
2448	1D7A	nop
2449	1D7B	ldc.i4.1
2450	1D7C	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2451	1D7E	ldarg.2
2452	1D7F	brfalse.s	2456 (1D85) ldloc.1 
2453	1D81	ldarg.2
2454	1D82	ldc.i4.1
2455	1D83	bne.un.s	2463 (1D95) ldloc.s V_4 (4)
And the corresponding C# code:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !true && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
Hope this is enough to get you going.
thx you, this is most long ass guide i ever try but worth it
keep in mind that when ever theres a new patch you got to do this all over again hehe

xathu0904
Expert Cheater
Expert Cheater
Posts: 82
Joined: Wed Dec 18, 2019 6:01 am
Reputation: 7

Re: League of Maidens Cheat Tutorial

Post by xathu0904 »

DarKunor wrote:
Sat Mar 20, 2021 8:06 am
xathu0904 wrote:
Sat Mar 20, 2021 7:50 am
Spoiler
x1nam82 wrote:
Fri Mar 19, 2021 8:44 pm
Unlocking items Part 2: Making Sure It Survives Game Restart

When the game restart, there's 2 phase on applying the saved data to your maiden. Namely SaveManager.LoadValue and LeagueData.ApplyLook. Both checks for premium items and if you have bought it. If not, it will reset the data on memory to default values, and if you enter the Customization screen, write it to the savegame. So to ensure your customization using premium items survives, those two methods need to be edited.

The goal is simple, remove all references to variables inside Steaminit. It's easier said than done.

First, LeagueData.ApplyLook, cos it's the easier of the two. Here's the resulting full code after edit. Mind you, all the caps variable names will be different in yours, so read and edit carefully.

Code: Select all

	public void ApplyLook(int JHBEGOOKAEL)
	{
			GlobalVar.CurrentLeagueCharacterData[0].BodyType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyType;
			GlobalVar.CurrentLeagueCharacterData[0].Part1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part3Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Part4Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Part4Colour;
			GlobalVar.CurrentLeagueCharacterData[0].OutfitPlug = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].OutfitPlug;
			GlobalVar.CurrentLeagueCharacterData[0].F_Setting.BodyRoughness = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].BodyRoughness;

			GlobalVar.CurrentLeagueCharacterData[0].WeaponSkinID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponSkinID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWeapon = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWeapon;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponPos;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponRot;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponScale;
			GlobalVar.CurrentLeagueCharacterData[0].WeaponColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WeaponColour;

			GlobalVar.CurrentLeagueCharacterData[0].ShieldType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowShield = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowShield;
			GlobalVar.CurrentLeagueCharacterData[0].ShieldColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShieldColour;

			GlobalVar.CurrentLeagueCharacterData[0].WingType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingType;
			GlobalVar.CurrentLeagueCharacterData[0].ShowWing = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowWing;
			GlobalVar.CurrentLeagueCharacterData[0].WingColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].WingColour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_ChokerColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_ChokerColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn3Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn3Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Glass = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Glass;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_GlassScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_GlassScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_MaskColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_MaskColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HeadGearColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HeadGearColor3;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Mask2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Mask2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].CapeID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeID;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour1;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour2;
			GlobalVar.CurrentLeagueCharacterData[0].CapeColour3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeColour3;
			GlobalVar.CurrentLeagueCharacterData[0].CapePos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapePos;
			GlobalVar.CurrentLeagueCharacterData[0].CapeRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeRot;
			GlobalVar.CurrentLeagueCharacterData[0].CapeScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].CapeScale;

			GlobalVar.CurrentLeagueCharacterData[0].PoseID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].PoseID;

			GlobalVar.CurrentLeagueCharacterData[0].GauntletID = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletID;
			GlobalVar.CurrentLeagueCharacterData[0].ShowGauntlet = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].ShowGauntlet;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor1;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor2;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor3 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor3;
			GlobalVar.CurrentLeagueCharacterData[0].GauntletColor4 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].GauntletColor4;

			GlobalVar.CurrentLeagueCharacterData[0].HairType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairType;
			GlobalVar.CurrentLeagueCharacterData[0].HairColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].HairColour;

			GlobalVar.CurrentLeagueCharacterData[0].TattooType = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].TattooType;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo1Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo1Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo2Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo2Colour;
			GlobalVar.CurrentLeagueCharacterData[0].Tattoo3Colour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Tattoo3Colour;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour1 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour1;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn1Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn1Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_HornColour2 = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_HornColour2;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Pos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Pos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Rot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Rot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_Horn2Scale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Horn2Scale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Ear = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Ear;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_EarScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_EarScale;

			GlobalVar.CurrentLeagueCharacterData[0].Acc_Tails = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_Tails;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailColour = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailColour;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsPos = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsPos;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsRot = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsRot;
			GlobalVar.CurrentLeagueCharacterData[0].Acc_TailsScale = GlobalVar.CurrentLeagueCharacterData[0].PlayeLookData[JHBEGOOKAEL].Acc_TailsScale;

		if (GlobalVar.Player != null && !GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ccMode)
		{
			GlobalVar.Player.GetComponent<NewPlayerControl>().BoneScript.ApplyLook();
		}
	}
There's a bunch of lines removed from the original, mainly the if lines. Just make sure to make your code similar to that using the "Edit C# Method".

The hard part is editing SaveManager.LoadValue, cos it requires editing the IL code. And no, it won't just involves setting some fields to ldc.i4.1, cos you need to turn codes such as this:

Code: Select all

if (SteamInit.NPBOPBKMFNH[num3] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
to this

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
That will be a long "short" tutorial in IL for that kind of edit, and, mind you, the edit is repeated for each item categories. My dll is already filled with junk from unsuccessful edits to post it cos I can't guarantee what havoc it can do on your system.

Suffice to say, anyone who are adventurous can do this workflow:

Return to the edits made on NewUI_CC_IconItem.Update on my previous post. Remember this kind of edits

Code: Select all

    case NewUI_CC_IconItem.JJPCBOAFJFJ.Outfit:
    	SteamInit.NPBOPBKMFNH[this.MyID] = true;
        this.unlocked = true;

Right click on NPBOPBKMFNH, then "Analyze"->"get"->"Used By"->"SaveManager.LoadValue"->"Show Reference in Method (New Tab)". Then you get the corresponding line highlighted, then "Edit IL Instruction". The corresponding lines is then highlighted in IL Editor. The hard part is deciding what to edit.

For outfit, you get these lines highlighted in IL Editor:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
3328	291B	ldelem.u1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
Now remove the highlight, and only highlight the 1st 2 lines:

Code: Select all

3326	2914	call	bool[] Steamworks.SteamInit::get_OutfitUnlocked()
3327	2919	ldloc.s	V_7 (7)
Now right click, and select "NOP Instruction".

After that, click the ldelem.u1 part of the 3rd line:

Code: Select all

3328	291B	ldelem.u1
Select ldc.i4.1. The code now reads as follow:

Code: Select all

3326	2914	nop
3327	2919	nop
3328	291B	ldc.i4.1
3329	291C	brtrue.s	3343 (2931) ldc.i4.1 
3330	291E	ldarg.2
3331	291F	brfalse.s	3341 (292E) ldc.i4.0 
3332	2921	ldarg.2
3333	2922	ldc.i4.1
3334	2923	beq.s	3341 (292E) ldc.i4.0 
3335	2925	ldarg.2
3336	2926	ldc.i4.2
3337	2927	ceq
3338	2929	ldc.i4.0
3339	292A	ceq
3340	292C	br.s	3344 (2932) ldloc.0 
3341	292E	ldc.i4.0
3342	292F	br.s	3344 (2932) ldloc.0 
3343	2931	ldc.i4.1
3344	2932	ldloc.0
3345	2933	or
3346	2934	brfalse.s	3351 (2940) ldloc.1 
After closing the window by clicking OK, you'll get this:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Now repeat the process for all item categories.

There are variations of the edit above. Let's look at Tattoos:

Code: Select all

if (SteamInit.PBJIILLFFBE[Mathf.Max(0, num3 - 1)] || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Getting there by the same process like before, you'll get these il codes:

Code: Select all

3371	2967	call	bool[] Steamworks.SteamInit::get_TattooUnlocked()
3372	296C	ldc.i4.0
3373	296D	ldloc.s	V_7 (7)
3374	296F	ldc.i4.1
3375	2970	sub
3376	2971	call	int32 [UnityEngine.CoreModule]UnityEngine.Mathf::Max(int32, int32)
3377	2976	ldelem.u1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
So, highlight the 6 first line, right click, then "NOP Instruction". At the 7th line, change ldelem.u1 to ldc.i4.1. The code now reads:

Code: Select all

3371	2967	nop
3372	296C	nop
3373	296D	nop
3374	296F	nop
3375	2970	nop
3376	2971	nop
3377	2976	ldc.i4.1
3378	2977	brtrue.s	3392 (298C) ldc.i4.1 
3379	2979	ldarg.2
3380	297A	brfalse.s	3390 (2989) ldc.i4.0 
3381	297C	ldarg.2
3382	297D	ldc.i4.1
3383	297E	beq.s	3390 (2989) ldc.i4.0 
3384	2980	ldarg.2
3385	2981	ldc.i4.2
3386	2982	ceq
3387	2984	ldc.i4.0
3388	2985	ceq
3389	2987	br.s	3393 (298D) ldloc.0 
3390	2989	ldc.i4.0
3391	298A	br.s	3393 (298D) ldloc.0 
3392	298C	ldc.i4.1
3393	298D	ldloc.0
3394	298E	or
3395	298F	brfalse.s	3400 (299B) ldloc.1 
After clicking OK, you'll get:

Code: Select all

if (true || (FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form1 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.Normal_Form2 && FMLLCCPHAEE != SaveManager.MLKJGNFODND.GeneralPreset) || flag)
Do you see a pattern here?
For codes like these:

Code: Select all

if ((SteamInit. ....
The IL code will always start with:

Code: Select all

call	bool[] Steamworks.SteamInit::get_ ...
What you want to do is look for the combo of this 2 lines immediately after:

Code: Select all

ldelem.u1
brtrue.s ...
Then, select the lines from the call bool[] Steamworks:: to one line directly above ldelem.u1, and NOP them. Afterward, change the ldelem.u1 to ldc.i4.1

Let's try something harder:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !SteamInit.JACFFEPMKKI[characterData.Acc_Glass - 1] && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
The corresponding IL code:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D9D) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2444	1D76	call	bool[] Steamworks.SteamInit::get_GlassUnlock()
2445	1D7B	ldloc.1
2446	1D7C	ldfld	int32 CharacterData::Acc_Glass
2447	1D81	ldc.i4.1
2448	1D82	sub
2449	1D83	ldelem.u1
2450	1D84	brtrue.s	2463 (1D9D) ldloc.s V_4 (4)
2451	1D86	ldarg.2
2452	1D87	brfalse.s	2456 (1D8D) ldloc.1 
2453	1D89	ldarg.2
2454	1D8A	ldc.i4.1
2455	1D8B	bne.un.s	2463 (1D9D) ldloc.s V_4 (4)
Remember the guideline above? Select the lines from call bool[] Steamworks.SteamInit:: to one line above the next ldelem.u1, that is line 2444 to 2448, then NOP them. Afterward, change ldelem.u1 to ldc.i4.1.

The code now looks like this:

Code: Select all

2438	1D6A	ldloc.1
2439	1D6B	ldfld	int32 CharacterData::Acc_Glass
2440	1D70	ldc.i4.0
2441	1D71	ble.s	2463 (1D95) ldloc.s V_4 (4)
2442	1D73	ldloc.0
2443	1D74	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2444	1D76	nop
2445	1D77	nop
2446	1D78	nop
2447	1D79	nop
2448	1D7A	nop
2449	1D7B	ldc.i4.1
2450	1D7C	brtrue.s	2463 (1D95) ldloc.s V_4 (4)
2451	1D7E	ldarg.2
2452	1D7F	brfalse.s	2456 (1D85) ldloc.1 
2453	1D81	ldarg.2
2454	1D82	ldc.i4.1
2455	1D83	bne.un.s	2463 (1D95) ldloc.s V_4 (4)
And the corresponding C# code:

Code: Select all

if (characterData.Acc_Glass > 0 && !flag && !true && (FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form1 || FMLLCCPHAEE == SaveManager.MLKJGNFODND.Normal_Form2))
Hope this is enough to get you going.
thx you, this is most long ass guide i ever try but worth it
keep in mind that when ever theres a new patch you got to do this all over again hehe
when getting use to it, i think it will quick. damn he forgot about unlock emote

x1nam82
Noobzor
Noobzor
Posts: 12
Joined: Tue Mar 16, 2021 3:48 am
Reputation: 19

Re: League of Maidens Cheat Tutorial

Post by x1nam82 »

Alex985 wrote:
Sat Mar 20, 2021 4:42 am
x1nam82 wrote:
Fri Mar 19, 2021 9:04 pm

Step 3: Go to LeagueData.CanCreateLeague
Find

Code: Select all

if (SaveManager.instance != null && this.LeagueFiles.Count < SteamInit.MMHKGNLENEE)
Change to

Code: Select all

if (SaveManager.instance != null)
Step 4: Go to LeagueData.CanCreateLeague
Find

Code: Select all

if (SaveManager.instance != null && this.LeagueFiles.Count < SteamInit.MMHKGNLENEE)
Change to

Code: Select all

if (SaveManager.instance != null)
So why 4 steps, not just edit SteamInit.MMHKGNLENEE. Yeah, I tried, and it broke the game, cos it turns out that variable is obfuscated. Changing it yields to erratic value in game and you won't be able to switch characters. So it's safer this way.

BTW the edits are achievable with "Edit C# Method".
Excuse me, where exactly do I find each of the last two files? Since I have modified the first one and I have unlocked all 12 slots but I can only create 3 characters
Hmm, there's a mixup in method name at step 4, my bad :oops:
Step 4 should be LeagueData.CreateLeague, which located directly below LeagueData.CanCreateLeague in the dll. I've edited the OP to reflect this. The procedure, however, remain the same.
DarKunor wrote:
Sat Mar 20, 2021 8:06 am
xathu0904 wrote:
Sat Mar 20, 2021 7:50 am
Spoiler
x1nam82 wrote:
Fri Mar 19, 2021 8:44 pm
Unlocking items Part 2: Making Sure It Survives Game Restart
thx you, this is most long ass guide i ever try but worth it
keep in mind that when ever theres a new patch you got to do this all over again hehe
I'm searching for ways to shorten the edit needed for game restart thingies to work. The concept is, we have to set all the relevant store item flags to true in the store context as early as possible in the game loading process, and making sure that it stays like that during the game.

The candidate for that process is in SteamInit.SteamInit (SteamInit constructor) itself for early setting up the store flags, and using SteamInit.ResetStoreItem, and even to repurpose SteamInit.VirtualGoodCo against itself in keeping the store flags stays set for us. But alas, that's heavy duty IL editing, as it actually add new code to the existing ones, with IL no less :o

If only there's a way to know which script is run when we click "Start Game", and hope it can be edited with C# instead of IL.

xathu0904
Expert Cheater
Expert Cheater
Posts: 82
Joined: Wed Dec 18, 2019 6:01 am
Reputation: 7

Re: League of Maidens Cheat Tutorial

Post by xathu0904 »

x1nam82 wrote:
Sat Mar 20, 2021 9:41 am
Alex985 wrote:
Sat Mar 20, 2021 4:42 am
x1nam82 wrote:
Fri Mar 19, 2021 9:04 pm

Step 3: Go to LeagueData.CanCreateLeague
Find

Code: Select all

if (SaveManager.instance != null && this.LeagueFiles.Count < SteamInit.MMHKGNLENEE)
Change to

Code: Select all

if (SaveManager.instance != null)
Step 4: Go to LeagueData.CanCreateLeague
Find

Code: Select all

if (SaveManager.instance != null && this.LeagueFiles.Count < SteamInit.MMHKGNLENEE)
Change to

Code: Select all

if (SaveManager.instance != null)
So why 4 steps, not just edit SteamInit.MMHKGNLENEE. Yeah, I tried, and it broke the game, cos it turns out that variable is obfuscated. Changing it yields to erratic value in game and you won't be able to switch characters. So it's safer this way.

BTW the edits are achievable with "Edit C# Method".
Excuse me, where exactly do I find each of the last two files? Since I have modified the first one and I have unlocked all 12 slots but I can only create 3 characters
Hmm, there's a mixup in method name at step 4, my bad :oops:
Step 4 should be LeagueData.CreateLeague, which located directly below LeagueData.CanCreateLeague in the dll. I've edited the OP to reflect this. The procedure, however, remain the same.
DarKunor wrote:
Sat Mar 20, 2021 8:06 am
xathu0904 wrote:
Sat Mar 20, 2021 7:50 am
Spoiler
keep in mind that when ever theres a new patch you got to do this all over again hehe
I'm searching for ways to shorten the edit needed for game restart thingies to work. The concept is, we have to set all the relevant store item flags to true in the store context as early as possible in the game loading process, and making sure that it stays like that during the game.

The candidate for that process is in SteamInit.SteamInit (SteamInit constructor) itself for early setting up the store flags, and using SteamInit.ResetStoreItem, and even to repurpose SteamInit.VirtualGoodCo against itself in keeping the store flags stays set for us. But alas, that's heavy duty IL editing, as it actually add new code to the existing ones, with IL no less :o

If only there's a way to know which script is run when we click "Start Game", and hope it can be edited with C# instead of IL.
Can you make guide for emote plz

even2229
What is cheating?
What is cheating?
Posts: 1
Joined: Sat Mar 20, 2021 12:19 pm
Reputation: 0

Re: League of Maidens Cheat Tutorial

Post by even2229 »

Does anyone know how to edit my character or world boss's height? I wanna be taller or super tiny!

JAXLOL
Noobzor
Noobzor
Posts: 8
Joined: Fri Mar 19, 2021 5:28 pm
Reputation: 1

Re: League of Maidens Cheat Tutorial

Post by JAXLOL »

x1nam82 wrote:
Fri Mar 19, 2021 7:32 pm
JAXLOL wrote:
Fri Mar 19, 2021 6:31 pm
How are you getting your code to compile?
I get errors every time I try to compile.
Do you edit the code with "Edit C# Method"? Check again if you missed some semicolon at the end of the line of the new code.
Actez wrote:
Fri Mar 19, 2021 6:38 pm
Thanks for the tut!! I was wondering if you happen to know how to bypass the VerifyVirtualGood to make it just return like funog1 suggested?
Well, fonug1 seemed to be more braver than me, making VerifyVirtualGood to "just return". I'm taking a more paranoid approach, I edited VerifyVirtualGoodCo as well..

So, go to SteamInit.VerifyVirtualGood, the highlight this line of code:

Code: Select all

this.JNMKFPOMOHF = base.StartCoroutine(this.VerifyVirtualGoodCo(PHLEDEBPOJI, EMKHPLIFLNN));
Now, make sure you have your mouse cursor on that line, then right-click and select "Edit IL Instruction". On the resulting window, you see several lines have been highlighted. Now, with your mouse cursor on one of the highlighted line, right-click and select "NOP Instruction". Then close the window by clicking "OK". You should left with VerifyVirtualGood but with the code line above disappeared.

For extra precaution, also look at VerifyVirtualGoodCo directly beneath VerifyVirtualGood. Look for this code:

Code: Select all

if (flag)
{
	LeagueData.instance.ResetStartPos();
	GlobalVar.BanDisplayDescription = "We apologize for the inconvenience. The application has encountered Error 1001. Data corruption has been detected. Please check to ensure that your data folder is valid.";
	SceneUnloader.instance.LoadingSimple("Ban");
}
Now highlight this line:

Code: Select all

if (flag)
Like before, right click while your cursor is on that line.

On the resulting window, you'll see there's 2 lines highlighted:

Code: Select all

ldloc.2
brfalse.s ....
Now click on ldloc.2, then select ldc.i4.0. After closing the window, you're left with code like this:

Code: Select all

if (false)
{
	LeagueData.instance.ResetStartPos();
	GlobalVar.BanDisplayDescription = "We apologize for the inconvenience. The application has encountered Error 1001. Data corruption has been detected. Please check to ensure that your data folder is valid.";
	SceneUnloader.instance.LoadingSimple("Ban");
}
So why the fuss of editing 2 methods instead of 1. VerifyVirtualGood is called whenever you switch outfit, i.e. change your appearance. It create a separate thread running VerifyVirtualGoodCo to check if you use any premium item you haven't bought for. While the 1st edit is enough to stop VerifyVirtualGoodCo to run, there's no stopping other subsystem of the game from calling VerifyVirtualGoodCo directly. While there's no subsystem do that for now, there's no guarantee that it will always be like that. So, why not remove the threat before it becoming a menace.
Yes I edit with the "Edit C# method" and it always fails to compile.

Even if I edit and don't make changes and compile it errors out.

nakhanang
What is cheating?
What is cheating?
Posts: 4
Joined: Thu Mar 11, 2021 4:50 pm
Reputation: 0

Re: League of Maidens Cheat Tutorial

Post by nakhanang »

Anyone know if there's a way to manipulate the current shards you have as well as the BP you had (for example: 12M/5K BP in my Maiden info)? I ended up having too many.

prosperthroughworld
What is cheating?
What is cheating?
Posts: 2
Joined: Sat Mar 13, 2021 9:44 pm
Reputation: 2

Re: League of Maidens Cheat Tutorial

Post by prosperthroughworld »

anyone know how to unlock all the premium emotes?

Aliza_Everheart
Novice Cheater
Novice Cheater
Posts: 21
Joined: Sat Mar 20, 2021 1:16 am
Reputation: 2

Re: League of Maidens Cheat Tutorial

Post by Aliza_Everheart »

can someone give me a simple explanation on cheating more money? or at least making it really easy to get money

funog1
Novice Cheater
Novice Cheater
Posts: 24
Joined: Mon Mar 26, 2018 8:44 pm
Reputation: 11

Re: League of Maidens Cheat Tutorial

Post by funog1 »

x1nam82 wrote:
Fri Mar 19, 2021 7:32 pm
Well, fonug1 seemed to be more braver than me, making VerifyVirtualGood to "just return". I'm taking a more paranoid approach, I edited VerifyVirtualGoodCo as well..
Setup breakpoints on the entire VerifyVirtualGoodCo if don't don't think editing VerifyVirtualGood is enough and play through the game for a while. Let me know when they are tripped. VerifyVirtualGoodCo is only ever run from a call inside VerifyVirtualGood and VerifyVirtualGood is only called when doing stuff related to the body. The devs were kind(stupid) enough to leave debug logs in place on anything that periodically checks against or updates your info in their server. So it's easy to find where it happens. Just search strings for "Server call"

and since you are worried about "there's no stopping other subsystem of the game from calling VerifyVirtualGoodCo directly. While there's no subsystem do that for now, there's no guarantee that it will always be like that. So, why not remove the threat before it becoming a menace. "
Why not just straight up nop it too?
Last edited by funog1 on Sat Mar 20, 2021 6:37 pm, edited 3 times in total.

Alex985
Expert Cheater
Expert Cheater
Posts: 69
Joined: Thu Jul 27, 2017 5:09 pm
Reputation: 4

Re: League of Maidens Cheat Tutorial

Post by Alex985 »

x1nam82 wrote:
Sat Mar 20, 2021 9:41 am

Hmm, there's a mixup in method name at step 4, my bad :oops:
Step 4 should be LeagueData.CreateLeague, which located directly below LeagueData.CanCreateLeague in the dll. I've edited the OP to reflect this. The procedure, however, remain the same.
Now it has worked, I appreciate it!

ALONCE
Noobzor
Noobzor
Posts: 10
Joined: Sat Mar 06, 2021 6:34 am
Reputation: 1

Re: League of Maidens Cheat Tutorial

Post by ALONCE »

Aliza_Everheart wrote:
Sat Mar 20, 2021 3:44 pm
can someone give me a simple explanation on cheating more money? or at least making it really easy to get money
Duplicate Treasure 13 with CheatEngine, set scan Value as Exact Value and set Value type as Float.

Post Reply

Who is online

Users browsing this forum: No registered users