fix infinite loop of sending dialogue conditions

This commit is contained in:
Mister_Nebula 2022-01-08 12:19:39 +00:00
parent 93eb642b77
commit 7434b59940
2 changed files with 34 additions and 12 deletions

View File

@ -1,5 +1,4 @@
using QSB.Messaging;
using QSB.Player.TransformSync;
using QSB.WorldSync;
using QuantumUNET.Transport;
@ -7,16 +6,6 @@ namespace QSB.ConversationSync.Messages
{
public class DialogueConditionMessage : QSBMessage
{
static DialogueConditionMessage() => GlobalMessenger<string, bool>.AddListener(OWEvents.DialogueConditionChanged, Handler);
private static void Handler(string name, bool state)
{
if (PlayerTransformSync.LocalInstance)
{
new DialogueConditionMessage(name, state).Send();
}
}
private string ConditionName;
private bool ConditionState;
@ -47,7 +36,32 @@ namespace QSB.ConversationSync.Messages
QSBWorldSync.SetDialogueCondition(ConditionName, ConditionState);
}
DialogueConditionManager.SharedInstance.SetConditionState(ConditionName, ConditionState);
var sharedInstance = DialogueConditionManager.SharedInstance;
var flag = true;
if (sharedInstance.ConditionExists(ConditionName))
{
if (sharedInstance._dictConditions[ConditionName] == ConditionState)
{
flag = false;
}
sharedInstance._dictConditions[ConditionName] = ConditionState;
}
else
{
sharedInstance.AddCondition(ConditionName, ConditionState);
}
if (flag)
{
GlobalMessenger<string, bool>.FireEvent("DialogueConditionChanged", ConditionName, ConditionState);
}
if (ConditionName == "LAUNCH_CODES_GIVEN")
{
PlayerData.LearnLaunchCodes();
}
}
public override void OnReceiveLocal()

View File

@ -25,6 +25,14 @@ namespace QSB.ConversationSync.Patches
"KNOWS_MEDITATION"
};
[HarmonyPrefix]
[HarmonyPatch(typeof(DialogueConditionManager), nameof(DialogueConditionManager.SetConditionState))]
public static bool SetConditionState(string conditionName, bool conditionState)
{
new DialogueConditionMessage(conditionName, conditionState).Send();
return true;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(CharacterDialogueTree), nameof(CharacterDialogueTree.StartConversation))]
public static void CharacterDialogueTree_StartConversation(CharacterDialogueTree __instance)