diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-09 00:54:27 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-09 00:54:27 +0100 |
| commit | fccf6fb72b60b08dfbe6d5fb17fba55239944fca (patch) | |
| tree | d34819afa3813592e60825b1f0d88e1262496dd1 /src/server/game/Entities/GameObject | |
| parent | 1439535c6ac2ca8db13990e4fee29d4c1312f87a (diff) | |
Core/Objects: Implemented vignettes
Diffstat (limited to 'src/server/game/Entities/GameObject')
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 43 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 10 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObjectData.h | 23 |
3 files changed, 76 insertions, 0 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ecc2ba48585..dacdb902d30 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -53,6 +53,7 @@ #include "SpellAuras.h" #include "SpellMgr.h" #include "Transport.h" +#include "Vignette.h" #include "World.h" #include <G3D/Box.h> #include <G3D/CoordinateFrame.h> @@ -874,6 +875,8 @@ std::string const& GameObject::GetAIName() const void GameObject::CleanupsBeforeDelete(bool finalCleanup) { + SetVignette(0); + WorldObject::CleanupsBeforeDelete(finalCleanup); RemoveFromOwner(); @@ -1152,6 +1155,9 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD _animKitId = gameObjectAddon->AIAnimKitID; } + if (uint32 vignetteId = GetGOInfo()->GetSpawnVignette()) + SetVignette(vignetteId); + LastUsedScriptID = GetGOInfo()->ScriptId; m_stringIds[0] = goInfo->StringId; @@ -3425,6 +3431,24 @@ void GameObject::Use(Unit* user) break; } + if (m_vignette) + { + if (Player* player = user->ToPlayer()) + { + if (Quest const* reward = sObjectMgr->GetQuestTemplate(m_vignette->Data->RewardQuestID)) + if (!player->GetQuestRewardStatus(m_vignette->Data->RewardQuestID)) + player->RewardQuest(reward, LootItemType::Item, 0, this, false); + + if (m_vignette->Data->VisibleTrackingQuestID) + player->SetRewardedQuest(m_vignette->Data->VisibleTrackingQuestID); + } + + // only unregister it from visibility (need to keep vignette for other gameobject users in case its usable by multiple players + // to flag their quest completion + if (GetGOInfo()->ClearObjectVignetteonOpening()) + Vignettes::Remove(*m_vignette, this); + } + if (!spellId) return; @@ -4090,6 +4114,10 @@ void GameObject::AfterRelocation() if (m_goTypeImpl) m_goTypeImpl->OnRelocated(); + // TODO: on heartbeat + if (m_vignette) + Vignettes::Update(*m_vignette, this); + UpdateObjectVisibility(false); } @@ -4167,6 +4195,21 @@ void GameObject::SetAnimKitId(uint16 animKitId, bool oneshot) SendMessageToSet(activateAnimKit.Write(), true); } +void GameObject::SetVignette(uint32 vignetteId) +{ + if (m_vignette) + { + if (m_vignette->Data->ID == vignetteId) + return; + + Vignettes::Remove(*m_vignette, this); + m_vignette = nullptr; + } + + if (VignetteEntry const* vignette = sVignetteStore.LookupEntry(vignetteId)) + m_vignette = Vignettes::Create(vignette, this); +} + void GameObject::SetSpellVisualId(int32 spellVisualId, ObjectGuid activatorGuid) { SetUpdateFieldValue(m_values.ModifyValue(&GameObject::m_gameObjectData).ModifyValue(&UF::GameObjectData::SpellVisualID), spellVisualId); diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 9926fd82cca..9b8651f1133 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -35,6 +35,11 @@ struct Loot; struct TransportAnimation; enum TriggerCastFlags : uint32; +namespace Vignettes +{ +struct VignetteData; +} + // enum for GAMEOBJECT_TYPE_NEW_FLAG // values taken from world state enum class FlagState : uint8 @@ -419,6 +424,9 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> uint32 GetWorldEffectID() const { return _worldEffectID; } void SetWorldEffectID(uint32 worldEffectID) { _worldEffectID = worldEffectID; } + Vignettes::VignetteData const* GetVignette() const { return m_vignette.get(); } + void SetVignette(uint32 vignetteId); + void SetSpellVisualId(int32 spellVisualId, ObjectGuid activatorGuid = ObjectGuid::Empty); void AssaultCapturePoint(Player* player); void UpdateCapturePoint(); @@ -502,6 +510,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> uint16 _animKitId; uint32 _worldEffectID; + std::unique_ptr<Vignettes::VignetteData> m_vignette; + struct PerPlayerState { SystemTimePoint ValidUntil = SystemTimePoint::min(); diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index deee786d1e6..1c05153c550 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -1277,6 +1277,29 @@ struct GameObjectTemplate } } + uint32 GetSpawnVignette() const + { + switch (type) + { + case GAMEOBJECT_TYPE_CHEST: return chest.SpawnVignette; + case GAMEOBJECT_TYPE_GOOBER: return goober.SpawnVignette; + case GAMEOBJECT_TYPE_NEW_FLAG: return newflag.SpawnVignette; + case GAMEOBJECT_TYPE_NEW_FLAG_DROP: return newflagdrop.SpawnVignette; + case GAMEOBJECT_TYPE_CAPTURE_POINT: return capturePoint.SpawnVignette; + case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.SpawnVignette; + default: return 0; + } + } + + bool ClearObjectVignetteonOpening() const + { + switch (type) + { + case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.ClearObjectVignetteonOpening != 0; + default: return false; + } + } + uint32 GetSpellFocusType() const { switch (type) |
