Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions CommunityBugFixCollection/DontRaycastDeveloper.cs
Original file line number Diff line number Diff line change
@@ -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<DontRaycastDeveloper>
{

public override IEnumerable<string> Authors { get; } = [.. Contributors.Onan];

public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//Debugger.Launch();
List<CodeInstruction> 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<CodeInstruction> 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<Slot> IgnoreHierarchy, RaycastHit hit, SyncDelegate<Func<ICollider, bool>> 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<SlotGizmo>() == null; //this is where we can specify "STOP RAYCASTING DEVELOPER!!!"
}
}
}
1 change: 0 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
<CopyToLibraries Condition="'$(CopyToLibraries)'==''">true</CopyToLibraries>

<RestoreAdditionalProjectSources>
https://pkg.munally.com/MonkeyModdingTroop/index.json;
https://nuget.pkg.github.com/ResoniteModdingGroup/index.json
</RestoreAdditionalProjectSources>
</PropertyGroup>
Expand Down
Loading