aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy <Golrag@users.noreply.github.com>2024-10-20 23:56:55 +0200
committerOvahlord <dreadkiller@gmx.de>2024-10-21 22:03:22 +0200
commit27399ce1e509fce0f7d6d159b036351a0ca53223 (patch)
treefe8986b1695b63bd5cc1b0e6a0f81083234d03bf
parentfc0d5b849f3ad2e917e504dd971247b7390ecfa2 (diff)
Core/GameObject: Implemented OnFlagTaken/OnFlagDropped hooks for GAMEOBJECT_TYPE_FLAGSTAND
(cherry picked from commit 0535a61cb7c9da97f05e5867ce181d91e3dd92eb)
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp17
-rw-r--r--src/server/game/Maps/ZoneScript.h5
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp21
3 files changed, 36 insertions, 7 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 445c007c588..622542f991b 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -3438,8 +3438,21 @@ void GameObject::Use(Unit* user)
SpellCastResult castResult = CastSpell(user, spellId);
if (castResult == SPELL_FAILED_SUCCESS)
{
- if (GetGoType() == GAMEOBJECT_TYPE_NEW_FLAG)
- HandleCustomTypeCommand(GameObjectType::SetNewFlagState(FlagState::Taken, user->ToPlayer()));
+ switch (GetGoType())
+ {
+ case GAMEOBJECT_TYPE_NEW_FLAG:
+ HandleCustomTypeCommand(GameObjectType::SetNewFlagState(FlagState::Taken, user->ToPlayer()));
+ break;
+ case GAMEOBJECT_TYPE_FLAGSTAND:
+ SetFlag(GO_FLAG_IN_USE);
+ if (ZoneScript* zonescript = GetZoneScript())
+ zonescript->OnFlagTaken(this, Object::ToPlayer(user));
+
+ Delete();
+ break;
+ default:
+ break;
+ }
}
}
}
diff --git a/src/server/game/Maps/ZoneScript.h b/src/server/game/Maps/ZoneScript.h
index 8f37b2a3cf5..0f1c1e1651e 100644
--- a/src/server/game/Maps/ZoneScript.h
+++ b/src/server/game/Maps/ZoneScript.h
@@ -107,6 +107,11 @@ class TC_GAME_API ZoneScript
virtual bool CanCaptureFlag([[maybe_unused]] AreaTrigger* areaTrigger, [[maybe_unused]] Player* player) { return false; }
virtual void OnCaptureFlag([[maybe_unused]] AreaTrigger* areaTrigger, [[maybe_unused]] Player* player) { }
+
+ // This hook is used with GAMEOBJECT_TYPE_FLAGSTAND. Newer gameobjects use GAMEOBJECT_TYPE_NEW_FLAG and should use `OnFlagStateChange`
+ virtual void OnFlagTaken([[maybe_unused]] GameObject* flag, [[maybe_unused]] Player* player) { }
+ // This hook is used with GAMEOBJECT_TYPE_FLAGSTAND. Newer gameobjects use GAMEOBJECT_TYPE_NEW_FLAG and should use `OnFlagStateChange`. The GameObject doesn't exist anymore, but the ObjectGuid does
+ virtual void OnFlagDropped([[maybe_unused]] ObjectGuid const& flagGuid, [[maybe_unused]] Player* player) { }
};
#endif
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 46f60331686..e70d77dab52 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -6346,13 +6346,24 @@ void AuraEffect::HandleBattlegroundPlayerPosition(AuraApplication const* aurApp,
if (!apply && aurApp->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
{
- if (GameObject* gameObjectCaster = target->GetMap()->GetGameObject(GetCasterGUID()))
+ if (GetCasterGUID().IsGameObject())
{
- if (gameObjectCaster->GetGoType() == GAMEOBJECT_TYPE_NEW_FLAG)
+ if (GameObjectTemplate const* gobTemplate = sObjectMgr->GetGameObjectTemplate(GetCasterGUID().GetEntry()))
{
- gameObjectCaster->HandleCustomTypeCommand(GameObjectType::SetNewFlagState(FlagState::Dropped, target));
- if (GameObject* droppedFlag = gameObjectCaster->SummonGameObject(gameObjectCaster->GetGOInfo()->newflag.FlagDrop, target->GetPosition(), QuaternionData::fromEulerAnglesZYX(target->GetOrientation(), 0.f, 0.f), Seconds(gameObjectCaster->GetGOInfo()->newflag.ExpireDuration / 1000), GO_SUMMON_TIMED_DESPAWN))
- droppedFlag->SetOwnerGUID(gameObjectCaster->GetGUID());
+ if (gobTemplate->type == GAMEOBJECT_TYPE_NEW_FLAG)
+ {
+ if (GameObject* gameObjectCaster = target->GetMap()->GetGameObject(GetCasterGUID()))
+ {
+ gameObjectCaster->HandleCustomTypeCommand(GameObjectType::SetNewFlagState(FlagState::Dropped, target));
+ if (GameObject* droppedFlag = gameObjectCaster->SummonGameObject(gameObjectCaster->GetGOInfo()->newflag.FlagDrop, target->GetPosition(), QuaternionData::fromEulerAnglesZYX(target->GetOrientation(), 0.f, 0.f), Seconds(gameObjectCaster->GetGOInfo()->newflag.ExpireDuration / 1000), GO_SUMMON_TIMED_DESPAWN))
+ droppedFlag->SetOwnerGUID(gameObjectCaster->GetGUID());
+ }
+ }
+ else if (gobTemplate->type == GAMEOBJECT_TYPE_FLAGSTAND)
+ {
+ if (ZoneScript* zonescript = target->FindZoneScript())
+ zonescript->OnFlagDropped(GetCasterGUID(), target);
+ }
}
}
}