Skip to content

Commit 2912386

Browse files
committed
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()`.
1 parent 89b9acb commit 2912386

File tree

2 files changed

+56
-50
lines changed

2 files changed

+56
-50
lines changed

korman/exporter/manager.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,23 @@
2626

2727
# These objects have to be in the plSceneNode pool in order to be loaded...
2828
# NOTE: We are using Factory indices because I doubt all of these classes are implemented.
29-
_pool_types = (
30-
plFactory.ClassIndex("plPostEffectMod"),
31-
plFactory.ClassIndex("pfGUIDialogMod"),
32-
plFactory.ClassIndex("plMsgForwarder"),
33-
plFactory.ClassIndex("plClothingItem"),
34-
plFactory.ClassIndex("plArmatureEffectFootSound"),
35-
plFactory.ClassIndex("plDynaFootMgr"),
36-
plFactory.ClassIndex("plDynaRippleMgr"),
37-
plFactory.ClassIndex("plDynaBulletMgr"),
38-
plFactory.ClassIndex("plDynaPuddleMgr"),
39-
#plFactory.ClassIndex("plATCAnim"), # Only Avatar Animations need to be pool objects
40-
plFactory.ClassIndex("plEmoteAnim"),
41-
plFactory.ClassIndex("plDynaRippleVSMgr"),
42-
plFactory.ClassIndex("plDynaTorpedoMgr"),
43-
plFactory.ClassIndex("plDynaTorpedoVSMgr"),
44-
plFactory.ClassIndex("plClusterGroup"),
45-
)
29+
_pool_types = {
30+
plFactory.kPostEffectMod,
31+
plFactory.kGUIDialogMod,
32+
plFactory.kMsgForwarder,
33+
plFactory.kClothingItem,
34+
plFactory.kArmatureEffectFootSound,
35+
plFactory.kDynaFootMgr,
36+
plFactory.kDynaRippleMgr,
37+
plFactory.kDynaBulletMgr,
38+
plFactory.kDynaPuddleMgr,
39+
#plFactory.kATCAnim, # Only Avatar Animations need to be pool objects
40+
plFactory.kEmoteAnim,
41+
plFactory.kDynaRippleVSMgr,
42+
plFactory.kDynaTorpedoMgr,
43+
plFactory.kDynaTorpedoVSMgr,
44+
plFactory.kClusterGroup,
45+
}
4646

4747

4848
class ExportManager:

korman/nodes/node_python.py

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -70,34 +70,44 @@
7070
}
7171

7272
_attrib_key_types = {
73-
"ptAttribSceneobject": plFactory.ClassIndex("plSceneObject"),
74-
"ptAttribSceneobjectList": plFactory.ClassIndex("plSceneObject"),
75-
"ptAttribActivator": (plFactory.ClassIndex("plLogicModifier"),
76-
plFactory.ClassIndex("plPythonFileMod")),
77-
"ptAttribActivatorList": (plFactory.ClassIndex("plLogicModifier"),
78-
plFactory.ClassIndex("plPythonFileMod")),
79-
"ptAttribNamedActivator": (plFactory.ClassIndex("plLogicModifier"),
80-
plFactory.ClassIndex("plPythonFileMod")),
81-
"ptAttribResponder": plFactory.ClassIndex("plResponderModifier"),
82-
"ptAttribResponderList": plFactory.ClassIndex("plResponderModifier"),
83-
"ptAttribNamedResponder": plFactory.ClassIndex("plResponderModifier"),
84-
"ptAttribDynamicMap": plFactory.ClassIndex("plDynamicTextMap"),
85-
"ptAttribGUIDialog": plFactory.ClassIndex("pfGUIDialogMod"),
86-
"ptAttribExcludeRegion": plFactory.ClassIndex("plExcludeRegionModifier"),
87-
"ptAttribAnimation": (plFactory.ClassIndex("plAGMasterMod"),
88-
plFactory.ClassIndex("plMsgForwarder")),
89-
"ptAttribBehavior": plFactory.ClassIndex("plMultistageBehMod"),
90-
"ptAttribMaterial": plFactory.ClassIndex("plLayer"),
91-
"ptAttribMaterialList": plFactory.ClassIndex("plLayer"),
92-
"ptAttribGUIPopUpMenu": plFactory.ClassIndex("pfGUIPopUpMenu"),
93-
"ptAttribGUISkin": plFactory.ClassIndex("pfGUISkin"),
94-
"ptAttribWaveSet": plFactory.ClassIndex("plWaveSet7"),
95-
"ptAttribSwimCurrent": (plFactory.ClassIndex("plSwimRegionInterface"),
96-
plFactory.ClassIndex("plSwimCircularCurrentRegion"),
97-
plFactory.ClassIndex("plSwimStraightCurrentRegion")),
98-
"ptAttribClusterList": plFactory.ClassIndex("plClusterGroup"),
99-
"ptAttribMaterialAnimation": plFactory.ClassIndex("plLayerAnimation"),
100-
"ptAttribGrassShader": plFactory.ClassIndex("plGrassShaderMod"),
73+
"ptAttribSceneobject": { plFactory.kSceneObject },
74+
"ptAttribSceneobjectList": { plFactory.kSceneObject },
75+
"ptAttribActivator": {
76+
plFactory.kLogicModifier,
77+
plFactory.kPythonFileMod
78+
},
79+
"ptAttribActivatorList": {
80+
plFactory.kLogicModifier,
81+
plFactory.kPythonFileMod
82+
},
83+
"ptAttribNamedActivator": {
84+
plFactory.kLogicModifier,
85+
plFactory.kPythonFileMod
86+
},
87+
"ptAttribResponder": { plFactory.kResponderModifier },
88+
"ptAttribResponderList": { plFactory.kResponderModifier },
89+
"ptAttribNamedResponder": { plFactory.kResponderModifier },
90+
"ptAttribDynamicMap": { plFactory.kDynamicTextMap },
91+
"ptAttribGUIDialog": { plFactory.kGUIDialogMod },
92+
"ptAttribExcludeRegion": { plFactory.kExcludeRegionModifier },
93+
"ptAttribAnimation": {
94+
plFactory.kAGMasterMod,
95+
plFactory.kMsgForwarder
96+
},
97+
"ptAttribBehavior": { plFactory.kMultistageBehMod },
98+
"ptAttribMaterial": { plFactory.kLayer },
99+
"ptAttribMaterialList": { plFactory.kLayer },
100+
"ptAttribGUIPopUpMenu": { plFactory.kGUIPopUpMenu },
101+
"ptAttribGUISkin": { plFactory.kGUISkin },
102+
"ptAttribWaveSet": { plFactory.kWaveSet7 },
103+
"ptAttribSwimCurrent": {
104+
plFactory.kSwimRegionInterface,
105+
plFactory.kSwimCircularCurrentRegion,
106+
plFactory.kSwimStraightCurrentRegion,
107+
},
108+
"ptAttribClusterList": { plFactory.kClusterGroup },
109+
"ptAttribMaterialAnimation": { plFactory.kLayerAnimation },
110+
"ptAttribGrassShader": { plFactory.kGrassShaderMod },
101111
}
102112

103113

@@ -342,11 +352,7 @@ def _export_key_attrib(self, exporter, bo, so: plSceneObject, pfm: plPythonFileM
342352
return
343353

344354
key_type = _attrib_key_types[socket.attribute_type]
345-
if isinstance(key_type, tuple):
346-
good_key = key.type in key_type
347-
else:
348-
good_key = key.type == key_type
349-
if not good_key:
355+
if not key.type in key_type:
350356
exporter.report.warn(
351357
f"'{self.id_data.name}' Node '{socket.links[0].from_node.name}' "
352358
f"returned an unexpected key type '{plFactory.ClassName(key.type)}' "

0 commit comments

Comments
 (0)