diff --git a/CommunityBugFixCollection/DontRaycastDeveloper.cs b/CommunityBugFixCollection/DontRaycastDeveloper.cs new file mode 100644 index 0000000..98aca5a --- /dev/null +++ b/CommunityBugFixCollection/DontRaycastDeveloper.cs @@ -0,0 +1,87 @@ +using FrooxEngine; +using HarmonyLib; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; + +namespace CommunityBugFixCollection +{ + [HarmonyPatchCategory(nameof(DontRaycastDeveloper))] + [HarmonyPatch(typeof(FrooxEngine.RaycastDriver), nameof(FrooxEngine.RaycastDriver.OnCommonUpdate))] + internal sealed class DontRaycastDeveloper : ResoniteBugFixMonkey + { + + public override IEnumerable Authors { get; } = [.. Contributors.Onan]; + + public static IEnumerable Transpiler(IEnumerable instructions) + { + //Debugger.Launch(); + List instructionList = [.. instructions]; + + + int index = 0; + int start = 0; + int stop = 0; + CodeInstruction Filter = new CodeInstruction(OpCodes.Nop); + foreach (CodeInstruction inst in instructionList) + { + + if (inst.operand?.ToString()?.Contains("IgnoreHierarchy") == true) + { + if(start == 0) + { + start = index; + } + + } + if (inst.operand?.ToString()?.ToLower()?.Contains("icollider") == true && inst.operand?.ToString()?.ToLower()?.Contains("bool") == true && inst.operand?.ToString()?.ToLower()?.Contains("invoke") == true) + { + if (stop == 0) + { + stop = index; + } + } + if (inst.opcode == OpCodes.Ldfld && inst.operand?.ToString()?.Contains("Filter") == true) + { + Filter = inst; + } + index++; + } + + + //note to self, loading "this" before trying to load a "this" variable on the stack is important - @989onan + List newinstructions = + [ + new CodeInstruction(OpCodes.Ldarg_0), + instructionList[start], + new CodeInstruction(OpCodes.Ldloc_S,8), + new CodeInstruction(OpCodes.Ldarg_0), + Filter, + new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(DontRaycastDeveloper), "DontRaycastDeveloperFilter")), + ]; + instructionList.RemoveRange(start-1, (stop+2) - start); + + + + instructionList.InsertRange(start - 1/*this is needed since start lands on "ignore hiearchy" which is at the beginning*/, newinstructions); + + + return instructionList; + + } + + + //recreates the if statement, allowing for full control over this check on raycasts and doing whatever we want. + public static bool DontRaycastDeveloperFilter(SyncRef IgnoreHierarchy, RaycastHit hit, SyncDelegate> Filter) { + if (!Enabled) + { + return (IgnoreHierarchy.Target == null || !hit.Collider.Slot.IsChildOf(IgnoreHierarchy.Target, true)) && (Filter.Target == null || Filter.Target(hit.Collider)); //this is where we use the default behavior. + } + return (IgnoreHierarchy.Target == null || !hit.Collider.Slot.IsChildOf(IgnoreHierarchy.Target, true)) && (Filter.Target == null || Filter.Target(hit.Collider)) && hit.Collider.Slot.FindParent(o=>o.Name == "Gizmo")?.GetComponent() == null; //this is where we can specify "STOP RAYCASTING DEVELOPER!!!" + } + } +} diff --git a/Directory.Build.props b/Directory.Build.props index 1c51a82..0ebc8dd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,7 +13,6 @@ true - https://pkg.munally.com/MonkeyModdingTroop/index.json; https://nuget.pkg.github.com/ResoniteModdingGroup/index.json