diff options
-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 | 22 |
6 files changed, 69 insertions, 18 deletions
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 76487aadffc..7cf95e03ee0 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -298,7 +298,7 @@ struct CreatureModelDataEntry { uint32 ID; // 0 uint32 Flags; // 1 - //uint32 FileDataID; // 2 + uint32 FileDataID; // 2 //uint32 SizeClass; // 3 //float ModelScale; // 4 //uint32 BloodID; // 5 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 900df980021..9ae4d348304 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -37,7 +37,7 @@ char const ChrRacesfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx"; char const ChrSpecializationfmt[] = "nxiiiiiiiiixxxii"; char const CreatureDisplayInfoExtrafmt[] = "dixxxxxxxxxxxxxxxxxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixsx"; -char const CreatureModelDatafmt[] = "nixxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; +char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; char const DifficultyFmt[] = "niiiixiixxxxix"; char const DungeonEncounterfmt[] = "niiixsxxx"; char const DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 5c9bb0113ad..5448dd99aae 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -105,6 +105,48 @@ uint32 CreatureTemplate::GetFirstValidModelId() const return 0; } +uint32 CreatureTemplate::GetFirstInvisibleModel() const +{ + CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid1); + if (modelInfo->is_trigger) + return Modelid1; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid2); + if (modelInfo->is_trigger) + return Modelid2; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid3); + if (modelInfo->is_trigger) + return Modelid3; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid4); + if (modelInfo->is_trigger) + return Modelid4; + + return 0; +} + +uint32 CreatureTemplate::GetFirstVisibleModel() const +{ + CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid1); + if (!modelInfo->is_trigger) + return Modelid1; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid2); + if (!modelInfo->is_trigger) + return Modelid2; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid3); + if (!modelInfo->is_trigger) + return Modelid3; + + modelInfo = sObjectMgr->GetCreatureModelInfo(Modelid4); + if (!modelInfo->is_trigger) + return Modelid4; + + return 0; +} + 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 1f5984691be..bf3e82f36b0 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -141,6 +141,8 @@ struct CreatureTemplate uint32 ScriptID; uint32 GetRandomValidModelId() const; uint32 GetFirstValidModelId() const; + uint32 GetFirstInvisibleModel() const; + uint32 GetFirstVisibleModel() const; // helpers SkillType GetRequiredLootSkill() const @@ -316,6 +318,7 @@ struct CreatureModelInfo float combat_reach; int8 gender; uint32 displayId_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 580c6ecd667..8a3e1191260 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16221,22 +16221,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 2a0a4cbe917..ea71887f472 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1261,7 +1261,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(CreatureTemplate const* cinfo, uint64& npcflag, uint32& unit_flags, uint32& dynamicflags, CreatureData const* data /*= NULL*/) @@ -1321,6 +1325,9 @@ void ObjectMgr::LoadCreatureModelInfo() _creatureModelStore.rehash(result->GetRowCount()); uint32 count = 0; + // List of model FileDataIDs that the client treats as invisible stalker + uint32 trigggerCreatureModelFileID[5] = { 124640, 124641, 124642, 343863, 439302 }; + do { Field* fields = result->Fetch(); @@ -1340,6 +1347,7 @@ void ObjectMgr::LoadCreatureModelInfo() modelInfo.combat_reach = fields[2].GetFloat(); modelInfo.displayId_other_gender = fields[3].GetUInt32(); modelInfo.gender = creatureDisplay->Gender; + modelInfo.is_trigger = false; // Checks @@ -1360,6 +1368,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 (modelData->FileDataID == trigggerCreatureModelFileID[i]) + { + modelInfo.is_trigger = true; + break; + } + } + } + ++count; } while (result->NextRow()); |