aboutsummaryrefslogtreecommitdiff
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
parent74dbed1d0ea11373b5765a4c53b1a762203fcbd2 (diff)
Core/OutdoorPvP: Dropped HandleGossipOption and CanTalkTo from OutdoorPvP and move the related stuff to npc scripts (#28224)
-rw-r--r--sql/updates/world/master/2022_09_02_00_world.sql9
-rw-r--r--src/server/game/Entities/Player/Player.cpp7
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.cpp18
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.h8
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp16
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.h4
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp161
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPZM.h7
8 files changed, 127 insertions, 103 deletions
diff --git a/sql/updates/world/master/2022_09_02_00_world.sql b/sql/updates/world/master/2022_09_02_00_world.sql
new file mode 100644
index 00000000000..232a8eb89b0
--- /dev/null
+++ b/sql/updates/world/master/2022_09_02_00_world.sql
@@ -0,0 +1,9 @@
+--
+UPDATE `creature_template` SET `AIName`='', `ScriptName`='npc_zm_field_scout' WHERE `entry` IN (18581,18564);
+UPDATE `gossip_menu_option` SET `OptionNpcFlag`=1 WHERE `MenuID`=7724 AND `OptionID`=0;
+
+DELETE FROM `gossip_menu_option` WHERE (`MenuID`=7722 AND `OptionID`=0);
+INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextId`, `OptionType`, `OptionNpcFlag`, `Language`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
+(7722, 0, 0, 'Give me a battle standard. I will take control of Twin Spire Ruins.', 15537, 1, 1, 0, 0, 0, 0, 0, NULL, 0, 45114); -- OptionBroadcastTextID: 15537 - 15539
+
+UPDATE `gossip_menu_option` SET `VerifiedBuild`=45114 WHERE (`MenuID`=7722 AND `OptionID`=1);
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;