Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
- index 8660b04..5dfc322 100755
- --- a/src/server/game/Entities/Player/Player.cpp
- +++ b/src/server/game/Entities/Player/Player.cpp
- @@ -2408,6 +2408,10 @@ void Player::RemoveFromWorld()
- UnsummonPetTemporaryIfAny();
- sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
- sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
- +
- + if (Group* g = GetGroup())
- + if (g->IsLeader(GetGUID()))
- + g->HandleLeaderLogOut(this);
- }
- ///- Do not add/remove the player from the object storage
- diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
- index fda04ef..ae08b23 100755
- --- a/src/server/game/Groups/Group.cpp
- +++ b/src/server/game/Groups/Group.cpp
- @@ -2413,3 +2413,40 @@ void Group::ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply)
- slot->flags &= ~flag;
- }
- +void Group::HandleLeaderLogOut(Player* player)
- +{
- + //! Find new potential leader
- + member_citerator itr = m_memberSlots.begin();
- + for (; itr != m_memberSlots.end(); ++itr)
- + if (itr->flags & MEMBER_FLAG_ASSISTANT) //! First look for oldest assistant
- + break;
- +
- + //! If no assistant is found, choose the oldest member
- + if (itr == m_memberSlots.end())
- + itr = m_memberSlots.begin();
- +
- + //! This loop only exists just in case FindPlayer returns NULL
- + Player* newLeader = NULL;
- + while (!newLeader && itr != m_memberSlots.end())
- + {
- + newLeader = ObjectAccessor::FindPlayer(itr->guid);
- + ++itr;
- + }
- +
- + if (!newLeader)
- + return;
- +
- + newLeader->m_Events.AddEvent(new GroupChangeLeaderEvent(newLeader), newLeader->m_Events.CalculateTime(CHANGELEADERDELAY));
- +
- +}
- +
- +bool GroupChangeLeaderEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
- +{
- + if (Group* group = _owner->GetGroup())
- + {
- + group->ChangeLeader(_owner->GetGUID());
- + return true;
- + }
- +
- + return false;
- +}
- diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
- index de622a1..f6eb125 100755
- --- a/src/server/game/Groups/Group.h
- +++ b/src/server/game/Groups/Group.h
- @@ -45,6 +45,7 @@ struct MapEntry;
- #define MAXRAIDSIZE 40
- #define MAX_RAID_SUBGROUPS MAXRAIDSIZE/MAXGROUPSIZE
- #define TARGETICONCOUNT 8
- +#define CHANGELEADERDELAY 2 * MINUTE * IN_MILLISECONDS
- enum RollVote
- {
- @@ -201,6 +202,7 @@ class Group
- void SetLootThreshold(ItemQualities threshold);
- void Disband(bool hideDestroy=false);
- void SetLfgRoles(uint64 guid, const uint8 roles);
- + void HandleLeaderLogOut(Player* player);
- // properties accessories
- bool IsFull() const;
- @@ -341,4 +343,14 @@ class Group
- uint32 m_maxEnchantingLevel;
- uint32 m_dbStoreId; // Represents the ID used in database (Can be reused by other groups if group was disbanded)
- };
- +
- +class GroupChangeLeaderEvent : public BasicEvent
- +{
- + public:
- + GroupChangeLeaderEvent(Player* owner) : _owner(owner), BasicEvent() {};
- + bool Execute(uint64 /*e_time*/, uint32 /*p_time*/);
- +
- + private:
- + Player* _owner;
- +};
- #endif
Add Comment
Please, Sign In to add comment