17 #if _RAKNET_SUPPORT_TeamBalancer==1 
   25 using namespace SLNet;
 
   27 enum TeamBalancerOperations
 
   29     ID_STATUS_UPDATE_TO_NEW_HOST,
 
   30     ID_CANCEL_TEAM_REQUEST,
 
   32     ID_REQUEST_SPECIFIC_TEAM
 
  129     bool foundMatch=
false;
 
  146     if (foundMatch==
false)
 
  150         mtm.memberId=memberId;
 
  151         mtm.requestedTeam=desiredTeam;
 
  160     bsOut.
Write(memberId);
 
  161     bsOut.
Write(desiredTeam);
 
  176             bsOut.
Write(memberId);
 
  185     bool foundMatch=
false;
 
  200     if (foundMatch==
false)
 
  204         mtm.memberId=memberId;
 
  213     bsOut.
Write(memberId);
 
  251     switch (packet->
data[0])
 
  274         case ID_TEAM_BALANCER_INTERNAL:
 
  278                 switch (packet->
data[1])
 
  280                     case ID_STATUS_UPDATE_TO_NEW_HOST:
 
  283                     case ID_CANCEL_TEAM_REQUEST:
 
  286                     case ID_REQUEST_ANY_TEAM:
 
  289                     case ID_REQUEST_SPECIFIC_TEAM:
 
  329     (void) systemAddress;
 
  330     (void) lostConnectionReason;
 
  343         unsigned int droppedMemberIndex=0;
 
  346             if (
teamMembers[droppedMemberIndex].memberGuid==rakNetGUID)
 
  369                 droppedMemberIndex++;
 
  381     uint8_t requestedTeamChangeListSize;
 
  382     bsIn.Read(requestedTeamChangeListSize);
 
  384     tm.memberGuid=packet->
guid;
 
  385     for (
uint8_t i=0; i < requestedTeamChangeListSize; i++)
 
  387         bsIn.Read(tm.memberId);
 
  388         bsIn.Read(tm.currentTeam);
 
  389         bsIn.Read(tm.requestedTeam);
 
  393             RakAssert(
"Current team out of range in TeamBalancer::OnStatusUpdateToNewHost" && 0);
 
  399             RakAssert(
"Requested team out of range in TeamBalancer::OnStatusUpdateToNewHost" && 0);
 
  407         if (memberIndex==(
unsigned int) -1)
 
  425                         tm.currentTeam=tm.requestedTeam;
 
  436                 RakAssert(
"Too many members asking for teams!" && 0);
 
  454     if (memberIndex!=(
unsigned int)-1)
 
  468     if (memberIndex==(
unsigned int)-1)
 
  473         tm.memberGuid=packet->
guid;
 
  474         tm.memberId=memberId;
 
  477             RakAssert(
"Too many members asking for teams!" && 0);
 
  491     bsIn.Read(tm.memberId);
 
  492     bsIn.Read(tm.requestedTeam);
 
  498         if (memberIndex != (
unsigned int) -1)
 
  505         RakAssert(
"Requested team out of range in TeamBalancer::OnRequestSpecificTeam" && 0);
 
  508     if (memberIndex==(
unsigned int) -1)
 
  510         tm.memberGuid=packet->
guid;
 
  515             tm.currentTeam=tm.requestedTeam;
 
  524             RakAssert(
"Too many members asking for teams!" && 0);
 
  531         teamMembers[memberIndex].requestedTeam=tm.requestedTeam;
 
  549             unsigned int swappableMemberIndex;
 
  550             for (swappableMemberIndex=0; swappableMemberIndex < 
teamMembers.
Size(); swappableMemberIndex++)
 
  552                 if (
teamMembers[swappableMemberIndex].currentTeam==tm.requestedTeam && 
teamMembers[swappableMemberIndex].requestedTeam==oldTeamThisUserWasOn)
 
  577     return (
unsigned int) -1;
 
  583         RakAssert(
"TeamBalancer::AddTeamMember team index out of bounds" && 0);
 
  584         return (
unsigned int) -1;
 
  606         maxMembersOnASingleTeam = minMembersOnASingleTeam;
 
  608         maxMembersOnASingleTeam = minMembersOnASingleTeam+1;
 
  613     int minMembersOnASingleTeam;
 
  614     int maxMembersOnASingleTeam;
 
  620     TeamId teamMemberCountsIndex;
 
  621     unsigned int memberIndexToSwitch;
 
  622     for (teamMemberCountsIndex=0; teamMemberCountsIndex<
teamMemberCounts.
Size(); teamMemberCountsIndex++)
 
  629             RakAssert(memberIndexToSwitch!=(
unsigned int)-1);
 
  641     for (j=0; j < sourceTeamNumbers.
Size(); j++)
 
  643         RakAssert(sourceTeamNumbers[j]!=targetTeamNumber);
 
  644         for (i=0; i < teamMembers.Size(); i++)
 
  646             if (teamMembers[i].currentTeam==sourceTeamNumbers[j])
 
  648                 if (teamMembers[i].requestedTeam==targetTeamNumber)
 
  656     if (preferredSwapIndices.
Size()>0)
 
  658         return preferredSwapIndices[ 
randomMT() % preferredSwapIndices.
Size() ];
 
  660     else if (potentialSwapIndices.
Size()>0)
 
  662         return potentialSwapIndices[ 
randomMT() % potentialSwapIndices.
Size() ];
 
  666         return (
unsigned int) -1;
 
  673     teamMembers[teamMemberIndex].currentTeam=destinationTeam;
 
  674     if (teamMembers[teamMemberIndex].requestedTeam==destinationTeam)
 
  688     RakAssert(teamMemberIndex < teamMembers.Size());
 
  689     if (teamMemberIndex>=teamMembers.Size())
 
  694     bsOut.
Write(teamMembers[teamMemberIndex].currentTeam);
 
  695     bsOut.
Write(teamMembers[teamMemberIndex].memberId);
 
  711     bsIn.Read(mtm.currentTeam);
 
  712     bsIn.Read(mtm.memberId);
 
  715     bool foundMatch=
false;
 
  728     if (foundMatch==
false)
 
  766             RakAssert(
"TeamBalancer::GetNextDefaultTeam unknown algorithm enumeration" && 0);
 
  791         unsigned int minMembersOnASingleTeam = (teamMemberSize-1)/
teamLimits.
Size();
 
  806             smallestTeamIndex=idx;
 
  809     return smallestTeamIndex;
 
  835     for (
TeamId i=0; i < teamMembers.Size(); i++)
 
  837         if (teamMembers[i].requestedTeam==teamId)
 
  841     if (membersThatWantToJoinTheTeam.
Size()>0)
 
  844         unsigned int swappedMemberIndex = membersThatWantToJoinTheTeam[ 
randomMT() % membersThatWantToJoinTheTeam.
Size() ];
 
  845         oldTeam=teamMembers[swappedMemberIndex].currentTeam;
 
  856     bsOut.
Write(requestedTeam);
 
  863     bsOut.
Write(requestedTeam);
 
  864     bsOut.
Write(memberId);
 
  869     TeamId index1Team = teamMembers[memberIndex1].currentTeam;
 
  870     teamMembers[memberIndex1].currentTeam=teamMembers[memberIndex2].currentTeam;
 
  871     teamMembers[memberIndex2].currentTeam=index1Team;
 
  880     bsOut.
Write(memberId);
 
  890 #endif // _RAKNET_SUPPORT_*