diff options
Diffstat (limited to 'src/game/Group.h')
| -rw-r--r-- | src/game/Group.h | 55 | 
1 files changed, 55 insertions, 0 deletions
diff --git a/src/game/Group.h b/src/game/Group.h index a77c106c550..d09ef616897 100644 --- a/src/game/Group.h +++ b/src/game/Group.h @@ -17,17 +17,22 @@   * along with this program; if not, write to the Free Software   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA   */ +  #ifndef TRINITYCORE_GROUP_H  #define TRINITYCORE_GROUP_H +  #include "GroupReference.h"  #include "GroupRefManager.h"  #include "BattleGround.h"  #include "LootMgr.h" +  #include <map>  #include <vector> +  #define MAXGROUPSIZE 5  #define MAXRAIDSIZE 40  #define TARGETICONCOUNT 8 +  enum RollVote  {      PASS              = 0, @@ -36,6 +41,7 @@ enum RollVote      NOT_EMITED_YET    = 3,      NOT_VALID         = 4  }; +  enum GroupMemberOnlineStatus  {      MEMBER_STATUS_OFFLINE   = 0x0000, @@ -48,12 +54,15 @@ enum GroupMemberOnlineStatus      MEMBER_STATUS_UNK4      = 0x0040,                       // appears with dead and ghost flags      MEMBER_STATUS_UNK5      = 0x0080,                       // never seen  }; +  enum GroupType  {      GROUPTYPE_NORMAL = 0,      GROUPTYPE_RAID   = 1  }; +  class BattleGround; +  enum GroupUpdateFlags  {      GROUP_UPDATE_FLAG_NONE              = 0x00000000,       // nothing @@ -80,10 +89,13 @@ enum GroupUpdateFlags      GROUP_UPDATE_PET                    = 0x0007FC00,       // all pet flags      GROUP_UPDATE_FULL                   = 0x0007FFFF,       // all known flags  }; +  #define GROUP_UPDATE_FLAGS_COUNT          20                                                                  // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19  static const uint8 GroupUpdateLength[GROUP_UPDATE_FLAGS_COUNT] = { 0, 2, 2, 2, 1, 2, 2, 2, 2, 4, 8, 8, 1, 2, 2, 2, 1, 2, 2, 8}; +  class InstanceSave; +  class Roll : public LootValidatorRef  {      public: @@ -94,6 +106,7 @@ class Roll : public LootValidatorRef          void setLoot(Loot *pLoot) { link(pLoot, this); }          Loot *getLoot() { return getTarget(); }          void targetObjectBuildLink(); +          uint64 itemGUID;          uint32 itemid;          int32  itemRandomPropId; @@ -106,6 +119,7 @@ class Roll : public LootValidatorRef          uint8 totalPass;          uint8 itemSlot;  }; +  struct InstanceGroupBind  {      InstanceSave *save; @@ -114,6 +128,7 @@ struct InstanceGroupBind         PlayerInstanceBind for the same instance. */      InstanceGroupBind() : save(NULL), perm(false) {}  }; +  /** request member stats checken **/  /** todo: uninvite people that not accepted invite **/  class TRINITY_DLL_SPEC Group @@ -128,14 +143,18 @@ class TRINITY_DLL_SPEC Group          };          typedef std::list<MemberSlot> MemberSlotList;          typedef MemberSlotList::const_iterator member_citerator; +          typedef UNORDERED_MAP< uint32 /*mapId*/, InstanceGroupBind> BoundInstancesMap;      protected:          typedef MemberSlotList::iterator member_witerator;          typedef std::set<Player*> InvitesList; +          typedef std::vector<Roll*> Rolls; +      public:          Group();          ~Group(); +          // group manipulation methods          bool   Create(const uint64 &guid, const char * name);          bool   LoadGroupFromDB(const uint64 &leaderGuid, QueryResult *result = NULL, bool loadMembers = true); @@ -153,6 +172,7 @@ class TRINITY_DLL_SPEC Group          void   UpdateLooterGuid( Creature* creature, bool ifneed = false );          void   SetLootThreshold(ItemQualities threshold) { m_lootThreshold = threshold; }          void   Disband(bool hideDestroy=false); +          // properties accessories          bool IsFull() const { return (m_groupType==GROUPTYPE_NORMAL) ? (m_memberSlots.size()>=MAXGROUPSIZE) : (m_memberSlots.size()>=MAXRAIDSIZE); }          bool isRaidGroup() const { return m_groupType==GROUPTYPE_RAID; } @@ -163,6 +183,7 @@ class TRINITY_DLL_SPEC Group          LootMethod    GetLootMethod() const { return m_lootMethod; }          const uint64& GetLooterGuid() const { return m_looterGuid; }          ItemQualities GetLootThreshold() const { return m_lootThreshold; } +          // member manipulation methods          bool IsMember(const uint64& guid) const { return _getMemberCSlot(guid) != m_memberSlots.end(); }          bool IsLeader(const uint64& guid) const { return (GetLeaderGUID() == guid); } @@ -182,29 +203,37 @@ class TRINITY_DLL_SPEC Group              member_citerator mslot = _getMemberCSlot(guid);              if(mslot==m_memberSlots.end())                  return false; +              return mslot->assistant;          }          Player* GetInvited(const uint64& guid) const;          Player* GetInvited(const std::string& name) const; +          bool SameSubGroup(uint64 guid1,const uint64& guid2) const          {              member_citerator mslot2 = _getMemberCSlot(guid2);              if(mslot2==m_memberSlots.end())                  return false; +              return SameSubGroup(guid1,&*mslot2);          } +          bool SameSubGroup(uint64 guid1, MemberSlot const* slot2) const          {              member_citerator mslot1 = _getMemberCSlot(guid1);              if(mslot1==m_memberSlots.end() || !slot2)                  return false; +              return (mslot1->group==slot2->group);          } +          bool HasFreeSlotSubGroup(uint8 subgroup) const          {              return (m_subGroupsCounts && m_subGroupsCounts[subgroup] < MAXGROUPSIZE);          } +          bool SameSubGroup(Player const* member1, Player const* member2) const; +          MemberSlotList const& GetMemberSlots() const { return m_memberSlots; }          GroupReference* GetFirstMember() { return m_memberMgr.getFirst(); }          uint32 GetMembersCount() const { return m_memberSlots.size(); } @@ -214,14 +243,19 @@ class TRINITY_DLL_SPEC Group              member_citerator mslot = _getMemberCSlot(guid);              if(mslot==m_memberSlots.end())                  return (MAXRAIDSIZE/MAXGROUPSIZE+1); +              return mslot->group;          } +          // some additional raid methods          void ConvertToRaid(); +          void SetBattlegroundGroup(BattleGround *bg) { m_bgGroup = bg; }          uint32 CanJoinBattleGroundQueue(BattleGroundTypeId bgTypeId, BattleGroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot); +          void ChangeMembersGroup(const uint64 &guid, const uint8 &group);          void ChangeMembersGroup(Player *player, const uint8 &group); +          void SetAssistant(uint64 guid, const bool &state)          {              if(!isRaidGroup()) @@ -233,6 +267,7 @@ class TRINITY_DLL_SPEC Group          {              if(!isRaidGroup())                  return; +              if(_setMainTank(guid))                  SendUpdate();          } @@ -240,15 +275,18 @@ class TRINITY_DLL_SPEC Group          {              if(!isRaidGroup())                  return; +              if(_setMainAssistant(guid))                  SendUpdate();          } +          void SetTargetIcon(uint8 id, uint64 guid);          void SetDifficulty(uint8 difficulty);          uint8 GetDifficulty() { return m_difficulty; }          uint16 InInstance();          bool InCombatToInstance(uint32 instanceId);          void ResetInstances(uint8 method, Player* SendMsgTo); +          // -no description-          //void SendInit(WorldSession *session);          void SendTargetIconList(WorldSession *session); @@ -258,9 +296,11 @@ class TRINITY_DLL_SPEC Group          void BroadcastPacket(WorldPacket *packet, bool ignorePlayersInBGRaid, int group=-1, uint64 ignore=0);          void BroadcastReadyCheck(WorldPacket *packet);          void OfflineReadyCheck(); +          /*********************************************************/          /***                   LOOT SYSTEM                     ***/          /*********************************************************/ +          void SendLootStartRoll(uint32 CountDown, const Roll &r);          void SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r);          void SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r); @@ -283,34 +323,45 @@ class TRINITY_DLL_SPEC Group          void CountTheRoll(Rolls::iterator roll, uint32 NumberOfPlayers);          void CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 NumberOfPlayers, uint8 Choise);          void EndRoll(); +          void LinkMember(GroupReference *pRef) { m_memberMgr.insertFirst(pRef); }          void DelinkMember(GroupReference* /*pRef*/ ) { } +          InstanceGroupBind* BindToInstance(InstanceSave *save, bool permanent, bool load = false);          void UnbindInstance(uint32 mapid, uint8 difficulty, bool unload = false);          InstanceGroupBind* GetBoundInstance(uint32 mapid, uint8 difficulty);          BoundInstancesMap& GetBoundInstances(uint8 difficulty) { return m_boundInstances[difficulty]; } +          // FG: evil hacks          void BroadcastGroupUpdate(void); +      protected:          bool _addMember(const uint64 &guid, const char* name, bool isAssistant=false);          bool _addMember(const uint64 &guid, const char* name, bool isAssistant, uint8 group);          bool _removeMember(const uint64 &guid);             // returns true if leader has changed          void _setLeader(const uint64 &guid); +          void _removeRolls(const uint64 &guid); +          bool _setMembersGroup(const uint64 &guid, const uint8 &group);          bool _setAssistantFlag(const uint64 &guid, const bool &state);          bool _setMainTank(const uint64 &guid);          bool _setMainAssistant(const uint64 &guid); +          void _homebindIfInstance(Player *player); +          void _initRaidSubGroupsCounter()          {              // Sub group counters initialization              if (!m_subGroupsCounts)                  m_subGroupsCounts = new uint8[MAXRAIDSIZE / MAXGROUPSIZE]; +              memset((void*)m_subGroupsCounts, 0, (MAXRAIDSIZE / MAXGROUPSIZE)*sizeof(uint8)); +              for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)                  ++m_subGroupsCounts[itr->group];          } +          member_citerator _getMemberCSlot(uint64 Guid) const          {              for(member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) @@ -320,6 +371,7 @@ class TRINITY_DLL_SPEC Group              }              return m_memberSlots.end();          } +          member_witerator _getMemberWSlot(uint64 Guid)          {              for(member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) @@ -329,16 +381,19 @@ class TRINITY_DLL_SPEC Group              }              return m_memberSlots.end();          } +          void SubGroupCounterIncrease(uint8 subgroup)          {              if (m_subGroupsCounts)                  ++m_subGroupsCounts[subgroup];          } +          void SubGroupCounterDecrease(uint8 subgroup)          {              if (m_subGroupsCounts)                  --m_subGroupsCounts[subgroup];          } +          MemberSlotList      m_memberSlots;          GroupRefManager     m_memberMgr;          InvitesList         m_invitees;  | 
