aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Conversation/Conversation.cpp55
-rw-r--r--src/server/game/Entities/Conversation/Conversation.h6
-rw-r--r--src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp18
3 files changed, 67 insertions, 12 deletions
diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp
index 527bc6636dd..087fb812e08 100644
--- a/src/server/game/Entities/Conversation/Conversation.cpp
+++ b/src/server/game/Entities/Conversation/Conversation.cpp
@@ -24,10 +24,12 @@
#include "IteratorPair.h"
#include "Log.h"
#include "Map.h"
+#include "ObjectAccessor.h"
#include "PhasingHandler.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "UpdateData.h"
+#include "WorldSession.h"
Conversation::Conversation() : WorldObject(false), _duration(0), _textureKitId(0)
{
@@ -278,6 +280,59 @@ Milliseconds Conversation::GetLastLineEndTime(LocaleConstant locale) const
return _lastLineEndTimes[locale];
}
+int32 Conversation::GetLineDuration(LocaleConstant locale, int32 lineId)
+{
+ ConversationLineEntry const* convoLine = sConversationLineStore.LookupEntry(lineId);
+ if (!convoLine)
+ {
+ TC_LOG_ERROR("entities.conversation", "Conversation::GetLineDuration: Tried to get duration for invalid ConversationLine id {}.", lineId);
+ return 0;
+ }
+
+ int32 const* textDuration = sDB2Manager.GetBroadcastTextDuration(convoLine->BroadcastTextID, locale);
+ if (!textDuration)
+ return 0;
+
+ return *textDuration + convoLine->AdditionalDuration;
+}
+
+Milliseconds Conversation::GetLineEndTime(LocaleConstant locale, int32 lineId) const
+{
+ Milliseconds const* lineStartTime = GetLineStartTime(locale, lineId);
+ if (!lineStartTime)
+ {
+ TC_LOG_ERROR("entities.conversation", "Conversation::GetLineEndTime: Unable to get line start time for locale {}, lineid {} (Conversation ID: {}).", locale, lineId, GetEntry());
+ return Milliseconds(0);
+ }
+ return *lineStartTime + Milliseconds(GetLineDuration(locale, lineId));
+}
+
+LocaleConstant Conversation::GetPrivateObjectOwnerLocale() const
+{
+ LocaleConstant privateOwnerLocale = LOCALE_enUS;
+ if (Player* owner = ObjectAccessor::GetPlayer(*this, GetPrivateObjectOwner()))
+ privateOwnerLocale = owner->GetSession()->GetSessionDbLocaleIndex();
+ return privateOwnerLocale;
+}
+
+Unit* Conversation::GetActorUnit(uint32 actorIdx) const
+{
+ if (m_conversationData->Actors.size() <= actorIdx)
+ {
+ TC_LOG_ERROR("entities.conversation", "Conversation::GetActorUnit: Tried to access invalid actor idx {} (Conversation ID: {}).", actorIdx, GetEntry());
+ return nullptr;
+ }
+ return ObjectAccessor::GetUnit(*this, m_conversationData->Actors[actorIdx].ActorGUID);
+}
+
+Creature* Conversation::GetActorCreature(uint32 actorIdx) const
+{
+ Unit* actor = GetActorUnit(actorIdx);
+ if (!actor)
+ return nullptr;
+ return actor->ToCreature();
+}
+
uint32 Conversation::GetScriptId() const
{
return sConversationDataStore->GetConversationTemplate(GetEntry())->ScriptId;
diff --git a/src/server/game/Entities/Conversation/Conversation.h b/src/server/game/Entities/Conversation/Conversation.h
index d387353da3f..12a03e7fbb0 100644
--- a/src/server/game/Entities/Conversation/Conversation.h
+++ b/src/server/game/Entities/Conversation/Conversation.h
@@ -78,6 +78,12 @@ class TC_GAME_API Conversation : public WorldObject, public GridObject<Conversat
Milliseconds const* GetLineStartTime(LocaleConstant locale, int32 lineId) const;
Milliseconds GetLastLineEndTime(LocaleConstant locale) const;
+ static int32 GetLineDuration(LocaleConstant locale, int32 lineId);
+ Milliseconds GetLineEndTime(LocaleConstant locale, int32 lineId) const;
+
+ LocaleConstant GetPrivateObjectOwnerLocale() const;
+ Unit* GetActorUnit(uint32 actorIdx) const;
+ Creature* GetActorCreature(uint32 actorIdx) const;
uint32 GetScriptId() const;
diff --git a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp
index 1ca1ddea79f..d20f3bdb54d 100644
--- a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp
@@ -436,8 +436,6 @@ public:
if (!mathiasClone || !vanessaClone)
return;
- _vanessaGUID = vanessaClone->GetGUID();
- _mathiasGUID = mathiasClone->GetGUID();
mathiasClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
vanessaClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
vanessaClone->SetVirtualItem(1, vanessaClone->GetVirtualItemId(0)); // add 2nd dagger to hands
@@ -449,9 +447,7 @@ public:
void OnConversationStart(Conversation* conversation) override
{
- LocaleConstant privateOwnerLocale = LOCALE_enUS;
- if (Player* owner = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner()))
- privateOwnerLocale = owner->GetSession()->GetSessionDbLocaleIndex();
+ LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale();
if (Milliseconds const* teleportLineStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_VANESSA_TELEPORT))
_events.ScheduleEvent(EVENT_VANESSA_TELEPORT, *teleportLineStartTime);
@@ -477,7 +473,7 @@ public:
if (!privateObjectOwner)
break;
- Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID);
+ Creature* vanessaClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_VANESSA);
if (!vanessaClone)
break;
@@ -489,7 +485,7 @@ public:
}
case EVENT_VANESSA_MOVE:
{
- Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID);
+ Creature* vanessaClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_VANESSA);
if (!vanessaClone)
break;
@@ -504,11 +500,11 @@ public:
if (!privateObjectOwner)
break;
- Creature* vanessaClone = ObjectAccessor::GetCreature(*conversation, _vanessaGUID);
+ Creature* vanessaClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_VANESSA);
if (!vanessaClone)
break;
- Creature* mathiasClone = ObjectAccessor::GetCreature(*conversation, _mathiasGUID);
+ Creature* mathiasClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_MATHIAS);
if (!mathiasClone)
break;
@@ -519,7 +515,7 @@ public:
}
case EVENT_MATHIAS_CLONE_DESPAWN:
{
- Creature* mathiasClone = ObjectAccessor::GetCreature(*conversation, _mathiasGUID);
+ Creature* mathiasClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_MATHIAS);
if (!mathiasClone)
break;
@@ -532,8 +528,6 @@ public:
}
private:
- ObjectGuid _vanessaGUID;
- ObjectGuid _mathiasGUID;
EventMap _events;
};