TrinityCore
Loading...
Searching...
No Matches
OutdoorPvP.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "OutdoorPvP.h"
19#include "CellImpl.h"
20#include "ChatPackets.h"
21#include "DatabaseEnv.h"
22#include "GridNotifiersImpl.h"
23#include "Group.h"
24#include "Log.h"
25#include "Map.h"
26#include "ObjectAccessor.h"
27#include "ObjectMgr.h"
28#include "OutdoorPvPMgr.h"
29#include "WorldPacket.h"
30#include "WorldSession.h"
31#include "WorldStateMgr.h"
32
34{
35 public:
37 : _zoneId(zoneId), _id(id) { }
38
40 {
41 std::string text = sOutdoorPvPMgr->GetDefenseMessage(_zoneId, _id, locale);
42
44 defenseMessage->Data.ZoneID = _zoneId;
45 defenseMessage->Data.MessageText = text;
46 defenseMessage->Data.Write();
47 return defenseMessage;
48 }
49
50 private:
53};
54
59
60OutdoorPvP::OutdoorPvP(Map* map) : m_TypeId(0), m_map(map) { }
61
62OutdoorPvP::~OutdoorPvP() = default;
63
65{
66 m_players[player->GetTeamId()].insert(player->GetGUID());
67}
68
70{
71 // remove the world state information from the player (we can't keep everyone up to date, so leave out those who are not in the concerning zones)
72 if (!player->GetSession()->PlayerLogout())
74 m_players[player->GetTeamId()].erase(player->GetGUID());
75 TC_LOG_DEBUG("outdoorpvp", "Player {} left an outdoorpvp zone", player->GetName());
76}
77
78void OutdoorPvP::HandlePlayerResurrects(Player* /*player*/, uint32 /*zone*/) { }
79
81{
82 for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
83 itr->second->Update(diff);
84}
85
87{
88 return WorldStateMgr::GetValue(worldStateId, m_map);
89}
90
91void OutdoorPvP::SetWorldState(int32 worldStateId, int32 value)
92{
93 WorldStateMgr::SetValue(worldStateId, value, false, m_map);
94}
95
96void OutdoorPvP::HandleKill(Player* killer, Unit* killed)
97{
98 if (Group* group = killer->GetGroup())
99 {
100 for (GroupReference const& itr : group->GetMembers())
101 {
102 Player* groupGuy = itr.GetSource();
103
104 // skip if too far away
105 if (!groupGuy->IsAtGroupRewardDistance(killed))
106 continue;
107
108 // creature kills must be notified, even if not inside objective / not outdoor pvp active
109 // player kills only count if active and inside objective
110 if ((groupGuy->IsOutdoorPvPActive()) || killed->GetTypeId() == TYPEID_UNIT)
111 HandleKillImpl(groupGuy, killed);
112 }
113 }
114 else
115 {
116 // creature kills must be notified, even if not inside objective / not outdoor pvp active
117 if ((killer->IsOutdoorPvPActive()) || killed->GetTypeId() == TYPEID_UNIT)
118 HandleKillImpl(killer, killed);
119 }
120}
121
123{
124 for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
125 if (itr->second->HandleCustomSpell(player, spellId, go))
126 return true;
127
128 return false;
129}
130
132{
133 if (!player->IsOutdoorPvPActive())
134 return false;
135 return true;
136}
137
139{
140 for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
141 if (itr->second->HandleOpenGo(player, go) >= 0)
142 return true;
143
144 return false;
145}
146
148{
149 for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
150 if (itr->second->HandleDropFlag(player, id))
151 return true;
152
153 return false;
154}
155
157{
158 return -1;
159}
160
162{
163 // This is faster than sWorld->SendZoneMessage
164 for (uint32 team = 0; team < PVP_TEAMS_COUNT; ++team)
165 for (GuidSet::const_iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
166 if (Player* const player = ObjectAccessor::FindPlayer(*itr))
167 player->SendDirectMessage(data);
168}
169
171{
172 sOutdoorPvPMgr->AddZone(zoneId, this);
173}
174
175bool OutdoorPvP::HasPlayer(Player const* player) const
176{
177 GuidSet const& plSet = m_players[player->GetTeamId()];
178 return plSet.find(player->GetGUID()) != plSet.end();
179}
180
182{
183 if (spellId > 0)
184 {
185 for (GuidSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
186 if (Player* const player = ObjectAccessor::FindPlayer(*itr))
187 player->CastSpell(player, (uint32)spellId, true);
188 }
189 else
190 {
191 for (GuidSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
192 if (Player* const player = ObjectAccessor::FindPlayer(*itr))
193 player->RemoveAura((uint32)-spellId); // by stack?
194 }
195}
196
197void OutdoorPvP::TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2)
198{
199 TeamCastSpell(team, spellId);
200 TeamCastSpell(OTHER_TEAM(team), spellId2 ? -(int32)spellId2 : -(int32)spellId);
201}
202
204{
205 DefenseMessageBuilder builder(zoneId, id);
207 BroadcastWorker(localizer, zoneId);
208}
209
210void OutdoorPvP::ProcessEvent([[maybe_unused]] WorldObject * target, [[maybe_unused]] uint32 eventId, [[maybe_unused]] WorldObject * invoker)
211{
212 if (invoker)
213 {
214 if (GameObject* gameobject = invoker->ToGameObject())
215 {
216 if (gameobject->GetGoType() == GAMEOBJECT_TYPE_CONTROL_ZONE)
217 {
218 if (!ControlZoneHandlers.contains(gameobject->GetEntry()))
219 return;
220
221 auto controlzone = gameobject->GetGOInfo()->controlZone;
222 OutdoorPvPControlZoneHandler& handler = *ControlZoneHandlers[invoker->GetEntry()];
223 if (eventId == controlzone.CaptureEventAlliance)
224 handler.HandleCaptureEventAlliance(gameobject);
225 else if (eventId == controlzone.CaptureEventHorde)
226 handler.HandleCaptureEventHorde(gameobject);
227 else if (eventId == controlzone.ContestedEventAlliance)
228 handler.HandleContestedEventAlliance(gameobject);
229 else if (eventId == controlzone.ContestedEventHorde)
230 handler.HandleContestedEventHorde(gameobject);
231 else if (eventId == controlzone.NeutralEventAlliance)
232 handler.HandleNeutralEventAlliance(gameobject);
233 else if (eventId == controlzone.NeutralEventHorde)
234 handler.HandleNeutralEventHorde(gameobject);
235 else if (eventId == controlzone.ProgressEventAlliance)
236 handler.HandleProgressEventAlliance(gameobject);
237 else if (eventId == controlzone.ProgressEventHorde)
238 handler.HandleProgressEventHorde(gameobject);
239 }
240 }
241 }
242}
243
244template<class Worker>
245void OutdoorPvP::BroadcastWorker(Worker& _worker, uint32 zoneId)
246{
247 for (uint32 i = 0; i < PVP_TEAMS_COUNT; ++i)
248 for (GuidSet::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr)
249 if (Player* player = ObjectAccessor::FindPlayer(*itr))
250 if (player->GetZoneId() == zoneId)
251 _worker(player);
252}
LocaleConstant
Definition Common.h:51
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
#define TC_LOG_DEBUG(filterType__, message__,...)
Definition Log.h:181
@ TYPEID_UNIT
Definition ObjectGuid.h:43
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:432
#define sOutdoorPvPMgr
@ OBJECTIVESTATE_NEUTRAL
Definition OutdoorPvP.h:41
#define OTHER_TEAM(a)
Definition OutdoorPvP.h:50
@ GAMEOBJECT_TYPE_CONTROL_ZONE
@ TEAM_NEUTRAL
uint8 constexpr PVP_TEAMS_COUNT
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
virtual void HandleNeutralEventHorde(GameObject *controlZone)
Definition ZoneScript.h:58
virtual void HandleProgressEventAlliance(GameObject *controlZone)
Definition ZoneScript.h:57
virtual void HandleContestedEventAlliance(GameObject *controlZone)
Definition ZoneScript.h:55
virtual void HandleNeutralEventAlliance(GameObject *controlZone)
Definition ZoneScript.h:59
virtual void HandleCaptureEventHorde(GameObject *controlZone)
Definition ZoneScript.h:52
virtual void HandleProgressEventHorde(GameObject *controlZone)
Definition ZoneScript.h:56
virtual void HandleContestedEventHorde(GameObject *controlZone)
Definition ZoneScript.h:54
virtual void HandleCaptureEventAlliance(GameObject *controlZone)
Definition ZoneScript.h:53
uint32 _zoneId
ZoneId.
Trinity::PacketSenderOwning< WorldPackets::Chat::DefenseMessage > * operator()(LocaleConstant locale) const
DefenseMessageBuilder(uint32 zoneId, uint32 id)
uint32 _id
BroadcastTextId.
Definition Group.h:205
Definition Map.h:225
OPvPCapturePoint(OutdoorPvP *pvp)
virtual bool HandleCustomSpell(Player *player, uint32 spellId, GameObject *go)
virtual int32 HandleOpenGo(Player *player, GameObject *go)
GameObject * ToGameObject()
Definition Object.h:131
virtual void HandlePlayerEnterZone(Player *player, uint32 zone)
OPvPCapturePointMap m_capturePoints
Definition OutdoorPvP.h:202
bool HasPlayer(Player const *player) const
GuidSet m_players[2]
Definition OutdoorPvP.h:206
virtual void Update(uint32 diff)
virtual ~OutdoorPvP()
int32 GetWorldState(int32 worldStateId) const
void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2=0)
void RegisterZone(uint32 zoneid)
virtual void SendRemoveWorldStates(Player *)
Definition OutdoorPvP.h:211
void SetWorldState(int32 worldStateId, int32 value)
virtual bool HandleCustomSpell(Player *player, uint32 spellId, GameObject *go)
virtual void HandlePlayerLeaveZone(Player *player, uint32 zone)
virtual bool HandleOpenGo(Player *player, GameObject *go)
void TeamCastSpell(TeamId team, int32 spellId)
virtual void HandlePlayerResurrects(Player *player, uint32 zone)
ControlZoneHandlerMap ControlZoneHandlers
Definition OutdoorPvP.h:204
virtual void HandleKillImpl(Player *, Unit *)
Definition OutdoorPvP.h:169
void ProcessEvent(WorldObject *target, uint32 eventId, WorldObject *invoker) override
void BroadcastWorker(Worker &_worker, uint32 zoneId)
void SendDefenseMessage(uint32 zoneId, uint32 id)
virtual void HandleKill(Player *killer, Unit *killed)
virtual bool HandleDropFlag(Player *player, uint32 spellId)
void BroadcastPacket(WorldPacket const *data) const
OutdoorPvP(Map *map)
Map * m_map
Definition OutdoorPvP.h:229
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:26434
WorldSession * GetSession() const
Definition Player.h:2272
TeamId GetTeamId() const
Definition Player.h:2424
Group * GetGroup(Optional< uint8 > partyIndex)
Definition Player.h:2796
bool IsOutdoorPvPActive() const
Definition Player.cpp:7788
Definition Unit.h:635
std::string const & GetName() const
Definition Object.h:342
bool PlayerLogout() const
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API void SetValue(int32 worldStateId, int32 value, bool hidden, Map *map)
TC_GAME_API int32 GetValue(int32 worldStateId, Map const *map)