aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/GameObject
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-10-23 01:30:31 +0200
committerShauren <shauren.trinity@gmail.com>2022-10-23 01:30:31 +0200
commitf52f2cc67ad91fa9017f6739e0efdf9677c5d629 (patch)
tree5926e53b0ab098109371cb5863b2d01fb583f5d4 /src/server/game/Entities/GameObject
parent2bb3ba3720fa93272beef2eea6857a6706f24fab (diff)
Core/GameObjects: Implemented AllowMultiInteract for GAMEOBJECT_TYPE_GOOBER
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.h1
2 files changed, 30 insertions, 14 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 9f84d95d17e..03871de2908 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -1421,6 +1421,14 @@ void GameObject::DespawnOrUnsummon(Milliseconds delay, Seconds forceRespawnTime)
}
}
+void GameObject::DespawnForPlayer(Player* seer, Seconds respawnTime)
+{
+ PerPlayerState& perPlayerState = GetOrCreatePerPlayerStates()[seer->GetGUID()];
+ perPlayerState.ValidUntil = GameTime::GetSystemTime() + respawnTime;
+ perPlayerState.Despawned = true;
+ seer->UpdateVisibilityOf(this);
+}
+
void GameObject::Delete()
{
SetLootState(GO_NOT_READY);
@@ -2398,8 +2406,9 @@ void GameObject::Use(Unit* user)
case GAMEOBJECT_TYPE_GOOBER: //10
{
GameObjectTemplate const* info = GetGOInfo();
+ Player* player = user->ToPlayer();
- if (Player* player = user->ToPlayer())
+ if (player)
{
if (info->goober.pageID) // show page...
{
@@ -2441,16 +2450,26 @@ void GameObject::Use(Unit* user)
if (uint32 trapEntry = info->goober.linkedTrap)
TriggeringLinkedGameObject(trapEntry, user);
- SetFlag(GO_FLAG_IN_USE);
- SetLootState(GO_ACTIVATED, user);
-
- // this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389)
- if (info->goober.customAnim)
- SendCustomAnim(GetGoAnimProgress());
+ if (info->goober.AllowMultiInteract && player)
+ {
+ if (info->IsDespawnAtAction())
+ DespawnForPlayer(player, Seconds(m_respawnDelayTime));
+ else
+ SetGoStateFor(GO_STATE_ACTIVE, player);
+ }
else
- SetGoState(GO_STATE_ACTIVE);
+ {
+ SetFlag(GO_FLAG_IN_USE);
+ SetLootState(GO_ACTIVATED, user);
- m_cooldownTime = GameTime::GetGameTimeMS() + info->GetAutoCloseTime();
+ // this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389)
+ if (info->goober.customAnim)
+ SendCustomAnim(GetGoAnimProgress());
+ else
+ SetGoState(GO_STATE_ACTIVE);
+
+ m_cooldownTime = GameTime::GetGameTimeMS() + info->GetAutoCloseTime();
+ }
// cast this spell later if provided
spellId = info->goober.spell;
@@ -3291,14 +3310,10 @@ void GameObject::OnLootRelease(Player* looter)
GameObjectTemplate const* goInfo = GetGOInfo();
if (!goInfo->chest.consumable && goInfo->chest.chestPersonalLoot)
{
- PerPlayerState& perPlayerState = GetOrCreatePerPlayerStates()[looter->GetGUID()];
- perPlayerState.ValidUntil = GameTime::GetSystemTime() + (goInfo->chest.chestRestockTime
+ DespawnForPlayer(looter, goInfo->chest.chestRestockTime
? Seconds(goInfo->chest.chestRestockTime)
: Seconds(m_respawnDelayTime)); // not hiding this object permanently to prevent infinite growth of m_perPlayerState
// while also maintaining some sort of cheater protection (not getting rid of entries on logout)
- perPlayerState.Despawned = true;
-
- looter->UpdateVisibilityOf(this);
}
break;
}
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 8dd027eb207..1e9d0fc3b0a 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -222,6 +222,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
uint32 GetRespawnDelay() const { return m_respawnDelayTime; }
void Refresh();
void DespawnOrUnsummon(Milliseconds delay = 0ms, Seconds forceRespawnTime = 0s);
+ void DespawnForPlayer(Player* seer, Seconds respawnTime);
void Delete();
void SendGameObjectDespawn();
Loot* GetFishLoot(Player* lootOwner);