101 if (!conversationTemplate)
107 conversation->Create(lowGuid, conversationEntry, creator->
GetMap(), creator, pos, privateObjectOwner, spellInfo);
108 if (autoStart && !conversation->Start())
133 if (creature->GetPhaseShift().GetPersonalGuid() ==
_creator->
GetGUID())
166 ASSERT(conversationTemplate);
189 std::vector<UF::ConversationLine> lines;
228 sScriptMgr->OnConversationCreate(
this, creator);
249 TC_LOG_ERROR(
"entities.conversation",
"Attempted to start conversation (Id: {}) multiple times.",
GetEntry());
253 if (!
GetMap()->AddToMap(
this))
297 TC_LOG_ERROR(
"entities.conversation",
"Conversation::GetLineDuration: Tried to get duration for invalid ConversationLine id {}.", lineId);
313 TC_LOG_ERROR(
"entities.conversation",
"Conversation::GetLineEndTime: Unable to get line start time for locale {}, lineid {} (Conversation ID: {}).", locale, lineId,
GetEntry());
323 privateOwnerLocale = owner->GetSession()->GetSessionDbLocaleIndex();
324 return privateOwnerLocale;
331 TC_LOG_ERROR(
"entities.conversation",
"Conversation::GetActorUnit: Tried to access invalid actor idx {} (Conversation ID: {}).", actorIdx,
GetEntry());
353 std::size_t sizePos = data->
wpos();
364 std::size_t sizePos = data->
wpos();
381 if (requestedObjectMask.IsAnySet())
384 if (requestedConversationMask.IsAnySet())
388 std::size_t sizePos = buffer.
wpos();
393 m_objectData->WriteUpdate(buffer, requestedObjectMask,
true,
this, target);
396 m_conversationData->WriteUpdate(buffer, requestedConversationMask,
true,
this, target);
@ CONDITION_SOURCE_TYPE_CONVERSATION_LINE
#define sConversationDataStore
@ AllowWithoutSpawnedActor
DB2Storage< ConversationLineEntry > sConversationLineStore("ConversationLine.db2", &ConversationLineLoadInfo::Instance)
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
#define TC_LOG_ERROR(filterType__,...)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
void put(std::size_t pos, T value)
uint32 GetScriptId() const
void AddToWorld() override
void RelocateStationaryPosition(Position const &pos)
Milliseconds GetLineEndTime(LocaleConstant locale, int32 lineId) const
void ClearUpdateMask(bool remove) override
static int32 GetLineDuration(LocaleConstant locale, int32 lineId)
void AddActor(int32 actorId, uint32 actorIdx, ObjectGuid const &actorGuid)
void BuildValuesUpdate(ByteBuffer *data, Player const *target) const override
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ConversationData::Mask const &requestedConversationMask, Player const *target) const
std::array< Milliseconds, TOTAL_LOCALES > _lastLineEndTimes
UF::UpdateField< UF::ConversationData, 0, TYPEID_CONVERSATION > m_conversationData
Milliseconds GetDuration() const
LocaleConstant GetPrivateObjectOwnerLocale() const
void Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, Map *map, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner, SpellInfo const *spellInfo=nullptr)
static Conversation * CreateConversation(uint32 conversationEntry, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner, SpellInfo const *spellInfo=nullptr, bool autoStart=true)
Milliseconds const * GetLineStartTime(LocaleConstant locale, int32 lineId) const
void BuildValuesCreate(ByteBuffer *data, Player const *target) const override
Milliseconds GetLastLineEndTime(LocaleConstant locale) const
Unit * GetActorUnit(uint32 actorIdx) const
void Update(uint32 diff) override
std::unordered_map< std::pair< LocaleConstant, int32 >, Milliseconds > _lineStartTimes
void RemoveFromWorld() override
Creature * GetActorCreature(uint32 actorIdx) const
constexpr bool HasFlag(T flag) const
MapStoredObjectTypesContainer & GetObjectsStore()
ObjectGuid::LowType GenerateLowGuid()
CreatureBySpawnIdContainer & GetCreatureBySpawnIdStore()
static ObjectGuid const Empty
static Creature * ToCreature(Object *o)
ObjectGuid const & GetGUID() const
UF::UpdateField< UF::ObjectData, 0, TYPEID_OBJECT > m_objectData
CreateObjectBits m_updateFlag
virtual void ClearUpdateMask(bool remove)
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
UF::UpdateFieldHolder m_values
void _Create(ObjectGuid const &guid)
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void DoWithSuppressingObjectUpdates(Action &&action)
static ObjectGuid GetGUID(Object const *o)
void SetEntry(uint32 entry)
virtual void SetObjectScale(float scale)
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
void ApplyModUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type mod, bool apply)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
void SendDirectMessage(WorldPacket const *data) const
bool Remove(KEY_TYPE const &handle)
bool Insert(KEY_TYPE const &handle, SPECIFIC_TYPE *obj)
void ClearChanged(UpdateField< T, BlockBit, Bit >(Derived::*))
Mask const & GetChangesMask() const
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
uint32 GetChangedObjectTypeMask() const
bool BuildPacket(WorldPacket *packet)
uint32 GetBlock(uint32 index) const
constexpr uint32 GetMapId() const
void AddToWorld() override
void RemoveFromWorld() override
ObjectGuid GetPrivateObjectOwner() const
void SetPrivateObjectOwner(ObjectGuid const &owner)
virtual void SetMap(Map *map)
void AddObjectToRemoveList()
void UpdatePositionData()
virtual void Update(uint32 diff)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
auto MapEqualRange(M &map, typename M::key_type const &key)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
Conversation * _conversation
void operator()(ConversationActorActivePlayerTemplate const &activePlayer) const
ConversationActorTemplate const & _actor
ConversationActorFillVisitor(Conversation *conversation, Unit const *creator, Map const *map, ConversationActorTemplate const &actor)
void operator()(ConversationActorWorldObjectTemplate const &worldObject) const
void operator()(ConversationActorTalkingHeadTemplate const &talkingHead) const
void operator()(ConversationActorNoObjectTemplate const &noObject) const
uint32 CreatureDisplayInfoId
uint32 CreatureDisplayInfoId
std::variant< ConversationActorWorldObjectTemplate, ConversationActorNoObjectTemplate, ConversationActorActivePlayerTemplate, ConversationActorTalkingHeadTemplate > Data
ObjectGuid::LowType SpawnId
EnumFlag< ConversationFlags > Flags
std::vector< ConversationLineTemplate const * > Lines
std::vector< ConversationActorTemplate > Actors
UF::ObjectData::Base ObjectMask
Conversation const * Owner
UF::ConversationData::Base ConversationMask
void operator()(Player const *player) const
constexpr void Relocate(float x, float y)
uint32 CreatureDisplayInfoID
DynamicUpdateField< UF::ConversationActor, 0, 3 > Actors
UpdateField< std::vector< UF::ConversationLine >, 0, 2 > Lines
UpdateField< uint32, 0, 5 > Progress
UpdateField< int32, 0, 4 > LastLineEndTime