diff --git a/CommunityBugFixCollection/BreakDragAndDropCopiedComponentDrives.cs b/CommunityBugFixCollection/BreakDragAndDropCopiedComponentDrives.cs index 865cbe3..c263933 100644 --- a/CommunityBugFixCollection/BreakDragAndDropCopiedComponentDrives.cs +++ b/CommunityBugFixCollection/BreakDragAndDropCopiedComponentDrives.cs @@ -2,61 +2,46 @@ using FrooxEngine; using FrooxEngine.UIX; using HarmonyLib; +using System.Reflection; +using System.Reflection.Emit; namespace CommunityBugFixCollection { [HarmonyPatchCategory(nameof(BreakDragAndDropCopiedComponentDrives))] - [HarmonyPatch(typeof(SlotComponentReceiver), nameof(SlotComponentReceiver.TryReceive))] internal sealed class BreakDragAndDropCopiedComponentDrives : ResoniteBugFixMonkey { - public override IEnumerable Authors => Contributors.Banane9; + public override IEnumerable Authors { get; } = [.. Contributors.Banane9, .. Contributors.Onan]; - private static bool Prefix(SlotComponentReceiver __instance, IEnumerable items, Canvas.InteractionData eventData, out bool __result) + public static MethodBase TargetMethod() { - __result = false; +#pragma warning disable CS8603 // Possible null reference return. +#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type. + Type stateMachineType = typeof(SlotComponentReceiver).InnerTypes().FirstOrDefault(x => x.Name.StartsWith("<>") && x.InnerTypes().Any()); + MethodInfo stolencodethingy = AccessTools.GetDeclaredMethods(stateMachineType).FirstOrDefault(x => x.Name == "b__1"); + return stolencodethingy; +#pragma warning restore CS8603 // Possible null reference return. +#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type. + } - if (__instance.Target.Target is null) - return false; - foreach (var item in items) + public static IEnumerable Transpiler(IEnumerable Codes) + { + List newcodes = new List(); + foreach (CodeInstruction code in Codes) { - foreach (ReferenceProxy componentsInChild in item.Slot.GetComponentsInChildren()) + if (code.operand != null) { - if (componentsInChild.Reference.Target is not Component component || __instance.Target.Target == component.Slot) + if(code.operand.ToString().Contains("CopyComponent")){ + + newcodes.Add(new CodeInstruction(OpCodes.Ldc_I4_0)); + newcodes.Add(new CodeInstruction(OpCodes.Callvirt, AccessTools.Method(typeof(FrooxEngine.Slot), "DuplicateComponent"))); continue; - - __instance.StartTask(async () => - { - var contextMenu = await __instance.LocalUser.OpenContextMenu(__instance, eventData.source.Slot); - - var copyItem = contextMenu.AddItem("Inspector.Actions.CopyComponent".AsLocaleKey(), (Uri)null!, RadiantUI_Constants.Hero.GREEN); - var moveItem = contextMenu.AddItem("Inspector.Actions.MoveComponent".AsLocaleKey(), (Uri)null!, RadiantUI_Constants.Hero.PURPLE); - var cancelItem = contextMenu.AddItem("General.Cancel".AsLocaleKey(), (Uri)null!, colorX.White); - - copyItem.Button.LocalPressed += delegate - { - __instance.Target.Target.DuplicateComponent(component); - __instance.LocalUser.CloseContextMenu(__instance); - }; - - moveItem.Button.LocalPressed += delegate - { - __instance.Target.Target.MoveComponent(component); - __instance.LocalUser.CloseContextMenu(__instance); - }; - - cancelItem.Button.LocalPressed += delegate - { - __instance.LocalUser.CloseContextMenu(__instance); - }; - }); - - __result = true; - return false; + } } + newcodes.Add(code); } - - return false; + Logger.Info(newcodes); + return newcodes; } } } \ No newline at end of file diff --git a/CommunityBugFixCollection/CommunityBugFixCollection.csproj b/CommunityBugFixCollection/CommunityBugFixCollection.csproj index 4194b95..3a9bb3d 100644 --- a/CommunityBugFixCollection/CommunityBugFixCollection.csproj +++ b/CommunityBugFixCollection/CommunityBugFixCollection.csproj @@ -3,10 +3,11 @@ CommunityBugFixCollection Community Bug-Fix Collection Banane9; Nytra; art0007i; LeCloutPanda; goat; __Choco__; LJ; 989onan - 0.9.0-beta + 0.9.0-beta This MonkeyLoader mod for Resonite that fixes various small Resonite-issues that are still open. README.md LGPL-3.0-or-later + $(PackageProjectUrl).git https://github.com/ResoniteModdingGroup/CommunityBugFixCollection $(PackageProjectUrl).git mod; mods; monkeyloader; resonite; component; attacher; selector; protoflux; node; picker; search; favorites diff --git a/CommunityBugFixCollection/DontRaycastDeveloper.cs b/CommunityBugFixCollection/DontRaycastDeveloper.cs new file mode 100644 index 0000000..9fd35a2 --- /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()?.ToLower()?.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 bcd9fef..708ad1c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,9 +13,9 @@ - D:/Files/Games/Resonite/app - D:/SteamLibrary//steamapps/common/Resonite - G:/SteamLibrary\steamapps\common\Resonite + D:/Files/Games/Resonite/app/ + D:/SteamLibrary/steamapps/common/Resonite/ + G:/SteamLibrary\steamapps\common\Resonite\