bool UPartyBeaconState::AddReservation(const FPartyReservation& ReservationRequest) { int32 TeamAssignment = GetTeamAssignment(ReservationRequest); if (TeamAssignment != INDEX_NONE) { int32 IncomingPartySize = ReservationRequest.PartyMembers.Num(); NumConsumedReservations += IncomingPartySize; int32 ResIdx = Reservations.Add(ReservationRequest); Reservations[ResIdx].TeamNum = TeamAssignment; } return TeamAssignment != INDEX_NONE; }
bool UPartyBeaconState::AddReservation(const FPartyReservation& ReservationRequest) { int32 TeamAssignment = GetTeamAssignment(ReservationRequest); if (TeamAssignment != INDEX_NONE) { int32 IncomingPartySize = ReservationRequest.PartyMembers.Num(); NumConsumedReservations += IncomingPartySize; int32 ResIdx = Reservations.Add(ReservationRequest); Reservations[ResIdx].TeamNum = TeamAssignment; // Possibly shuffle existing teams so that beacon can accommodate biggest open slots BestFitTeamAssignmentJiggle(); } return TeamAssignment != INDEX_NONE; }
void UPartyBeaconState::BestFitTeamAssignmentJiggle() { if (TeamAssignmentMethod == ETeamAssignmentMethod::BestFit && NumTeams > 1) { TArray<FPartyReservation*> ReservationsToJiggle; ReservationsToJiggle.Reserve(Reservations.Num()); for (FPartyReservation& Reservation : Reservations) { // Only want to rejiggle reservations with existing team assignments (new reservations will still stay at -1) if (Reservation.TeamNum != -1) { // Remove existing team assignments so new assignments can be given Reservation.TeamNum = -1; // Add to list of reservations that need new assignments ReservationsToJiggle.Add(&Reservation); } } // Sort so that largest party reservations come first ReservationsToJiggle.Sort([](const FPartyReservation& A, const FPartyReservation& B) { return B.PartyMembers.Num() < A.PartyMembers.Num(); } ); // Re-add these reservations with best fit team assignments for (FPartyReservation* Reservation : ReservationsToJiggle) { Reservation->TeamNum = GetTeamAssignment(*Reservation); if (Reservation->TeamNum == -1) { UE_LOG(LogBeacon, Warning, TEXT("UPartyBeaconHost::BestFitTeamAssignmentJiggle: could not reassign to a team!")); } } } }