aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2021_04_26_00_world.sql9
-rw-r--r--src/server/game/Entities/Conversation/Conversation.cpp11
-rw-r--r--src/server/game/Globals/ConversationDataStore.cpp48
-rw-r--r--src/server/game/Globals/ConversationDataStore.h8
4 files changed, 32 insertions, 44 deletions
diff --git a/sql/updates/world/master/2021_04_26_00_world.sql b/sql/updates/world/master/2021_04_26_00_world.sql
new file mode 100644
index 00000000000..a796650e5f4
--- /dev/null
+++ b/sql/updates/world/master/2021_04_26_00_world.sql
@@ -0,0 +1,9 @@
+ALTER TABLE `conversation_actors`
+ ADD COLUMN `CreatureId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Idx`,
+ ADD COLUMN `CreatureDisplayInfoId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CreatureId`;
+
+UPDATE `conversation_actors` AS ca
+INNER JOIN `conversation_actor_template` AS cat ON (ca.ConversationActorId = cat.Id)
+SET ca.CreatureId = cat.CreatureId, ca.CreatureDisplayInfoId = cat.CreatureModelId;
+
+DROP TABLE `conversation_actor_template`;
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;