diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-12-05 18:47:35 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-12-11 23:51:04 +0100 |
commit | f72795240aacc184a327c865c11ff23d8147b3a7 (patch) | |
tree | 62a2d89934596871d8d2069da327a409302ffbce /src | |
parent | 0170b79ae9690bd7c853dc78224f887efe16fc19 (diff) |
Core/Creatures: Implemented automatic detection of trigger models, their order in creature_template no longer matters
(cherry picked from commit c488fb219ab080031488593a0b86ac785a7d2cae)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCfmt.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 42 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 28 |
6 files changed, 72 insertions, 21 deletions
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index dc4ad55d9c2..a419864a194 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -809,7 +809,7 @@ struct CreatureModelDataEntry { uint32 Id; uint32 Flags; - //char* ModelPath[16] + char* ModelPath; //uint32 Unk1; float Scale; // Used in calculation of unit collision data //int32 Unk2 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index c75c0fff625..e81db5924f6 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -42,7 +42,7 @@ char const CinematicSequencesEntryfmt[] = "nxxxxxxxxx"; char const CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxx"; char const CreatureDisplayInfoExtrafmt[] = "diixxxxxxxxxxxxxxxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixssssssssssssssssxx"; -char const CreatureModelDatafmt[] = "nixxfxxxxxxxxxxffxxxxxxxxxxx"; +char const CreatureModelDatafmt[] = "nisxfxxxxxxxxxxffxxxxxxxxxxx"; char const CreatureSpellDatafmt[] = "niiiixxxx"; char const CreatureTypefmt[] = "nxxxxxxxxxxxxxxxxxx"; char const CurrencyTypesfmt[] = "xnxi"; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index ea10ce7988b..6ba8fb44e09 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -103,6 +103,48 @@ uint32 CreatureTemplate::GetFirstValidModelId() const return 0; } +uint32 CreatureTemplate::GetFirstInvisibleModel() const +{ + CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid1); + if (modelInfo && modelInfo->is_trigger) + return Modelid1; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid2); + if (modelInfo && modelInfo->is_trigger) + return Modelid2; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid3); + if (modelInfo && modelInfo->is_trigger) + return Modelid3; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid4); + if (modelInfo && modelInfo->is_trigger) + return Modelid4; + + return 11686; +} + +uint32 CreatureTemplate::GetFirstVisibleModel() const +{ + CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid1); + if (modelInfo && !modelInfo->is_trigger) + return Modelid1; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid2); + if (modelInfo && !modelInfo->is_trigger) + return Modelid2; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid3); + if (modelInfo && !modelInfo->is_trigger) + return Modelid3; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid4); + if (modelInfo && !modelInfo->is_trigger) + return Modelid4; + + return 17519; +} + bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { if (Unit* victim = ObjectAccessor::GetUnit(m_owner, m_victim)) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 9a41c8570ed..966944e099f 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -137,6 +137,8 @@ struct CreatureTemplate uint32 ScriptID; uint32 GetRandomValidModelId() const; uint32 GetFirstValidModelId() const; + uint32 GetFirstInvisibleModel() const; + uint32 GetFirstVisibleModel() const; // helpers SkillType GetRequiredLootSkill() const @@ -278,6 +280,7 @@ struct CreatureModelInfo float combat_reach; uint8 gender; uint32 modelid_other_gender; + bool is_trigger; }; // Benchmarked: Faster than std::map (insert/find) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 277ead92df7..27f6d5f614d 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -17791,22 +17791,8 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) } if (cinfo->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER) - { if (target->IsGameMaster()) - { - if (cinfo->Modelid1) - displayId = cinfo->Modelid1; // Modelid1 is a visible model for gms - else - displayId = 17519; // world visible trigger's model - } - else - { - if (cinfo->Modelid2) - displayId = cinfo->Modelid2; // Modelid2 is an invisible model for players - else - displayId = 11686; // world invisible trigger's model - } - } + displayId = cinfo->GetFirstVisibleModel(); } fieldBuffer << uint32(displayId); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b2be5c49b91..d8e5852b85a 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1236,7 +1236,11 @@ uint32 ObjectMgr::ChooseDisplayId(CreatureTemplate const* cinfo, CreatureData co if (data && data->displayid) return data->displayid; - return cinfo->GetRandomValidModelId(); + if (!(cinfo->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER)) + return cinfo->GetRandomValidModelId(); + + // Triggers by default receive the invisible model + return cinfo->GetFirstInvisibleModel(); } void ObjectMgr::ChooseCreatureFlags(const CreatureTemplate* cinfo, uint32& npcflag, uint32& unit_flags, uint32& dynamicflags, const CreatureData* data /*= NULL*/) @@ -1301,6 +1305,12 @@ void ObjectMgr::LoadCreatureModelInfo() Field* fields = result->Fetch(); uint32 modelId = fields[0].GetUInt32(); + CreatureDisplayInfoEntry const* creatureDisplay = sCreatureDisplayInfoStore.LookupEntry(modelId); + if (!creatureDisplay) + { + TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has model for nonexistent display id (%u).", modelId); + continue; + } CreatureModelInfo& modelInfo = _creatureModelStore[modelId]; @@ -1308,12 +1318,10 @@ void ObjectMgr::LoadCreatureModelInfo() modelInfo.combat_reach = fields[2].GetFloat(); modelInfo.gender = fields[3].GetUInt8(); modelInfo.modelid_other_gender = fields[4].GetUInt32(); + modelInfo.is_trigger = false; // Checks - if (!sCreatureDisplayInfoStore.LookupEntry(modelId)) - TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has model for nonexistent display id (%u).", modelId); - if (modelInfo.gender > GENDER_NONE) { TC_LOG_ERROR("sql.sql", "Table `creature_model_info` has wrong gender (%u) for display id (%u).", uint32(modelInfo.gender), modelId); @@ -1329,6 +1337,18 @@ void ObjectMgr::LoadCreatureModelInfo() if (modelInfo.combat_reach < 0.1f) modelInfo.combat_reach = DEFAULT_COMBAT_REACH; + if (CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(creatureDisplay->ModelId)) + { + for (uint32 i = 0; i < 5; ++i) + { + if (strstr(modelData->ModelPath, "InvisibleStalker")) + { + modelInfo.is_trigger = true; + break; + } + } + } + ++count; } while (result->NextRow()); |