Last Epoch Save Editor

Upload *YOUR* gamehacking tools/helpers here
timechaos69
Expert Cheater
Expert Cheater
Posts: 284
Joined: Wed Oct 18, 2017 4:23 am
Reputation: 38

Re: Last Epoch Save Editor

Post by timechaos69 »

another option to add maybe is maelstrom duration for druid and area? just walking maelstrom of death lol

Bloodadmiral
What is cheating?
What is cheating?
Posts: 2
Joined: Tue Oct 10, 2023 10:33 pm
Reputation: 0

Re: Last Epoch Save Editor

Post by Bloodadmiral »

Is there a link for the most updated save editor ? Or could you drop it here? I have an older version and I don't think the link is working anymore.

User avatar
Ash06
Expert Cheater
Expert Cheater
Posts: 246
Joined: Wed Oct 09, 2019 2:34 pm
Reputation: 117

Re: Last Epoch Save Editor

Post by Ash06 »

Bloodadmiral wrote:
Tue Oct 10, 2023 10:34 pm
Is that link for the Save Editor broken? I'm only able to down the In-game mods.
Link is working, I will send you a link in pm, latest version with latest fix
I tried with Microsoft Edge and I have the same trouble, works well with Firefox, should be the same with Chrome
timechaos69 wrote:
Thu Oct 12, 2023 7:27 pm
another option to add maybe is maelstrom duration for druid and area? just walking maelstrom of death lol
Many options can be added and it's easy to do, but adding options in menu isn't quick and boring (I'm not a designer ^^)

With UnityExplorer : [Link]
Use disable character movement Option from Mods, and add a movement ability in your bar in case you click T ^^
F7 to show UnityExplorer in game
Typically for a mutator, try with Class Filter = Skill Name ending by "Mutator" in Object Explorer
Image
As you can see, there are 2 objects found
The object we want to edit don't have the first two line egal to null (refs to PlayerAbilityList and actor)
Look for these variables :
- increaseDuration
- increaseRadius

Then look for others variables if you want more :p

Swerve
Noobzor
Noobzor
Posts: 11
Joined: Sat Jan 12, 2019 4:20 am
Reputation: 0

Re: Last Epoch Save Editor

Post by Swerve »

Thank you so much! Still having trouble accessing some things, like equipment and for some reason the last ruin.

Edit: Nevermind, Steam automatically turns on autosave even though I have it disabled. Apparently it has been an issue for a while and I can't play offline mode, so I guess it's fubared.

User avatar
Ash06
Expert Cheater
Expert Cheater
Posts: 246
Joined: Wed Oct 09, 2019 2:34 pm
Reputation: 117

Re: Last Epoch Save Editor

Post by Ash06 »

Disable cloud save for your game, not all steam ^^
Image
Don't delete or override "steam_autocloud.vdf" in your SaveFolder
Game delete your saves, if you copy "steam_autocloud.vdf" from another user or you don't have this file

Check main post for 5.2 release and use the saves you give me other day, let the app fix your save :p
I can open all your characters in SaveEditor and in Game

Swerve
Noobzor
Noobzor
Posts: 11
Joined: Sat Jan 12, 2019 4:20 am
Reputation: 0

Re: Last Epoch Save Editor

Post by Swerve »

It works! You are amazing.

Nothing seems to save, it allows me to edit, but no changes save. Whether I save an item or if I save manually under options.

Melon Loader crashes Last Epoch on me. this is the log I get.

NewEntryPoint] Passing ptr to LoadAssemblyAndGetFuncPtr back to host...
[NewEntryPoint] Configuring imports...
[NewEntryPoint] Initializing. In default load context: True
[01:28:12.846] ------------------------------
[01:28:12.847] MelonLoader v0.6.1 Open-Beta
[01:28:12.848] OS: Windows 11
[01:28:12.848] Hash Code: 696B58144EEC73C72FA36A811CA73312EEE4EC28AD5E3527BDA1E14F388A
[01:28:12.848] ------------------------------
[01:28:12.849] Game Type: Il2cpp
[01:28:12.849] Game Arch: x64
[01:28:12.849] ------------------------------
[01:28:12.849] Core::BasePath = C:\Program Files (x86)\Steam\steamapps\common\Last Epoch
[01:28:12.849] Game::BasePath = C:\Program Files (x86)\Steam\steamapps\common\Last Epoch
[01:28:12.849] Game::DataPath = C:\Program Files (x86)\Steam\steamapps\common\Last Epoch\Last Epoch_Data
[01:28:12.849] Game::ApplicationPath = C:\Program Files (x86)\Steam\steamapps\common\Last Epoch\Last Epoch.exe
[01:28:12.849] Runtime Type: net6
[01:28:13.242] ------------------------------
[01:28:13.242] Game Name: Last Epoch
[01:28:13.243] Game Developer: Eleventh Hour Games
[01:28:13.244] Unity Version: 2019.4.40f1
[01:28:13.245] Game Version: 0.9.2.6
[01:28:13.245] ------------------------------

[01:28:13.746] Preferences Loaded!

[01:28:13.765] Loading Plugins from 'C:\Program Files (x86)\Steam\steamapps\common\Last Epoch\Plugins'...
[01:28:13.766] 0 Plugins loaded.
[NewEntryPoint] PreStarting.
[01:28:27.073] [MelonStartScreen] Initializing...
[01:28:27.101] [MelonStartScreen] Using Start Screen Theme: "Default"
[01:28:28.894] Loading Il2CppAssemblyGenerator...
[01:28:28.907] [Il2CppAssemblyGenerator] Contacting RemoteAPI...
[01:28:29.151] [Il2CppAssemblyGenerator] Game Not Found on RemoteAPI Host ([Link])
[01:28:29.152] [Il2CppAssemblyGenerator] RemoteAPI.DumperVersion = null
[01:28:29.154] [Il2CppAssemblyGenerator] RemoteAPI.ObfuscationRegex = null
[01:28:29.156] [Il2CppAssemblyGenerator] RemoteAPI.MappingURL = null
[01:28:29.159] [Il2CppAssemblyGenerator] RemoteAPI.MappingFileSHA512 = null
[01:28:29.173] [Il2CppAssemblyGenerator] Using Dumper Version: 2022.1.0-pre-release.10
[01:28:29.173] [Il2CppAssemblyGenerator] Using Il2CppInterop Version = 1.4.5
[01:28:29.177] [Il2CppAssemblyGenerator] Using Unity Dependencies Version = 2019.4.40
[01:28:29.183] [Il2CppAssemblyGenerator] Using Deobfuscation Regex = null
[01:28:29.186] [Il2CppAssemblyGenerator] Cpp2IL is up to date.
[01:28:29.187] [Il2CppAssemblyGenerator] UnityDependencies is up to date.
[01:28:29.189] [Il2CppAssemblyGenerator] Checking GameAssembly...
[01:28:29.397] [Il2CppAssemblyGenerator] Assembly is up to date. No Generation Needed.
[NewEntryPoint] Starting.

[01:28:29.408] Loading Mods from 'C:\Program Files (x86)\Steam\steamapps\common\Last Epoch\Mods'...
[01:28:29.410] ------------------------------
[01:28:29.434] Melon Assembly loaded: '.\Mods\UnityLastEpoch_Mods.dll'
[01:28:29.434] SHA256 Hash: '7b3944b042d3a79f4b5d51c892b7a4f91b63f87de8575ddc83f1cf166b54b42a'

[01:28:29.558] Some Melons are missing dependencies, which you may have to install.
If these are optional dependencies, mark them as optional using the MelonOptionalDependencies attribute.
This warning will turn into an error and Melons with missing dependencies will not be loaded in the next version of MelonLoader.
- 'LastEpochMods' is missing the following dependencies:
- 'LE' v0.0.0.0
- 'UniTask' v0.0.0.0
- 'UnhollowerBaseLib' v0.4.18.0
[01:28:29.573] ------------------------------
[01:28:29.574] LastEpochMods v4.5.1
[01:28:29.574] by Ash
[01:28:29.575] Assembly: UnityLastEpoch_Mods.dll
[01:28:29.575] ------------------------------
[01:28:29.576] ------------------------------
[01:28:29.576] 1 Mod loaded.

[01:28:30.085] Registered mono type Il2CppInterop.Runtime.DelegateSupport+Il2CppToMonoDelegateReference in il2cpp domain
[01:28:30.112] Registered mono type MelonLoader.Support.MonoEnumeratorWrapper in il2cpp domain
[01:28:30.114] Registered mono type MelonLoader.Support.SM_Component in il2cpp domain
[01:28:30.125] Support Module Loaded: C:\Program Files (x86)\Steam\steamapps\common\Last Epoch\MelonLoader\Dependencies\SupportModules\Il2Cpp.dll
[01:28:30.133] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at System.Reflection.CustomAttribute._CreateCaObject(RuntimeModule pModule, RuntimeType type, IRuntimeMethodInfo pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs)
at System.Reflection.CustomAttribute.AddCustomAttributes(ListBuilder`1& attributes, RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1 derivedAttributes)
at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
at System.RuntimeType.GetCustomAttributes(Boolean inherit)
at HarmonyLib.HarmonyMethodExtensions.GetFromType(Type type)
at HarmonyLib.PatchClassProcessor..ctor(Harmony instance, Type type, Boolean allowUnannotatedType)
at HarmonyLib.PatchClassProcessor..ctor(Harmony instance, Type type)
at HarmonyLib.Harmony.CreateClassProcessor(Type type)
at HarmonyLib.Harmony.<PatchAll>b__11_0(Type type)
at HarmonyLib.CollectionExtensions.Do[T](IEnumerable`1 sequence, Action`1 action)
at HarmonyLib.Harmony.PatchAll(Assembly assembly)
at MelonLoader.MelonMod.HarmonyInit() in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\MelonMod.cs:line 40
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
Setting breakpad minidump AppID = 899770
SteamInternal_SetMinidumpSteamID: Caching Steam ID: 76561198326588493 [API loaded no]
[01:28:43.975] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'UnhollowerBaseLib, Version=0.4.22.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'UnhollowerBaseLib, Version=0.4.22.0, Culture=neutral, PublicKeyToken=null'
at UniverseLib.UniversalBehaviour.Setup()
at UniverseLib.Universe.Init(Single startupDelay, Action onInitialized, Action`2 logHandler, UniverseLibConfig config)
at LastEpochMods.Main.OnLateUpdate()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.151] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.153] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.448] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.449] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.537] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.539] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEvent.<>c.<Invoke>b__1_0(LemonAction x) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 174
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.607] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.609] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.616] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.616] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.672] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.673] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.681] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
[01:28:44.682] [LastEpochMods] System.IO.FileNotFoundException: Could not load file or assembly 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'LE, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at LastEpochMods.Mods.Items.HeadHunter.Ui.Update()
at LastEpochMods.Main.OnGUI()
at MelonLoader.MelonEventBase`1.Invoke(Action`1 delegateInvoker) in D:\a\MelonLoader\MelonLoader\MelonLoader\Melons\Events\MelonEvent.cs:line 143
Fatal error. Internal CLR error. (0x80131506)
at MonoMod.RuntimeDetour.Platforms.DetourRuntimeNETCore30Platform.CompileMethodHook(IntPtr, IntPtr, CORINFO_METHOD_INFO ByRef, UInt32, Byte* ByRef, UInt32 ByRef)

User avatar
Ash06
Expert Cheater
Expert Cheater
Posts: 246
Joined: Wed Oct 09, 2019 2:34 pm
Reputation: 117

Re: Last Epoch Save Editor

Post by Ash06 »

You have to use melonloader 5.7, See install instructions

Swerve
Noobzor
Noobzor
Posts: 11
Joined: Sat Jan 12, 2019 4:20 am
Reputation: 0

Re: Last Epoch Save Editor

Post by Swerve »

Thats what I get for doing this at 2 am. Thanks!

infinityinc
Noobzor
Noobzor
Posts: 13
Joined: Sat Oct 14, 2023 5:29 pm
Reputation: 0

Re: Last Epoch Save Editor

Post by infinityinc »

Could you PM a link for latest working save editor? Main page link is not working for me :( Thanks for your hard work.

Swerve
Noobzor
Noobzor
Posts: 11
Joined: Sat Jan 12, 2019 4:20 am
Reputation: 0

Re: Last Epoch Save Editor

Post by Swerve »

Can you still edit stats? If so how?

rnd
Noobzor
Noobzor
Posts: 5
Joined: Sat Mar 27, 2021 8:42 pm
Reputation: 3

Re: Last Epoch Save Editor

Post by rnd »

Ash06 wrote:
Thu Oct 12, 2023 9:50 pm
With UnityExplorer : [Link]
Use disable character movement Option from Mods, and add a movement ability in your bar in case you click T ^^
F7 to show UnityExplorer in game
Typically for a mutator, try with Class Filter = Skill Name ending by "Mutator" in Object Explorer
Image
As you can see, there are 2 objects found
The object we want to edit don't have the first two line egal to null (refs to PlayerAbilityList and actor)
Look for these variables :
- increaseDuration
- increaseRadius
Then look for others variables if you want more :p
Thank you very much for this wonderful explanation! Its really fun to mess with the game with UnityExplorer!
Is there any way to save changes made in UnityExplorer across game restarts? Maybe you can suggest me some guide/howto for dummies? Thank you!

User avatar
Ash06
Expert Cheater
Expert Cheater
Posts: 246
Joined: Wed Oct 09, 2019 2:34 pm
Reputation: 117

Re: Last Epoch Save Editor

Post by Ash06 »

rnd wrote:
Sat Oct 14, 2023 7:11 pm
Is there any way to save changes made in UnityExplorer across game restarts? Maybe you can suggest me some guide/howto for dummies?
According to UnityExplorer github ([Link]) :
C# Console
The C# Console uses the Mono.CSharp.Evaluator to define temporary classes or run immediate REPL code.
You can execute a script automatically on startup by naming it startup.cs and placing it in the sinai-dev-UnityExplorer\Scripts\ folder (this folder will be created where you placed the DLL file).

Exemple with FuryLeapMutator :
Image

Code: Select all

foreach (UnityEngine.Object obj in UniverseLib.RuntimeHelper.FindObjectsOfTypeAll(typeof(FuryLeapMutator)))
{
	FuryLeapMutator mutator = obj.TryCast<FuryLeapMutator>();
	if (mutator.actor != null)
	{
		mutator.addedLeech = 50;
		mutator.addedManaCost = 50;
		mutator.alwaysCritBelowHalfHealth = true;
		break;
	}
}
I wrote this code in less than 30 seconds with Visual Studio, doing the same in UnityExplorer can take much longer and you can easily make mistakes (all variables are case sensitive)
Image
In game Result : Copy code in C# Console then click on compile
Image

I prefer to use UnityExplorer (get pointer for Cheat Engine, get GameObjects for c#, ...), DnsSpy (search in assembly) and Ida (app logic) as tools for analytic only

Making a mod for Melonloader is like 5mn to setup ([Link]), and you can hook functions with initial setup because Melonloader contain Harmony ([Link]) (Searching for Objects take more ressources and time, so i prefer to use Hook functions with ref for what i need)

Actual Mod Hook code for Ability and AbilityMutator :

Code: Select all

using HarmonyLib;
using UniverseLib;

namespace LastEpochMods.Hooks
{
    public class Character_Mutator
    {
        [HarmonyPatch(typeof(CharacterMutator), "OnStartedUsingAbility")]
        public class OnStartedUsingAbility
        {
            [HarmonyPostfix]
            static void Postfix(CharacterMutator __instance, AbilityInfo __0, ref Ability __1, UnityEngine.Vector3 __2)
            {
                if ((Main.UniverseLibLoaded) && (Scenes.GameScene()))
                {
                    if (__1 != null)
                    {
                        //Main.logger_instance.Msg("Ability name = " + __1.abilityName); //Debug
                        if (Config.Data.mods_config.character.skills.Enable_channel_cost) { __1.channelCost = 0f; }
                        if (Config.Data.mods_config.character.skills.Enable_manaCost)
                        {
                            __1.manaCost = 0f;
                            __1.minimumManaCost = 0f;
                            __1.manaCostPerDistance = 0f;
                        }
                        if (Config.Data.mods_config.character.skills.Enable_noManaRegenWhileChanneling) { __1.noManaRegenWhileChanneling = false; }
                        if (Config.Data.mods_config.character.skills.Enable_stopWhenOutOfMana) { __1.stopWhenOutOfMana = false; }
                        if (Config.Data.mods_config.character.characterstats.Enable_attack_rate) { __1.speedMultiplier = Config.Data.mods_config.character.characterstats.attack_rate; }
                        if ((__1.moveOrAttackCompatible) && (__1.moveOrAttackFallback == Ability.MoveOrAttackFallback.Move))
                        {
                            if (Config.Data.mods_config.character.skills.Movements.Enable_NoTarget)
                            {
                                __1.playerRequiresTarget = false;
                                __1.requiredEnemyTargetMustBeAccessible = false;
                            }
                            if (Config.Data.mods_config.character.skills.Movements.Enable_ImmuneDuringMovement)
                            {
                                __1.immuneDuringMovement = true;
                                __1.cannotDieDuringMovement = true;
                            }
                            if (Config.Data.mods_config.character.skills.Movements.Disable_SimplePath)
                            {
                                __1.limitRangeForPlayers = false;
                                __1.requireSimplePath = false;
                            }
                        }

                        //Get Mutator
                        try
                        {
                            AbilityMutator ability_mutator = OnSceneChanged.Ability_Mutator.GetMutatorFromAbility(__1);
                            if (Config.Data.mods_config.character.skills.Enable_RemoveCooldown) { ability_mutator.RemoveCooldown(); }
                            System.Type type = ability_mutator.GetActualType();
                            //Main.logger_instance.Msg("Mutator type = " + type.ToString()); //Debug
                            //Fix Meteor Cost Mana
                            if (type == typeof(MeteorMutator))
                            {
                                if (Config.Data.mods_config.character.skills.Enable_manaCost)
                                {
                                    ability_mutator.TryCast<MeteorMutator>().addedManaCost = 0f;
                                }
                            }
                            //Acolyte
                            else if (type == typeof(TransplantMutator))
                            {
                                if (Config.Data.mods_config.character.skills.HealCost.Enable_Transplant)
                                {
                                    ability_mutator.TryCast<TransplantMutator>().moreHealthCost = -1;
                                }
                            }
                            else if (type == typeof(MarrowShardsMutator))
                            {
                                if (Config.Data.mods_config.character.skills.HealCost.Enable_MarrowShards)
                                {
                                    ability_mutator.TryCast<MarrowShardsMutator>().noHealthCost = true;
                                }
                            }
                            else if (type == typeof(ReaperFormMutator))
                            {
                                if (Config.Data.mods_config.character.skills.HealCost.Enable_ReaperForm)
                                {
                                    ability_mutator.TryCast<ReaperFormMutator>().increasedHealthDrainSpeed = -255;
                                }
                            }

                            //Companions
                            else if (type == typeof(SummonWolfMutator))
                            {
                                if (Config.Data.mods_config.character.companions.wolf.Enable_override_limit)
                                {
                                    ability_mutator.TryCast<SummonWolfMutator>().wolfLimit = Config.Data.mods_config.character.companions.wolf.summon_limit;
                                }
                            }
                            else if (type == typeof(SummonScorpionMutator))
                            {
                                if (Config.Data.mods_config.character.companions.scorpion.Enable_baby_quantity)
                                {
                                    SummonScorpionMutator mutator = ability_mutator.TryCast<SummonScorpionMutator>();
                                    mutator.babyScorpionQuantity = Config.Data.mods_config.character.companions.scorpion.baby_quantity;
                                    mutator.babyScorpionsToSpawnOnAbilityActivation = Config.Data.mods_config.character.companions.scorpion.baby_quantity;
                                    mutator.increasedBabySpawnRate = 1;
                                }
                            }

                            //Minions
                            else if (type == typeof(SummonSkeletonMutator))
                            {
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_additionalSkeletonsFromPassives)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().additionalSkeletonsFromPassives = Config.Data.mods_config.character.minions.skeleton.additionalSkeletonsFromPassives;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_additionalSkeletonsFromSkillTree)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().additionalSkeletonsFromSkillTree = Config.Data.mods_config.character.minions.skeleton.additionalSkeletonsFromSkillTree;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_additionalSkeletonsPerCast)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().additionalSkeletonsPerCast = Config.Data.mods_config.character.minions.skeleton.additionalSkeletonsPerCast;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_chanceToResummonOnDeath)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().chanceToResummonOnDeath = Config.Data.mods_config.character.minions.skeleton.chanceToResummonOnDeath;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_forceArcher)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceBrawler = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceRogue = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceWarrior = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceArcher = true;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_forceBrawler)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceRogue = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceWarrior = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceArcher = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceBrawler = true;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_forceRogue)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceWarrior = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceArcher = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceBrawler = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceRogue = true;
                                }
                                if (Config.Data.mods_config.character.minions.skeleton.Enable_forceWarrior)
                                {
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceArcher = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceBrawler = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceRogue = false;
                                    ability_mutator.TryCast<SummonSkeletonMutator>().forceWarrior = true;
                                }
                            }
                            else if (type == typeof(SummonWraithMutator))
                            {
                                if (Config.Data.mods_config.character.minions.wraith.Enable_additionalMaxWraiths)
                                {
                                    ability_mutator.TryCast<SummonWraithMutator>().additionalMaxWraiths = Config.Data.mods_config.character.minions.wraith.additionalMaxWraiths;
                                }
                                if (Config.Data.mods_config.character.minions.wraith.Enable_delayedWraiths)
                                {
                                    ability_mutator.TryCast<SummonWraithMutator>().delayedWraiths = Config.Data.mods_config.character.minions.wraith.delayedWraiths; //Wraiths per cast
                                }
                                if (Config.Data.mods_config.character.minions.wraith.Enable_limitedTo2Wraiths)
                                {
                                    ability_mutator.TryCast<SummonWraithMutator>().limitedTo2Wraiths = false;
                                }
                                if (Config.Data.mods_config.character.minions.wraith.Enable_wraithsDoNotDecay)
                                {
                                    ability_mutator.TryCast<SummonWraithMutator>().wraithsDoNotDecay = true;
                                }
                                if (Config.Data.mods_config.character.minions.wraith.Enable_increasedCastSpeed)
                                {
                                    ability_mutator.TryCast<SummonWraithMutator>().increasedCastSpeed = Config.Data.mods_config.character.minions.wraith.increasedCastSpeed;
                                }
                            }
                            else if (type == typeof(SummonMageMutator))
                            {
                                if (Config.Data.mods_config.character.minions.mage.Enable_additionalSkeletonsFromItems)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().additionalSkeletonsFromItems = Config.Data.mods_config.character.minions.mage.additionalSkeletonsFromItems;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_additionalSkeletonsFromPassives)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().additionalSkeletonsFromPassives = Config.Data.mods_config.character.minions.mage.additionalSkeletonsFromPassives;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_additionalSkeletonsFromSkillTree)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().additionalSkeletonsFromSkillTree = Config.Data.mods_config.character.minions.mage.additionalSkeletonsFromSkillTree;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_additionalSkeletonsPerCast)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().additionalSkeletonsPerCast = Config.Data.mods_config.character.minions.mage.additionalSkeletonsPerCast;
                                }
                                /*if (Config.Data.mods_config.character.minions.mage.Enable_onlySummonOneMage)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().onlySummonOneMage = false;                                
                                }*/
                                if (Config.Data.mods_config.character.minions.mage.Enable_singleSummon)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().singleSummon = false;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_forceCryomancer)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().forceDeathKnight = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forcePyromancer = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forceNoCryo = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forceCryomancer = true;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_forceDeathKnight)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().forcePyromancer = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forceCryomancer = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forceDeathKnight = true;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_forcePyromancer)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().forceCryomancer = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forceDeathKnight = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forceNoPyro = false;
                                    ability_mutator.TryCast<SummonMageMutator>().forcePyromancer = true;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_chanceForTwoExtraProjectiles)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().chanceForTwoExtraProjectiles = Config.Data.mods_config.character.minions.mage.chanceForTwoExtraProjectiles;
                                }
                                if (Config.Data.mods_config.character.minions.mage.Enable_doubleProjectiles)
                                {
                                    ability_mutator.TryCast<SummonMageMutator>().doubleProjectiles = true;
                                }
                                //ability_mutator.TryCast<SummonMageMutator>().additionalWarlords = 50;
                            }
                            else if (type == typeof(SummonBoneGolemMutator))
                            {
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_selfResurrectChance)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().selfResurrectChance = Config.Data.mods_config.character.minions.bone_golem.selfResurrectChance;
                                }
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_increasedFireAuraArea)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().increasedFireAuraArea = Config.Data.mods_config.character.minions.bone_golem.increasedFireAuraArea;
                                }
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_increasedMoveSpeed)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().increasedMoveSpeed = Config.Data.mods_config.character.minions.bone_golem.increasedMoveSpeed;
                                }
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_twins)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().twins = true;
                                }
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_hasSlamAttack)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().hasSlamAttack = true;
                                }
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_undeadArmorAura)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().undeadArmorAura = Config.Data.mods_config.character.minions.bone_golem.undeadArmorAura;
                                }
                                if (Config.Data.mods_config.character.minions.bone_golem.Enable_undeadMovespeedAura)
                                {
                                    ability_mutator.TryCast<SummonBoneGolemMutator>().undeadMovespeedAura = Config.Data.mods_config.character.minions.bone_golem.undeadMovespeedAura;
                                }
                            }
                            else if (type == typeof(SummonVolatileZombieMutator))
                            {
                                if (Config.Data.mods_config.character.minions.volatile_zombie.Enable_chanceToCastFromMinionDeath)
                                {
                                    ability_mutator.TryCast<SummonVolatileZombieMutator>().chanceToCastFromMinionDeath = Config.Data.mods_config.character.minions.volatile_zombie.chanceToCastFromMinionDeath;
                                }
                                if (Config.Data.mods_config.character.minions.volatile_zombie.Enable_chanceToCastInfernalShadeOnDeath)
                                {
                                    ability_mutator.TryCast<SummonVolatileZombieMutator>().chanceToCastInfernalShadeOnDeath = Config.Data.mods_config.character.minions.volatile_zombie.chanceToCastInfernalShadeOnDeath;
                                }
                                if (Config.Data.mods_config.character.minions.volatile_zombie.Enable_chanceToCastMarrowShardsOnDeath)
                                {
                                    ability_mutator.TryCast<SummonVolatileZombieMutator>().chanceToCastMarrowShardsOnDeath = Config.Data.mods_config.character.minions.volatile_zombie.chanceToCastMarrowShardsOnDeath;
                                }
                            }
                            else if (type == typeof(DreadShadeMutator))
                            {
                                if (Config.Data.mods_config.character.minions.dread_shade.Enable_DisableLimit)
                                {
                                    ability_mutator.TryCast<DreadShadeMutator>().limitTo1DreadShade = false;
                                }
                                if (Config.Data.mods_config.character.minions.dread_shade.Enable_Duration)
                                {
                                    ability_mutator.TryCast<DreadShadeMutator>().increasedDuration = Config.Data.mods_config.character.minions.dread_shade.Duration;
                                }
                                if (Config.Data.mods_config.character.minions.dread_shade.Enable_DisableHealthDrain)
                                {
                                    ability_mutator.TryCast<DreadShadeMutator>().noHealthDrain = true;
                                }
                                if (Config.Data.mods_config.character.minions.dread_shade.Enable_Max)
                                {
                                    ability_mutator.TryCast<DreadShadeMutator>().addedMaxShades = Config.Data.mods_config.character.minions.dread_shade.max;
                                }
                                if (Config.Data.mods_config.character.minions.dread_shade.Enable_ReduceDecay)
                                {
                                    ability_mutator.TryCast<DreadShadeMutator>().reducedDecayRate = Config.Data.mods_config.character.minions.dread_shade.decay;
                                }
                                if (Config.Data.mods_config.character.minions.dread_shade.Enable_Radius)
                                {
                                    ability_mutator.TryCast<DreadShadeMutator>().increasedRadius = Config.Data.mods_config.character.minions.dread_shade.radius;
                                }
                            }
                        }
                        catch { }
                    }
                }
            }
        }
    }
}
Last edited by Ash06 on Sun Oct 15, 2023 12:22 am, edited 3 times in total.

Swifty2453
What is cheating?
What is cheating?
Posts: 4
Joined: Sun Apr 02, 2023 3:38 am
Reputation: 0

Re: Last Epoch Save Editor

Post by Swifty2453 »

New user, I messed around with monolith progress and messed my hero up. Getting "JsonToken EndArray is not valid for closing Jsontype Object. Path 'monolithRuns(0)'.line 1, position 6523.

Every time I run editor when I click Character I get this error. How to resolve, also the char is not showing in game or in editor which is fine but would like to remove error.

User avatar
Ash06
Expert Cheater
Expert Cheater
Posts: 246
Joined: Wed Oct 09, 2019 2:34 pm
Reputation: 117

Re: Last Epoch Save Editor

Post by Ash06 »

Swifty2453 wrote:
Sat Oct 14, 2023 11:46 pm
but would like to remove error.
Make an archive with Winzip or Winrar (password protect them) of your Save Folder (C:\Users\YourUser\AppData\LocalLow\Eleventh Hour Games\Last Epoch\Saves)
Upload here

Swifty2453
What is cheating?
What is cheating?
Posts: 4
Joined: Sun Apr 02, 2023 3:38 am
Reputation: 0

Re: Last Epoch Save Editor

Post by Swifty2453 »

I think I did it right. How do I give you Password?

Password: ashty
Attachments
Saves.rar
(204.52 KiB) Downloaded 160 times
Last edited by Swifty2453 on Sun Oct 15, 2023 12:32 am, edited 1 time in total.

Post Reply

Who is online

Users browsing this forum: No registered users