Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
OutdoorPvPMgr.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "DisableMgr.h"
7#include "ObjectMgr.h"
8#include "OutdoorPvPMgr.h"
9#include "Player.h"
10#include "ScriptMgr.h"
11
13{
14 //SF_LOG_DEBUG("outdoorpvp", "Deleting OutdoorPvPMgr");
15 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
16 delete* itr;
17
18 for (OutdoorPvPDataMap::iterator itr = m_OutdoorPvPDatas.begin(); itr != m_OutdoorPvPDatas.end(); ++itr)
19 delete itr->second;
20}
21
23{
24 uint32 oldMSTime = getMSTime();
25
26 // 0 1
27 QueryResult result = WorldDatabase.Query("SELECT TypeId, ScriptName FROM outdoorpvp_template");
28
29 if (!result)
30 {
31 SF_LOG_ERROR("server.loading", ">> Loaded 0 outdoor PvP definitions. DB table `outdoorpvp_template` is empty.");
32 return;
33 }
34
35 uint32 count = 0;
36 uint32 typeId = 0;
37
38 do
39 {
40 Field* fields = result->Fetch();
41
42 typeId = fields[0].GetUInt8();
43
45 continue;
46
47 if (typeId >= MAX_OUTDOORPVP_TYPES)
48 {
49 SF_LOG_ERROR("sql.sql", "Invalid OutdoorPvPTypes value %u in outdoorpvp_template; skipped.", typeId);
50 continue;
51 }
52
53 OutdoorPvPData* data = new OutdoorPvPData();
54 OutdoorPvPTypes realTypeId = OutdoorPvPTypes(typeId);
55 data->TypeId = realTypeId;
56 data->ScriptId = sObjectMgr->GetScriptId(fields[1].GetCString());
57 m_OutdoorPvPDatas[realTypeId] = data;
58
59 ++count;
60 } while (result->NextRow());
61
62 OutdoorPvP* pvp;
63 for (uint8 i = 1; i < MAX_OUTDOORPVP_TYPES; ++i)
64 {
65 OutdoorPvPDataMap::iterator iter = m_OutdoorPvPDatas.find(OutdoorPvPTypes(i));
66 if (iter == m_OutdoorPvPDatas.end())
67 {
68 SF_LOG_ERROR("sql.sql", "Could not initialize OutdoorPvP object for type ID %u; no entry in database.", uint32(i));
69 continue;
70 }
71
72 pvp = sScriptMgr->CreateOutdoorPvP(iter->second);
73 if (!pvp)
74 {
75 SF_LOG_ERROR("outdoorpvp", "Could not initialize OutdoorPvP object for type ID %u; got NULL pointer from script.", uint32(i));
76 continue;
77 }
78
79 if (!pvp->SetupOutdoorPvP())
80 {
81 SF_LOG_ERROR("outdoorpvp", "Could not initialize OutdoorPvP object for type ID %u; SetupOutdoorPvP failed.", uint32(i));
82 delete pvp;
83 continue;
84 }
85
86 m_OutdoorPvPSet.push_back(pvp);
87 }
88
89 SF_LOG_INFO("server.loading", ">> Loaded %u outdoor PvP definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
90}
91
93{
94 m_OutdoorPvPMap[zoneid] = handle;
95}
96
98{
99 OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
100 if (itr == m_OutdoorPvPMap.end())
101 return;
102
103 if (itr->second->HasPlayer(player))
104 return;
105
106 itr->second->HandlePlayerEnterZone(player, zoneid);
107 SF_LOG_DEBUG("outdoorpvp", "Player %u entered outdoorpvp id %u", player->GetGUIDLow(), itr->second->GetTypeId());
108}
109
111{
112 OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
113 if (itr == m_OutdoorPvPMap.end())
114 return;
115
116 // teleport: remove once in removefromworld, once in updatezone
117 if (!itr->second->HasPlayer(player))
118 return;
119
120 itr->second->HandlePlayerLeaveZone(player, zoneid);
121 SF_LOG_DEBUG("outdoorpvp", "Player %u left outdoorpvp id %u", player->GetGUIDLow(), itr->second->GetTypeId());
122}
123
125{
126 OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
127 if (itr == m_OutdoorPvPMap.end())
128 {
129 // no handle for this zone, return
130 return NULL;
131 }
132 return itr->second;
133}
134
136{
137 m_UpdateTimer += diff;
139 {
140 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
141 (*itr)->Update(m_UpdateTimer);
142 m_UpdateTimer = 0;
143 }
144}
145
147{
148 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
149 {
150 if ((*itr)->HandleCustomSpell(player, spellId, go))
151 return true;
152 }
153 return false;
154}
155
157{
158 OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneId);
159 if (itr != m_OutdoorPvPMap.end())
160 return itr->second;
161 else
162 return NULL;
163}
164
166{
167 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
168 {
169 if ((*itr)->HandleOpenGo(player, guid))
170 return true;
171 }
172 return false;
173}
174
176{
177 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
178 {
179 if ((*itr)->HandleGossipOption(player, guid, gossipid))
180 return;
181 }
182}
183
184bool OutdoorPvPMgr::CanTalkTo(Player* player, Creature* creature, GossipMenuItems const& gso)
185{
186 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
187 {
188 if ((*itr)->CanTalkTo(player, creature, gso))
189 return true;
190 }
191 return false;
192}
193
195{
196 for (OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr)
197 {
198 if ((*itr)->HandleDropFlag(player, spellId))
199 return;
200 }
201}
202
204{
205 OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
206 if (itr == m_OutdoorPvPMap.end())
207 return;
208
209 if (itr->second->HasPlayer(player))
210 itr->second->HandlePlayerResurrects(player, zoneid);
211}
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
@ DISABLE_TYPE_OUTDOORPVP
Definition DisableMgr.h:20
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
#define SF_LOG_INFO(filterType__,...)
Definition Log.h:137
#define sObjectMgr
Definition ObjectMgr.h:1617
OutdoorPvPTypes
Definition OutdoorPvP.h:17
#define MAX_OUTDOORPVP_TYPES
Definition OutdoorPvP.h:25
#define OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL
Skyfire::AutoPtr< ResultSet, Skyfire::Mutex > QueryResult
Definition QueryResult.h:48
#define sScriptMgr
Definition ScriptMgr.h:764
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:22
uint32 getMSTime()
Definition Timer.h:12
Definition Field.h:16
uint8 GetUInt8() const
Definition Field.h:26
uint32 GetGUIDLow() const
Definition Object.h:120
virtual bool SetupOutdoorPvP()
Definition OutdoorPvP.h:204
bool HandleCustomSpell(Player *player, uint32 spellId, GameObject *go)
void HandleGossipOption(Player *player, uint64 guid, uint32 gossipid)
OutdoorPvPMap m_OutdoorPvPMap
ZoneScript * GetZoneScript(uint32 zoneId)
bool HandleOpenGo(Player *player, uint64 guid)
void AddZone(uint32 zoneid, OutdoorPvP *handle)
void HandlePlayerLeaveZone(Player *player, uint32 areaflag)
OutdoorPvPSet m_OutdoorPvPSet
bool CanTalkTo(Player *player, Creature *creature, GossipMenuItems const &gso)
void Update(uint32 diff)
void HandleDropFlag(Player *player, uint32 spellId)
OutdoorPvP * GetOutdoorPvPToZoneId(uint32 zoneid)
void HandlePlayerEnterZone(Player *player, uint32 areaflag)
uint32 m_UpdateTimer
void HandlePlayerResurrects(Player *player, uint32 areaflag)
OutdoorPvPDataMap m_OutdoorPvPDatas
WorldDatabaseWorkerPool WorldDatabase
Accessor to the world database.
Definition Main.cpp:40
bool IsDisabledFor(DisableType type, uint32 entry, Unit const *unit, uint8 flags)
OutdoorPvPTypes TypeId