Browse Source

Simplify decensor further

ghorsington 4 years ago
parent
commit
9f7827c736
1 changed files with 28 additions and 27 deletions
  1. 28 27
      NeighUncensorPatcher.cs

+ 28 - 27
NeighUncensorPatcher.cs

@@ -5,6 +5,7 @@ using System.Reflection;
 using Mono.Cecil;
 using Mono.Cecil.Cil;
 using UnityEngine;
+using Object = UnityEngine.Object;
 
 namespace COM3D2.NeighUncensor.Patcher
 {
@@ -12,11 +13,11 @@ namespace COM3D2.NeighUncensor.Patcher
     {
         public static readonly string[] TargetAssemblyNames = { "Assembly-CSharp.dll", "UnityEngine.dll" };
 
-        private static Dictionary<string, Action<AssemblyDefinition, TypeDefinition>> patches = new Dictionary<string, Action<AssemblyDefinition, TypeDefinition>>
-        {
-            ["Assembly-CSharp"] = PatchAssemblyCSharp,
-            ["UnityEngine"] = PatchUnityEngine
-        };
+        private static readonly Dictionary<string, Action<AssemblyDefinition, TypeDefinition>> patches =
+            new Dictionary<string, Action<AssemblyDefinition, TypeDefinition>>
+            {
+                ["Assembly-CSharp"] = PatchAssemblyCSharp, ["UnityEngine"] = PatchUnityEngine
+            };
 
         public static void Patch(AssemblyDefinition ad)
         {
@@ -39,21 +40,22 @@ namespace COM3D2.NeighUncensor.Patcher
                 ins.OpCode = OpCodes.Nop;
                 il.InsertAfter(ins, il.Create(OpCodes.Ret));
                 il.InsertAfter(ins, il.Create(OpCodes.Call, mRef));
-                if(passInstance)
+                if (passInstance)
                     il.InsertAfter(ins, il.Create(OpCodes.Ldarg_0));
             }
         }
 
         private static void PatchAssemblyCSharp(AssemblyDefinition ad, TypeDefinition hooks)
         {
-            var tBody = ad.MainModule.GetType("TBody");
+            var bgMgr = ad.MainModule.GetType("BgMgr");
             var importCM = ad.MainModule.GetType("ImportCM");
 
-            var fixMaskFlag = tBody.Methods.FirstOrDefault(m => m.Name == "FixMaskFlag");
-            PatchPostfix(fixMaskFlag, hooks.Methods.FirstOrDefault(m => m.Name == nameof(Hooks.PostFixMaskFlag)), true);
+            var createAssetBundle = bgMgr.Methods.FirstOrDefault(m => m.Name == "CreateAssetBundle");
+            PatchPostfix(createAssetBundle,
+                         hooks.Methods.FirstOrDefault(m => m.Name == nameof(Hooks.PostCreateAssetBundle)));
 
-            var loadSkinMeshR = importCM.Methods.FirstOrDefault(m => m.Name == "LoadSkinMesh_R");
-            PatchPostfix(loadSkinMeshR, hooks.Methods.FirstOrDefault(m => m.Name == nameof(Hooks.PostLoadMesh)));
+            var readMaterial = importCM.Methods.FirstOrDefault(m => m.Name == "ReadMaterial");
+            PatchPostfix(readMaterial, hooks.Methods.FirstOrDefault(m => m.Name == nameof(Hooks.PostReadMaterial)));
         }
 
         private static void PatchUnityEngine(AssemblyDefinition ad, TypeDefinition hooks)
@@ -70,20 +72,28 @@ namespace COM3D2.NeighUncensor.Patcher
 
     public static class Hooks
     {
-        private static object diffuse;
+        private static object replacement;
 
-        public static void PostFixMaskFlag(TBody tbody)
+        public static Material PostReadMaterial(Material result)
         {
-            tbody.goSlot[(int)TBody.hashSlotName["moza"]].boVisible = false;
+            if (result.shader?.name.ToLowerInvariant().Contains("mosaic") ?? false)
+            {
+                if (replacement == null)
+                    replacement = Shader.Find("Unlit/Transparent");
+                result.shader = (Shader)replacement;
+                result.renderQueue = 0;
+            }
+
+            return result;
         }
 
-        public static GameObject PostLoadMesh(GameObject result)
+        public static GameObject PostCreateAssetBundle(GameObject result)
         {
             TryUncensor(result);
             return result;
         }
 
-        public static UnityEngine.Object OnResourceLoad(UnityEngine.Object result)
+        public static Object OnResourceLoad(Object result)
         {
             if (result is GameObject go)
                 TryUncensor(go);
@@ -99,16 +109,7 @@ namespace COM3D2.NeighUncensor.Patcher
             if (smr == null || smr.materials == null)
                 return;
             foreach (var mm in smr.materials)
-            {
-                if (mm.shader?.name.ToLowerInvariant().Contains("mosaic") ?? false)
-                {
-                    if (diffuse == null)
-                        diffuse = Shader.Find("CM3D2/Toony_Lighted_Trans");
-
-                    mm.shader = diffuse as Shader;
-                    mm.color += new Color(0f, 0f, 0f, -1f);
-                }
-            }
+                PostReadMaterial(mm);
         }
     }
-}
+}