feat: eating toggle is now functional
added a harmony transpiler to replace check for ThingDef.surfaceType with bool EatableComp.EatableFrom
This commit is contained in:
parent
c298657f6f
commit
180891f7aa
3 changed files with 114 additions and 0 deletions
83
Source/TTHarmony.cs
Normal file
83
Source/TTHarmony.cs
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
Copyright 2025 Maciej Pawłowski
|
||||||
|
|
||||||
|
This file is part of "Table Eating Toggle".
|
||||||
|
|
||||||
|
"Table Eating Toggle" is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
"Table Eating Toggle" is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with "Table Eating Toggle". If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Reflection.Emit;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using HarmonyLib;
|
||||||
|
using RimWorld;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace TableToggle;
|
||||||
|
|
||||||
|
[HarmonyPatch]
|
||||||
|
public static class BaseChairValidator_Patch
|
||||||
|
{
|
||||||
|
[HarmonyTranspiler]
|
||||||
|
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
||||||
|
{
|
||||||
|
CodeMatcher codeMatcher = new(instructions, generator);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
codeMatcher.Start();
|
||||||
|
codeMatcher.MatchStartForward(
|
||||||
|
[
|
||||||
|
CodeMatch.LoadsField(typeof(Thing).GetField(nameof(Thing.def))),
|
||||||
|
CodeMatch.LoadsField(typeof(ThingDef).GetField(nameof(ThingDef.surfaceType))),
|
||||||
|
CodeMatch.LoadsConstant(),
|
||||||
|
CodeMatch.Branches()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
.ThrowIfInvalid("Could not find SurfaceType check");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Error(e.Message);
|
||||||
|
return instructions;
|
||||||
|
}
|
||||||
|
CodeInstruction[] replace = [
|
||||||
|
new(OpCodes.Call, AccessTools.Method(typeof(ThingWithComps), nameof(ThingWithComps.GetComp), null, [typeof(EatableComp)])),
|
||||||
|
new(OpCodes.Stloc_3),
|
||||||
|
new(OpCodes.Ldloc_3),
|
||||||
|
new(OpCodes.Brfalse_S, (Label)codeMatcher.InstructionAt(3).operand),
|
||||||
|
new(OpCodes.Ldloc_3),
|
||||||
|
new(OpCodes.Ldfld, typeof(EatableComp).GetField(nameof(EatableComp.EatableFrom))),
|
||||||
|
new(OpCodes.Brfalse_S, (Label)codeMatcher.InstructionAt(3).operand)
|
||||||
|
];
|
||||||
|
codeMatcher.RemoveInstructions(4);
|
||||||
|
codeMatcher.Insert(replace);
|
||||||
|
return codeMatcher.Instructions().AsEnumerable();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyTargetMethod]
|
||||||
|
private static MethodBase TargetMethod()
|
||||||
|
{
|
||||||
|
MethodInfo method = typeof(Toils_Ingest).GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
|
||||||
|
.FirstOrDefault(m => m.GetCustomAttribute<CompilerGeneratedAttribute>() != null && Regex.IsMatch(m.Name, $@"^<CarryIngestibleToChewSpot>g__BaseChairValidator\|\d+(_\d+)?"));
|
||||||
|
|
||||||
|
if (method is not null) return method;
|
||||||
|
|
||||||
|
IEnumerable<Type> nestedTypes = typeof(Toils_Ingest).GetNestedTypes(BindingFlags.NonPublic).Where(t => t.GetCustomAttribute<CompilerGeneratedAttribute>() != null);
|
||||||
|
foreach(Type nested in nestedTypes)
|
||||||
|
{
|
||||||
|
method = nested.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(m => Regex.IsMatch(m.Name, $@"^<CarryIngestibleToChewSpot>g__BaseChairValidator\|\d+(_\d+)?"));
|
||||||
|
if (method is not null) return method;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Building.GetComp<EatableComp>().EatableFrom
|
||||||
|
}
|
27
Source/TableToggle.cs
Normal file
27
Source/TableToggle.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
Copyright 2025 Maciej Pawłowski
|
||||||
|
|
||||||
|
This file is part of "Table Eating Toggle".
|
||||||
|
|
||||||
|
"Table Eating Toggle" is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
"Table Eating Toggle" is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with "Table Eating Toggle". If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using HarmonyLib;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace TableToggle;
|
||||||
|
|
||||||
|
[StaticConstructorOnStartup]
|
||||||
|
public static class TableToggle
|
||||||
|
{
|
||||||
|
static TableToggle()
|
||||||
|
{
|
||||||
|
Harmony harmony = new("maciek.tabletoggle");
|
||||||
|
harmony.PatchAll();
|
||||||
|
Log.Message("Table Eating Toggle initialised");
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,6 +40,10 @@ You should have received a copy of the GNU General Public License along with "Ta
|
||||||
<HintPath>../../../RimWorldLinux_Data/Managed/UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>../../../RimWorldLinux_Data/Managed/UnityEngine.CoreModule.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="0Harmony.dll">
|
||||||
|
<HintPath>../../2009463077/Current/Assemblies/0Harmony.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue