• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

TeamBalancer.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #include "NativeFeatureIncludes.h"
00010 #if _RAKNET_SUPPORT_TeamBalancer==1
00011 
00012 #ifndef __TEAM_BALANCER_H
00013 #define __TEAM_BALANCER_H
00014 
00015 class RakPeerInterface;
00016 #include "PluginInterface2.h"
00017 #include "RakMemoryOverride.h"
00018 #include "NativeTypes.h"
00019 #include "DS_List.h"
00020 #include "RakString.h"
00021 
00022 namespace RakNet
00023 {
00024 
00029 
00032 typedef unsigned char TeamId;
00033 
00034 #define UNASSIGNED_TEAM_ID 255
00035 
00040 class RAK_DLL_EXPORT TeamBalancer : public PluginInterface2
00041 {
00042 public:
00043         TeamBalancer();
00044         virtual ~TeamBalancer();
00045 
00052         void SetHostGuid(RakNetGUID _hostGuid);
00053 
00059         void SetTeamSizeLimits(const DataStructures::List<unsigned short> &_teamLimits);
00060 
00067         void SetTeamSizeLimits(unsigned short *values, int valuesLength);
00068         
00069         enum DefaultAssigmentAlgorithm
00070         {
00072                 SMALLEST_TEAM,
00074                 FILL_IN_ORDER
00075         };
00081         void SetDefaultAssignmentAlgorithm(DefaultAssigmentAlgorithm daa);
00082 
00090         void SetForceEvenTeams(bool force);
00091 
00097         void SetLockTeams(bool lock);
00098 
00107         bool RequestSpecificTeam(TeamId desiredTeam);
00108 
00112         void CancelRequestSpecificTeam(void);
00113 
00117         void RequestAnyTeam(void);
00118 
00124         TeamId GetMyTeam(void) const;
00125 
00131         void SetAllowHostMigration(bool allow);
00132 
00133         struct TeamMember
00134         {
00135                 RakNetGUID memberGuid;
00136                 TeamId currentTeam;
00137                 TeamId requestedTeam;
00138         };
00139 
00140 protected:
00141 
00143         virtual PluginReceiveResult OnReceive(Packet *packet);
00145         virtual void OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason );
00146 
00147         void OnStatusUpdateToNewHost(Packet *packet);
00148         void OnCancelTeamRequest(Packet *packet);
00149         void OnRequestAnyTeam(Packet *packet);
00150         void OnRequestSpecificTeam(Packet *packet);
00151 
00152         RakNetGUID hostGuid;
00153         TeamId currentTeam;
00154         TeamId requestedTeam;
00155         DefaultAssigmentAlgorithm defaultAssigmentAlgorithm;
00156         bool forceTeamsToBeEven;
00157         bool lockTeams;
00158         bool expectingToReceiveTeamNumber; // So if we lose the connection while processing, we request the same info of the new host
00159         bool allowHostMigration;
00160 
00161         DataStructures::List<unsigned short> teamLimits;
00162         DataStructures::List<unsigned short> teamMemberCounts;
00163         DataStructures::List<TeamMember> teamMembers;
00164         unsigned int GetMemberIndex(RakNetGUID guid);
00165         unsigned int AddTeamMember(const TeamMember &tm); // Returns index of new member
00166         void RemoveTeamMember(unsigned int index);
00167         void EvenTeams(void);
00168         unsigned int GetMemberIndexToSwitchTeams(const DataStructures::List<TeamId> &sourceTeamNumbers, TeamId targetTeamNumber);
00169         void GetOverpopulatedTeams(DataStructures::List<TeamId> &overpopulatedTeams, int maxTeamSize);
00170         void SwitchMemberTeam(unsigned int teamMemberIndex, TeamId destinationTeam);
00171         void NotifyTeamAssigment(unsigned int teamMemberIndex);
00172         bool WeAreHost(void) const;
00173         PluginReceiveResult OnTeamAssigned(Packet *packet);
00174         PluginReceiveResult OnRequestedTeamChangePending(Packet *packet);
00175         PluginReceiveResult OnTeamsLocked(Packet *packet);
00176         void GetMinMaxTeamMembers(int &minMembersOnASingleTeam, int &maxMembersOnASingleTeam);
00177         TeamId GetNextDefaultTeam(void); // Accounting for team balancing and team limits, get the team a player should be placed on
00178         bool TeamWouldBeOverpopulatedOnAddition(TeamId teamId, unsigned int teamMemberSize); // Accounting for team balancing and team limits, would this team be overpopulated if a member was added to it?
00179         bool TeamWouldBeUnderpopulatedOnLeave(TeamId teamId, unsigned int teamMemberSize);
00180         TeamId GetSmallestNonFullTeam(void) const;
00181         TeamId GetFirstNonFullTeam(void) const;
00182         void MoveMemberThatWantsToJoinTeam(TeamId teamId);
00183         TeamId MoveMemberThatWantsToJoinTeamInternal(TeamId teamId);
00184         void NotifyTeamsLocked(RakNetGUID target, TeamId requestedTeam);
00185         void NotifyTeamSwitchPending(RakNetGUID target, TeamId requestedTeam);
00186         void NotifyNoTeam(RakNetGUID target);
00187         void SwapTeamMembersByRequest(unsigned int memberIndex1, unsigned int memberIndex2);
00188         void RemoveByGuid(RakNetGUID rakNetGUID);
00189         bool TeamsWouldBeEvenOnSwitch(TeamId t1, TeamId t2);
00190 
00191 };
00192 
00193 } // namespace RakNet
00194 
00195 #endif
00196 
00197 #endif // _RAKNET_SUPPORT_*

Generated on Thu Sep 30 2010 01:27:28 for RakNet by  doxygen 1.7.1