Fix mod for new game version

This commit is contained in:
Guus Waals 2024-01-06 11:59:17 +01:00
parent 347a838704
commit 54b75a869d
3 changed files with 72 additions and 52 deletions

View File

@ -1,14 +1,18 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
using System;
using HarmonyLib; using HarmonyLib;
using KMod; using KMod;
namespace PriorityUX { namespace PriorityUX
{
[HarmonyDebug] [HarmonyDebug]
[HarmonyPatch(typeof(Deconstructable))] [HarmonyPatch(typeof(Deconstructable))]
public class DeconstructablePatches { public class DeconstructablePatches
public static PrioritySetting getChorePriority() { {
public static PrioritySetting getChorePriority()
{
Debug.Log("Getting deconstruct chore priority"); Debug.Log("Getting deconstruct chore priority");
if (Options.Instance.deconstructInheritPriority) if (Options.Instance.deconstructInheritPriority)
return Utils.getLastPriority(); return Utils.getLastPriority();
@ -16,59 +20,63 @@ namespace PriorityUX {
return Utils.getDefaultPriority(); return Utils.getDefaultPriority();
} }
[HarmonyPatch(new Type[] { typeof(bool) })]
[HarmonyPatch("QueueDeconstruction")] [HarmonyPatch("QueueDeconstruction")]
[HarmonyPostfix] [HarmonyPostfix]
static void QueueDeconstruction_Postfix(Deconstructable __instance) { static void QueueDeconstruction_Postfix(Deconstructable __instance)
{
Prioritizable prioritizable = __instance.GetComponent<Prioritizable>(); Prioritizable prioritizable = __instance.GetComponent<Prioritizable>();
if (prioritizable != null) { if (prioritizable != null)
{
Debug.Log("Updating deconstruct priority"); Debug.Log("Updating deconstruct priority");
prioritizable.SetMasterPriority(getChorePriority()); prioritizable.SetMasterPriority(getChorePriority());
} }
} }
/*
[HarmonyPatch("QueueDeconstruction")]
[HarmonyTranspiler]
static IEnumerable<CodeInstruction> QueueDeconstruction_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator ilGenerator) {
Harmony.DEBUG = true;
var priorityLocal = ilGenerator.DeclareLocal(typeof(int)); /*
var priorityClassLocal = ilGenerator.DeclareLocal(typeof(PriorityScreen.PriorityClass)); [HarmonyPatch("QueueDeconstruction")]
var tmpLocal0 = ilGenerator.DeclareLocal(typeof(int)); [HarmonyTranspiler]
var tmpLocal1 = ilGenerator.DeclareLocal(typeof(int)); static IEnumerable<CodeInstruction> QueueDeconstruction_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator ilGenerator) {
yield return CodeInstruction.Call(typeof(DeconstructablePatches), nameof(getChorePriority)); Harmony.DEBUG = true;
yield return new CodeInstruction(OpCodes.Dup);
// yield return new CodeInstruction(OpCodes.Pop);
// yield return new CodeInstruction(OpCodes.Pop);
yield return CodeInstruction.LoadField(typeof(PrioritySetting), nameof(PrioritySetting.priority_value));
yield return new CodeInstruction(OpCodes.Stloc, priorityLocal.LocalIndex);
yield return CodeInstruction.LoadField(typeof(PrioritySetting), nameof(PrioritySetting.priority_class));
yield return new CodeInstruction(OpCodes.Stloc, priorityClassLocal.LocalIndex);
ConstructorInfo choreConstructor = typeof(WorkChore<Deconstructable>).GetConstructors()[0]; var priorityLocal = ilGenerator.DeclareLocal(typeof(int));
// FieldInfo field = typeof(Deconstructable).GetField(nameof(Deconstructable.chore)); var priorityClassLocal = ilGenerator.DeclareLocal(typeof(PriorityScreen.PriorityClass));
foreach (var instruction in instructions) { var tmpLocal0 = ilGenerator.DeclareLocal(typeof(int));
// IL_0087: ldc.i4.1 var tmpLocal1 = ilGenerator.DeclareLocal(typeof(int));
// IL_0088: ldc.i4.0 // priority_class yield return CodeInstruction.Call(typeof(DeconstructablePatches), nameof(getChorePriority));
// IL_0089: ldc.i4.5 // priority_value yield return new CodeInstruction(OpCodes.Dup);
// IL_008a: ldc.i4.1 // yield return new CodeInstruction(OpCodes.Pop);
// IL_008b: ldc.i4.1 // yield return new CodeInstruction(OpCodes.Pop);
// IL_008c: newobj instance void class WorkChore`1<class Deconstructable>::.ctor(class ChoreType, class ['Assembly-CSharp-firstpass']IStateMachineTarget, class ChoreProvider, bool, class [mscorlib]System.Action`1<class Chore>, class [mscorlib]System.Action`1<class Chore>, class [mscorlib]System.Action`1<class Chore>, bool, class ScheduleBlockType, bool, bool, class ['Assembly-CSharp-firstpass']KAnimFile, bool, bool, bool, valuetype PriorityScreen/PriorityClass, int32, bool, bool) yield return CodeInstruction.LoadField(typeof(PrioritySetting), nameof(PrioritySetting.priority_value));
// IL_0091: stfld class Chore Deconstructable::chore yield return new CodeInstruction(OpCodes.Stloc, priorityLocal.LocalIndex);
if (instruction.OperandIs(choreConstructor)) { yield return CodeInstruction.LoadField(typeof(PrioritySetting), nameof(PrioritySetting.priority_class));
Debug.Log("PATCHING CHORE CONSTRUCTOR\n" + System.Environment.StackTrace); yield return new CodeInstruction(OpCodes.Stloc, priorityClassLocal.LocalIndex);
yield return new CodeInstruction(OpCodes.Stloc, tmpLocal1.LocalIndex);
yield return new CodeInstruction(OpCodes.Stloc, tmpLocal0.LocalIndex); ConstructorInfo choreConstructor = typeof(WorkChore<Deconstructable>).GetConstructors()[0];
yield return new CodeInstruction(OpCodes.Pop); // FieldInfo field = typeof(Deconstructable).GetField(nameof(Deconstructable.chore));
yield return new CodeInstruction(OpCodes.Pop); foreach (var instruction in instructions) {
yield return new CodeInstruction(OpCodes.Ldloc, priorityClassLocal.LocalIndex); // IL_0087: ldc.i4.1
yield return new CodeInstruction(OpCodes.Ldloc, priorityLocal.LocalIndex); // IL_0088: ldc.i4.0 // priority_class
yield return new CodeInstruction(OpCodes.Ldloc, tmpLocal0.LocalIndex); // IL_0089: ldc.i4.5 // priority_value
yield return new CodeInstruction(OpCodes.Ldloc, tmpLocal1.LocalIndex); // IL_008a: ldc.i4.1
// IL_008b: ldc.i4.1
// IL_008c: newobj instance void class WorkChore`1<class Deconstructable>::.ctor(class ChoreType, class ['Assembly-CSharp-firstpass']IStateMachineTarget, class ChoreProvider, bool, class [mscorlib]System.Action`1<class Chore>, class [mscorlib]System.Action`1<class Chore>, class [mscorlib]System.Action`1<class Chore>, bool, class ScheduleBlockType, bool, bool, class ['Assembly-CSharp-firstpass']KAnimFile, bool, bool, bool, valuetype PriorityScreen/PriorityClass, int32, bool, bool)
// IL_0091: stfld class Chore Deconstructable::chore
if (instruction.OperandIs(choreConstructor)) {
Debug.Log("PATCHING CHORE CONSTRUCTOR\n" + System.Environment.StackTrace);
yield return new CodeInstruction(OpCodes.Stloc, tmpLocal1.LocalIndex);
yield return new CodeInstruction(OpCodes.Stloc, tmpLocal0.LocalIndex);
yield return new CodeInstruction(OpCodes.Pop);
yield return new CodeInstruction(OpCodes.Pop);
yield return new CodeInstruction(OpCodes.Ldloc, priorityClassLocal.LocalIndex);
yield return new CodeInstruction(OpCodes.Ldloc, priorityLocal.LocalIndex);
yield return new CodeInstruction(OpCodes.Ldloc, tmpLocal0.LocalIndex);
yield return new CodeInstruction(OpCodes.Ldloc, tmpLocal1.LocalIndex);
yield return instruction;
continue;
}
yield return instruction; yield return instruction;
continue;
} }
yield return instruction; } */
}
} */
} }
} }

View File

@ -12,10 +12,20 @@ namespace PriorityUX {
public static LocString TOOLTIP = "Used for reset and as a default priority"; public static LocString TOOLTIP = "Used for reset and as a default priority";
public static LocString CATEGORY = "Tweaks"; public static LocString CATEGORY = "Tweaks";
} }
public static class ENABLEPRIORITYHOTKEYSEVERYWHERE { public static class ENABLEKEYSFORBUILDING {
public static LocString NAME = "Enable priority keys everywhere"; public static LocString NAME = "Enable priority keys in the build menu";
public static LocString TOOLTIP = "Allows the 1-9 keys to select priority for all tools. Close the tool to open the building menus."; public static LocString TOOLTIP = "Allows the 1-9 keys to select priority in the building menu. Close the tool to open the building menus.";
public static LocString CATEGORY = "Tweaks"; public static LocString CATEGORY = "Toggles";
}
public static class DECONSTRUCTINHERITPRIORITY {
public static LocString NAME = "Use last priority for deconstruction";
public static LocString TOOLTIP = "Use the last priority for deconstruction. If disabled, the default priority will be used every time the menu is opened.";
public static LocString CATEGORY = "Toggles";
}
public static class ENABLEKEYSFORALLTOOLS {
public static LocString NAME = "Enable priority keys for all tools";
public static LocString TOOLTIP = "Will enable the 1-9 keys for all tools.";
public static LocString CATEGORY = "Toggles";
} }
} }
} }

View File

@ -6,10 +6,12 @@ ROOT=$( cd "$(dirname "$0")" ; pwd -P )
pushd $ROOT pushd $ROOT
# Do the build (need to use mono) # Do the build (need to use mono)
$msbuild # $msbuild
$msbuild -p:Configuration=Release
set -x set -x
rm -rf dist rm -rf dist
mkdir dist mkdir dist
cp bin/Debug/net48/oni-prio.dll dist/ # cp bin/Debug/net48/oni-prio.dll dist/
cp bin/Release/net48/oni-prio.dll dist/
cp -r meta/* dist/ cp -r meta/* dist/