@@ -64,6 +64,8 @@ typedef enum
64
64
MMA_FORWARD = 3 ,
65
65
} MONSTERMAKER_TARGET_ACTIVATOR;
66
66
67
+ #define MAX_CHILD_KEYS 16
68
+
67
69
// =========================================================
68
70
// MonsterMaker - this ent creates monsters during the game.
69
71
// =========================================================
@@ -128,6 +130,10 @@ class CMonsterMaker : public CBaseMonster
128
130
int m_delayedCount;
129
131
130
132
float m_delayAfterBlocked;
133
+
134
+ string_t m_childKeys[MAX_CHILD_KEYS];
135
+ string_t m_childValues[MAX_CHILD_KEYS];
136
+ int m_childKeyCount;
131
137
};
132
138
133
139
LINK_ENTITY_TO_CLASS ( monstermaker, CMonsterMaker )
@@ -163,6 +169,9 @@ TYPEDESCRIPTION CMonsterMaker::m_SaveData[] =
163
169
DEFINE_FIELD ( CMonsterMaker, m_spawnDelay, FIELD_FLOAT ),
164
170
DEFINE_FIELD ( CMonsterMaker, m_delayedCount, FIELD_INTEGER ),
165
171
DEFINE_FIELD ( CMonsterMaker, m_delayAfterBlocked, FIELD_FLOAT ),
172
+ DEFINE_ARRAY ( CMonsterMaker, m_childKeys, FIELD_STRING, MAX_CHILD_KEYS ),
173
+ DEFINE_ARRAY ( CMonsterMaker, m_childValues, FIELD_STRING, MAX_CHILD_KEYS ),
174
+ DEFINE_FIELD ( CMonsterMaker, m_childKeyCount, FIELD_INTEGER ),
166
175
};
167
176
168
177
IMPLEMENT_SAVERESTORE ( CMonsterMaker, CBaseMonster )
@@ -284,6 +293,19 @@ void CMonsterMaker::KeyValue( KeyValueData *pkvd )
284
293
m_delayAfterBlocked = atof ( pkvd->szValue );
285
294
pkvd->fHandled = TRUE ;
286
295
}
296
+ else if ( pkvd->szKeyName [0 ] == ' #' )
297
+ {
298
+ if (m_childKeyCount < MAX_CHILD_KEYS)
299
+ {
300
+ m_childKeys[m_childKeyCount] = ALLOC_STRING (pkvd->szKeyName + 1 );
301
+ m_childValues[m_childKeyCount] = ALLOC_STRING (pkvd->szValue );
302
+ ++m_childKeyCount;
303
+ }
304
+ else
305
+ {
306
+ ALERT (at_warning, " %s: Too many child keys" , STRING (pev->classname ));
307
+ }
308
+ }
287
309
else
288
310
CBaseMonster::KeyValue ( pkvd );
289
311
}
@@ -632,6 +654,28 @@ CBaseEntity* CMonsterMaker::SpawnMonster(const Vector &placePosition, const Vect
632
654
pevCreate->origin = placePosition;
633
655
pevCreate->angles = placeAngles;
634
656
SetBits ( pevCreate->spawnflags , SF_MONSTER_FALL_TO_GROUND );
657
+
658
+ if (m_childKeyCount > 0 )
659
+ {
660
+ const char * classname = STRING (pevCreate->classname );
661
+ KeyValueData kvd;
662
+ kvd.szClassName = classname;
663
+ for (int i=0 ; i<m_childKeyCount; ++i)
664
+ {
665
+ kvd.szKeyName = STRING (m_childKeys[i]);
666
+ kvd.szValue = STRING (m_childValues[i]);
667
+ kvd.fHandled = FALSE ;
668
+
669
+ // don't change classname
670
+ if (FStrEq (kvd.szKeyName , " classname" ))
671
+ {
672
+ continue ;
673
+ }
674
+
675
+ DispatchKeyValue (pent, &kvd);
676
+ }
677
+ }
678
+
635
679
pevCreate->body = pev->body ;
636
680
pevCreate->skin = pev->skin ;
637
681
pevCreate->health = pev->health ;
0 commit comments