[Crash] Fix IsUnderwaterOnly crash where npc data references can be stale (#2830)

* [Crash] Fix IsUnderwaterOnly crash where npc data references can be stale

* m_ prefix
This commit is contained in:
Chris Miles 2023-02-06 17:24:38 -06:00 committed by GitHub
parent 34d21d4056
commit c6eb12ac16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 37 deletions

View File

@ -160,42 +160,43 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
size = 5; size = 5;
} }
taunting = false; taunting = false;
proximity = nullptr; proximity = nullptr;
copper = 0; copper = 0;
silver = 0; silver = 0;
gold = 0; gold = 0;
platinum = 0; platinum = 0;
max_dmg = npc_type_data->max_dmg; max_dmg = npc_type_data->max_dmg;
min_dmg = npc_type_data->min_dmg; min_dmg = npc_type_data->min_dmg;
attack_count = npc_type_data->attack_count; attack_count = npc_type_data->attack_count;
grid = 0; grid = 0;
wp_m = 0; wp_m = 0;
max_wp = 0; max_wp = 0;
save_wp = 0; save_wp = 0;
spawn_group_id = 0; spawn_group_id = 0;
swarmInfoPtr = nullptr; swarmInfoPtr = nullptr;
spellscale = npc_type_data->spellscale; spellscale = npc_type_data->spellscale;
healscale = npc_type_data->healscale; healscale = npc_type_data->healscale;
pAggroRange = npc_type_data->aggroradius; pAggroRange = npc_type_data->aggroradius;
pAssistRange = npc_type_data->assistradius; pAssistRange = npc_type_data->assistradius;
findable = npc_type_data->findable; findable = npc_type_data->findable;
trackable = npc_type_data->trackable; trackable = npc_type_data->trackable;
MR = npc_type_data->MR; MR = npc_type_data->MR;
CR = npc_type_data->CR; CR = npc_type_data->CR;
DR = npc_type_data->DR; DR = npc_type_data->DR;
FR = npc_type_data->FR; FR = npc_type_data->FR;
PR = npc_type_data->PR; PR = npc_type_data->PR;
Corrup = npc_type_data->Corrup; Corrup = npc_type_data->Corrup;
PhR = npc_type_data->PhR; PhR = npc_type_data->PhR;
STR = npc_type_data->STR; STR = npc_type_data->STR;
STA = npc_type_data->STA; STA = npc_type_data->STA;
AGI = npc_type_data->AGI; AGI = npc_type_data->AGI;
DEX = npc_type_data->DEX; DEX = npc_type_data->DEX;
INT = npc_type_data->INT; INT = npc_type_data->INT;
WIS = npc_type_data->WIS; WIS = npc_type_data->WIS;
CHA = npc_type_data->CHA; CHA = npc_type_data->CHA;
npc_mana = npc_type_data->Mana; npc_mana = npc_type_data->Mana;
m_is_underwater_only = npc_type_data->underwater;
//quick fix of ordering if they screwed it up in the DB //quick fix of ordering if they screwed it up in the DB
if (max_dmg < min_dmg) { if (max_dmg < min_dmg) {

View File

@ -437,7 +437,7 @@ public:
/* Only allows players that killed corpse to loot */ /* Only allows players that killed corpse to loot */
const bool HasPrivateCorpse() const { return NPCTypedata_ours ? NPCTypedata_ours->private_corpse : NPCTypedata->private_corpse; } const bool HasPrivateCorpse() const { return NPCTypedata_ours ? NPCTypedata_ours->private_corpse : NPCTypedata->private_corpse; }
virtual const bool IsUnderwaterOnly() const { return NPCTypedata_ours ? NPCTypedata_ours->underwater : NPCTypedata->underwater; } virtual const bool IsUnderwaterOnly() const { return m_is_underwater_only; }
const char* GetRawNPCTypeName() const { return NPCTypedata_ours ? NPCTypedata_ours->name : NPCTypedata->name; } const char* GetRawNPCTypeName() const { return NPCTypedata_ours ? NPCTypedata_ours->name : NPCTypedata->name; }
virtual int GetKillExpMod() const { return NPCTypedata_ours ? NPCTypedata_ours->exp_mod : NPCTypedata->exp_mod; } virtual int GetKillExpMod() const { return NPCTypedata_ours ? NPCTypedata_ours->exp_mod : NPCTypedata->exp_mod; }
@ -674,6 +674,8 @@ protected:
QGlobalCache *qGlobals; QGlobalCache *qGlobals;
uint32 adventure_template_id; uint32 adventure_template_id;
bool m_is_underwater_only = false;
//mercenary stuff //mercenary stuff
std::list<MercType> mercTypeList; std::list<MercType> mercTypeList;
std::list<MercData> mercDataList; std::list<MercData> mercDataList;