From 291238622e1ca7e26d6166bcf8a1151698df0d2d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 12 Jun 2025 17:56:00 -0500 Subject: [PATCH] Avoid using `plFactory.ClassIndex()`. As we saw in debd7d1, `plFactory.ClassIndex()` will silently error by returning an "invalid" class index when an invalid class name is passed in. While the immediate bug was indeed fixed, we can make the code even more resilient by simply using the `plFactory` constants directly. We aren't programmatically generating the class names, so there's no need for the overhead and bugprone nature of `plFactory.ClassIndex()`. --- korman/exporter/manager.py | 34 +++++++++--------- korman/nodes/node_python.py | 72 ++++++++++++++++++++----------------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/korman/exporter/manager.py b/korman/exporter/manager.py index d6735d0..4d5fb09 100644 --- a/korman/exporter/manager.py +++ b/korman/exporter/manager.py @@ -26,23 +26,23 @@ from ..plasma_magic import * # These objects have to be in the plSceneNode pool in order to be loaded... # NOTE: We are using Factory indices because I doubt all of these classes are implemented. -_pool_types = ( - plFactory.ClassIndex("plPostEffectMod"), - plFactory.ClassIndex("pfGUIDialogMod"), - plFactory.ClassIndex("plMsgForwarder"), - plFactory.ClassIndex("plClothingItem"), - plFactory.ClassIndex("plArmatureEffectFootSound"), - plFactory.ClassIndex("plDynaFootMgr"), - plFactory.ClassIndex("plDynaRippleMgr"), - plFactory.ClassIndex("plDynaBulletMgr"), - plFactory.ClassIndex("plDynaPuddleMgr"), - #plFactory.ClassIndex("plATCAnim"), # Only Avatar Animations need to be pool objects - plFactory.ClassIndex("plEmoteAnim"), - plFactory.ClassIndex("plDynaRippleVSMgr"), - plFactory.ClassIndex("plDynaTorpedoMgr"), - plFactory.ClassIndex("plDynaTorpedoVSMgr"), - plFactory.ClassIndex("plClusterGroup"), -) +_pool_types = { + plFactory.kPostEffectMod, + plFactory.kGUIDialogMod, + plFactory.kMsgForwarder, + plFactory.kClothingItem, + plFactory.kArmatureEffectFootSound, + plFactory.kDynaFootMgr, + plFactory.kDynaRippleMgr, + plFactory.kDynaBulletMgr, + plFactory.kDynaPuddleMgr, + #plFactory.kATCAnim, # Only Avatar Animations need to be pool objects + plFactory.kEmoteAnim, + plFactory.kDynaRippleVSMgr, + plFactory.kDynaTorpedoMgr, + plFactory.kDynaTorpedoVSMgr, + plFactory.kClusterGroup, +} class ExportManager: diff --git a/korman/nodes/node_python.py b/korman/nodes/node_python.py index 28c7f09..5d1b9c6 100644 --- a/korman/nodes/node_python.py +++ b/korman/nodes/node_python.py @@ -70,34 +70,44 @@ _attrib2param = { } _attrib_key_types = { - "ptAttribSceneobject": plFactory.ClassIndex("plSceneObject"), - "ptAttribSceneobjectList": plFactory.ClassIndex("plSceneObject"), - "ptAttribActivator": (plFactory.ClassIndex("plLogicModifier"), - plFactory.ClassIndex("plPythonFileMod")), - "ptAttribActivatorList": (plFactory.ClassIndex("plLogicModifier"), - plFactory.ClassIndex("plPythonFileMod")), - "ptAttribNamedActivator": (plFactory.ClassIndex("plLogicModifier"), - plFactory.ClassIndex("plPythonFileMod")), - "ptAttribResponder": plFactory.ClassIndex("plResponderModifier"), - "ptAttribResponderList": plFactory.ClassIndex("plResponderModifier"), - "ptAttribNamedResponder": plFactory.ClassIndex("plResponderModifier"), - "ptAttribDynamicMap": plFactory.ClassIndex("plDynamicTextMap"), - "ptAttribGUIDialog": plFactory.ClassIndex("pfGUIDialogMod"), - "ptAttribExcludeRegion": plFactory.ClassIndex("plExcludeRegionModifier"), - "ptAttribAnimation": (plFactory.ClassIndex("plAGMasterMod"), - plFactory.ClassIndex("plMsgForwarder")), - "ptAttribBehavior": plFactory.ClassIndex("plMultistageBehMod"), - "ptAttribMaterial": plFactory.ClassIndex("plLayer"), - "ptAttribMaterialList": plFactory.ClassIndex("plLayer"), - "ptAttribGUIPopUpMenu": plFactory.ClassIndex("pfGUIPopUpMenu"), - "ptAttribGUISkin": plFactory.ClassIndex("pfGUISkin"), - "ptAttribWaveSet": plFactory.ClassIndex("plWaveSet7"), - "ptAttribSwimCurrent": (plFactory.ClassIndex("plSwimRegionInterface"), - plFactory.ClassIndex("plSwimCircularCurrentRegion"), - plFactory.ClassIndex("plSwimStraightCurrentRegion")), - "ptAttribClusterList": plFactory.ClassIndex("plClusterGroup"), - "ptAttribMaterialAnimation": plFactory.ClassIndex("plLayerAnimation"), - "ptAttribGrassShader": plFactory.ClassIndex("plGrassShaderMod"), + "ptAttribSceneobject": { plFactory.kSceneObject }, + "ptAttribSceneobjectList": { plFactory.kSceneObject }, + "ptAttribActivator": { + plFactory.kLogicModifier, + plFactory.kPythonFileMod + }, + "ptAttribActivatorList": { + plFactory.kLogicModifier, + plFactory.kPythonFileMod + }, + "ptAttribNamedActivator": { + plFactory.kLogicModifier, + plFactory.kPythonFileMod + }, + "ptAttribResponder": { plFactory.kResponderModifier }, + "ptAttribResponderList": { plFactory.kResponderModifier }, + "ptAttribNamedResponder": { plFactory.kResponderModifier }, + "ptAttribDynamicMap": { plFactory.kDynamicTextMap }, + "ptAttribGUIDialog": { plFactory.kGUIDialogMod }, + "ptAttribExcludeRegion": { plFactory.kExcludeRegionModifier }, + "ptAttribAnimation": { + plFactory.kAGMasterMod, + plFactory.kMsgForwarder + }, + "ptAttribBehavior": { plFactory.kMultistageBehMod }, + "ptAttribMaterial": { plFactory.kLayer }, + "ptAttribMaterialList": { plFactory.kLayer }, + "ptAttribGUIPopUpMenu": { plFactory.kGUIPopUpMenu }, + "ptAttribGUISkin": { plFactory.kGUISkin }, + "ptAttribWaveSet": { plFactory.kWaveSet7 }, + "ptAttribSwimCurrent": { + plFactory.kSwimRegionInterface, + plFactory.kSwimCircularCurrentRegion, + plFactory.kSwimStraightCurrentRegion, + }, + "ptAttribClusterList": { plFactory.kClusterGroup }, + "ptAttribMaterialAnimation": { plFactory.kLayerAnimation }, + "ptAttribGrassShader": { plFactory.kGrassShaderMod }, } @@ -342,11 +352,7 @@ class PlasmaPythonFileNode(PlasmaVersionedNode, bpy.types.Node): return key_type = _attrib_key_types[socket.attribute_type] - if isinstance(key_type, tuple): - good_key = key.type in key_type - else: - good_key = key.type == key_type - if not good_key: + if not key.type in key_type: exporter.report.warn( f"'{self.id_data.name}' Node '{socket.links[0].from_node.name}' " f"returned an unexpected key type '{plFactory.ClassName(key.type)}' "