diff options
author | Jeremy <Golrag@users.noreply.github.com> | 2024-10-20 23:56:55 +0200 |
---|---|---|
committer | ModoX <moardox@gmail.com> | 2024-10-21 00:30:20 +0200 |
commit | 0535a61cb7c9da97f05e5867ce181d91e3dd92eb (patch) | |
tree | 63a3357adc6e6dd104ed5c43f78d948a9456a56e | |
parent | c45cd444efa65842419c8c90fcedcf6dbd731027 (diff) |
Core/GameObject: Implemented OnFlagTaken/OnFlagDropped hooks for GAMEOBJECT_TYPE_FLAGSTAND
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Maps/ZoneScript.h | 5 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 21 |
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 eb48c74b1fa..3b7724ee26f 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -3491,8 +3491,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 3b04455db88..9aa9a9c5787 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6417,13 +6417,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); + } } } } |