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_*