Shadowrun: Awakened 29 September 2011 - Build 871
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 #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.

GNU Lesser General Public License 3 Sourceforge.net