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;
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);
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);
00178 bool TeamWouldBeOverpopulatedOnAddition(TeamId teamId, unsigned int teamMemberSize);
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 }
00194
00195 #endif
00196
00197 #endif // _RAKNET_SUPPORT_*