diff options
author | funjoker <funjoker109@gmail.com> | 2021-04-27 11:06:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-27 11:06:56 +0200 |
commit | f4ef40d9686135088a76c90a3f9de6a6bc10e8f0 (patch) | |
tree | f0e5b09d0f4eb2c884ad2c30639d34f0a340f613 /src/server | |
parent | 8b0de23d0e4b15fce8dc8c67f9512f76804d6439 (diff) |
Core/Conversations: Fix conversation data handling (#26375)
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Conversation/Conversation.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Globals/ConversationDataStore.cpp | 48 | ||||
-rw-r--r-- | src/server/game/Globals/ConversationDataStore.h | 8 |
3 files changed, 23 insertions, 44 deletions
diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp index d51053ee15b..015846b88fb 100644 --- a/src/server/game/Entities/Conversation/Conversation.cpp +++ b/src/server/game/Entities/Conversation/Conversation.cpp @@ -133,16 +133,13 @@ bool Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, _duration = conversationTemplate->LastLineEndTime; _textureKitId = conversationTemplate->TextureKitId; - for (ConversationActorTemplate const* actor : conversationTemplate->Actors) + for (ConversationActor const& actor : conversationTemplate->Actors) { - if (actor) - { UF::ConversationActor& actorField = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Conversation::m_conversationData).ModifyValue(&UF::ConversationData::Actors)); - actorField.CreatureID = actor->CreatureId; - actorField.CreatureDisplayInfoID = actor->CreatureModelId; - actorField.Id = actor->Id; + actorField.CreatureID = actor.CreatureId; + actorField.CreatureDisplayInfoID = actor.CreatureDisplayInfoId; + actorField.Id = actor.ActorId; actorField.Type = AsUnderlyingType(ActorType::CreatureActor); - } } for (uint16 actorIndex = 0; actorIndex < conversationTemplate->ActorGuids.size(); ++actorIndex) diff --git a/src/server/game/Globals/ConversationDataStore.cpp b/src/server/game/Globals/ConversationDataStore.cpp index 79ad4728276..61bcfc212bf 100644 --- a/src/server/game/Globals/ConversationDataStore.cpp +++ b/src/server/game/Globals/ConversationDataStore.cpp @@ -26,42 +26,17 @@ namespace { std::unordered_map<uint32, ConversationTemplate> _conversationTemplateStore; - std::unordered_map<uint32, ConversationActorTemplate> _conversationActorTemplateStore; std::unordered_map<uint32, ConversationLineTemplate> _conversationLineTemplateStore; } void ConversationDataStore::LoadConversationTemplates() { - _conversationActorTemplateStore.clear(); _conversationLineTemplateStore.clear(); _conversationTemplateStore.clear(); - std::unordered_map<uint32, std::vector<ConversationActorTemplate const*>> actorsByConversation; + std::unordered_map<uint32, std::vector<ConversationActor>> actorsByConversation; std::unordered_map<uint32, std::vector<ObjectGuid::LowType>> actorGuidsByConversation; - if (QueryResult actorTemplates = WorldDatabase.Query("SELECT Id, CreatureId, CreatureModelId FROM conversation_actor_template")) - { - uint32 oldMSTime = getMSTime(); - - do - { - Field* fields = actorTemplates->Fetch(); - - uint32 id = fields[0].GetUInt32(); - ConversationActorTemplate& conversationActor = _conversationActorTemplateStore[id]; - conversationActor.Id = id; - conversationActor.CreatureId = fields[1].GetUInt32(); - conversationActor.CreatureModelId = fields[2].GetUInt32(); - } - while (actorTemplates->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " Conversation actor templates in %u ms", _conversationActorTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime)); - } - else - { - TC_LOG_INFO("server.loading", ">> Loaded 0 Conversation actor templates. DB table `conversation_actor_template` is empty."); - } - if (QueryResult lineTemplates = WorldDatabase.Query("SELECT Id, StartTime, UiCameraID, ActorIdx, Flags FROM conversation_line_template")) { uint32 oldMSTime = getMSTime(); @@ -94,7 +69,7 @@ void ConversationDataStore::LoadConversationTemplates() TC_LOG_INFO("server.loading", ">> Loaded 0 Conversation line templates. DB table `conversation_line_template` is empty."); } - if (QueryResult actors = WorldDatabase.Query("SELECT ConversationId, ConversationActorId, ConversationActorGuid, Idx FROM conversation_actors")) + if (QueryResult actors = WorldDatabase.Query("SELECT ConversationId, ConversationActorId, ConversationActorGuid, Idx, CreatureId, CreatureDisplayInfoId FROM conversation_actors")) { uint32 oldMSTime = getMSTime(); uint32 count = 0; @@ -107,25 +82,32 @@ void ConversationDataStore::LoadConversationTemplates() uint32 actorId = fields[1].GetUInt32(); ObjectGuid::LowType actorGuid = fields[2].GetUInt64(); uint16 idx = fields[3].GetUInt16(); + uint32 creatureId = fields[4].GetUInt32(); + uint32 creatureDisplayInfoId = fields[5].GetUInt32(); - if (actorId != 0 && actorGuid != 0) + if (creatureId != 0 && actorGuid != 0) { TC_LOG_ERROR("sql.sql", "Table `conversation_actors` references both actor (ID: %u) and actorGuid (GUID: " UI64FMTD ") for Conversation %u, skipped.", actorId, actorGuid, conversationId); continue; } - if (actorId != 0) + if (creatureId != 0) { - if (ConversationActorTemplate const* conversationActorTemplate = Trinity::Containers::MapGetValuePtr(_conversationActorTemplateStore, actorId)) + if (creatureDisplayInfoId != 0) { - std::vector<ConversationActorTemplate const*>& actors = actorsByConversation[conversationId]; + ConversationActor conversationActor; + conversationActor.ActorId = actorId; + conversationActor.CreatureId = creatureId; + conversationActor.CreatureDisplayInfoId = creatureDisplayInfoId; + + std::vector<ConversationActor>& actors = actorsByConversation[conversationId]; if (actors.size() <= idx) actors.resize(idx + 1); - actors[idx] = conversationActorTemplate; + actors[idx] = conversationActor; ++count; } else - TC_LOG_ERROR("sql.sql", "Table `conversation_actors` references an invalid actor (ID: %u) for Conversation %u, skipped", actorId, conversationId); + TC_LOG_ERROR("sql.sql", "Table `conversation_actors` references an actor (CreatureId: %u) without CreatureDisplayInfoId for Conversation %u, skipped", creatureId, conversationId); } else if (actorGuid != 0) { diff --git a/src/server/game/Globals/ConversationDataStore.h b/src/server/game/Globals/ConversationDataStore.h index 08342c5da07..257e76c6a31 100644 --- a/src/server/game/Globals/ConversationDataStore.h +++ b/src/server/game/Globals/ConversationDataStore.h @@ -28,11 +28,11 @@ enum ConversationLineFlags CONVERSATION_LINE_FLAG_NOTIFY_STARTED = 0x1 // Client will send CMSG_CONVERSATION_LINE_STARTED when it runs this line }; -struct ConversationActorTemplate +struct ConversationActor { - uint32 Id; + uint32 ActorId; uint32 CreatureId; - uint32 CreatureModelId; + uint32 CreatureDisplayInfoId; }; #pragma pack(push, 1) @@ -54,7 +54,7 @@ struct ConversationTemplate uint32 LastLineEndTime; // Time in ms after conversation creation the last line fades out uint32 TextureKitId; // Background texture - std::vector<ConversationActorTemplate const*> Actors; + std::vector<ConversationActor> Actors; std::vector<ObjectGuid::LowType> ActorGuids; std::vector<ConversationLineTemplate const*> Lines; |