17 #if _RAKNET_SUPPORT_TeamManager==1
24 using namespace SLNet;
27 enum TeamManagerOperations
29 ID_RUN_UpdateListsToNoTeam,
30 ID_RUN_UpdateTeamsRequestedToAny,
32 ID_RUN_JoinRequestedTeam,
33 ID_RUN_UpdateTeamsRequestedToNoneAndAddTeam,
34 ID_RUN_RemoveFromTeamsRequestedAndAddTeam,
35 ID_RUN_AddToRequestedTeams,
37 ID_RUN_SetMemberLimit,
38 ID_RUN_SetJoinPermissions,
39 ID_RUN_SetBalanceTeams,
40 ID_RUN_SetBalanceTeamsInitial,
41 ID_RUN_SerializeWorld,
271 if (i==(
unsigned int)-1)
286 return (
unsigned int) -1;
308 if (specificTeamToCancel)
458 constructionBitstream->
Write(
true);
463 constructionBitstream->
Write(
false);
467 constructionBitstream->
Write(
true);
472 constructionBitstream->
Write(
false);
488 constructionBitstream->
Read(worldId);
494 success=constructionBitstream->
Read(teamsRequestedSize);
495 for (
unsigned int i=0; i < teamsRequestedSize; i++)
498 rt.isTeamSwitch=
false;
501 constructionBitstream->
Read(rt.isTeamSwitch);
502 bool hasTeamToLeave=
false;
503 constructionBitstream->
Read(hasTeamToLeave);
507 constructionBitstream->
Read(teamToLeaveId);
513 bool hasTeamRequested=
false;
514 success=constructionBitstream->
Read(hasTeamRequested);
516 if (hasTeamRequested)
518 success=constructionBitstream->
Read(teamRequestedId);
525 (hasTeamToLeave==
false || (hasTeamToLeave==
true && rt.teamToLeave!=0)) &&
526 (hasTeamRequested==
false || (hasTeamRequested==
true && rt.requested!=0))
571 return g & 0xFFFFFFFF;
579 for (
unsigned int i=0; i <
teams.
Size(); i++)
581 teams[i]->RemoveFromTeamMemberList(
this);
641 if (teamToLeave!=0 &&
IsOnTeam(teamToLeave)==
false)
644 if (teamToJoin==teamToLeave)
704 rt.isTeamSwitch=
false;
705 rt.requested=teamToJoin;
719 rt.isTeamSwitch=
true;
720 rt.requested=teamToJoin;
721 rt.teamToLeave=teamToLeave;
859 bsOut.
Write(noTeamId);
877 return limitWithBalancing;
904 bsOut.
Write(_joinPermissions);
923 teamMember->
LeaveTeam(
this, noTeamSubcategory);
974 constructionBitstream->
Write(
ID);
986 constructionBitstream->
Read(worldId);
989 constructionBitstream->
Read(
ID);
1006 return g & 0xFFFFFFFF;
1049 unsigned int j =
teamMembers[i]->GetRequestedTeamIndex(team);
1050 if (j!=(
unsigned int)-1)
1052 if (
teamMembers[i]->teamsRequested[j].isTeamSwitch &&
1053 (
teamMembers[i]->teamsRequested[j].teamToLeave==0 ||
1060 return (
unsigned int) -1;
1118 if (i!=(
unsigned int)-1)
1197 return teams[index];
1220 return (
unsigned int) -1;
1234 teamMember->
world=
this;
1300 return (
unsigned int) -1;
1317 bsOut.
Write(balanceTeams);
1318 bsOut.
Write(noTeamId);
1364 for (
unsigned int i=0; i <
teams.
Size(); i++)
1381 (void) lostConnectionReason;
1382 (void) systemAddress;
1392 (void) systemAddress;
1426 unsigned int i, teamIndex;
1436 if (teamIndex == (
unsigned int)-1)
1444 teamToJoin =
teams[teamIndex];
1479 unsigned int teamIndex, indexIntoTeamsRequested = (
unsigned int)-1;
1484 unsigned int joinRequestIndex;
1486 for (joinRequestIndex=0; joinRequestIndex < joinRequests.
Size(); joinRequestIndex++)
1488 teamMember =
teamMembers[joinRequests[joinRequestIndex].teamMemberIndex];
1494 teamIndex=(
unsigned int)-1;
1498 indexIntoTeamsRequested = joinRequests[joinRequestIndex].indexIntoTeamsRequested;
1500 team = teamMember->
teamsRequested[indexIntoTeamsRequested].requested;
1509 teamIndex=(
unsigned int)-1;
1513 if (teamIndex != (
unsigned int)-1)
1515 team =
teams[teamIndex];
1540 bool isSwitch = teamMember->
teamsRequested[indexIntoTeamsRequested].isTeamSwitch;
1544 teamToLeave=teamMember->
teamsRequested[indexIntoTeamsRequested].teamToLeave;
1547 if (teamMember->
IsOnTeam(teamToLeave))
1559 teamsWeAreLeaving=teamMember->
teams;
1565 int teamJoined =
JoinSpecificTeam(teamMember, team, isSwitch, teamToLeave, teamsWeAreLeaving);
1575 bsOut.
Write(isSwitch);
1594 unsigned int teamIndex;
1596 unsigned int lowestTeamMembers = (
unsigned int) -1;
1597 unsigned int lowestIndex = (
unsigned int) -1;
1599 for (teamIndex=0; teamIndex <
teams.
Size(); teamIndex++)
1601 if (
teams[teamIndex]->GetTeamMembersCount() < secondaryLimit &&
1602 teams[teamIndex]->GetTeamMembersCount() <
teams[teamIndex]->GetMemberLimitSetting() &&
1603 teams[teamIndex]->GetTeamMembersCount() < lowestTeamMembers &&
1604 (joinPermissions &
teams[teamIndex]->GetJoinPermissions())!=0)
1606 lowestTeamMembers =
teams[teamIndex]->GetTeamMembersCount();
1607 lowestIndex = teamIndex;
1681 if (idx == (
unsigned int ) -1)
1686 if ((
teams[idx]->GetTeamMembersCount() >= balancedLimit ||
1687 teams[idx]->GetTeamMembersCount() >=
teams[idx]->GetMemberLimitSetting()) &&
1688 teams[idx]->GetMemberLimitSetting() != 0 &&
1710 return lowestMemberTeam;
1740 if (teamsWeAreLeaving.
Size()==1)
1743 if (j!=(
unsigned int)-1)
1784 bool additionalTeamsExcluded;
1792 additionalTeamsExcluded=
false;
1793 balancedLimit = (
TeamMemberLimit) ((membersCount+(teamsCount-1))/(teamsCount));
1795 while (i < consideredTeams.
Size())
1797 if (consideredTeams[i]->GetMemberLimitSetting() < balancedLimit)
1799 additionalTeamsExcluded=
true;
1800 membersCount-=consideredTeams[i]->GetMemberLimitSetting();
1810 }
while (additionalTeamsExcluded==
true && teamsCount>0);
1812 return balancedLimit;
1822 for (
unsigned int i=0; i < 255; i++)
1896 worldsList[i]->SetAutoManageConnections(autoAdd);
1923 DecomposeTeamFullOrLocked(&bsIn, world, teamMember, team, currentMembers, memberLimitIncludingBalancing, balancingIsActive, joinPermissions);
1960 bsIn->
Read(worldId);
1961 bsIn->
Read(teamMemberId);
1963 bsIn->
Read(currentMembers);
1964 bsIn->
Read(memberLimitIncludingBalancing);
1965 bsIn->
Read(balancingIsActive);
1966 bsIn->
Read(joinPermissions);
1971 *teamMember = (*world)->GetTeamMemberByNetworkID(teamMemberId);
1972 *team = (*world)->GetTeamByNetworkID(teamId);
1984 DecomposeTeamFullOrLocked(&bsIn, world, teamMember, team, currentMembers, memberLimitIncludingBalancing, balancingIsActive, joinPermissions);
1994 for (
unsigned int i=0; i < teamMember->
teams.
Size(); i++)
1996 bitStream->
Write(teamMember->
teams[i]->GetNetworkID());
2013 DecodeTeamAssigned(bsIn, &world, &teamMember, noTeamId, joinTeamType, newTeam, teamsLeft, teamsJoined);
2017 for (
unsigned int i=0; i < teamsLeft.
Size(); i++)
2021 for (
unsigned int i=0; i < teamsJoined.
Size(); i++)
2023 if (teamMember->
IsOnTeam(teamsJoined[i])==
false)
2044 bsIn.
Read(teamMemberId);
2048 *teamMember = (*world)->GetTeamMemberByNetworkID(teamMemberId);
2066 bsIn.
Read(teamMemberId);
2071 *teamMember = (*world)->GetTeamMemberByNetworkID(teamMemberId);
2083 *teamCancelled = (*world)->GetTeamByNetworkID(nid);
2106 bsIn->
Read(worldId);
2107 bsIn->
Read(teamMemberId);
2111 *teamMember = (*world)->GetTeamMemberByNetworkID(teamMemberId);
2113 bsIn->
Read(teamsCount);
2115 for (
unsigned int i=0; i < teamsCount; i++)
2118 TM_Team * team = (*world)->GetTeamByNetworkID(teamId);
2127 for (
unsigned int i=0; i < (*teamMember)->teams.Size(); i++)
2129 TM_Team *team = (*teamMember)->teams[i];
2130 if (newTeam.
GetIndexOf(team)==(
unsigned int)-1)
2135 for (
unsigned int i=0; i < newTeam.
Size(); i++)
2138 if ((*teamMember)->teams.GetIndexOf(team)==(
unsigned int)-1)
2142 bsIn->
Read(noTeamId);
2143 bsIn->
Read(joinTeamType);
2158 worldsList[i]->
Clear();
2174 switch (packet->
data[0])
2179 for (i=0; i < worldsList.Size(); i++)
2180 worldsList[i]->SetHost(packet->
guid);
2201 if (validPacket==
false)
2217 switch (packet->
data[1])
2219 case ID_RUN_UpdateListsToNoTeam:
2222 case ID_RUN_UpdateTeamsRequestedToAny:
2225 case ID_RUN_JoinAnyTeam:
2228 case ID_RUN_JoinRequestedTeam:
2231 case ID_RUN_UpdateTeamsRequestedToNoneAndAddTeam:
2234 case ID_RUN_RemoveFromTeamsRequestedAndAddTeam:
2237 case ID_RUN_AddToRequestedTeams:
2240 case ID_RUN_LeaveTeam:
2243 case ID_RUN_SetMemberLimit:
2246 case ID_RUN_SetJoinPermissions:
2249 case ID_RUN_SetBalanceTeams:
2252 case ID_RUN_SetBalanceTeamsInitial:
2268 for (
unsigned int i=0; i < worldsList.Size(); i++)
2270 worldsList[i]->OnClosedConnection(systemAddress, rakNetGUID, lostConnectionReason);
2278 for (
unsigned int i=0; i < worldsList.Size(); i++)
2280 worldsList[i]->OnNewConnection(systemAddress, rakNetGUID, isIncoming);
2345 bsIn.
Read(networkId);
2348 bsIn.
Read(noTeamId);
2376 bsIn.
Read(networkId);
2391 bsIn.
Read(networkId);
2411 bsOut.
Write(networkId);
2431 bsOut.
Write(networkId);
2439 else if (resultCode==-1)
2458 bsIn.
Read(networkId);
2461 bsIn.
Read(teamToJoinNetworkId);
2463 bool isTeamSwitch=
false;
2464 bool switchSpecificTeam=
false;
2467 bsIn.
Read(isTeamSwitch);
2470 bsIn.
Read(switchSpecificTeam);
2471 if (switchSpecificTeam)
2473 bsIn.
Read(teamToLeaveNetworkId);
2479 if (teamToJoin && teamMember)
2501 teamsWeAreLeaving=teamMember->
teams;
2505 if (teamMember->
IsOnTeam(teamToLeave))
2509 if (teamsWeAreLeaving.
Size()==0)
2513 int resultCode = world->
JoinSpecificTeam(teamMember, teamToJoin, isTeamSwitch, teamToLeave, teamsWeAreLeaving);
2523 bsOut.
Write(networkId);
2525 bsOut.
Write(isTeamSwitch);
2528 bsOut.
Write(switchSpecificTeam);
2529 if (switchSpecificTeam)
2530 bsOut.
Write(teamToLeaveNetworkId);
2550 bsOut.
Write(networkId);
2552 bsOut.
Write(isTeamSwitch);
2555 bsOut.
Write(switchSpecificTeam);
2556 if (switchSpecificTeam)
2557 bsOut.
Write(teamToLeaveNetworkId);
2566 else if (resultCode==-1)
2586 bsIn.
Read(networkId);
2589 bsIn.
Read(teamNetworkId);
2592 if (team && teamMember)
2608 bsIn.
Read(networkId);
2611 bsIn.
Read(teamNetworkId);
2612 bool isTeamSwitch=
false, switchSpecificTeam=
false;
2615 bsIn.
Read(isTeamSwitch);
2618 bsIn.
Read(switchSpecificTeam);
2619 if (switchSpecificTeam)
2621 bsIn.
Read(teamToLeaveNetworkId);
2627 if (team && teamMember)
2632 else if (isTeamSwitch==
true && switchSpecificTeam==
false)
2645 bsIn.
Read(networkId);
2648 bsIn.
Read(teamNetworkId);
2651 bool isTeamSwitch=
false;
2652 bool switchSpecificTeam=
false;
2655 bsIn.
Read(isTeamSwitch);
2658 bsIn.
Read(switchSpecificTeam);
2659 if (switchSpecificTeam)
2661 bsIn.
Read(teamToLeaveNetworkId);
2668 if (team && teamMember)
2684 bsIn.
Read(networkId);
2686 bool hasSpecificTeam=
false;
2689 bsIn.
Read(hasSpecificTeam);
2690 if (hasSpecificTeam)
2692 bsIn.
Read(teamNetworkId);
2726 bsIn.
Read(networkId);
2729 bsIn.
Read(teamNetworkId);
2732 bsIn.
Read(noTeamId);
2734 if (team && teamMember)
2768 bsIn.
Read(teamNetworkId);
2771 bsIn.
Read(teamMemberLimit);
2772 bsIn.
Read(noTeamId);
2798 bsIn.
Read(teamNetworkId);
2800 bsIn.
Read(joinPermissions);
2824 bool balanceTeams=
false;
2825 bsIn.
Read(balanceTeams);
2827 bsIn.
Read(noTeamId);
2850 bool balanceTeams=
false;
2851 bsIn.
Read(balanceTeams);
2857 #endif // _RAKNET_SUPPORT_TeamManager==1