[HL25] Backport "_sv_override_scientist_mdl" CVAR functionality

This commit is contained in:
Joël Troch 2024-08-28 09:09:16 +02:00
parent c50041a728
commit c3b58b1bb4

View file

@ -105,6 +105,8 @@ public:
void TalkInit(); void TalkInit();
char* GetScientistModel() const;
void Killed(entvars_t* pevAttacker, int iGib) override; void Killed(entvars_t* pevAttacker, int iGib) override;
bool Save(CSave& save) override; bool Save(CSave& save) override;
@ -130,6 +132,17 @@ TYPEDESCRIPTION CScientist::m_SaveData[] =
IMPLEMENT_SAVERESTORE(CScientist, CTalkMonster); IMPLEMENT_SAVERESTORE(CScientist, CTalkMonster);
char* CScientist::GetScientistModel() const
{
char* pszOverride = (char*)CVAR_GET_STRING("_sv_override_scientist_mdl");
if (pszOverride && strlen(pszOverride) > 5) // at least requires ".mdl"
{
return pszOverride;
}
return "models/scientist.mdl";
}
//========================================================= //=========================================================
// AI Schedules Specific to this monster // AI Schedules Specific to this monster
//========================================================= //=========================================================
@ -652,7 +665,7 @@ void CScientist::Spawn()
Precache(); Precache();
SET_MODEL(ENT(pev), "models/scientist.mdl"); SET_MODEL(ENT(pev), GetScientistModel());
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX); UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX);
pev->solid = SOLID_SLIDEBOX; pev->solid = SOLID_SLIDEBOX;
@ -683,7 +696,7 @@ void CScientist::Spawn()
//========================================================= //=========================================================
void CScientist::Precache() void CScientist::Precache()
{ {
PRECACHE_MODEL("models/scientist.mdl"); PRECACHE_MODEL(GetScientistModel());
PRECACHE_SOUND("scientist/sci_pain1.wav"); PRECACHE_SOUND("scientist/sci_pain1.wav");
PRECACHE_SOUND("scientist/sci_pain2.wav"); PRECACHE_SOUND("scientist/sci_pain2.wav");
PRECACHE_SOUND("scientist/sci_pain3.wav"); PRECACHE_SOUND("scientist/sci_pain3.wav");
@ -1146,12 +1159,26 @@ public:
void Spawn() override; void Spawn() override;
int Classify() override { return CLASS_HUMAN_PASSIVE; } int Classify() override { return CLASS_HUMAN_PASSIVE; }
// passed into Precache which is non-const
char* GetScientistModel() const;
bool KeyValue(KeyValueData* pkvd) override; bool KeyValue(KeyValueData* pkvd) override;
int m_iPose; // which sequence to display int m_iPose; // which sequence to display
static const char* m_szPoses[7]; static const char* m_szPoses[7];
}; };
const char* CDeadScientist::m_szPoses[] = {"lying_on_back", "lying_on_stomach", "dead_sitting", "dead_hang", "dead_table1", "dead_table2", "dead_table3"}; const char* CDeadScientist::m_szPoses[] = {"lying_on_back", "lying_on_stomach", "dead_sitting", "dead_hang", "dead_table1", "dead_table2", "dead_table3"};
char* CDeadScientist::GetScientistModel() const
{
char* pszOverride = (char*)CVAR_GET_STRING("_sv_override_scientist_mdl");
if (pszOverride && strlen(pszOverride) > 5) // at least requires ".mdl"
{
return pszOverride;
}
return "models/scientist.mdl";
}
bool CDeadScientist::KeyValue(KeyValueData* pkvd) bool CDeadScientist::KeyValue(KeyValueData* pkvd)
{ {
if (FStrEq(pkvd->szKeyName, "pose")) if (FStrEq(pkvd->szKeyName, "pose"))
@ -1169,8 +1196,8 @@ LINK_ENTITY_TO_CLASS(monster_scientist_dead, CDeadScientist);
// //
void CDeadScientist::Spawn() void CDeadScientist::Spawn()
{ {
PRECACHE_MODEL("models/scientist.mdl"); PRECACHE_MODEL(GetScientistModel());
SET_MODEL(ENT(pev), "models/scientist.mdl"); SET_MODEL(ENT(pev), GetScientistModel());
pev->effects = 0; pev->effects = 0;
pev->sequence = 0; pev->sequence = 0;
@ -1251,8 +1278,8 @@ typedef enum
// //
void CSittingScientist::Spawn() void CSittingScientist::Spawn()
{ {
PRECACHE_MODEL("models/scientist.mdl"); PRECACHE_MODEL(GetScientistModel());
SET_MODEL(ENT(pev), "models/scientist.mdl"); SET_MODEL(ENT(pev), GetScientistModel());
Precache(); Precache();
InitBoneControllers(); InitBoneControllers();