Skip to content

Commit c658ecb

Browse files
committed
Allow setting custom keyvalues for monster spawned via monstermaker
1 parent a956123 commit c658ecb

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

dlls/monstermaker.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ typedef enum
6464
MMA_FORWARD = 3,
6565
} MONSTERMAKER_TARGET_ACTIVATOR;
6666

67+
#define MAX_CHILD_KEYS 16
68+
6769
//=========================================================
6870
// MonsterMaker - this ent creates monsters during the game.
6971
//=========================================================
@@ -128,6 +130,10 @@ class CMonsterMaker : public CBaseMonster
128130
int m_delayedCount;
129131

130132
float m_delayAfterBlocked;
133+
134+
string_t m_childKeys[MAX_CHILD_KEYS];
135+
string_t m_childValues[MAX_CHILD_KEYS];
136+
int m_childKeyCount;
131137
};
132138

133139
LINK_ENTITY_TO_CLASS( monstermaker, CMonsterMaker )
@@ -163,6 +169,9 @@ TYPEDESCRIPTION CMonsterMaker::m_SaveData[] =
163169
DEFINE_FIELD( CMonsterMaker, m_spawnDelay, FIELD_FLOAT ),
164170
DEFINE_FIELD( CMonsterMaker, m_delayedCount, FIELD_INTEGER ),
165171
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 ),
166175
};
167176

168177
IMPLEMENT_SAVERESTORE( CMonsterMaker, CBaseMonster )
@@ -284,6 +293,19 @@ void CMonsterMaker::KeyValue( KeyValueData *pkvd )
284293
m_delayAfterBlocked = atof( pkvd->szValue );
285294
pkvd->fHandled = TRUE;
286295
}
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+
}
287309
else
288310
CBaseMonster::KeyValue( pkvd );
289311
}
@@ -632,6 +654,28 @@ CBaseEntity* CMonsterMaker::SpawnMonster(const Vector &placePosition, const Vect
632654
pevCreate->origin = placePosition;
633655
pevCreate->angles = placeAngles;
634656
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+
635679
pevCreate->body = pev->body;
636680
pevCreate->skin = pev->skin;
637681
pevCreate->health = pev->health;

0 commit comments

Comments
 (0)