diff options
author | ModoX <moardox@gmail.com> | 2022-09-02 14:57:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-02 14:57:59 +0200 |
commit | 0de520ed9241e6a6e449a6c9c00194e81b105201 (patch) | |
tree | 445ca506137b82366e05afb7fbaefc4f6677d7c0 /src | |
parent | 74dbed1d0ea11373b5765a4c53b1a762203fcbd2 (diff) |
Core/OutdoorPvP: Dropped HandleGossipOption and CanTalkTo from OutdoorPvP and move the related stuff to npc scripts (#28224)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 7 | ||||
-rw-r--r-- | src/server/game/OutdoorPvP/OutdoorPvP.cpp | 18 | ||||
-rw-r--r-- | src/server/game/OutdoorPvP/OutdoorPvP.h | 8 | ||||
-rw-r--r-- | src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp | 16 | ||||
-rw-r--r-- | src/server/game/OutdoorPvP/OutdoorPvPMgr.h | 4 | ||||
-rw-r--r-- | src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp | 161 | ||||
-rw-r--r-- | src/server/scripts/OutdoorPvP/OutdoorPvPZM.h | 7 |
7 files changed, 118 insertions, 103 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4bd199b6f3f..5d6a7d9e61c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14040,10 +14040,6 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool case GOSSIP_OPTION_TRANSMOGRIFIER: case GOSSIP_OPTION_MAILBOX: break; // no checks - case GOSSIP_OPTION_OUTDOORPVP: - if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second)) - canTalk = false; - break; default: TC_LOG_ERROR("sql.sql", "Creature entry %u has unknown gossip option %u for menu %u.", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID); canTalk = false; @@ -14181,9 +14177,6 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men break; } - case GOSSIP_OPTION_OUTDOORPVP: - sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId); - break; case GOSSIP_OPTION_SPIRITHEALER: if (isDead()) source->ToCreature()->CastSpell(source->ToCreature(), 17251, CastSpellExtraArgs(TRIGGERED_FULL_MASK) diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 1e609b15272..bef17947d72 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -376,24 +376,6 @@ bool OutdoorPvP::HandleOpenGo(Player* player, GameObject* go) return false; } -bool OutdoorPvP::HandleGossipOption(Player* player, Creature* creature, uint32 id) -{ - for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) - if (itr->second->HandleGossipOption(player, creature, id)) - return true; - - return false; -} - -bool OutdoorPvP::CanTalkTo(Player* player, Creature* c, GossipMenuItems const& gso) -{ - for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) - if (itr->second->CanTalkTo(player, c, gso)) - return true; - - return false; -} - bool OutdoorPvP::HandleDropFlag(Player* player, uint32 id) { for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.h b/src/server/game/OutdoorPvP/OutdoorPvP.h index 01b86d21392..48e3e33b4cd 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.h +++ b/src/server/game/OutdoorPvP/OutdoorPvP.h @@ -113,10 +113,6 @@ class TC_GAME_API OPvPCapturePoint virtual void SendChangePhase(); - virtual bool HandleGossipOption(Player* /*player*/, Creature* /*guid*/, uint32 /*gossipId*/) { return false; } - - virtual bool CanTalkTo(Player* /*player*/, Creature* /*creature*/, GossipMenuItems const& /*gso*/) { return false; } - virtual bool HandleDropFlag(Player* /*player*/, uint32 /*spellId*/) { return false; } ObjectGuid::LowType m_capturePointSpawnId; @@ -205,10 +201,6 @@ class TC_GAME_API OutdoorPvP : public ZoneScript virtual bool HandleDropFlag(Player* player, uint32 spellId); - virtual bool HandleGossipOption(Player* player, Creature* creature, uint32 gossipid); - - virtual bool CanTalkTo(Player* player, Creature* c, GossipMenuItems const& gso); - void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2 = 0); static TeamId GetTeamIdByTeam(uint32 team) diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp index ece3e33afbe..329a205d87b 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp @@ -195,22 +195,6 @@ bool OutdoorPvPMgr::HandleOpenGo(Player* player, GameObject* go) return false; } -void OutdoorPvPMgr::HandleGossipOption(Player* player, Creature* creature, uint32 gossipid) -{ - if (OutdoorPvP* pvp = player->GetOutdoorPvP()) - if (pvp->HasPlayer(player)) - pvp->HandleGossipOption(player, creature, gossipid); -} - -bool OutdoorPvPMgr::CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso) -{ - if (OutdoorPvP* pvp = player->GetOutdoorPvP()) - if (pvp->HasPlayer(player)) - return pvp->CanTalkTo(player, creature, gso); - - return false; -} - void OutdoorPvPMgr::HandleDropFlag(Player* player, uint32 spellId) { if (OutdoorPvP* pvp = player->GetOutdoorPvP()) diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h index a455919f473..92fc0b4d22b 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h @@ -83,10 +83,6 @@ class TC_GAME_API OutdoorPvPMgr void Update(uint32 diff); - void HandleGossipOption(Player* player, Creature* creature, uint32 gossipid); - - bool CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso); - void HandleDropFlag(Player* player, uint32 spellId); std::string GetDefenseMessage(uint32 zoneId, uint32 id, LocaleConstant locale) const; diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp index 20345358fe5..982af87d67c 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp @@ -22,7 +22,10 @@ #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "ScriptMgr.h" +#include "WorldSession.h" #include "WorldStatePackets.h" uint8 const OutdoorPvPZMBuffZonesNum = 5; @@ -273,10 +276,13 @@ void OPvPCapturePointZM_Graveyard::UpdateTowerState() m_PvP->SetWorldState(ZM_MAP_GRAVEYARD_H, int32((m_GraveyardState & ZM_GRAVEYARD_H) != 0)); m_PvP->SetWorldState(ZM_MAP_GRAVEYARD_A, int32((m_GraveyardState & ZM_GRAVEYARD_A) != 0)); - m_PvP->SetWorldState(ZM_MAP_ALLIANCE_FLAG_READY, int32(m_BothControllingFaction == ALLIANCE)); - m_PvP->SetWorldState(ZM_MAP_ALLIANCE_FLAG_NOT_READY, int32(m_BothControllingFaction != ALLIANCE)); - m_PvP->SetWorldState(ZM_MAP_HORDE_FLAG_READY, int32(m_BothControllingFaction == HORDE)); - m_PvP->SetWorldState(ZM_MAP_HORDE_FLAG_NOT_READY, int32(m_BothControllingFaction != HORDE)); + bool allianceFlagReady = m_BothControllingFaction == ALLIANCE && m_GraveyardState != ZM_GRAVEYARD_A; + m_PvP->SetWorldState(ZM_MAP_ALLIANCE_FLAG_READY, int32(allianceFlagReady)); + m_PvP->SetWorldState(ZM_MAP_ALLIANCE_FLAG_NOT_READY, int32(!allianceFlagReady)); + + bool hordeFlagReady = m_BothControllingFaction == HORDE && m_GraveyardState != ZM_GRAVEYARD_H; + m_PvP->SetWorldState(ZM_MAP_HORDE_FLAG_READY, int32(hordeFlagReady)); + m_PvP->SetWorldState(ZM_MAP_HORDE_FLAG_NOT_READY, int32(!hordeFlagReady)); } void OPvPCapturePointZM_Graveyard::SetBeaconState(uint32 controlling_faction) @@ -324,50 +330,6 @@ void OPvPCapturePointZM_Graveyard::SetBeaconState(uint32 controlling_faction) UpdateTowerState(); } -bool OPvPCapturePointZM_Graveyard::CanTalkTo(Player* player, Creature* c, GossipMenuItems const& /*gso*/) -{ - switch (c->GetEntry()) - { - case ZM_ALLIANCE_FIELD_SCOUT: - return player->GetTeam() == ALLIANCE && m_BothControllingFaction == ALLIANCE && !m_FlagCarrierGUID && m_GraveyardState != ZM_GRAVEYARD_A; - case ZM_HORDE_FIELD_SCOUT: - return player->GetTeam() == HORDE && m_BothControllingFaction == HORDE && !m_FlagCarrierGUID && m_GraveyardState != ZM_GRAVEYARD_H; - default: - break; - } - - return false; -} - -bool OPvPCapturePointZM_Graveyard::HandleGossipOption(Player* player, Creature* creature, uint32 /*gossipid*/) -{ - switch (creature->GetEntry()) - { - case ZM_ALLIANCE_FIELD_SCOUT: - // if the flag is already taken, then return - if (!m_FlagCarrierGUID.IsEmpty()) - return true; - creature->CastSpell(player, ZM_BATTLE_STANDARD_A, true); - m_FlagCarrierGUID = player->GetGUID(); - UpdateTowerState(); - player->PlayerTalkClass->SendCloseGossip(); - return true; - case ZM_HORDE_FIELD_SCOUT: - // if the flag is already taken, then return - if (!m_FlagCarrierGUID.IsEmpty()) - return true; - creature->CastSpell(player, ZM_BATTLE_STANDARD_H, true); - m_FlagCarrierGUID = player->GetGUID(); - UpdateTowerState(); - player->PlayerTalkClass->SendCloseGossip(); - return true; - default: - break; - } - - return false; -} - bool OPvPCapturePointZM_Graveyard::HandleDropFlag(Player* /*player*/, uint32 spellId) { switch (spellId) @@ -446,7 +408,110 @@ class OutdoorPvP_zangarmarsh : public OutdoorPvPScript } }; +enum ZMFieldScoutMisc +{ + GOSSIP_MENU_FIELD_SCOUT_HORDE = 7722, + GOSSIP_MENU_FIELD_SCOUT_ALLIANCE = 7724, + + GOSSIP_OPTION_FIELD_SCOUT_BATTLE_STANDARD = 0, + GOSSIP_OPTION_FIELD_SCOUT_VENDOR = 1, +}; + +// 18581 - Alliance Field Scout +// 18564 - Horde Field Scout +struct npc_zm_field_scout : public ScriptedAI +{ + npc_zm_field_scout(Creature* creature) : ScriptedAI(creature) { } + + bool CanObtainBanner(Player* player) + { + OutdoorPvP* pvp = player->GetOutdoorPvP(); + if (!pvp) + return false; + + OutdoorPvPZM* zmPvp = reinterpret_cast<OutdoorPvPZM*>(pvp); + if (!zmPvp) + return false; + + OPvPCapturePointZM_Graveyard* gy = zmPvp->GetGraveyard(); + if (!gy) + return false; + + if (!gy->GetFlagCarrierGUID().IsEmpty()) + return false; + + switch (me->GetEntry()) + { + case ZM_ALLIANCE_FIELD_SCOUT: + return player->GetTeam() == ALLIANCE && pvp->GetWorldState(ZM_MAP_ALLIANCE_FLAG_READY); + case ZM_HORDE_FIELD_SCOUT: + return player->GetTeam() == HORDE && pvp->GetWorldState(ZM_MAP_HORDE_FLAG_READY); + default: + break; + } + return true; + } + + bool OnGossipHello(Player* player) override + { + uint32 gossipMenuId = GOSSIP_MENU_FIELD_SCOUT_HORDE; + if (me->GetEntry() == ZM_ALLIANCE_FIELD_SCOUT) + gossipMenuId = GOSSIP_MENU_FIELD_SCOUT_ALLIANCE; + + if (CanObtainBanner(player)) + AddGossipItemFor(player, gossipMenuId, GOSSIP_OPTION_FIELD_SCOUT_BATTLE_STANDARD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + AddGossipItemFor(player, gossipMenuId, GOSSIP_OPTION_FIELD_SCOUT_VENDOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + { + player->PlayerTalkClass->SendCloseGossip(); + + OutdoorPvP* pvp = player->GetOutdoorPvP(); + if (!pvp) + return true; + + OutdoorPvPZM* zmPvp = reinterpret_cast<OutdoorPvPZM*>(pvp); + if (!zmPvp) + return true; + + OPvPCapturePointZM_Graveyard* gy = zmPvp->GetGraveyard(); + if (!gy) + return true; + + // if the flag is already taken, then return + if (!gy->GetFlagCarrierGUID().IsEmpty()) + return true; + + uint32 battleStandardSpell = ZM_BATTLE_STANDARD_H; + if (me->GetEntry() == ZM_ALLIANCE_FIELD_SCOUT) + battleStandardSpell = ZM_BATTLE_STANDARD_A; + + me->CastSpell(player, battleStandardSpell, true); + gy->SetFlagCarrierGUID(player->GetGUID()); + gy->UpdateTowerState(); + break; + } + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + default: + break; + } + return true; + } +}; + void AddSC_outdoorpvp_zm() { new OutdoorPvP_zangarmarsh(); + RegisterCreatureAI(npc_zm_field_scout); } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h index 7ef63cc0064..a8d22f1a784 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h @@ -122,14 +122,15 @@ class OPvPCapturePointZM_Graveyard : public OPvPCapturePoint bool Update(uint32 diff) override; void ChangeState() override { } int32 HandleOpenGo(Player* player, GameObject* go) override; - bool HandleGossipOption(Player* player, Creature* creature, uint32 gossipid) override; bool HandleDropFlag(Player* player, uint32 spellId) override; - bool CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso) override; void UpdateTowerState(); void SetBeaconState(uint32 controlling_team); // not good atm uint32 GetGraveyardState() const; + ObjectGuid GetFlagCarrierGUID() const { return m_FlagCarrierGUID; } + void SetFlagCarrierGUID(ObjectGuid guid) { m_FlagCarrierGUID = guid; } + protected: uint32 m_BothControllingFaction; ObjectGuid m_FlagCarrierGUID; @@ -155,6 +156,8 @@ class OutdoorPvPZM : public OutdoorPvP uint32 GetHordeTowersControlled() const; void SetHordeTowersControlled(uint32 count); + OPvPCapturePointZM_Graveyard* GetGraveyard() { return m_Graveyard; } + private: OPvPCapturePointZM_Graveyard* m_Graveyard; uint32 m_AllianceTowersControlled; |