Skip to content

Instantly share code, notes, and snippets.

View pardeike's full-sized avatar
💭
Innovating 🛠

Andreas Pardeike pardeike

💭
Innovating 🛠
View GitHub Profile
@pardeike
pardeike / Dilute.cs
Created April 19, 2024 14:58
Expanding an image with a brush
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;
using Image = SixLabors.ImageSharp.Image;
using SixLabors.ImageSharp.Formats.Png;
class Program
{
static readonly PngEncoder encoder = new()
{
@pardeike
pardeike / TwoTranspilersDoingTheSame.cs
Created April 7, 2024 22:29
How infixes will be better than transpilers
public static readonly StringBuilder buffer = new StringBuilder();
void Main()
{
// first mod adds transpiler
Console.WriteLine("// APPLYING PATCH 1");
var h1 = new Harmony("test1");
h1.CreateClassProcessor(typeof(Patch1)).Patch();
// second mod adds transpiler
@pardeike
pardeike / LINQPad_Harmony2.3.3.cs
Created March 29, 2024 14:15
Changes in Harmony 2.3.3
void Main()
{
Test.Run();
var harmony = new Harmony("test");
harmony.PatchCategory("category1");
Test.Run();
harmony.PatchCategory("category2");
Test.Run();
@pardeike
pardeike / finalizers.cs
Created March 26, 2024 22:41
Multiple Finalizers seems broken
void Main()
{
var harmony = new Harmony("test");
Harmony.DEBUG = true;
harmony.PatchAll();
Class.Test();
}
[HarmonyPriority(Priority.High)]
[HarmonyPatch(typeof(Class), nameof(Class.Test))]
@pardeike
pardeike / innerfix.cs
Last active February 4, 2024 23:45
Harmony: A draft of how to patch inner methods with so called infixes
static void Main(string[] args)
{
var test = new Test();
Console.WriteLine($"--> OriginalMethod={test.OriginalMethod(0, "foobartest")}");
Console.WriteLine("");
Console.WriteLine($"--> OriginalMethod={test.OriginalMethod(123, "foobartest")}");
Console.WriteLine("");
// patching would happen here
@pardeike
pardeike / FilterBlockTest.cs
Created January 14, 2024 23:33
Creating a filter clause in Cecil
/*
The following code creates this class:
using System;
public static void Method1()
{
try
{
Console.WriteLine("code");
}
@pardeike
pardeike / DynamicWorkTypes.cs
Last active October 2, 2023 18:37
Some helper for RimWorld mods to add and remove work types at runtime
using HarmonyLib;
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using Verse;
namespace Brrainz
{
[StaticConstructorOnStartup]
@pardeike
pardeike / InstallMod.bat
Created August 16, 2023 19:26
Mod build and install script
REM ################ Mod build and install script (c) Andreas Pardeike 2020 ################
REM
REM Call this script from Visual Studio's Build Events post-build event command line box:
REM "$(ProjectDir)Install.bat" $(ConfigurationName) "$(ProjectDir)" "$(ProjectName)" "About Assemblies Languages Textures v1.1" "LoadFolders.xml"
REM
REM The project structure should look like this:
REM
REM Modname
REM +- .git
REM +- .vs
@pardeike
pardeike / Debouncer.cs
Last active August 4, 2023 10:20
A debouncer for RimWorld modding - delaying actions to a global tick method if necessary
using System;
using System.Collections.Generic;
using HarmonyLib;
using Verse;
public class Debouncer
{
private Debouncer() { }
private readonly int tickThrottle;
private readonly bool onlyWhenRunning;
@pardeike
pardeike / DoMainMenuControls.txt
Created June 1, 2023 18:59
MainMenuDrawer::DoMainMenuControls IL
### Patch: static System.Void RimWorld.MainMenuDrawer::DoMainMenuControls(UnityEngine.Rect rect, System.Boolean anyMapFiles)
### Replacement: static System.Void RimWorld.MainMenuDrawer::RimWorld.MainMenuDrawer.DoMainMenuControls_Patch0(UnityEngine.Rect rect, System.Boolean anyMapFiles)
IL_0000: Local var 0: UnityEngine.Rect
IL_0000: Local var 1: UnityEngine.Rect
IL_0000: Local var 2: System.Collections.Generic.List`1<Verse.ListableOption>
IL_0000: Local var 3: Verse.ListableOption
IL_0000: Local var 4: System.String
IL_0000: Local var 5: System.Action
IL_0000: Local var 6: System.Action
IL_0000: Local var 7: System.Collections.Generic.List`1<Verse.ListableOption>