From e0db2bd3c3730fd053ffddfd8ce870de17bc344f Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 May 2020 15:25:47 -0400 Subject: [PATCH 1/3] Allow MSBs to trigger responders and sitting mods. --- korman/nodes/node_avatar.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/korman/nodes/node_avatar.py b/korman/nodes/node_avatar.py index 25d7184..2c5d431 100644 --- a/korman/nodes/node_avatar.py +++ b/korman/nodes/node_avatar.py @@ -303,6 +303,11 @@ class PlasmaMultiStageBehaviorNode(PlasmaNodeBase, bpy.types.Node): "link_limit": 1, "spawn_empty": True, }), + ("condition", { + "text": "Triggered By", + "type": "PlasmaConditionSocket", + "spawn_empty": True, + }), ]) output_sockets = OrderedDict([ @@ -311,6 +316,10 @@ class PlasmaMultiStageBehaviorNode(PlasmaNodeBase, bpy.types.Node): "type": "PlasmaBehaviorSocket", "valid_link_nodes": {"PlasmaPythonFileNode"}, "spawn_empty": True, + }), + ("satisfies", { + "text": "Trigger", + "type": "PlasmaConditionSocket", }) ]) @@ -382,6 +391,14 @@ class PlasmaMultiStageBehaviorNode(PlasmaNodeBase, bpy.types.Node): msbmod.addStage(animstage) + receivers = ((i, i.get_key(exporter, so)) for i in self.find_outputs("satisfies")) + for node, key in receivers: + if key is not None: + msbmod.addReceiver(key) + else: + exporter.report.warn("'{}' Node '{}' doesn't expose a key. It won't be triggered by '{}'!", + node.bl_idname, node.name, self.name, indent=3) + @property def requires_actor(self): return not self.find_input_socket("seek_target").is_linked From 0844a5338dae764b7d947250bf9246698ec064a5 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 May 2020 15:33:40 -0400 Subject: [PATCH 2/3] What the log message...? --- korman/nodes/node_avatar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/korman/nodes/node_avatar.py b/korman/nodes/node_avatar.py index 2c5d431..5579fc8 100644 --- a/korman/nodes/node_avatar.py +++ b/korman/nodes/node_avatar.py @@ -335,7 +335,7 @@ class PlasmaMultiStageBehaviorNode(PlasmaNodeBase, bpy.types.Node): if seek_target is not None: seek_object = exporter.mgr.find_create_object(plSceneObject, bl=seek_target) else: - raise ExportError("'{}': MultiStage Behavior's seek point object is invalid".format(self._find_create_key(plMultistageBehMod, exporter, so=so).name)) + self.raise_error("MultiStage Behavior's seek point object is invalid") else: seek_object = so From 0c82e80e48d4d39e65adbc156dd662e8f094d557 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 May 2020 16:40:37 -0400 Subject: [PATCH 3/3] Allow triggering MSBs from Responders. --- korman/nodes/node_messages.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/korman/nodes/node_messages.py b/korman/nodes/node_messages.py index de436e5..64c9e03 100644 --- a/korman/nodes/node_messages.py +++ b/korman/nodes/node_messages.py @@ -831,6 +831,34 @@ class PlasmaTimerCallbackMsgNode(PlasmaMessageWithCallbacksNode, bpy.types.Node) return msg +class PlasmaTriggerMultiStageMsgNode(PlasmaMessageNode, bpy.types.Node): + bl_category = "MSG" + bl_idname = "PlasmaTriggerMultiStageMsgNode" + bl_label = "Trigger MultiStage" + + output_sockets = OrderedDict([ + ("satisfies", { + "text": "Trigger", + "type": "PlasmaConditionSocket", + "valid_link_nodes": "PlasmaMultiStageBehaviorNode", + "valid_link_sockets": "PlasmaConditionSocket", + "link_limit": 1, + }) + ]) + + def convert_message(self, exporter, so): + # Yeah, this is not a REAL Plasma message, but the Korman way is to try to hide these little + # low-level notifications behind higher level abstractions, so here you go. A notify message + # that only targets plMultiStageBehMod. You're welcome! + msg = self.generate_notify_msg(exporter, so, "satisfies") + + # The MultiStageBehMod needs to receive the avatar key that whatdonetriggeredit. We don't know + # this information at export-time, but plResponderModifier::IContinueSending will interpret + # a collision event as "ohey, let's add the avatar key for MSBs" - nice. + msg.addEvent(proCollisionEventData()) + return msg + + class PlasmaFootstepSoundMsgNode(PlasmaMessageNode, bpy.types.Node): bl_category = "MSG" bl_idname = "PlasmaFootstepSoundMsgNode"