![]() |
Shadowrun: Awakened 29 September 2011 - Build 871
|
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 #include "PluginInterface2.h" 00016 #include "RakMemoryOverride.h" 00017 #include "NativeTypes.h" 00018 #include "DS_List.h" 00019 #include "RakString.h" 00020 00021 namespace RakNet 00022 { 00024 class RakPeerInterface; 00025 00030 00033 typedef unsigned char TeamId; 00034 00035 #define UNASSIGNED_TEAM_ID 255 00036 00041 class RAK_DLL_EXPORT TeamBalancer : public PluginInterface2 00042 { 00043 public: 00044 // GetInstance() and DestroyInstance(instance*) 00045 STATIC_FACTORY_DECLARATIONS(TeamBalancer) 00046 00047 TeamBalancer(); 00048 virtual ~TeamBalancer(); 00049 00056 void SetHostGuid(RakNetGUID _hostGuid); 00057 00063 void SetTeamSizeLimits(const DataStructures::List<unsigned short> &_teamLimits); 00064 00071 void SetTeamSizeLimits(unsigned short *values, int valuesLength); 00072 00073 enum DefaultAssigmentAlgorithm 00074 { 00076 SMALLEST_TEAM, 00078 FILL_IN_ORDER 00079 }; 00085 void SetDefaultAssignmentAlgorithm(DefaultAssigmentAlgorithm daa); 00086 00094 void SetForceEvenTeams(bool force); 00095 00101 void SetLockTeams(bool lock); 00102 00111 bool RequestSpecificTeam(TeamId desiredTeam); 00112 00116 void CancelRequestSpecificTeam(void); 00117 00121 void RequestAnyTeam(void); 00122 00128 TeamId GetMyTeam(void) const; 00129 00135 void SetAllowHostMigration(bool allow); 00136 00137 struct TeamMember 00138 { 00139 RakNetGUID memberGuid; 00140 TeamId currentTeam; 00141 TeamId requestedTeam; 00142 }; 00143 00144 protected: 00145 00147 virtual PluginReceiveResult OnReceive(Packet *packet); 00149 virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); 00150 00151 void OnStatusUpdateToNewHost(Packet *packet); 00152 void OnCancelTeamRequest(Packet *packet); 00153 void OnRequestAnyTeam(Packet *packet); 00154 void OnRequestSpecificTeam(Packet *packet); 00155 00156 RakNetGUID hostGuid; 00157 TeamId currentTeam; 00158 TeamId requestedTeam; 00159 DefaultAssigmentAlgorithm defaultAssigmentAlgorithm; 00160 bool forceTeamsToBeEven; 00161 bool lockTeams; 00162 bool expectingToReceiveTeamNumber; // So if we lose the connection while processing, we request the same info of the new host 00163 bool allowHostMigration; 00164 00165 DataStructures::List<unsigned short> teamLimits; 00166 DataStructures::List<unsigned short> teamMemberCounts; 00167 DataStructures::List<TeamMember> teamMembers; 00168 unsigned int GetMemberIndex(RakNetGUID guid); 00169 unsigned int AddTeamMember(const TeamMember &tm); // Returns index of new member 00170 void RemoveTeamMember(unsigned int index); 00171 void EvenTeams(void); 00172 unsigned int GetMemberIndexToSwitchTeams(const DataStructures::List<TeamId> &sourceTeamNumbers, TeamId targetTeamNumber); 00173 void GetOverpopulatedTeams(DataStructures::List<TeamId> &overpopulatedTeams, int maxTeamSize); 00174 void SwitchMemberTeam(unsigned int teamMemberIndex, TeamId destinationTeam); 00175 void NotifyTeamAssigment(unsigned int teamMemberIndex); 00176 bool WeAreHost(void) const; 00177 PluginReceiveResult OnTeamAssigned(Packet *packet); 00178 PluginReceiveResult OnRequestedTeamChangePending(Packet *packet); 00179 PluginReceiveResult OnTeamsLocked(Packet *packet); 00180 void GetMinMaxTeamMembers(int &minMembersOnASingleTeam, int &maxMembersOnASingleTeam); 00181 TeamId GetNextDefaultTeam(void); // Accounting for team balancing and team limits, get the team a player should be placed on 00182 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? 00183 bool TeamWouldBeUnderpopulatedOnLeave(TeamId teamId, unsigned int teamMemberSize); 00184 TeamId GetSmallestNonFullTeam(void) const; 00185 TeamId GetFirstNonFullTeam(void) const; 00186 void MoveMemberThatWantsToJoinTeam(TeamId teamId); 00187 TeamId MoveMemberThatWantsToJoinTeamInternal(TeamId teamId); 00188 void NotifyTeamsLocked(RakNetGUID target, TeamId requestedTeam); 00189 void NotifyTeamSwitchPending(RakNetGUID target, TeamId requestedTeam); 00190 void NotifyNoTeam(RakNetGUID target); 00191 void SwapTeamMembersByRequest(unsigned int memberIndex1, unsigned int memberIndex2); 00192 void RemoveByGuid(RakNetGUID rakNetGUID); 00193 bool TeamsWouldBeEvenOnSwitch(TeamId t1, TeamId t2); 00194 00195 }; 00196 00197 } // namespace RakNet 00198 00199 #endif 00200 00201 #endif // _RAKNET_SUPPORT_*
Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.