aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorModoX <moardox@gmail.com>2022-09-02 14:57:59 +0200
committerGitHub <noreply@github.com>2022-09-02 14:57:59 +0200
commit0de520ed9241e6a6e449a6c9c00194e81b105201 (patch)
tree445ca506137b82366e05afb7fbaefc4f6677d7c0 /src/server/scripts
parent74dbed1d0ea11373b5765a4c53b1a762203fcbd2 (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.cpp161
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPZM.h7
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;