aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/GameObject
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-09 00:54:27 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-09 00:54:27 +0100
commitfccf6fb72b60b08dfbe6d5fb17fba55239944fca (patch)
treed34819afa3813592e60825b1f0d88e1262496dd1 /src/server/game/Entities/GameObject
parent1439535c6ac2ca8db13990e4fee29d4c1312f87a (diff)
Core/Objects: Implemented vignettes
Diffstat (limited to 'src/server/game/Entities/GameObject')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp43
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h10
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h23
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)