From 1b0934be9fdba2a7fae4a461a35b272c27e5d0f4 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Mon, 20 Dec 2021 11:48:50 +0000 Subject: [PATCH] make auto-triggers work --- QSB/ConversationSync/ConversationManager.cs | 6 +- .../Events/EnterRemoteDialogueEvent.cs | 35 +++++++++ .../Events/EnterRemoteDialogueMessage.cs | 25 +++++++ .../Patches/ConversationPatches.cs | 73 +++++++++++++++++++ .../WorldObjects/QSBRemoteDialogueTrigger.cs | 16 ++++ QSB/Events/EventNames.cs | 1 + QSB/Events/QSBEventManager.cs | 1 + QSB/QSBCore.cs | 2 +- 8 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs create mode 100644 QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs create mode 100644 QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs diff --git a/QSB/ConversationSync/ConversationManager.cs b/QSB/ConversationSync/ConversationManager.cs index 2304d018..c72884bb 100644 --- a/QSB/ConversationSync/ConversationManager.cs +++ b/QSB/ConversationSync/ConversationManager.cs @@ -1,4 +1,5 @@ using OWML.Common; +using QSB.ConversationSync.WorldObjects; using QSB.Events; using QSB.Player; using QSB.Utility; @@ -10,7 +11,7 @@ using UnityEngine.UI; namespace QSB.ConversationSync { - public class ConversationManager : MonoBehaviour + public class ConversationManager : WorldObjectManager { public static ConversationManager Instance { get; private set; } public Dictionary BoxMappings { get; } = new Dictionary(); @@ -33,6 +34,9 @@ namespace QSB.ConversationSync _boxPrefab.GetComponent().color = Color.white; } + protected override void RebuildWorldObjects(OWScene scene) + => QSBWorldSync.Init(); + public uint GetPlayerTalkingToTree(CharacterDialogueTree tree) { var treeIndex = QSBWorldSync.OldDialogueTrees.IndexOf(tree); diff --git a/QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs b/QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs new file mode 100644 index 00000000..b685535e --- /dev/null +++ b/QSB/ConversationSync/Events/EnterRemoteDialogueEvent.cs @@ -0,0 +1,35 @@ +using QSB.ConversationSync.WorldObjects; +using QSB.Events; +using QSB.WorldSync; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace QSB.ConversationSync.Events +{ + internal class EnterRemoteDialogueEvent : QSBEvent + { + public override bool RequireWorldObjectsReady => true; + + public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBEnterRemoteDialogue, Handler); + public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBEnterRemoteDialogue, Handler); + + private void Handler(QSBRemoteDialogueTrigger remoteTrigger, int activatedIndex, int listIndex) => SendEvent(CreateMessage(remoteTrigger, activatedIndex, listIndex)); + + private EnterRemoteDialogueMessage CreateMessage(QSBRemoteDialogueTrigger remoteTrigger, int activatedIndex, int listIndex) => new() + { + AboutId = LocalPlayerId, + ObjectId = remoteTrigger.ObjectId, + ActivatedDialogueIndex = activatedIndex, + ListDialoguesIndex = listIndex + }; + + public override void OnReceiveRemote(bool isHost, EnterRemoteDialogueMessage message) + { + var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); + qsbObj.RemoteEnterDialogue(message.ActivatedDialogueIndex, message.ListDialoguesIndex); + } + } +} diff --git a/QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs b/QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs new file mode 100644 index 00000000..3ba5087a --- /dev/null +++ b/QSB/ConversationSync/Events/EnterRemoteDialogueMessage.cs @@ -0,0 +1,25 @@ +using QSB.WorldSync.Events; +using QuantumUNET.Transport; + +namespace QSB.ConversationSync.Events +{ + public class EnterRemoteDialogueMessage : WorldObjectMessage + { + public int ActivatedDialogueIndex { get; set; } + public int ListDialoguesIndex { get; set; } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + ActivatedDialogueIndex = reader.ReadInt32(); + ListDialoguesIndex = reader.ReadInt32(); + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(ActivatedDialogueIndex); + writer.Write(ListDialoguesIndex); + } + } +} \ No newline at end of file diff --git a/QSB/ConversationSync/Patches/ConversationPatches.cs b/QSB/ConversationSync/Patches/ConversationPatches.cs index c674cc15..b288462e 100644 --- a/QSB/ConversationSync/Patches/ConversationPatches.cs +++ b/QSB/ConversationSync/Patches/ConversationPatches.cs @@ -1,10 +1,13 @@ using HarmonyLib; using OWML.Common; +using QSB.ConversationSync.WorldObjects; +using QSB.Events; using QSB.Patches; using QSB.Player; using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; +using UnityEngine; namespace QSB.ConversationSync.Patches { @@ -74,5 +77,75 @@ namespace QSB.ConversationSync.Patches QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId != -1, () => ConversationManager.Instance.SendCharacterDialogue(QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId, key)); } + + [HarmonyPrefix] + [HarmonyPatch(typeof(RemoteDialogueTrigger), nameof(RemoteDialogueTrigger.ConversationTriggered))] + public static bool ConversationTriggeredReplacement(RemoteDialogueTrigger __instance, ref bool __result, out RemoteDialogueTrigger.RemoteDialogueCondition dialogue) + { + dialogue = default; + var maxValue = int.MaxValue; + var num = -1; + var sharedInstance = DialogueConditionManager.SharedInstance; + for (var i = 0; i < __instance._listDialogues.Length; i++) + { + if (!__instance._activatedDialogues[i]) + { + var flag = true; + var flag2 = false; + if (__instance._listDialogues[i].prereqConditions.Length == 0) + { + flag2 = true; + } + + for (int j = 0; j < __instance._listDialogues[i].prereqConditions.Length; j++) + { + if (sharedInstance.GetConditionState(__instance._listDialogues[i].prereqConditions[j])) + { + flag2 = true; + } + else + { + flag = false; + } + } + + bool flag3 = false; + RemoteDialogueTrigger.MultiConditionType prereqConditionType = __instance._listDialogues[i].prereqConditionType; + if (prereqConditionType != RemoteDialogueTrigger.MultiConditionType.OR) + { + if (prereqConditionType == RemoteDialogueTrigger.MultiConditionType.AND && flag) + { + flag3 = true; + } + } + else if (flag2) + { + flag3 = true; + } + + if (flag3 && __instance._listDialogues[i].priority < maxValue) + { + dialogue = __instance._listDialogues[i]; + num = i; + } + } + } + + if (num == -1) + { + __result = false; + return false; + } + + __instance._activatedDialogues[num] = true; + + QSBEventManager.FireEvent(EventNames.QSBEnterRemoteDialogue, + QSBWorldSync.GetWorldFromUnity(__instance), + num, + __instance._listDialogues.IndexOf(dialogue)); + + __result = true; + return false; + } } } \ No newline at end of file diff --git a/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs b/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs new file mode 100644 index 00000000..44f8d946 --- /dev/null +++ b/QSB/ConversationSync/WorldObjects/QSBRemoteDialogueTrigger.cs @@ -0,0 +1,16 @@ +using QSB.Utility; +using QSB.WorldSync; + +namespace QSB.ConversationSync.WorldObjects +{ + internal class QSBRemoteDialogueTrigger : WorldObject + { + public void RemoteEnterDialogue(int activatedIndex, int listIndex) + { + var dialogueCondition = AttachedObject._listDialogues[listIndex]; + AttachedObject._activeRemoteDialogue = dialogueCondition.dialogue; + AttachedObject._inRemoteDialogue = true; + AttachedObject._activatedDialogues[activatedIndex] = true; + } + } +} diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index f0e4fdf6..29b07940 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -105,5 +105,6 @@ public const string QSBTornadoFormState = nameof(QSBTornadoFormState); public const string QSBRequestGameDetails = nameof(QSBRequestGameDetails); public const string QSBGameDetails = nameof(QSBGameDetails); + public const string QSBEnterRemoteDialogue = nameof(QSBEnterRemoteDialogue); } } diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 63b90f98..adaaf1c4 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -120,6 +120,7 @@ namespace QSB.Events new IdentifySignalEvent(), new NpcAnimationEvent(), new AuthQueueEvent(), + new EnterRemoteDialogueEvent(), // Ship new FlyShipEvent(), new HatchEvent(), diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 129c74ae..c467a2ae 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -114,7 +114,6 @@ namespace QSB gameObject.AddComponent(); gameObject.AddComponent(); - gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); @@ -144,6 +143,7 @@ namespace QSB gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); + gameObject.AddComponent(); DebugBoxManager.Init();