// get the number of free slots for team // returns the number how many players can join battleground to MaxPlayersPerTeam uint32 BattleGround::GetFreeSlotsForTeam(Team team) const { // return free slot count to MaxPlayerPerTeam if (GetStatus() == STATUS_WAIT_JOIN || GetStatus() == STATUS_IN_PROGRESS) return (GetInvitedCount(team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(team) : 0; return 0; }
// get the number of free slots for team // works in similar way that HasFreeSlotsForTeam did, but this is needed for join as group uint32 BattleGround::GetFreeSlotsForTeam(uint32 Team) const { //if BG is starting ... invite anyone if (GetStatus() == STATUS_WAIT_JOIN) return (GetInvitedCount(Team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(Team) : 0; //if BG is already started .. do not allow to join too much players of one faction uint32 otherTeam; uint32 otherIn; if (Team == ALLIANCE) { otherTeam = GetInvitedCount(HORDE); otherIn = GetPlayersCountByTeam(HORDE); } else { otherTeam = GetInvitedCount(ALLIANCE); otherIn = GetPlayersCountByTeam(ALLIANCE); } if (GetStatus() == STATUS_IN_PROGRESS) { // difference based on ppl invited (not necessarily entered battle) // default: allow 0 uint32 diff = 0; // allow join one person if the sides are equal (to fill up bg to minplayersperteam) if (otherTeam == GetInvitedCount(Team)) diff = 1; // allow join more ppl if the other side has more players else if(otherTeam > GetInvitedCount(Team)) diff = otherTeam - GetInvitedCount(Team); // difference based on max players per team (don't allow inviting more) uint32 diff2 = (GetInvitedCount(Team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(Team) : 0; // difference based on players who already entered // default: allow 0 uint32 diff3 = 0; // allow join one person if the sides are equal (to fill up bg minplayersperteam) if (otherIn == GetPlayersCountByTeam(Team)) diff3 = 1; // allow join more ppl if the other side has more players else if (otherIn > GetPlayersCountByTeam(Team)) diff3 = otherIn - GetPlayersCountByTeam(Team); // or other side has less than minPlayersPerTeam else if (GetInvitedCount(Team) <= GetMinPlayersPerTeam()) diff3 = GetMinPlayersPerTeam() - GetInvitedCount(Team) + 1; // return the minimum of the 3 differences // min of diff and diff 2 diff = diff < diff2 ? diff : diff2; // min of diff, diff2 and diff3 return diff < diff3 ? diff : diff3 ; } return 0; }
/* this method should decide, if we can invite new player of certain team to BG, it is based on BATTLEGROUND_STATUS */ bool BattleGround::HasFreeSlotsForTeam(uint32 Team) const { //if BG is starting ... invite anyone: if (GetStatus() == STATUS_WAIT_JOIN) return GetInvitedCount(Team) < GetMaxPlayersPerTeam(); //if BG is already started .. do not allow to join too much players of one faction uint32 otherTeam; if (Team == ALLIANCE) otherTeam = GetInvitedCount(HORDE); else otherTeam = GetInvitedCount(ALLIANCE); if (GetStatus() == STATUS_IN_PROGRESS) return (GetInvitedCount(Team) <= otherTeam && GetInvitedCount(Team) < GetMaxPlayersPerTeam()); return false; }
EPartyReservationResult::Type APartyBeaconHost::UpdatePartyReservation(const FPartyReservation& ReservationUpdateRequest) { EPartyReservationResult::Type Result = EPartyReservationResult::GeneralError; if (!State || GetBeaconState() == EBeaconState::DenyRequests) { return EPartyReservationResult::ReservationDenied; } if (ReservationUpdateRequest.IsValid()) { if (!State->IsBeaconFull()) { const int32 ExistingReservationIdx = State->GetExistingReservation(ReservationUpdateRequest.PartyLeader); if (ExistingReservationIdx != INDEX_NONE) { // Count the number of available slots for the existing reservation's team TArray<FPartyReservation>& Reservations = State->GetReservations(); FPartyReservation& ExistingReservation = Reservations[ExistingReservationIdx]; const int32 NumTeamMembers = GetNumPlayersOnTeam(ExistingReservation.TeamNum); const int32 NumAvailableSlotsOnTeam = FMath::Max<int32>(0, GetMaxPlayersPerTeam() - NumTeamMembers); // Read the list of new players and remove the ones that have existing reservation entries TArray<FPlayerReservation> NewPlayers; for (int32 PlayerIdx = 0; PlayerIdx < ReservationUpdateRequest.PartyMembers.Num(); PlayerIdx++) { const FPlayerReservation& NewPlayerRes = ReservationUpdateRequest.PartyMembers[PlayerIdx]; FPlayerReservation* PlayerRes = ExistingReservation.PartyMembers.FindByPredicate( [NewPlayerRes](const FPlayerReservation& ExistingPlayerRes) { return NewPlayerRes.UniqueId == ExistingPlayerRes.UniqueId; }); if (!PlayerRes) { // player reservation doesn't exist so add it as a new player NewPlayers.Add(NewPlayerRes); } else { // duplicate entry for this player UE_LOG(LogBeacon, Log, TEXT("Skipping player %s"), *NewPlayerRes.UniqueId.ToString()); } } // Validate that adding the new party members to this reservation entry still fits within the team size if (NewPlayers.Num() <= NumAvailableSlotsOnTeam) { if (NewPlayers.Num() > 0) { // Copy new player entries into existing reservation for (int32 PlayerIdx = 0; PlayerIdx < NewPlayers.Num(); PlayerIdx++) { const FPlayerReservation& PlayerRes = NewPlayers[PlayerIdx]; ExistingReservation.PartyMembers.Add(PlayerRes); // Keep track of newly added players NewPlayerAdded(PlayerRes); } // Update the reservation count before sending the response State->NumConsumedReservations += NewPlayers.Num(); // Tell any UI and/or clients that there has been a change in the reservation state SendReservationUpdates(); // Tell the owner that we've received a reservation so the UI can be updated NotifyReservationEventNextFrame(ReservationChanged); if (State->IsBeaconFull()) { // If we've hit our limit, fire the delegate so the host can do the // next step in getting parties together NotifyReservationEventNextFrame(ReservationsFull); } Result = EPartyReservationResult::ReservationAccepted; } else { // Duplicate entries (or zero) so existing reservation not updated Result = EPartyReservationResult::ReservationDuplicate; } } else { // Send an invalid party size response Result = EPartyReservationResult::IncorrectPlayerCount; } } else { // Send a not found reservation response Result = EPartyReservationResult::ReservationNotFound; } } else { // Send a session full response Result = EPartyReservationResult::PartyLimitReached; } } else { // Invalid reservation Result = EPartyReservationResult::ReservationInvalid; } return Result; }