Browse Source

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()`.
master
Adam Johnson 6 days ago
parent
commit
291238622e
Signed by: Hoikas
GPG Key ID: 0B6515D6FF6F271E
  1. 34
      korman/exporter/manager.py
  2. 72
      korman/nodes/node_python.py

34
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... # 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. # NOTE: We are using Factory indices because I doubt all of these classes are implemented.
_pool_types = ( _pool_types = {
plFactory.ClassIndex("plPostEffectMod"), plFactory.kPostEffectMod,
plFactory.ClassIndex("pfGUIDialogMod"), plFactory.kGUIDialogMod,
plFactory.ClassIndex("plMsgForwarder"), plFactory.kMsgForwarder,
plFactory.ClassIndex("plClothingItem"), plFactory.kClothingItem,
plFactory.ClassIndex("plArmatureEffectFootSound"), plFactory.kArmatureEffectFootSound,
plFactory.ClassIndex("plDynaFootMgr"), plFactory.kDynaFootMgr,
plFactory.ClassIndex("plDynaRippleMgr"), plFactory.kDynaRippleMgr,
plFactory.ClassIndex("plDynaBulletMgr"), plFactory.kDynaBulletMgr,
plFactory.ClassIndex("plDynaPuddleMgr"), plFactory.kDynaPuddleMgr,
#plFactory.ClassIndex("plATCAnim"), # Only Avatar Animations need to be pool objects #plFactory.kATCAnim, # Only Avatar Animations need to be pool objects
plFactory.ClassIndex("plEmoteAnim"), plFactory.kEmoteAnim,
plFactory.ClassIndex("plDynaRippleVSMgr"), plFactory.kDynaRippleVSMgr,
plFactory.ClassIndex("plDynaTorpedoMgr"), plFactory.kDynaTorpedoMgr,
plFactory.ClassIndex("plDynaTorpedoVSMgr"), plFactory.kDynaTorpedoVSMgr,
plFactory.ClassIndex("plClusterGroup"), plFactory.kClusterGroup,
) }
class ExportManager: class ExportManager:

72
korman/nodes/node_python.py

@ -70,34 +70,44 @@ _attrib2param = {
} }
_attrib_key_types = { _attrib_key_types = {
"ptAttribSceneobject": plFactory.ClassIndex("plSceneObject"), "ptAttribSceneobject": { plFactory.kSceneObject },
"ptAttribSceneobjectList": plFactory.ClassIndex("plSceneObject"), "ptAttribSceneobjectList": { plFactory.kSceneObject },
"ptAttribActivator": (plFactory.ClassIndex("plLogicModifier"), "ptAttribActivator": {
plFactory.ClassIndex("plPythonFileMod")), plFactory.kLogicModifier,
"ptAttribActivatorList": (plFactory.ClassIndex("plLogicModifier"), plFactory.kPythonFileMod
plFactory.ClassIndex("plPythonFileMod")), },
"ptAttribNamedActivator": (plFactory.ClassIndex("plLogicModifier"), "ptAttribActivatorList": {
plFactory.ClassIndex("plPythonFileMod")), plFactory.kLogicModifier,
"ptAttribResponder": plFactory.ClassIndex("plResponderModifier"), plFactory.kPythonFileMod
"ptAttribResponderList": plFactory.ClassIndex("plResponderModifier"), },
"ptAttribNamedResponder": plFactory.ClassIndex("plResponderModifier"), "ptAttribNamedActivator": {
"ptAttribDynamicMap": plFactory.ClassIndex("plDynamicTextMap"), plFactory.kLogicModifier,
"ptAttribGUIDialog": plFactory.ClassIndex("pfGUIDialogMod"), plFactory.kPythonFileMod
"ptAttribExcludeRegion": plFactory.ClassIndex("plExcludeRegionModifier"), },
"ptAttribAnimation": (plFactory.ClassIndex("plAGMasterMod"), "ptAttribResponder": { plFactory.kResponderModifier },
plFactory.ClassIndex("plMsgForwarder")), "ptAttribResponderList": { plFactory.kResponderModifier },
"ptAttribBehavior": plFactory.ClassIndex("plMultistageBehMod"), "ptAttribNamedResponder": { plFactory.kResponderModifier },
"ptAttribMaterial": plFactory.ClassIndex("plLayer"), "ptAttribDynamicMap": { plFactory.kDynamicTextMap },
"ptAttribMaterialList": plFactory.ClassIndex("plLayer"), "ptAttribGUIDialog": { plFactory.kGUIDialogMod },
"ptAttribGUIPopUpMenu": plFactory.ClassIndex("pfGUIPopUpMenu"), "ptAttribExcludeRegion": { plFactory.kExcludeRegionModifier },
"ptAttribGUISkin": plFactory.ClassIndex("pfGUISkin"), "ptAttribAnimation": {
"ptAttribWaveSet": plFactory.ClassIndex("plWaveSet7"), plFactory.kAGMasterMod,
"ptAttribSwimCurrent": (plFactory.ClassIndex("plSwimRegionInterface"), plFactory.kMsgForwarder
plFactory.ClassIndex("plSwimCircularCurrentRegion"), },
plFactory.ClassIndex("plSwimStraightCurrentRegion")), "ptAttribBehavior": { plFactory.kMultistageBehMod },
"ptAttribClusterList": plFactory.ClassIndex("plClusterGroup"), "ptAttribMaterial": { plFactory.kLayer },
"ptAttribMaterialAnimation": plFactory.ClassIndex("plLayerAnimation"), "ptAttribMaterialList": { plFactory.kLayer },
"ptAttribGrassShader": plFactory.ClassIndex("plGrassShaderMod"), "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 return
key_type = _attrib_key_types[socket.attribute_type] key_type = _attrib_key_types[socket.attribute_type]
if isinstance(key_type, tuple): if not key.type in key_type:
good_key = key.type in key_type
else:
good_key = key.type == key_type
if not good_key:
exporter.report.warn( exporter.report.warn(
f"'{self.id_data.name}' Node '{socket.links[0].from_node.name}' " f"'{self.id_data.name}' Node '{socket.links[0].from_node.name}' "
f"returned an unexpected key type '{plFactory.ClassName(key.type)}' " f"returned an unexpected key type '{plFactory.ClassName(key.type)}' "

Loading…
Cancel
Save