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/server/scripts | |
| parent | 74dbed1d0ea11373b5765a4c53b1a762203fcbd2 (diff) | |
Core/OutdoorPvP: Dropped HandleGossipOption and CanTalkTo from OutdoorPvP and move the related stuff to npc scripts (#28224)
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp | 161 | ||||
| -rw-r--r-- | src/server/scripts/OutdoorPvP/OutdoorPvPZM.h | 7 |
2 files changed, 118 insertions, 50 deletions
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; |
