AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
lfg::LFGGroupScript Class Reference

#include "LFGScripts.h"

Inheritance diagram for lfg::LFGGroupScript:
GroupScript ScriptObject

Public Member Functions

 LFGGroupScript ()
 
void OnAddMember (Group *group, ObjectGuid guid) override
 
void OnRemoveMember (Group *group, ObjectGuid guid, RemoveMethod method, ObjectGuid kicker, char const *reason) override
 
void OnDisband (Group *group) override
 
void OnChangeLeader (Group *group, ObjectGuid newLeaderGuid, ObjectGuid oldLeaderGuid) override
 
void OnInviteMember (Group *group, ObjectGuid guid) override
 
- Public Member Functions inherited from GroupScript
bool IsDatabaseBound () const override
 
virtual void OnAddMember (Group *, ObjectGuid)
 
virtual void OnInviteMember (Group *, ObjectGuid)
 
virtual void OnRemoveMember (Group *, ObjectGuid, RemoveMethod, ObjectGuid, const char *)
 
virtual void OnChangeLeader (Group *, ObjectGuid, ObjectGuid)
 
virtual void OnDisband (Group *)
 
virtual bool CanGroupJoinBattlegroundQueue (Group const *, Player *, Battleground const *, uint32, bool, uint32)
 
virtual void OnCreate (Group *, Player *)
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 

Additional Inherited Members

- Protected Member Functions inherited from GroupScript
 GroupScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name)
 
virtual ~ScriptObject ()=default
 

Detailed Description

Constructor & Destructor Documentation

◆ LFGGroupScript()

lfg::LFGGroupScript::LFGGroupScript ( )
133 : GroupScript("LFGGroupScript")
134 {
135 }
Definition: ScriptMgr.h:1532

Member Function Documentation

◆ OnAddMember()

void lfg::LFGGroupScript::OnAddMember ( Group group,
ObjectGuid  guid 
)
overridevirtual

Reimplemented from GroupScript.

138 {
140 return;
141
142 ObjectGuid gguid = group->GetGUID();
143 ObjectGuid leader = group->GetLeaderGUID();
144
145 if (leader == guid)
146 {
147 LOG_DEBUG("lfg", "LFGScripts::OnAddMember [{}]: added [{}] leader [{}]", gguid.ToString(), guid.ToString(), leader.ToString());
148 sLFGMgr->SetLeader(gguid, guid);
149 }
150 else
151 {
152 LfgState gstate = sLFGMgr->GetState(gguid);
153 LfgState state = sLFGMgr->GetState(guid);
154 LOG_DEBUG("lfg", "LFGScripts::OnAddMember [{}]: added [{}] leader [{}] gstate: {}, state: {}",
155 gguid.ToString(), guid.ToString(), leader.ToString(), gstate, state);
156
157 if (state == LFG_STATE_QUEUED)
158 sLFGMgr->LeaveLfg(guid);
159
160 if (gstate == LFG_STATE_QUEUED)
161 sLFGMgr->LeaveLfg(gguid);
162 }
163
164 if (!group->isLFGGroup())
165 {
166 sLFGMgr->LeaveAllLfgQueues(leader, true, gguid); // pussywizard: invited, queued, party formed, neither party nor new member are queued, but leader is in queue solo!
167 sLFGMgr->LeaveAllLfgQueues(guid, false);
168 }
169
170 sLFGMgr->SetGroup(guid, gguid);
171 sLFGMgr->AddPlayerToGroup(gguid, guid);
172
173 // pussywizard: after all necessary actions handle raid browser
174 if (sLFGMgr->GetState(guid) == LFG_STATE_RAIDBROWSER)
175 sLFGMgr->LeaveLfg(guid);
176 }
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
#define sLFGMgr
Definition: LFGMgr.h:638
@ LFG_OPTION_ENABLE_SEASONAL_BOSSES
Definition: LFGMgr.h:43
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
Definition: LFGMgr.h:41
@ LFG_OPTION_ENABLE_RAID_BROWSER
Definition: LFGMgr.h:42
LfgState
Definition: LFG.h:70
@ LFG_STATE_RAIDBROWSER
Definition: LFG.h:78
@ LFG_STATE_QUEUED
Definition: LFG.h:73
Definition: ObjectGuid.h:120
std::string ToString() const
Definition: ObjectGuid.cpp:47
bool isLFGGroup(bool restricted=false) const
Definition: Group.cpp:2204
ObjectGuid GetGUID() const
Definition: Group.cpp:2245
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:2235

References Group::GetGUID(), Group::GetLeaderGUID(), Group::isLFGGroup(), lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER, lfg::LFG_OPTION_ENABLE_RAID_BROWSER, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, lfg::LFG_STATE_QUEUED, lfg::LFG_STATE_RAIDBROWSER, LOG_DEBUG, sLFGMgr, and ObjectGuid::ToString().

◆ OnChangeLeader()

void lfg::LFGGroupScript::OnChangeLeader ( Group group,
ObjectGuid  newLeaderGuid,
ObjectGuid  oldLeaderGuid 
)
overridevirtual

Reimplemented from GroupScript.

264 {
266 return;
267
268 ObjectGuid gguid = group->GetGUID();
269
270 LOG_DEBUG("lfg", "LFGScripts::OnChangeLeader [{}]: old [{}] new [{}]",
271 gguid.ToString(), newLeaderGuid.ToString(), oldLeaderGuid.ToString());
272 sLFGMgr->SetLeader(gguid, newLeaderGuid);
273
274 // pussywizard: after all necessary actions handle raid browser
275 if (sLFGMgr->GetState(oldLeaderGuid) == LFG_STATE_RAIDBROWSER)
276 sLFGMgr->LeaveLfg(oldLeaderGuid);
277 }

References Group::GetGUID(), lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER, lfg::LFG_OPTION_ENABLE_RAID_BROWSER, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, lfg::LFG_STATE_RAIDBROWSER, LOG_DEBUG, sLFGMgr, and ObjectGuid::ToString().

◆ OnDisband()

void lfg::LFGGroupScript::OnDisband ( Group group)
overridevirtual

Reimplemented from GroupScript.

249 {
251 return;
252
253 ObjectGuid gguid = group->GetGUID();
254 LOG_DEBUG("lfg", "LFGScripts::OnDisband [{}]", gguid.ToString());
255
256 // pussywizard: after all necessary actions handle raid browser
257 if (sLFGMgr->GetState(group->GetLeaderGUID()) == LFG_STATE_RAIDBROWSER)
258 sLFGMgr->LeaveLfg(group->GetLeaderGUID());
259
260 sLFGMgr->RemoveGroupData(gguid);
261 }

References Group::GetGUID(), Group::GetLeaderGUID(), lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER, lfg::LFG_OPTION_ENABLE_RAID_BROWSER, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, lfg::LFG_STATE_RAIDBROWSER, LOG_DEBUG, sLFGMgr, and ObjectGuid::ToString().

◆ OnInviteMember()

void lfg::LFGGroupScript::OnInviteMember ( Group group,
ObjectGuid  guid 
)
overridevirtual

Reimplemented from GroupScript.

280 {
281 // used only with EXTRA_LOGS
282 (void)guid;
283
285 return;
286
287 ObjectGuid gguid = group->GetGUID();
288 ObjectGuid leader = group->GetLeaderGUID();
289 LOG_DEBUG("lfg", "LFGScripts::OnInviteMember [{}]: invite [{}] leader [{}]", gguid.ToString(), guid.ToString(), leader.ToString());
290 // No gguid == new group being formed
291 // No leader == after group creation first invite is new leader
292 // leader and no gguid == first invite after leader is added to new group (this is the real invite)
293 if (leader && !gguid)
294 {
295 sLFGMgr->LeaveLfg(leader);
296 sLFGMgr->LeaveAllLfgQueues(leader, true);
297 }
298 }

References Group::GetGUID(), Group::GetLeaderGUID(), lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER, lfg::LFG_OPTION_ENABLE_RAID_BROWSER, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, LOG_DEBUG, sLFGMgr, and ObjectGuid::ToString().

◆ OnRemoveMember()

void lfg::LFGGroupScript::OnRemoveMember ( Group group,
ObjectGuid  guid,
RemoveMethod  method,
ObjectGuid  kicker,
char const *  reason 
)
overridevirtual

Reimplemented from GroupScript.

179 {
180 // used only with EXTRA_LOGS
181 (void)kicker;
182 (void)reason;
183
185 return;
186
187 ObjectGuid gguid = group->GetGUID();
188 LOG_DEBUG("lfg", "LFGScripts::OnRemoveMember [{}]: remove [{}] Method: {} Kicker: [{}] Reason: {}",
189 gguid.ToString(), guid.ToString(), method, kicker.ToString(), (reason ? reason : ""));
190
191 bool isLFG = group->isLFGGroup();
192 LfgState state = sLFGMgr->GetState(gguid);
193 uint32 dungeonId = sLFGMgr->GetDungeon(gguid, false);
194
195 // If group is being formed after proposal success do nothing more
196 if (state == LFG_STATE_PROPOSAL && method == GROUP_REMOVEMETHOD_DEFAULT)
197 {
198 // LfgData: Remove player from group
199 sLFGMgr->SetGroup(guid, ObjectGuid::Empty);
200 sLFGMgr->RemovePlayerFromGroup(gguid, guid);
201 return;
202 }
203
204 sLFGMgr->LeaveLfg(guid);
205 sLFGMgr->LeaveAllLfgQueues(guid, true, gguid);
206 sLFGMgr->SetGroup(guid, ObjectGuid::Empty);
207 uint8 players = sLFGMgr->RemovePlayerFromGroup(gguid, guid);
208
209 // pussywizard: after all necessary actions handle raid browser
210 // pussywizard: already done above
211 //if (sLFGMgr->GetState(guid) == LFG_STATE_RAIDBROWSER)
212 // sLFGMgr->LeaveLfg(guid);
213
214 // Xinef: only LFG groups can go below
215 if (!isLFG)
216 return;
217
218 if (state != LFG_STATE_FINISHED_DUNGEON && group) // Need more players to finish the dungeon
219 {
220 if (Player* leader = ObjectAccessor::FindConnectedPlayer(sLFGMgr->GetLeader(gguid)))
221 {
222 sLFGMgr->SetDungeon(gguid, dungeonId);
223 leader->GetSession()->SendLfgOfferContinue(sLFGMgr->GetDungeon(gguid, false));
224 }
225 }
226
228 {
229 // xinef: fixed dungeon deserter
231 player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN) && players >= LFG_GROUP_KICK_VOTES_NEEDED)
232 {
233 player->AddAura(LFG_SPELL_DUNGEON_DESERTER, player);
234 }
235 //else if (state == LFG_STATE_BOOT)
236 // Update internal kick cooldown of kicked
237
238 player->GetSession()->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_LEADER_UNK1));
239 if (player->GetMap()->IsDungeon()) // Teleport player out the dungeon
240 {
241 // Xinef: no longer valid sLFGMgr->TeleportPlayer(player, true);
242 if (!player->IsBeingTeleportedFar() && player->GetMapId() == sLFGMgr->GetDungeonMapId(gguid))
243 player->TeleportToEntryPoint();
244 }
245 }
246 }
std::uint8_t uint8
Definition: Define.h:110
std::uint32_t uint32
Definition: Define.h:108
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition: SharedDefines.h:3562
@ GROUP_REMOVEMETHOD_DEFAULT
Definition: SharedDefines.h:3559
@ LFG_STATE_FINISHED_DUNGEON
Definition: LFG.h:77
@ LFG_STATE_PROPOSAL
Definition: LFG.h:74
@ LFG_UPDATETYPE_LEADER_UNK1
Definition: LFG.h:52
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition: LFGMgr.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition: LFGMgr.h:55
@ LFG_SPELL_DUNGEON_DESERTER
Definition: LFGMgr.h:53
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:262
static ObjectGuid const Empty
Definition: ObjectGuid.h:122
Definition: Player.h:1046

References ObjectGuid::Empty, ObjectAccessor::FindConnectedPlayer(), Group::GetGUID(), GROUP_REMOVEMETHOD_DEFAULT, GROUP_REMOVEMETHOD_KICK_LFG, Group::isLFGGroup(), lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER, lfg::LFG_OPTION_ENABLE_RAID_BROWSER, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_SPELL_DUNGEON_DESERTER, lfg::LFG_STATE_FINISHED_DUNGEON, lfg::LFG_STATE_PROPOSAL, lfg::LFG_UPDATETYPE_LEADER_UNK1, LOG_DEBUG, sLFGMgr, and ObjectGuid::ToString().