Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2016
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using RimWorld;
  3. using Verse;
  4. using UnityEngine;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9.  
  10. namespace MyRimworldMod
  11. {
  12.     [StaticConstructorOnStartup]
  13.     internal static class DetourInjector
  14.     {
  15.         private static Assembly Assembly => Assembly.GetAssembly(typeof(DetourInjector));
  16.  
  17.         private static string AssemblyName => Assembly.FullName.Split(',').First();
  18.  
  19.         static DetourInjector()
  20.         {
  21.             LongEventHandler.QueueLongEvent(Inject, "Initializing", true, null);
  22.         }
  23.  
  24.         private static void Inject()
  25.         {
  26.             if (DoInject())
  27.                 Log.Message(AssemblyName + " injected.");
  28.             else
  29.                 Log.Error(AssemblyName + " failed to get injected properly.");
  30.         }
  31.  
  32.         private const BindingFlags UniversalBindingFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
  33.  
  34.         private static bool DoInject()
  35.         {
  36.             // Detour the DropBloodFilth method
  37.             // First MethodInfo is source method to detour
  38.             // Second MethodInfo is our method taking its place
  39.             MethodInfo Verse_PawnHealthTracker_DropBloodFilth = typeof(Verse.Pawn_HealthTracker).GetMethod("DropBloodFilth");
  40.             MethodInfo MyRimworldMod_DropBloodOverride_DropBloodFilth = typeof(MyDetours).GetMethod("_DropBloodFilth");
  41.             if (!Detours.TryDetourFromTo(Verse_PawnHealthTracker_DropBloodFilth, MyRimworldMod_MyDetours_DropBloodFilth)){
  42.                 ErrorDetouring("Pawn_HealthTracker.DropBloodFilth method");
  43.                 return false;
  44.             }
  45.  
  46.             // You can do as many detours as you like.
  47.  
  48.             // All our detours must have succeeded. Hooray!
  49.             return true;
  50.         }
  51.  
  52.         // Just saves some writing for throwing errors on failed detours
  53.         internal static void ErrorDetouring(string classmethod){
  54.             Log.Error("Failed to inject " + classmethod + " detour!");
  55.         }
  56.     }
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement