update patches, use publicized assembly

This commit is contained in:
Mister_Nebula 2021-10-15 21:06:51 +01:00
parent d4505b0fb3
commit 565f0b7f8e
35 changed files with 456 additions and 464 deletions

View File

@ -1,4 +1,5 @@
using OWML.Common; using HarmonyLib;
using OWML.Common;
using QSB.Animation.NPC.WorldObjects; using QSB.Animation.NPC.WorldObjects;
using QSB.ConversationSync; using QSB.ConversationSync;
using QSB.Events; using QSB.Events;
@ -12,22 +13,14 @@ using UnityEngine;
namespace QSB.Animation.NPC.Patches namespace QSB.Animation.NPC.Patches
{ {
[HarmonyPatch]
public class CharacterAnimationPatches : QSBPatch public class CharacterAnimationPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(CharacterAnimController), nameof(CharacterAnimController.OnAnimatorIK))]
Prefix(nameof(CharacterAnimController_OnAnimatorIK)); public static bool AnimatorIKReplacement(
Prefix(nameof(CharacterAnimController_OnZoneEntry));
Prefix(nameof(CharacterAnimController_OnZoneExit));
Prefix(nameof(FacePlayerWhenTalking_OnStartConversation));
Prefix(nameof(CharacterDialogueTree_StartConversation));
Prefix(nameof(CharacterDialogueTree_EndConversation));
Prefix(nameof(KidRockController_Update));
}
public static bool CharacterAnimController_OnAnimatorIK(
CharacterAnimController __instance, CharacterAnimController __instance,
float ___headTrackingWeight, float ___headTrackingWeight,
bool ___lookOnlyWhenTalking, bool ___lookOnlyWhenTalking,
@ -103,21 +96,27 @@ namespace QSB.Animation.NPC.Patches
} }
public static bool CharacterAnimController_OnZoneExit(CharacterAnimController __instance) [HarmonyPrefix]
[HarmonyPatch(typeof(CharacterAnimController), nameof(CharacterAnimController.OnZoneExit))]
public static bool HeadZoneExit(CharacterAnimController __instance)
{ {
var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance); var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance);
QSBEventManager.FireEvent(EventNames.QSBExitHeadZone, qsbObj.ObjectId); QSBEventManager.FireEvent(EventNames.QSBExitHeadZone, qsbObj.ObjectId);
return false; return false;
} }
public static bool CharacterAnimController_OnZoneEntry(CharacterAnimController __instance) [HarmonyPrefix]
[HarmonyPatch(typeof(CharacterAnimController), nameof(CharacterAnimController.OnZoneEntry))]
public static bool HeadZoneEntry(CharacterAnimController __instance)
{ {
var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance); var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance);
QSBEventManager.FireEvent(EventNames.QSBEnterHeadZone, qsbObj.ObjectId); QSBEventManager.FireEvent(EventNames.QSBEnterHeadZone, qsbObj.ObjectId);
return false; return false;
} }
public static bool FacePlayerWhenTalking_OnStartConversation( [HarmonyPrefix]
[HarmonyPatch(typeof(FacePlayerWhenTalking), nameof(FacePlayerWhenTalking.OnStartConversation))]
public static bool OnStartConversation(
FacePlayerWhenTalking __instance, FacePlayerWhenTalking __instance,
CharacterDialogueTree ____dialogueTree) CharacterDialogueTree ____dialogueTree)
{ {
@ -140,7 +139,9 @@ namespace QSB.Animation.NPC.Patches
return false; return false;
} }
public static bool CharacterDialogueTree_StartConversation(CharacterDialogueTree __instance) [HarmonyPrefix]
[HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.StartConversation))]
public static bool StartConversation(CharacterDialogueTree __instance)
{ {
var allNpcAnimControllers = QSBWorldSync.GetWorldObjects<INpcAnimController>(); var allNpcAnimControllers = QSBWorldSync.GetWorldObjects<INpcAnimController>();
var ownerOfThis = allNpcAnimControllers.FirstOrDefault(x => x.GetDialogueTree() == __instance); var ownerOfThis = allNpcAnimControllers.FirstOrDefault(x => x.GetDialogueTree() == __instance);
@ -154,7 +155,9 @@ namespace QSB.Animation.NPC.Patches
return true; return true;
} }
public static bool CharacterDialogueTree_EndConversation(CharacterDialogueTree __instance) [HarmonyPrefix]
[HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.EndConversation))]
public static bool EndConversation(CharacterDialogueTree __instance)
{ {
var allNpcAnimControllers = QSBWorldSync.GetWorldObjects<INpcAnimController>(); var allNpcAnimControllers = QSBWorldSync.GetWorldObjects<INpcAnimController>();
var ownerOfThis = allNpcAnimControllers.FirstOrDefault(x => x.GetDialogueTree() == __instance); var ownerOfThis = allNpcAnimControllers.FirstOrDefault(x => x.GetDialogueTree() == __instance);
@ -168,7 +171,9 @@ namespace QSB.Animation.NPC.Patches
return true; return true;
} }
public static bool KidRockController_Update( [HarmonyPrefix]
[HarmonyPatch(typeof(KidRockController), nameof(KidRockController.Update))]
public static bool UpdateReplacement(
KidRockController __instance, KidRockController __instance,
bool ____throwingRock, bool ____throwingRock,
CharacterDialogueTree ____dialogueTree, CharacterDialogueTree ____dialogueTree,

View File

@ -1,4 +1,5 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
@ -6,14 +7,14 @@ using UnityEngine;
namespace QSB.Animation.Patches namespace QSB.Animation.Patches
{ {
[HarmonyPatch]
internal class PlayerAnimationPatches : QSBPatch internal class PlayerAnimationPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
=> Prefix(nameof(PlayerAnimController_LateUpdate)); [HarmonyPatch(typeof(PlayerAnimController), nameof(PlayerAnimController.LateUpdate))]
public static bool LateUpdateReplacement(
public static bool PlayerAnimController_LateUpdate(
PlayerAnimController __instance, PlayerAnimController __instance,
PlayerCharacterController ____playerController, PlayerCharacterController ____playerController,
ThrusterModel ____playerJetpack, ThrusterModel ____playerJetpack,

View File

@ -1,20 +1,22 @@
using QSB.CampfireSync.WorldObjects; using HarmonyLib;
using QSB.CampfireSync.WorldObjects;
using QSB.Events; using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.WorldSync; using QSB.WorldSync;
namespace QSB.CampfireSync.Patches namespace QSB.CampfireSync.Patches
{ {
[HarmonyPatch]
internal class CampfirePatches : QSBPatch internal class CampfirePatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() => Prefix(nameof(Campfire_OnPressInteract)); [HarmonyPrefix]
[HarmonyPatch(typeof(Campfire), nameof(Campfire.OnPressInteract))]
public static bool Campfire_OnPressInteract(Campfire __instance, Campfire.State ____state) public static bool LightCampfireEvent(Campfire __instance)
{ {
var qsbCampfire = QSBWorldSync.GetWorldFromUnity<QSBCampfire, Campfire>(__instance); var qsbCampfire = QSBWorldSync.GetWorldFromUnity<QSBCampfire, Campfire>(__instance);
if (____state == Campfire.State.LIT) if (__instance._state == Campfire.State.LIT)
{ {
qsbCampfire.StartRoasting(); qsbCampfire.StartRoasting();
} }

View File

@ -1,4 +1,5 @@
using OWML.Common; using HarmonyLib;
using OWML.Common;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
@ -7,18 +8,13 @@ using System.Collections.Generic;
namespace QSB.ConversationSync.Patches namespace QSB.ConversationSync.Patches
{ {
[HarmonyPatch]
public class ConversationPatches : QSBPatch public class ConversationPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.StartConversation))]
Postfix(nameof(DialogueNode_GetNextPage));
Prefix(nameof(CharacterDialogueTree_InputDialogueOption));
Prefix(nameof(CharacterDialogueTree_StartConversation));
Prefix(nameof(CharacterDialogueTree_EndConversation));
}
public static void CharacterDialogueTree_StartConversation(CharacterDialogueTree __instance) public static void CharacterDialogueTree_StartConversation(CharacterDialogueTree __instance)
{ {
var index = QSBWorldSync.OldDialogueTrees.FindIndex(x => x == __instance); var index = QSBWorldSync.OldDialogueTrees.FindIndex(x => x == __instance);
@ -31,6 +27,8 @@ namespace QSB.ConversationSync.Patches
ConversationManager.Instance.SendConvState(index, true); ConversationManager.Instance.SendConvState(index, true);
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.EndConversation))]
public static bool CharacterDialogueTree_EndConversation(CharacterDialogueTree __instance) public static bool CharacterDialogueTree_EndConversation(CharacterDialogueTree __instance)
{ {
if (!__instance.enabled) if (!__instance.enabled)
@ -51,6 +49,8 @@ namespace QSB.ConversationSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.InputDialogueOption))]
public static bool CharacterDialogueTree_InputDialogueOption(int optionIndex, DialogueBoxVer2 ____currentDialogueBox) public static bool CharacterDialogueTree_InputDialogueOption(int optionIndex, DialogueBoxVer2 ____currentDialogueBox)
{ {
if (optionIndex < 0) if (optionIndex < 0)
@ -65,6 +65,8 @@ namespace QSB.ConversationSync.Patches
return true; return true;
} }
[HarmonyPostfix]
[HarmonyPatch(typeof(DialogueNode), nameof(DialogueNode.GetNextPage))]
public static void DialogueNode_GetNextPage(string ____name, List<string> ____listPagesToDisplay, int ____currentPage) public static void DialogueNode_GetNextPage(string ____name, List<string> ____listPagesToDisplay, int ____currentPage)
{ {
var key = ____name + ____listPagesToDisplay[____currentPage]; var key = ____name + ____listPagesToDisplay[____currentPage];

View File

@ -11,35 +11,37 @@ using UnityEngine;
namespace QSB.DeathSync.Patches namespace QSB.DeathSync.Patches
{ {
[HarmonyPatch]
public class DeathPatches : QSBPatch public class DeathPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() // TODO : Remove with future functionality.
{ [HarmonyPrefix]
Prefix(nameof(DeathManager_KillPlayer_Prefix)); [HarmonyPatch(typeof(ShipEjectionSystem), nameof(ShipEjectionSystem.OnPressInteract))]
Postfix(nameof(DeathManager_KillPlayer_Postfix)); public static bool DisableEjection()
Prefix(nameof(ShipDetachableLeg_Detach)); => false;
Prefix(nameof(ShipDetachableModule_Detach));
Empty("ShipEjectionSystem_OnPressInteract");
Postfix(nameof(ShipDamageController_Awake));
Prefix(nameof(DestructionVolume_VanishShip));
Prefix(nameof(HighSpeedImpactSensor_FixedUpdate));
Prefix(nameof(PlayerResources_OnImpact));
}
// TODO : Remove with future functionality.
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipDetachableLeg), nameof(ShipDetachableLeg.Detach))]
public static bool ShipDetachableLeg_Detach(ref OWRigidbody __result) public static bool ShipDetachableLeg_Detach(ref OWRigidbody __result)
{ {
__result = null; __result = null;
return false; return false;
} }
// TODO : Remove with future functionality.
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipDetachableModule), nameof(ShipDetachableModule.Detach))]
public static bool ShipDetachableModule_Detach(ref OWRigidbody __result) public static bool ShipDetachableModule_Detach(ref OWRigidbody __result)
{ {
__result = null; __result = null;
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(PlayerResources), nameof(PlayerResources.OnImpact))]
public static bool PlayerResources_OnImpact(ImpactData impact, PlayerResources __instance, float ____currentHealth) public static bool PlayerResources_OnImpact(ImpactData impact, PlayerResources __instance, float ____currentHealth)
{ {
if (PlayerState.IsInsideShip()) if (PlayerState.IsInsideShip())
@ -65,6 +67,8 @@ namespace QSB.DeathSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(HighSpeedImpactSensor), nameof(HighSpeedImpactSensor.FixedUpdate))]
public static bool HighSpeedImpactSensor_FixedUpdate( public static bool HighSpeedImpactSensor_FixedUpdate(
HighSpeedImpactSensor __instance, HighSpeedImpactSensor __instance,
bool ____isPlayer, bool ____isPlayer,
@ -185,6 +189,8 @@ namespace QSB.DeathSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(DeathManager), nameof(DeathManager.KillPlayer))]
public static bool DeathManager_KillPlayer_Prefix(DeathType deathType) public static bool DeathManager_KillPlayer_Prefix(DeathType deathType)
{ {
if (RespawnOnDeath.Instance == null) if (RespawnOnDeath.Instance == null)
@ -203,20 +209,20 @@ namespace QSB.DeathSync.Patches
return false; return false;
} }
[HarmonyPostfix]
[HarmonyPatch(typeof(DeathManager), nameof(DeathManager.KillPlayer))]
public static void DeathManager_KillPlayer_Postfix(DeathType deathType) public static void DeathManager_KillPlayer_Postfix(DeathType deathType)
{ {
QSBEventManager.FireEvent(EventNames.QSBPlayerDeath, deathType); QSBEventManager.FireEvent(EventNames.QSBPlayerDeath, deathType);
} }
[HarmonyPostfix]
[HarmonyPatch(typeof(ShipDamageController), nameof(ShipDamageController.Awake))]
public static void ShipDamageController_Awake(ref bool ____exploded) public static void ShipDamageController_Awake(ref bool ____exploded)
=> ____exploded = true; => ____exploded = true;
public static IEnumerable<CodeInstruction> ReturnNull(IEnumerable<CodeInstruction> instructions) => new List<CodeInstruction> [HarmonyPrefix]
{ [HarmonyPatch(typeof(DestructionVolume), nameof(DestructionVolume.VanishShip))]
new CodeInstruction(OpCodes.Ldnull),
new CodeInstruction(OpCodes.Ret)
};
public static bool DestructionVolume_VanishShip(DeathType ____deathType) public static bool DestructionVolume_VanishShip(DeathType ____deathType)
{ {
if (RespawnOnDeath.Instance == null) if (RespawnOnDeath.Instance == null)

View File

@ -7,11 +7,11 @@ namespace QSB.DeathSync.Patches
{ {
public override QSBPatchTypes Type => QSBPatchTypes.RespawnTime; public override QSBPatchTypes Type => QSBPatchTypes.RespawnTime;
public override void DoPatches() //public override void DoPatches()
{ //{
Prefix(nameof(MapController_LateUpdate)); // Prefix<MapController>(nameof(MapController.LateUpdate), nameof(MapController_LateUpdate));
Prefix(nameof(MapController_EnterMapView)); // Prefix<MapController>(nameof(MapController.EnterMapView), nameof(MapController_EnterMapView));
} //}
public static bool MapController_EnterMapView( public static bool MapController_EnterMapView(
MapController __instance, MapController __instance,

View File

@ -1,18 +1,22 @@
using OWML.Utils; using HarmonyLib;
using OWML.Utils;
using QSB.Patches; using QSB.Patches;
namespace QSB.DeathSync.Patches namespace QSB.DeathSync.Patches
{ {
[HarmonyPatch]
internal class RespawnPatches : QSBPatch internal class RespawnPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() //public override void DoPatches()
{ //{
Prefix(nameof(PlayerRecoveryPoint_OnGainFocus)); // Prefix<PlayerRecoveryPoint>(nameof(PlayerRecoveryPoint.OnGainFocus), nameof(PlayerRecoveryPoint_OnGainFocus));
Prefix(nameof(PlayerRecoveryPoint_OnPressInteract)); // Prefix<PlayerRecoveryPoint>(nameof(PlayerRecoveryPoint.OnPressInteract), nameof(PlayerRecoveryPoint_OnPressInteract));
} //}
[HarmonyPrefix]
[HarmonyPatch(typeof(PlayerRecoveryPoint), nameof(PlayerRecoveryPoint.OnGainFocus))]
public static bool PlayerRecoveryPoint_OnGainFocus( public static bool PlayerRecoveryPoint_OnGainFocus(
PlayerResources ____playerResources, PlayerResources ____playerResources,
bool ____refuelsPlayer, bool ____refuelsPlayer,
@ -100,6 +104,8 @@ namespace QSB.DeathSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(PlayerRecoveryPoint), nameof(PlayerRecoveryPoint.OnPressInteract))]
public static bool PlayerRecoveryPoint_OnPressInteract( public static bool PlayerRecoveryPoint_OnPressInteract(
PlayerRecoveryPoint __instance, PlayerRecoveryPoint __instance,
PlayerResources ____playerResources, PlayerResources ____playerResources,

View File

@ -1,4 +1,5 @@
using OWML.Utils; using HarmonyLib;
using OWML.Utils;
using QSB.ElevatorSync.WorldObjects; using QSB.ElevatorSync.WorldObjects;
using QSB.Events; using QSB.Events;
using QSB.Patches; using QSB.Patches;
@ -6,18 +7,18 @@ using QSB.WorldSync;
namespace QSB.ElevatorSync.Patches namespace QSB.ElevatorSync.Patches
{ {
[HarmonyPatch]
public class ElevatorPatches : QSBPatch public class ElevatorPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPostfix]
[HarmonyPatch(typeof(Elevator), nameof(Elevator.StartLift))]
public static void Elevator_StartLift(Elevator __instance) public static void Elevator_StartLift(Elevator __instance)
{ {
var isGoingUp = __instance.GetValue<bool>("_goingToTheEnd"); var isGoingUp = __instance.GetValue<bool>("_goingToTheEnd");
var id = QSBWorldSync.GetIdFromUnity<QSBElevator, Elevator>(__instance); var id = QSBWorldSync.GetIdFromUnity<QSBElevator, Elevator>(__instance);
QSBEventManager.FireEvent(EventNames.QSBStartLift, id, isGoingUp); QSBEventManager.FireEvent(EventNames.QSBStartLift, id, isGoingUp);
} }
public override void DoPatches()
=> Postfix(nameof(Elevator_StartLift));
} }
} }

View File

@ -1,22 +1,22 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
namespace QSB.FrequencySync.Patches namespace QSB.FrequencySync.Patches
{ {
[HarmonyPatch]
public class FrequencyPatches : QSBPatch public class FrequencyPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPostfix]
{ [HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.IdentifyFrequency))]
Postfix(nameof(AudioSignal_IdentifyFrequency)); static void IdentifyFrequencyEvent(SignalFrequency ____frequency)
Postfix(nameof(AudioSignal_IdentifySignal));
}
public static void AudioSignal_IdentifyFrequency(SignalFrequency ____frequency)
=> QSBEventManager.FireEvent(EventNames.QSBIdentifyFrequency, ____frequency); => QSBEventManager.FireEvent(EventNames.QSBIdentifyFrequency, ____frequency);
public static void AudioSignal_IdentifySignal(SignalName ____name) [HarmonyPostfix]
[HarmonyPatch(typeof(AudioSignal), nameof(AudioSignal.IdentifySignal))]
static void IdentifySignalEvent(SignalName ____name)
=> QSBEventManager.FireEvent(EventNames.QSBIdentifySignal, ____name); => QSBEventManager.FireEvent(EventNames.QSBIdentifySignal, ____name);
} }
} }

View File

@ -1,11 +1,16 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
namespace QSB.GeyserSync.Patches namespace QSB.GeyserSync.Patches
{ {
[HarmonyPatch]
internal class GeyserPatches : QSBPatch internal class GeyserPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect;
public override void DoPatches() => Empty("GeyserController_Update"); [HarmonyPrefix]
[HarmonyPatch(typeof(GeyserController), nameof(GeyserController.Update))]
public static bool Empty()
=> false;
} }
} }

View File

@ -1,14 +1,15 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
namespace QSB.Inputs.Patches namespace QSB.Inputs.Patches
{ {
[HarmonyPatch]
internal class InputPatches : QSBPatch internal class InputPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
=> Prefix(nameof(OWInput_Update)); [HarmonyPatch(typeof(OWInput), nameof(OWInput.Update))]
public static bool OWInput_Update() public static bool OWInput_Update()
=> QSBInputManager.Instance.InputsEnabled; => QSBInputManager.Instance.InputsEnabled;
} }

View File

@ -1,4 +1,5 @@
using OWML.Common; using HarmonyLib;
using OWML.Common;
using QSB.Events; using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Utility; using QSB.Utility;
@ -7,19 +8,13 @@ using UnityEngine;
namespace QSB.ItemSync.Patches namespace QSB.ItemSync.Patches
{ {
[HarmonyPatch]
internal class ItemPatches : QSBPatch internal class ItemPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(ItemTool), nameof(ItemTool.MoveItemToCarrySocket))]
Prefix(nameof(ItemTool_MoveItemToCarrySocket));
Prefix(nameof(ItemTool_SocketItem));
Prefix(nameof(ItemTool_StartUnsocketItem));
Prefix(nameof(ItemTool_CompleteUnsocketItem));
Prefix(nameof(ItemTool_DropItem));
}
public static bool ItemTool_MoveItemToCarrySocket(OWItem item) public static bool ItemTool_MoveItemToCarrySocket(OWItem item)
{ {
var itemId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(item)); var itemId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(item));
@ -27,6 +22,8 @@ namespace QSB.ItemSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ItemTool), nameof(ItemTool.SocketItem))]
public static bool ItemTool_SocketItem(OWItem ____heldItem, OWItemSocket socket) public static bool ItemTool_SocketItem(OWItem ____heldItem, OWItemSocket socket)
{ {
var socketId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(socket)); var socketId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(socket));
@ -35,6 +32,8 @@ namespace QSB.ItemSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ItemTool), nameof(ItemTool.StartUnsocketItem))]
public static bool ItemTool_StartUnsocketItem(OWItemSocket socket) public static bool ItemTool_StartUnsocketItem(OWItemSocket socket)
{ {
var socketId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(socket)); var socketId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(socket));
@ -42,6 +41,8 @@ namespace QSB.ItemSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ItemTool), nameof(ItemTool.CompleteUnsocketItem))]
public static bool ItemTool_CompleteUnsocketItem(OWItem ____heldItem) public static bool ItemTool_CompleteUnsocketItem(OWItem ____heldItem)
{ {
var itemId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(____heldItem)); var itemId = QSBWorldSync.GetIdFromTypeSubset(ItemManager.GetObject(____heldItem));
@ -49,6 +50,8 @@ namespace QSB.ItemSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ItemTool), nameof(ItemTool.DropItem))]
public static bool ItemTool_DropItem(RaycastHit hit, OWRigidbody targetRigidbody, IItemDropTarget customDropTarget, ref OWItem ____heldItem) public static bool ItemTool_DropItem(RaycastHit hit, OWRigidbody targetRigidbody, IItemDropTarget customDropTarget, ref OWItem ____heldItem)
{ {
Locator.GetPlayerAudioController().PlayDropItem(____heldItem.GetItemType()); Locator.GetPlayerAudioController().PlayDropItem(____heldItem.GetItemType());

View File

@ -1,12 +1,16 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
namespace QSB.LogSync.Patches namespace QSB.LogSync.Patches
{ {
[HarmonyPatch]
public class LogPatches : QSBPatch public class LogPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPostfix]
[HarmonyPatch(typeof(ShipLogManager), nameof(ShipLogManager.RevealFact))]
public static void ShipLogManager_RevealFact(string id, bool saveGame, bool showNotification, bool __result) public static void ShipLogManager_RevealFact(string id, bool saveGame, bool showNotification, bool __result)
{ {
if (!__result) if (!__result)
@ -16,7 +20,5 @@ namespace QSB.LogSync.Patches
QSBEventManager.FireEvent(EventNames.QSBRevealFact, id, saveGame, showNotification); QSBEventManager.FireEvent(EventNames.QSBRevealFact, id, saveGame, showNotification);
} }
public override void DoPatches() => Postfix(nameof(ShipLogManager_RevealFact));
} }
} }

View File

@ -1,4 +1,5 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
@ -6,10 +7,13 @@ using UnityEngine;
namespace QSB.OrbSync.Patches namespace QSB.OrbSync.Patches
{ {
[HarmonyPatch]
public class OrbPatches : QSBPatch public class OrbPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPostfix]
[HarmonyPatch(typeof(NomaiInterfaceOrb), nameof(NomaiInterfaceOrb.StartDragFromPosition))]
public static void NomaiInterfaceOrb_StartDragFromPosition(bool __result, NomaiInterfaceOrb __instance) public static void NomaiInterfaceOrb_StartDragFromPosition(bool __result, NomaiInterfaceOrb __instance)
{ {
if (__result) if (__result)
@ -18,6 +22,8 @@ namespace QSB.OrbSync.Patches
} }
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiInterfaceSlot), nameof(NomaiInterfaceSlot.CheckOrbCollision))]
public static bool NomaiInterfaceSlot_CheckOrbCollision(ref bool __result, NomaiInterfaceSlot __instance, NomaiInterfaceOrb orb, public static bool NomaiInterfaceSlot_CheckOrbCollision(ref bool __result, NomaiInterfaceSlot __instance, NomaiInterfaceOrb orb,
bool ____ignoreDraggedOrbs, float ____radius, float ____exitRadius, ref NomaiInterfaceOrb ____occupyingOrb) bool ____ignoreDraggedOrbs, float ____radius, float ____exitRadius, ref NomaiInterfaceOrb ____occupyingOrb)
{ {
@ -60,11 +66,5 @@ namespace QSB.OrbSync.Patches
__result = true; __result = true;
return false; return false;
} }
public override void DoPatches()
{
Postfix(nameof(NomaiInterfaceOrb_StartDragFromPosition));
Prefix(nameof(NomaiInterfaceSlot_CheckOrbCollision));
}
} }
} }

View File

@ -1,147 +1,24 @@
using OWML.Common; using QSB.Utility;
using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
namespace QSB.Patches namespace QSB.Patches
{ {
public abstract class QSBPatch public abstract class QSBPatch
{ {
public abstract QSBPatchTypes Type { get; } public abstract QSBPatchTypes Type { get; }
public abstract void DoPatches();
public virtual void DoPatches()
{
var oldMethods = QSBPatchManager.HarmonyInstance.GetPatchedMethods();
QSBPatchManager.HarmonyInstance.PatchAll(GetType());
foreach (var method in QSBPatchManager.HarmonyInstance.GetPatchedMethods().Except(oldMethods))
{
DebugLog.DebugWrite($"- Patching {method.DeclaringType}.{method.Name}");
}
}
public void DoUnpatches() public void DoUnpatches()
{ {
foreach (var item in _patchedMethods)
{
//DebugLog.DebugWrite($"[Unpatch] {item.DeclaringType}.{item.Name}", MessageType.Info);
Unpatch(item);
}
_patchedMethods.Clear();
}
private List<MethodInfo> _patchedMethods = new List<MethodInfo>();
public void Empty(string patchName)
{
//DebugLog.DebugWrite($"[Empty] {patchName}", MessageType.Success);
var method = GetMethodInfo(patchName);
QSBCore.Helper.HarmonyHelper.EmptyMethod(method);
_patchedMethods.Add(method);
}
public void Prefix(string patchName, params Type[] args)
=> DoPrefixPostfix(true, patchName, args);
public void Postfix(string patchName, params Type[] args)
=> DoPrefixPostfix(false, patchName, args);
private void DoPrefixPostfix(bool isPrefix, string patchName, params Type[] args)
{
var method = GetMethodInfo(patchName, args);
if (method != null)
{
if (isPrefix)
{
QSBCore.Helper.HarmonyHelper.AddPrefix(method, GetType(), patchName);
}
else
{
QSBCore.Helper.HarmonyHelper.AddPostfix(method, GetType(), patchName);
}
_patchedMethods.Add(method);
}
//DebugLog.DebugWrite($"{(isPrefix ? "[Prefix]" : "[Postfix]")} {patchName}", method == null ? MessageType.Error : MessageType.Success);
}
private MethodInfo GetMethodInfo(string patchName, params Type[] args)
{
var splitName = patchName.Split('_');
var typeName = splitName[0];
var methodName = splitName[1];
var type = GetFirstTypeByName(typeName);
if (type == null)
{
DebugLog.ToConsole($"Error - Couldn't find type for patch name {patchName}!", MessageType.Error);
return null;
}
var allMethodsOfName = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Where(x => x.Name == methodName);
if (allMethodsOfName.Count() == 0)
{
DebugLog.ToConsole($"Error - Could not find method {methodName} in type {typeName}.", MessageType.Error);
return null;
}
if (allMethodsOfName.Count() == 1)
{
return allMethodsOfName.First();
}
DebugLog.DebugWrite($"More than one method found with name {methodName} in type {typeName}");
foreach (var method in allMethodsOfName)
{
DebugLog.DebugWrite($"checking {method.Name}");
var paramList = method.GetParameters().Select(x => x.ParameterType);
if (Enumerable.SequenceEqual(args, paramList))
{
DebugLog.DebugWrite($"match!");
return method;
}
}
DebugLog.DebugWrite($"nothing found");
DebugLog.ToConsole($"Error - Could not find method {methodName} in type {typeName} with parameter list of {string.Join(", ", args.Select(x => x.FullName).ToArray())}", MessageType.Error);
foreach (var method in allMethodsOfName)
{
var paramList = method.GetParameters().Select(x => x.ParameterType);
DebugLog.ToConsole($"- Found {method.Name}, but with params {string.Join(", ", paramList.Select(x => x.FullName).ToArray())}", MessageType.Error);
}
return null;
}
private Type GetFirstTypeByName(string typeName)
{
var a = typeof(OWRigidbody).Assembly;
var assemblyTypes = a.GetTypes();
for (var j = 0; j < assemblyTypes.Length; j++)
{
if (assemblyTypes[j].Name == typeName)
{
return assemblyTypes[j];
}
}
return null;
}
private void Unpatch(MethodInfo method)
{
/*
var dictionary = typeof(HarmonySharedState).Invoke<Dictionary<MethodBase, byte[]>>("GetState", new object[0]);
var methodBase = dictionary.Keys.First(m =>
m.DeclaringType == method.DeclaringType
&& m.Name == method.Name);
var patchInfo = PatchInfoSerialization.Deserialize(dictionary.GetValueSafe(methodBase));
patchInfo.RemovePostfix(QSBCore.Helper.Manifest.UniqueName);
patchInfo.RemovePrefix(QSBCore.Helper.Manifest.UniqueName);
patchInfo.RemoveTranspiler(QSBCore.Helper.Manifest.UniqueName);
PatchFunctions.UpdateWrapper(methodBase, patchInfo, QSBCore.Helper.Manifest.UniqueName);
dictionary[methodBase] = patchInfo.Serialize();
*/
} }
} }
} }

View File

@ -1,4 +1,6 @@
using OWML.Common; using HarmonyLib;
using OWML.Common;
using OWML.Utils;
using QSB.Animation.NPC.Patches; using QSB.Animation.NPC.Patches;
using QSB.Animation.Patches; using QSB.Animation.Patches;
using QSB.CampfireSync.Patches; using QSB.CampfireSync.Patches;
@ -34,6 +36,8 @@ namespace QSB.Patches
private static List<QSBPatch> _patchList = new List<QSBPatch>(); private static List<QSBPatch> _patchList = new List<QSBPatch>();
public static Harmony HarmonyInstance;
public static void Init() public static void Init()
{ {
_patchList = new List<QSBPatch> _patchList = new List<QSBPatch>
@ -66,27 +70,36 @@ namespace QSB.Patches
new LauncherPatches() new LauncherPatches()
}; };
HarmonyInstance = QSBCore.Helper.HarmonyHelper.GetValue<Harmony>("_harmony");
DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success); DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success);
} }
public static void DoPatchType(QSBPatchTypes type) public static void DoPatchType(QSBPatchTypes type)
{ {
OnPatchType?.SafeInvoke(type); OnPatchType?.SafeInvoke(type);
//DebugLog.DebugWrite($"Patch block {Enum.GetName(typeof(QSBPatchTypes), type)}", MessageType.Info); DebugLog.DebugWrite($"Patch block {Enum.GetName(typeof(QSBPatchTypes), type)}", MessageType.Info);
foreach (var patch in _patchList.Where(x => x.Type == type)) foreach (var patch in _patchList.Where(x => x.Type == type))
{ {
//DebugLog.DebugWrite($" - Patching in {patch.GetType().Name}", MessageType.Info); DebugLog.DebugWrite($" - Patching in {patch.GetType().Name}", MessageType.Info);
try
{
patch.DoPatches(); patch.DoPatches();
} }
catch (Exception ex)
{
DebugLog.DebugWrite($"Error while patching {patch.GetType().Name} :\r\n{ex}", MessageType.Error);
}
}
} }
public static void DoUnpatchType(QSBPatchTypes type) public static void DoUnpatchType(QSBPatchTypes type)
{ {
OnUnpatchType?.SafeInvoke(type); OnUnpatchType?.SafeInvoke(type);
//DebugLog.DebugWrite($"Unpatch block {Enum.GetName(typeof(QSBPatchTypes), type)}", MessageType.Info); DebugLog.DebugWrite($"Unpatch block {Enum.GetName(typeof(QSBPatchTypes), type)}", MessageType.Info);
foreach (var patch in _patchList.Where(x => x.Type == type)) foreach (var patch in _patchList.Where(x => x.Type == type))
{ {
//DebugLog.DebugWrite($" - Unpatching in {patch.GetType().Name}", MessageType.Info); DebugLog.DebugWrite($" - Unpatching in {patch.GetType().Name}", MessageType.Info);
patch.DoUnpatches(); patch.DoUnpatches();
} }
} }

View File

@ -1,17 +1,15 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
namespace QSB.Player.Patches namespace QSB.Player.Patches
{ {
[HarmonyPatch]
internal class PlayerPatches : QSBPatch internal class PlayerPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(PlayerCrushedController), nameof(PlayerCrushedController.CrushPlayer))]
Prefix(nameof(PlayerCrushedController_CrushPlayer));
Prefix(nameof(PauseMenuManager_OnExitToMainMenu));
}
public static bool PlayerCrushedController_CrushPlayer() public static bool PlayerCrushedController_CrushPlayer()
{ {
// #CrushIt https://www.twitch.tv/videos/846916781?t=00h03m51s // #CrushIt https://www.twitch.tv/videos/846916781?t=00h03m51s
@ -20,6 +18,9 @@ namespace QSB.Player.Patches
return false; return false;
} }
public static void PauseMenuManager_OnExitToMainMenu() => QSBPlayerManager.LocalPlayer.PlayerStates.IsReady = false; [HarmonyPrefix]
[HarmonyPatch(typeof(PauseMenuManager), nameof(PauseMenuManager.OnExitToMainMenu))]
public static void PauseMenuManager_OnExitToMainMenu()
=> QSBPlayerManager.LocalPlayer.PlayerStates.IsReady = false;
} }
} }

View File

@ -9,7 +9,7 @@ namespace QSB.Player
private bool _needsInitializing; private bool _needsInitializing;
private bool _isReady; private bool _isReady;
protected override void InitCanvasMarker() public override void InitCanvasMarker()
{ {
_markerRadius = 2f; _markerRadius = 2f;

View File

@ -13,7 +13,7 @@ namespace QSB.PoolSync
private NomaiRemoteCameraStreaming _oldStreaming; private NomaiRemoteCameraStreaming _oldStreaming;
private bool _hasLoadedAssets; private bool _hasLoadedAssets;
protected override void Awake() public override void Awake()
{ {
base.Awake(); base.Awake();
_oldStreaming = GetComponent<NomaiRemoteCameraStreaming>(); _oldStreaming = GetComponent<NomaiRemoteCameraStreaming>();
@ -48,7 +48,7 @@ namespace QSB.PoolSync
} }
} }
protected override void OnSectorOccupantAdded(SectorDetector sectorDetector) public override void OnSectorOccupantAdded(SectorDetector sectorDetector)
{ {
if (sectorDetector.GetOccupantType() == DynamicOccupant.Player && StreamingManager.isStreamingEnabled) if (sectorDetector.GetOccupantType() == DynamicOccupant.Player && StreamingManager.isStreamingEnabled)
{ {
@ -56,7 +56,7 @@ namespace QSB.PoolSync
} }
} }
protected override void OnSectorOccupantRemoved(SectorDetector sectorDetector) public override void OnSectorOccupantRemoved(SectorDetector sectorDetector)
{ {
if (sectorDetector.GetOccupantType() == DynamicOccupant.Player) if (sectorDetector.GetOccupantType() == DynamicOccupant.Player)
{ {

View File

@ -1,34 +1,51 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
namespace QSB.PoolSync.Patches namespace QSB.PoolSync.Patches
{ {
[HarmonyPatch]
internal class PoolPatches : QSBPatch internal class PoolPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(NomaiRemoteCameraPlatform), nameof(NomaiRemoteCameraPlatform.Awake))]
Prefix(nameof(NomaiRemoteCameraPlatform_Awake));
Prefix(nameof(NomaiRemoteCameraPlatform_Update));
Prefix(nameof(NomaiRemoteCameraPlatform_OnSocketableRemoved));
Prefix(nameof(NomaiRemoteCameraPlatform_OnSocketableDonePlacing));
Prefix(nameof(NomaiRemoteCameraPlatform_OnPedestalContact));
Prefix(nameof(NomaiRemoteCameraStreaming_FixedUpdate));
Prefix(nameof(NomaiRemoteCameraStreaming_OnSectorOccupantAdded));
Prefix(nameof(NomaiRemoteCameraStreaming_OnSectorOccupantRemoved));
Prefix(nameof(NomaiRemoteCameraStreaming_OnEntry));
Prefix(nameof(NomaiRemoteCameraStreaming_OnExit));
}
public static bool NomaiRemoteCameraPlatform_Awake() => false; public static bool NomaiRemoteCameraPlatform_Awake() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraPlatform), nameof(NomaiRemoteCameraPlatform.Update))]
public static bool NomaiRemoteCameraPlatform_Update() => false; public static bool NomaiRemoteCameraPlatform_Update() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraPlatform), nameof(NomaiRemoteCameraPlatform.OnSocketableRemoved))]
public static bool NomaiRemoteCameraPlatform_OnSocketableRemoved() => false; public static bool NomaiRemoteCameraPlatform_OnSocketableRemoved() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraPlatform), nameof(NomaiRemoteCameraPlatform.OnSocketableDonePlacing))]
public static bool NomaiRemoteCameraPlatform_OnSocketableDonePlacing() => false; public static bool NomaiRemoteCameraPlatform_OnSocketableDonePlacing() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraPlatform), nameof(NomaiRemoteCameraPlatform.OnPedestalContact))]
public static bool NomaiRemoteCameraPlatform_OnPedestalContact() => false; public static bool NomaiRemoteCameraPlatform_OnPedestalContact() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraStreaming), nameof(NomaiRemoteCameraStreaming.FixedUpdate))]
public static bool NomaiRemoteCameraStreaming_FixedUpdate() => false; public static bool NomaiRemoteCameraStreaming_FixedUpdate() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraStreaming), nameof(NomaiRemoteCameraStreaming.OnSectorOccupantAdded))]
public static bool NomaiRemoteCameraStreaming_OnSectorOccupantAdded() => false; public static bool NomaiRemoteCameraStreaming_OnSectorOccupantAdded() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraStreaming), nameof(NomaiRemoteCameraStreaming.OnSectorOccupantRemoved))]
public static bool NomaiRemoteCameraStreaming_OnSectorOccupantRemoved() => false; public static bool NomaiRemoteCameraStreaming_OnSectorOccupantRemoved() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraStreaming), nameof(NomaiRemoteCameraStreaming.OnEntry))]
public static bool NomaiRemoteCameraStreaming_OnEntry() => false; public static bool NomaiRemoteCameraStreaming_OnEntry() => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiRemoteCameraStreaming), nameof(NomaiRemoteCameraStreaming.OnExit))]
public static bool NomaiRemoteCameraStreaming_OnExit() => false; public static bool NomaiRemoteCameraStreaming_OnExit() => false;
} }
} }

View File

@ -22,6 +22,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@ -339,69 +340,69 @@
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Assembly-CSharp"> <Reference Include="Assembly-CSharp_publicized">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\Assembly-CSharp.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\publicized_assemblies\Assembly-CSharp_publicized.dll</HintPath>
</Reference> </Reference>
<Reference Include="Assembly-CSharp-firstpass"> <Reference Include="Assembly-CSharp-firstpass">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath>
</Reference> </Reference>
<Reference Include="netstandard"> <Reference Include="netstandard">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\netstandard.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\netstandard.dll</HintPath>
</Reference> </Reference>
<Reference Include="System"> <Reference Include="System">
<HintPath>..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll</HintPath> <HintPath>..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll</HintPath>
</Reference> </Reference>
<Reference Include="Unity.InputSystem, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Unity.InputSystem, Version=1.0.2.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\Unity.InputSystem.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\Unity.InputSystem.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine"> <Reference Include="UnityEngine">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.AnimationModule"> <Reference Include="UnityEngine.AnimationModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.AnimationModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.AnimationModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.AssetBundleModule"> <Reference Include="UnityEngine.AssetBundleModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.AssetBundleModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.AssetBundleModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.AudioModule"> <Reference Include="UnityEngine.AudioModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.AudioModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.AudioModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.CoreModule"> <Reference Include="UnityEngine.CoreModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.IMGUIModule"> <Reference Include="UnityEngine.IMGUIModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.InputLegacyModule"> <Reference Include="UnityEngine.InputLegacyModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.InputLegacyModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.InputLegacyModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.InputModule"> <Reference Include="UnityEngine.InputModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.InputModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.InputModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.Networking"> <Reference Include="UnityEngine.Networking">
<HintPath>D:\EpicGames\OuterWilds\OuterWilds_Data\Managed\UnityEngine.Networking.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.Networking.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.ParticleSystemModule"> <Reference Include="UnityEngine.ParticleSystemModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.ParticleSystemModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.ParticleSystemModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.PhysicsModule"> <Reference Include="UnityEngine.PhysicsModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.TextCoreModule"> <Reference Include="UnityEngine.TextCoreModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.TextCoreModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.TextCoreModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.TextRenderingModule"> <Reference Include="UnityEngine.TextRenderingModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.UI"> <Reference Include="UnityEngine.UI">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.UI.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.UI.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.UIModule"> <Reference Include="UnityEngine.UIModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.UIModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.UIModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.UNETModule"> <Reference Include="UnityEngine.UNETModule">
<HintPath>D:\SteamLibrary\steamapps\common\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.UNETModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.UNETModule.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -69,7 +69,7 @@ namespace QSB
public void Awake() public void Awake()
{ {
var instance = TextTranslation.Get().GetValue<TextTranslation.TranslationTable>("m_table"); var instance = TextTranslation.Get().m_table;
instance.theUITable[(int)UITextType.PleaseUseController] = instance.theUITable[(int)UITextType.PleaseUseController] =
"<color=orange>Quantum Space Buddies</color> is best experienced with friends..."; "<color=orange>Quantum Space Buddies</color> is best experienced with friends...";
} }

View File

@ -1,21 +1,21 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
using System.Reflection; using System.Reflection;
namespace QSB.QuantumSync.Patches namespace QSB.QuantumSync.Patches
{ {
[HarmonyPatch]
public class ClientQuantumPatches : QSBPatch public class ClientQuantumPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect;
public override void DoPatches() [HarmonyPostfix]
{ [HarmonyPatch(typeof(QuantumMoon), nameof(QuantumMoon.Start))]
Prefix(nameof(QuantumMoon_ChangeQuantumState));
Postfix(nameof(QuantumMoon_Start));
}
public static void QuantumMoon_Start(QuantumMoon __instance) public static void QuantumMoon_Start(QuantumMoon __instance)
=> __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 }); => __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 });
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumMoon), nameof(QuantumMoon.ChangeQuantumState))]
public static bool QuantumMoon_ChangeQuantumState() public static bool QuantumMoon_ChangeQuantumState()
=> false; => false;
} }

View File

@ -1,4 +1,5 @@
using OWML.Common; using HarmonyLib;
using OWML.Common;
using QSB.Events; using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
@ -12,26 +13,13 @@ using UnityEngine;
namespace QSB.QuantumSync.Patches namespace QSB.QuantumSync.Patches
{ {
[HarmonyPatch]
public class QuantumPatches : QSBPatch public class QuantumPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(QuantumObject), nameof(QuantumObject.IsLockedByPlayerContact))]
Prefix(nameof(SocketedQuantumObject_ChangeQuantumState));
Postfix(nameof(SocketedQuantumObject_MoveToSocket));
Prefix(nameof(QuantumShuffleObject_ChangeQuantumState));
Prefix(nameof(MultiStateQuantumObject_ChangeQuantumState));
Postfix(nameof(QuantumState_SetVisible));
Prefix(nameof(QuantumShrine_IsPlayerInDarkness));
Prefix(nameof(QuantumShrine_ChangeQuantumState));
Prefix(nameof(QuantumShrine_OnEntry));
Prefix(nameof(QuantumShrine_OnExit));
Prefix(nameof(QuantumMoon_CheckPlayerFogProximity));
Prefix(nameof(QuantumObject_IsLockedByPlayerContact));
Prefix(nameof(MultiStateQuantumObject_Start));
}
public static bool QuantumObject_IsLockedByPlayerContact(ref bool __result, QuantumObject __instance) public static bool QuantumObject_IsLockedByPlayerContact(ref bool __result, QuantumObject __instance)
{ {
var playersEntangled = QuantumManager.GetEntangledPlayers(__instance); var playersEntangled = QuantumManager.GetEntangledPlayers(__instance);
@ -39,6 +27,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(SocketedQuantumObject), nameof(SocketedQuantumObject.ChangeQuantumState))]
public static bool SocketedQuantumObject_ChangeQuantumState( public static bool SocketedQuantumObject_ChangeQuantumState(
SocketedQuantumObject __instance, SocketedQuantumObject __instance,
ref bool __result, ref bool __result,
@ -149,6 +139,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPostfix]
[HarmonyPatch(typeof(SocketedQuantumObject), nameof(SocketedQuantumObject.MoveToSocket))]
public static void SocketedQuantumObject_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket) public static void SocketedQuantumObject_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket)
{ {
if (!WorldObjectManager.AllReady) if (!WorldObjectManager.AllReady)
@ -183,6 +175,8 @@ namespace QSB.QuantumSync.Patches
__instance.transform.localRotation); __instance.transform.localRotation);
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumShuffleObject), nameof(QuantumShuffleObject.ChangeQuantumState))]
public static bool QuantumShuffleObject_ChangeQuantumState( public static bool QuantumShuffleObject_ChangeQuantumState(
QuantumShuffleObject __instance, QuantumShuffleObject __instance,
ref List<int> ____indexList, ref List<int> ____indexList,
@ -227,6 +221,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(MultiStateQuantumObject), nameof(MultiStateQuantumObject.Start))]
public static bool MultiStateQuantumObject_Start(MultiStateQuantumObject __instance, Sector ____sector, bool ____collapseOnStart) public static bool MultiStateQuantumObject_Start(MultiStateQuantumObject __instance, Sector ____sector, bool ____collapseOnStart)
{ {
if (!WorldObjectManager.AllReady) if (!WorldObjectManager.AllReady)
@ -261,6 +257,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(MultiStateQuantumObject), nameof(MultiStateQuantumObject.ChangeQuantumState))]
public static bool MultiStateQuantumObject_ChangeQuantumState(MultiStateQuantumObject __instance) public static bool MultiStateQuantumObject_ChangeQuantumState(MultiStateQuantumObject __instance)
{ {
if (!WorldObjectManager.AllReady) if (!WorldObjectManager.AllReady)
@ -278,6 +276,8 @@ namespace QSB.QuantumSync.Patches
return isInControl; return isInControl;
} }
[HarmonyPostfix]
[HarmonyPatch(typeof(QuantumState), nameof(QuantumState.SetVisible))]
public static void QuantumState_SetVisible(QuantumState __instance, bool visible) public static void QuantumState_SetVisible(QuantumState __instance, bool visible)
{ {
if (!WorldObjectManager.AllReady) if (!WorldObjectManager.AllReady)
@ -305,6 +305,8 @@ namespace QSB.QuantumSync.Patches
stateIndex); stateIndex);
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumShrine), nameof(QuantumShrine.IsPlayerInDarkness))]
public static bool QuantumShrine_IsPlayerInDarkness(ref bool __result, Light[] ____lamps, float ____fadeFraction, bool ____isProbeInside, NomaiGateway ____gate) public static bool QuantumShrine_IsPlayerInDarkness(ref bool __result, Light[] ____lamps, float ____fadeFraction, bool ____isProbeInside, NomaiGateway ____gate)
{ {
foreach (var lamp in ____lamps) foreach (var lamp in ____lamps)
@ -351,6 +353,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumShrine), nameof(QuantumShrine.ChangeQuantumState))]
public static bool QuantumShrine_ChangeQuantumState(QuantumShrine __instance) public static bool QuantumShrine_ChangeQuantumState(QuantumShrine __instance)
{ {
var shrineWorldObject = QSBWorldSync.GetWorldFromUnity<QSBSocketedQuantumObject, SocketedQuantumObject>(__instance); var shrineWorldObject = QSBWorldSync.GetWorldFromUnity<QSBSocketedQuantumObject, SocketedQuantumObject>(__instance);
@ -358,6 +362,8 @@ namespace QSB.QuantumSync.Patches
return isInControl; return isInControl;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumShrine), nameof(QuantumShrine.OnEntry))]
public static bool QuantumShrine_OnEntry( public static bool QuantumShrine_OnEntry(
GameObject hitObj, GameObject hitObj,
ref bool ____isPlayerInside, ref bool ____isPlayerInside,
@ -380,6 +386,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumShrine), nameof(QuantumShrine.OnExit))]
public static bool QuantumShrine_OnExit( public static bool QuantumShrine_OnExit(
GameObject hitObj, GameObject hitObj,
ref bool ____isPlayerInside, ref bool ____isPlayerInside,
@ -402,6 +410,8 @@ namespace QSB.QuantumSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumMoon), nameof(QuantumMoon.CheckPlayerFogProximity))]
public static bool QuantumMoon_CheckPlayerFogProximity( public static bool QuantumMoon_CheckPlayerFogProximity(
QuantumMoon __instance, QuantumMoon __instance,
int ____stateIndex, int ____stateIndex,

View File

@ -1,4 +1,5 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
using System.Linq; using System.Linq;
@ -7,34 +8,33 @@ using UnityEngine;
namespace QSB.QuantumSync.Patches namespace QSB.QuantumSync.Patches
{ {
[HarmonyPatch]
public class QuantumVisibilityPatches : QSBPatch public class QuantumVisibilityPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPostfix]
{ [HarmonyPatch(typeof(Shape), nameof(Shape.OnEnable))]
Prefix(nameof(ShapeVisibilityTracker_IsVisibleUsingCameraFrustum));
Prefix(nameof(ShapeVisibilityTracker_IsVisible));
Prefix(nameof(RendererVisibilityTracker_IsVisibleUsingCameraFrustum));
Prefix(nameof(VisibilityObject_CheckIllumination));
Postfix(nameof(Shape_OnEnable));
Postfix(nameof(Shape_OnDisable));
}
public static void Shape_OnEnable(Shape __instance) public static void Shape_OnEnable(Shape __instance)
=> __instance.RaiseEvent("OnShapeActivated", __instance); => __instance.RaiseEvent("OnShapeActivated", __instance);
[HarmonyPostfix]
[HarmonyPatch(typeof(Shape), nameof(Shape.OnDisable))]
public static void Shape_OnDisable(Shape __instance) public static void Shape_OnDisable(Shape __instance)
=> __instance.RaiseEvent("OnShapeDeactivated", __instance); => __instance.RaiseEvent("OnShapeDeactivated", __instance);
// ShapeVisibilityTracker patches // ShapeVisibilityTracker patches
[HarmonyPrefix]
[HarmonyPatch(typeof(ShapeVisibilityTracker), nameof(ShapeVisibilityTracker.IsVisibleUsingCameraFrustum))]
public static bool ShapeVisibilityTracker_IsVisibleUsingCameraFrustum(ShapeVisibilityTracker __instance, ref bool __result) public static bool ShapeVisibilityTracker_IsVisibleUsingCameraFrustum(ShapeVisibilityTracker __instance, ref bool __result)
{ {
__result = QuantumManager.IsVisibleUsingCameraFrustum(__instance, false).Item1; __result = QuantumManager.IsVisibleUsingCameraFrustum(__instance, false).Item1;
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ShapeVisibilityTracker), nameof(ShapeVisibilityTracker.IsVisible))]
public static bool ShapeVisibilityTracker_IsVisible(ShapeVisibilityTracker __instance, ref bool __result) public static bool ShapeVisibilityTracker_IsVisible(ShapeVisibilityTracker __instance, ref bool __result)
{ {
__result = QuantumManager.IsVisible(__instance, false); __result = QuantumManager.IsVisible(__instance, false);
@ -43,6 +43,8 @@ namespace QSB.QuantumSync.Patches
// RendererVisibilityTracker patches - probably not needed as i don't think RendererVisibilityTracker is ever used? // RendererVisibilityTracker patches - probably not needed as i don't think RendererVisibilityTracker is ever used?
[HarmonyPrefix]
[HarmonyPatch(typeof(RendererVisibilityTracker), nameof(RendererVisibilityTracker.IsVisibleUsingCameraFrustum))]
public static bool RendererVisibilityTracker_IsVisibleUsingCameraFrustum(RendererVisibilityTracker __instance, ref bool __result, Renderer ____renderer, bool ____checkFrustumOcclusion) public static bool RendererVisibilityTracker_IsVisibleUsingCameraFrustum(RendererVisibilityTracker __instance, ref bool __result, Renderer ____renderer, bool ____checkFrustumOcclusion)
{ {
__result = QSBPlayerManager.GetPlayersWithCameras() __result = QSBPlayerManager.GetPlayersWithCameras()
@ -56,6 +58,8 @@ namespace QSB.QuantumSync.Patches
// VisibilityObject // VisibilityObject
[HarmonyPrefix]
[HarmonyPatch(typeof(VisibilityObject), nameof(VisibilityObject.CheckIllumination))]
public static bool VisibilityObject_CheckIllumination(VisibilityObject __instance, ref bool __result, bool ____checkIllumination, Vector3 ____localIlluminationOffset, float ____illuminationRadius, Light[] ____lightSources) public static bool VisibilityObject_CheckIllumination(VisibilityObject __instance, ref bool __result, bool ____checkIllumination, Vector3 ____localIlluminationOffset, float ____illuminationRadius, Light[] ____lightSources)
{ {
if (!____checkIllumination) if (!____checkIllumination)

View File

@ -1,4 +1,5 @@
using OWML.Common; using HarmonyLib;
using OWML.Common;
using QSB.Events; using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
@ -9,13 +10,13 @@ using UnityEngine;
namespace QSB.QuantumSync.Patches namespace QSB.QuantumSync.Patches
{ {
[HarmonyPatch]
public class ServerQuantumPatches : QSBPatch public class ServerQuantumPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnServerClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnServerClientConnect;
public override void DoPatches() [HarmonyPrefix]
=> Prefix(nameof(QuantumMoon_ChangeQuantumState)); [HarmonyPatch(typeof(QuantumMoon), nameof(QuantumMoon.ChangeQuantumState))]
public static bool QuantumMoon_ChangeQuantumState( public static bool QuantumMoon_ChangeQuantumState(
QuantumMoon __instance, QuantumMoon __instance,
ref bool __result, ref bool __result,

View File

@ -1,28 +1,34 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
using UnityEngine; using UnityEngine;
namespace QSB.RoastingSync.Patches namespace QSB.RoastingSync.Patches
{ {
[HarmonyPatch]
internal class RoastingPatches : QSBPatch internal class RoastingPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() //public override void DoPatches()
{ //{
Prefix(nameof(RoastingStickController_UpdateMarshmallowInput)); // Prefix<RoastingStickController>(nameof(RoastingStickController.UpdateMarshmallowInput), nameof(RoastingStickController_UpdateMarshmallowInput));
Prefix(nameof(Marshmallow_Burn)); // Prefix<Marshmallow>(nameof(Marshmallow.Burn), nameof(Marshmallow_Burn));
Prefix(nameof(Marshmallow_Shrivel)); // Prefix<Marshmallow>(nameof(Marshmallow.Shrivel), nameof(Marshmallow_Shrivel));
Prefix(nameof(Marshmallow_RemoveMallow)); // Prefix<Marshmallow>(nameof(Marshmallow.RemoveMallow), nameof(Marshmallow_RemoveMallow));
Prefix(nameof(Marshmallow_SpawnMallow)); // Prefix<Marshmallow>(nameof(Marshmallow.SpawnMallow), nameof(Marshmallow_SpawnMallow));
} //}
[HarmonyPrefix]
[HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.SpawnMallow))]
public static bool Marshmallow_SpawnMallow() public static bool Marshmallow_SpawnMallow()
{ {
QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Replace); QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Replace);
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.Burn))]
public static bool Marshmallow_Burn( public static bool Marshmallow_Burn(
ref Marshmallow.MallowState ____mallowState, ref Marshmallow.MallowState ____mallowState,
MeshRenderer ____fireRenderer, MeshRenderer ____fireRenderer,
@ -43,6 +49,8 @@ namespace QSB.RoastingSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.Shrivel))]
public static bool Marshmallow_Shrivel( public static bool Marshmallow_Shrivel(
ref Marshmallow.MallowState ____mallowState, ref Marshmallow.MallowState ____mallowState,
ref float ____initShrivelTime) ref float ____initShrivelTime)
@ -57,6 +65,8 @@ namespace QSB.RoastingSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(Marshmallow), nameof(Marshmallow.RemoveMallow))]
public static bool Marshmallow_RemoveMallow( public static bool Marshmallow_RemoveMallow(
ParticleSystem ____smokeParticles, ParticleSystem ____smokeParticles,
MeshRenderer ____fireRenderer, MeshRenderer ____fireRenderer,
@ -73,6 +83,8 @@ namespace QSB.RoastingSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(RoastingStickController), nameof(RoastingStickController.UpdateMarshmallowInput))]
public static bool RoastingStickController_UpdateMarshmallowInput( public static bool RoastingStickController_UpdateMarshmallowInput(
float ____extendFraction, float ____extendFraction,
Marshmallow ____marshmallow, Marshmallow ____marshmallow,

View File

@ -4,6 +4,6 @@
{ {
public Sector AttachedSector; public Sector AttachedSector;
protected override void Awake() { } public override void Awake() { }
} }
} }

View File

@ -1,30 +1,22 @@
using OWML.Utils; using HarmonyLib;
using OWML.Utils;
using QSB.Events; using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Utility; using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Reflection.Emit;
using UnityEngine; using UnityEngine;
namespace QSB.ShipSync.Patches namespace QSB.ShipSync.Patches
{ {
[HarmonyPatch]
internal class ShipPatches : QSBPatch internal class ShipPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(HatchController), nameof(HatchController.OnPressInteract))]
Prefix(nameof(HatchController_OnPressInteract));
Prefix(nameof(HatchController_OnEntry));
Prefix(nameof(ShipTractorBeamSwitch_OnTriggerExit));
Prefix(nameof(InteractZone_UpdateInteractVolume));
Prefix(nameof(ShipElectricalComponent_OnEnterShip));
Prefix(nameof(ShipElectricalComponent_OnExitShip));
Prefix(nameof(ShipComponent_SetDamaged));
Prefix(nameof(ShipHull_FixedUpdate));
Prefix(nameof(ShipDamageController_OnImpact));
Postfix(nameof(ShipComponent_RepairTick));
Prefix(nameof(ShipHull_RepairTick));
}
public static bool HatchController_OnPressInteract() public static bool HatchController_OnPressInteract()
{ {
if (!PlayerState.IsInsideShip()) if (!PlayerState.IsInsideShip())
@ -37,6 +29,8 @@ namespace QSB.ShipSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(HatchController), nameof(HatchController.OnEntry))]
public static bool HatchController_OnEntry(GameObject hitObj) public static bool HatchController_OnEntry(GameObject hitObj)
{ {
if (hitObj.CompareTag("PlayerDetector")) if (hitObj.CompareTag("PlayerDetector"))
@ -47,9 +41,11 @@ namespace QSB.ShipSync.Patches
return true; return true;
} }
public static bool ShipTractorBeamSwitch_OnTriggerExit(Collider hitCollider, bool ____isPlayerInShip, bool ____functional) [HarmonyPrefix]
[HarmonyPatch(typeof(ShipTractorBeamSwitch), nameof(ShipTractorBeamSwitch.OnTriggerExit))]
public static bool ShipTractorBeamSwitch_OnTriggerExit(ShipTractorBeamSwitch __instance, Collider hitCollider)
{ {
if (!____isPlayerInShip && ____functional && hitCollider.CompareTag("PlayerDetector") && !ShipManager.Instance.HatchController.GetValue<GameObject>("_hatchObject").activeSelf) if (!__instance._isPlayerInShip && __instance._functional && hitCollider.CompareTag("PlayerDetector") && !ShipManager.Instance.HatchController._hatchObject.activeSelf)
{ {
ShipManager.Instance.HatchController.Invoke("CloseHatch"); ShipManager.Instance.HatchController.Invoke("CloseHatch");
ShipManager.Instance.ShipTractorBeam.DeactivateTractorBeam(); ShipManager.Instance.ShipTractorBeam.DeactivateTractorBeam();
@ -59,7 +55,16 @@ namespace QSB.ShipSync.Patches
return false; return false;
} }
public static bool InteractZone_UpdateInteractVolume(InteractZone __instance, OWCamera ____playerCam, ref bool ____focused) [HarmonyReversePatch]
[HarmonyPatch(typeof(SingleInteractionVolume), nameof(SingleInteractionVolume.UpdateInteractVolume))]
public static void SingleInteractionVolume_UpdateInteractVolume_Stub(object instance)
{
throw new NotImplementedException();
}
[HarmonyPrefix]
[HarmonyPatch(typeof(InteractZone), nameof(InteractZone.UpdateInteractVolume))]
public static bool InteractZone_UpdateInteractVolume(InteractZone __instance)
{ {
/* Angle for interaction with the ship hatch /* Angle for interaction with the ship hatch
* *
@ -78,64 +83,86 @@ namespace QSB.ShipSync.Patches
return true; return true;
} }
var angle = 2f * Vector3.Angle(____playerCam.transform.forward, __instance.transform.forward); var angle = 2f * Vector3.Angle(__instance._playerCam.transform.forward, __instance.transform.forward);
____focused = PlayerState.IsInsideShip() __instance._focused = PlayerState.IsInsideShip()
? angle <= 80 ? angle <= 80
: angle >= 280; : angle >= 280;
__instance.CallBase<InteractZone, SingleInteractionVolume>("UpdateInteractVolume"); SingleInteractionVolume_UpdateInteractVolume_Stub(__instance as SingleInteractionVolume);
return false; return false;
} }
public static bool ShipElectricalComponent_OnEnterShip(ShipElectricalComponent __instance, bool ____damaged, ElectricalSystem ____electricalSystem) [HarmonyReversePatch]
[HarmonyPatch(typeof(ShipComponent), nameof(ShipComponent.OnEnterShip))]
public static void ShipComponent_OnEnterShip_Stub(object instance)
{ {
__instance.CallBase<ShipElectricalComponent, ShipComponent>("OnEnterShip"); throw new NotImplementedException();
}
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipElectricalComponent), nameof(ShipElectricalComponent.OnEnterShip))]
public static bool ShipElectricalComponent_OnEnterShip(ShipElectricalComponent __instance)
{
ShipComponent_OnEnterShip_Stub(__instance as ShipComponent);
return false; return false;
} }
public static bool ShipElectricalComponent_OnExitShip(ShipElectricalComponent __instance, bool ____damaged, ElectricalSystem ____electricalSystem) [HarmonyReversePatch]
[HarmonyPatch(typeof(ShipComponent), nameof(ShipComponent.OnExitShip))]
public static void ShipComponent_OnExitShip_Stub(object instance)
{ {
__instance.CallBase<ShipElectricalComponent, ShipComponent>("OnExitShip"); throw new NotImplementedException();
}
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipElectricalComponent), nameof(ShipElectricalComponent.OnExitShip))]
public static bool ShipElectricalComponent_OnExitShip(ShipElectricalComponent __instance)
{
ShipComponent_OnExitShip_Stub(__instance as ShipComponent);
return false; return false;
} }
public static bool ShipComponent_SetDamaged(ShipComponent __instance, bool damaged, ref bool ____damaged, ref float ____repairFraction, DamageEffect ____damageEffect) [HarmonyPrefix]
[HarmonyPatch(typeof(ShipComponent), nameof(ShipComponent.SetDamaged))]
public static bool ShipComponent_SetDamaged(ShipComponent __instance, bool damaged)
{ {
if (____damaged == damaged) if (__instance._damaged == damaged)
{ {
return false; return false;
} }
if (damaged) if (damaged)
{ {
____damaged = true; __instance._damaged = true;
____repairFraction = 0f; __instance._repairFraction = 0f;
__instance.GetType().GetAnyMethod("OnComponentDamaged").Invoke(__instance, null); __instance.GetType().GetAnyMethod("OnComponentDamaged").Invoke(__instance, null);
__instance.RaiseEvent("OnDamaged", __instance); __instance.RaiseEvent("OnDamaged", __instance);
QSBEventManager.FireEvent(EventNames.QSBComponentDamaged, __instance); QSBEventManager.FireEvent(EventNames.QSBComponentDamaged, __instance);
} }
else else
{ {
____damaged = false; __instance._damaged = false;
____repairFraction = 1f; __instance._repairFraction = 1f;
__instance.GetType().GetAnyMethod("OnComponentRepaired").Invoke(__instance, null); __instance.GetType().GetAnyMethod("OnComponentRepaired").Invoke(__instance, null);
__instance.RaiseEvent("OnRepaired", __instance); __instance.RaiseEvent("OnRepaired", __instance);
QSBEventManager.FireEvent(EventNames.QSBComponentRepaired, __instance); QSBEventManager.FireEvent(EventNames.QSBComponentRepaired, __instance);
} }
__instance.GetType().GetAnyMethod("UpdateColliderState").Invoke(__instance, null); __instance.GetType().GetAnyMethod("UpdateColliderState").Invoke(__instance, null);
if (____damageEffect) if (__instance._damageEffect)
{ {
____damageEffect.SetEffectBlend(1f - ____repairFraction); __instance._damageEffect.SetEffectBlend(1f - __instance._repairFraction);
} }
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipHull), nameof(ShipHull.FixedUpdate))]
public static bool ShipHull_FixedUpdate(ShipHull __instance, ref ImpactData ____dominantImpact, ref float ____integrity, ref bool ____damaged, DamageEffect ____damageEffect, ShipComponent[] ____components) public static bool ShipHull_FixedUpdate(ShipHull __instance, ref ImpactData ____dominantImpact, ref float ____integrity, ref bool ____damaged, DamageEffect ____damageEffect, ShipComponent[] ____components)
{ {
if (____dominantImpact != null) if (____dominantImpact != null)
@ -186,15 +213,21 @@ namespace QSB.ShipSync.Patches
return false; return false;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipDamageController), nameof(ShipDamageController.OnImpact))]
public static bool ShipDamageController_OnImpact() public static bool ShipDamageController_OnImpact()
=> ShipManager.Instance.HasAuthority; => ShipManager.Instance.HasAuthority;
[HarmonyPostfix]
[HarmonyPatch(typeof(ShipComponent), nameof(ShipComponent.RepairTick))]
public static void ShipComponent_RepairTick(ShipComponent __instance, float ____repairFraction) public static void ShipComponent_RepairTick(ShipComponent __instance, float ____repairFraction)
{ {
QSBEventManager.FireEvent(EventNames.QSBComponentRepairTick, __instance, ____repairFraction); QSBEventManager.FireEvent(EventNames.QSBComponentRepairTick, __instance, ____repairFraction);
return; return;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(ShipHull), nameof(ShipHull.RepairTick))]
public static bool ShipHull_RepairTick(ShipHull __instance, ref float ____integrity, ref bool ____damaged, DamageEffect ____damageEffect, float ____repairTime) public static bool ShipHull_RepairTick(ShipHull __instance, ref float ____integrity, ref bool ____damaged, DamageEffect ____damageEffect, float ____repairTime)
{ {
if (!____damaged) if (!____damaged)

View File

@ -1,17 +1,18 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
using UnityEngine; using UnityEngine;
namespace QSB.StatueSync.Patches namespace QSB.StatueSync.Patches
{ {
[HarmonyPatch]
internal class StatuePatches : QSBPatch internal class StatuePatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
=> Prefix(nameof(MemoryUplinkTrigger_Update)); [HarmonyPatch(typeof(MemoryUplinkTrigger), nameof(MemoryUplinkTrigger.Update))]
public static bool MemoryUplinkTrigger_Update(bool ____waitForPlayerGrounded) public static bool MemoryUplinkTrigger_Update(bool ____waitForPlayerGrounded)
{ {
if (StatueManager.Instance.HasStartedStatueLocally) if (StatueManager.Instance.HasStartedStatueLocally)

View File

@ -1,19 +1,26 @@
using QSB.Patches; using HarmonyLib;
using QSB.Patches;
namespace QSB.TimeSync.Patches namespace QSB.TimeSync.Patches
{ {
[HarmonyPatch]
internal class TimePatches : QSBPatch internal class TimePatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(PlayerCameraEffectController), nameof(PlayerCameraEffectController.OnStartOfTimeLoop))]
Prefix(nameof(PlayerCameraEffectController_OnStartOfTimeLoop));
Empty("OWTime_Pause");
Empty("SubmitActionSkipToNextLoop_AdvanceToNextLoop"); // TODO : remove this, remove meditation button instead
}
public static bool PlayerCameraEffectController_OnStartOfTimeLoop() public static bool PlayerCameraEffectController_OnStartOfTimeLoop()
=> false; => false;
[HarmonyPrefix]
[HarmonyPatch(typeof(OWTime), nameof(OWTime.Pause))]
public static bool StopPausing()
=> false;
[HarmonyPrefix]
[HarmonyPatch(typeof(SubmitActionSkipToNextLoop), nameof(SubmitActionSkipToNextLoop.AdvanceToNewTimeLoop))]
public static bool StopMeditation()
=> false;
} }
} }

View File

@ -1,4 +1,5 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
using QSB.Tools.ProbeLauncherTool.WorldObjects; using QSB.Tools.ProbeLauncherTool.WorldObjects;
@ -7,17 +8,13 @@ using UnityEngine;
namespace QSB.Tools.ProbeLauncherTool.Patches namespace QSB.Tools.ProbeLauncherTool.Patches
{ {
[HarmonyPatch]
internal class LauncherPatches : QSBPatch internal class LauncherPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(ProbeLauncher), nameof(ProbeLauncher.RetrieveProbe))]
Prefix(nameof(ProbeLauncher_RetrieveProbe));
Postfix(nameof(ProbeLauncherEffects_PlayRetrievalClip));
Postfix(nameof(ProbeLauncherEffects_PlayLaunchClip));
}
public static bool ProbeLauncher_RetrieveProbe( public static bool ProbeLauncher_RetrieveProbe(
ProbeLauncher __instance, ProbeLauncher __instance,
bool playEffects, bool playEffects,
@ -74,8 +71,12 @@ namespace QSB.Tools.ProbeLauncherTool.Patches
// TODO : ehhhh idk about this. maybe copy each sound source so we have a 2d version (for local) and a 3d version (for remote)? // TODO : ehhhh idk about this. maybe copy each sound source so we have a 2d version (for local) and a 3d version (for remote)?
// this would probably be a whole qsb version on it's own // this would probably be a whole qsb version on it's own
[HarmonyPostfix]
[HarmonyPatch(typeof(ProbeLauncherEffects), nameof(ProbeLauncherEffects.PlayRetrievalClip))]
public static void ProbeLauncherEffects_PlayRetrievalClip(OWAudioSource ____owAudioSource) => ____owAudioSource.GetAudioSource().spatialBlend = 1f; public static void ProbeLauncherEffects_PlayRetrievalClip(OWAudioSource ____owAudioSource) => ____owAudioSource.GetAudioSource().spatialBlend = 1f;
[HarmonyPostfix]
[HarmonyPatch(typeof(ProbeLauncherEffects), nameof(ProbeLauncherEffects.PlayLaunchClip))]
public static void ProbeLauncherEffects_PlayLaunchClip(OWAudioSource ____owAudioSource) => ____owAudioSource.GetAudioSource().spatialBlend = 1f; public static void ProbeLauncherEffects_PlayLaunchClip(OWAudioSource ____owAudioSource) => ____owAudioSource.GetAudioSource().spatialBlend = 1f;
} }
} }

View File

@ -1,21 +1,18 @@
using QSB.Events; using HarmonyLib;
using QSB.Events;
using QSB.Patches; using QSB.Patches;
using QSB.TranslationSync.WorldObjects; using QSB.TranslationSync.WorldObjects;
using QSB.WorldSync; using QSB.WorldSync;
namespace QSB.TranslationSync.Patches namespace QSB.TranslationSync.Patches
{ {
[HarmonyPatch]
internal class SpiralPatches : QSBPatch internal class SpiralPatches : QSBPatch
{ {
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() [HarmonyPrefix]
{ [HarmonyPatch(typeof(NomaiWallText), nameof(NomaiWallText.SetAsTranslated))]
Prefix(nameof(NomaiWallText_SetAsTranslated));
Prefix(nameof(NomaiComputer_SetAsTranslated));
Prefix(nameof(NomaiVesselComputer_SetAsTranslated));
}
public static bool NomaiWallText_SetAsTranslated(NomaiWallText __instance, int id) public static bool NomaiWallText_SetAsTranslated(NomaiWallText __instance, int id)
{ {
if (__instance.IsTranslated(id)) if (__instance.IsTranslated(id))
@ -31,6 +28,8 @@ namespace QSB.TranslationSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiComputer), nameof(NomaiWallText.SetAsTranslated))]
public static bool NomaiComputer_SetAsTranslated(NomaiComputer __instance, int id) public static bool NomaiComputer_SetAsTranslated(NomaiComputer __instance, int id)
{ {
if (__instance.IsTranslated(id)) if (__instance.IsTranslated(id))
@ -46,6 +45,8 @@ namespace QSB.TranslationSync.Patches
return true; return true;
} }
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiVesselComputer), nameof(NomaiWallText.SetAsTranslated))]
public static bool NomaiVesselComputer_SetAsTranslated(NomaiVesselComputer __instance, int id) public static bool NomaiVesselComputer_SetAsTranslated(NomaiVesselComputer __instance, int id)
{ {
if (__instance.IsTranslated(id)) if (__instance.IsTranslated(id))

View File

@ -129,27 +129,6 @@ namespace QSB.Utility
multiDelegate.GetInvocationList().ToList().ForEach(dl => dl.DynamicInvoke(args)); multiDelegate.GetInvocationList().ToList().ForEach(dl => dl.DynamicInvoke(args));
} }
public static void CallBase<ThisType, BaseType>(this ThisType obj, string methodName)
where ThisType : BaseType
{
var method = typeof(BaseType).GetAnyMethod(methodName);
if (method == null)
{
DebugLog.ToConsole($"Error - Couldn't find method {methodName} in {typeof(BaseType).FullName}!", MessageType.Error);
return;
}
var functionPointer = method.MethodHandle.GetFunctionPointer();
if (functionPointer == null)
{
DebugLog.ToConsole($"Error - Function pointer for {methodName} in {typeof(BaseType).FullName} is null!", MessageType.Error);
return;
}
var methodAction = (Action)Activator.CreateInstance(typeof(Action), obj, functionPointer);
methodAction();
}
// OW // OW
public static Vector3 GetRelativeAngularVelocity(this OWRigidbody baseBody, OWRigidbody relativeBody) public static Vector3 GetRelativeAngularVelocity(this OWRigidbody baseBody, OWRigidbody relativeBody)

View File

@ -10,32 +10,32 @@ namespace QSBTests
[TestClass] [TestClass]
public class PatchTests public class PatchTests
{ {
[TestMethod] //[TestMethod]
public void CheckUnreferencedPatches() //public void CheckUnreferencedPatches()
{ //{
var qsbAssembly = Assembly.Load("QSB"); // var qsbAssembly = Assembly.Load("QSB");
var allPatchTypes = qsbAssembly // var allPatchTypes = qsbAssembly
.GetTypes() // .GetTypes()
.Where(x => typeof(QSBPatch).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract); // .Where(x => typeof(QSBPatch).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract);
QSBPatchManager.Init(); // QSBPatchManager.Init();
var patchInstances = (List<QSBPatch>)typeof(QSBPatchManager) // var patchInstances = (List<QSBPatch>)typeof(QSBPatchManager)
.GetField("_patchList", BindingFlags.NonPublic | BindingFlags.Static) // .GetField("_patchList", BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(typeof(QSBPatchManager)); // .GetValue(typeof(QSBPatchManager));
var failedTypes = new List<Type>(); // var failedTypes = new List<Type>();
foreach (var type in allPatchTypes) // foreach (var type in allPatchTypes)
{ // {
if (!patchInstances.Any(x => x.GetType() == type)) // if (!patchInstances.Any(x => x.GetType() == type))
{ // {
failedTypes.Add(type); // failedTypes.Add(type);
} // }
} // }
if (failedTypes.Count > 0) // if (failedTypes.Count > 0)
{ // {
Assert.Fail(string.Join(", ", failedTypes.Select(x => x.Name))); // Assert.Fail(string.Join(", ", failedTypes.Select(x => x.Name)));
} // }
} //}
} }
} }