Spawn players during warmup but disable their input until match starts
This commit is contained in:
parent
10a672dc8f
commit
a21e7e71c9
BIN
GravityStomp/Content/Core/BP_GSDefaultGameMode.uasset
(Stored with Git LFS)
BIN
GravityStomp/Content/Core/BP_GSDefaultGameMode.uasset
(Stored with Git LFS)
Binary file not shown.
@ -90,7 +90,7 @@ void AGSGameModeBase::RestartPlayer(AController* NewPlayer)
|
|||||||
|
|
||||||
// inform player controller that game has started using client RPC
|
// inform player controller that game has started using client RPC
|
||||||
AGSPlayerController* PC = Cast<AGSPlayerController>(NewPlayer);
|
AGSPlayerController* PC = Cast<AGSPlayerController>(NewPlayer);
|
||||||
if(PC)
|
if(PC && IsMatchInProgress())
|
||||||
{
|
{
|
||||||
PC->Client_GameStarted();
|
PC->Client_GameStarted();
|
||||||
}
|
}
|
||||||
@ -113,37 +113,6 @@ bool AGSGameModeBase::CanDamagePlayer(AGSPlayerController* Damager, AGSPlayerCon
|
|||||||
|
|
||||||
void AGSGameModeBase::PickTeam(AGSPlayerState* PlayerState)
|
void AGSGameModeBase::PickTeam(AGSPlayerState* PlayerState)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
// place player on the team with the fewest players, or on the first team if all teams have the same number of players
|
|
||||||
TArray<int32> NumTeamPlayers;
|
|
||||||
AGSGameState* GS = GetGameState<AGSGameState>();
|
|
||||||
NumTeamPlayers.AddZeroed(GS->GetNumTeams());
|
|
||||||
|
|
||||||
check(NumTeamPlayers.Num() > 0);
|
|
||||||
|
|
||||||
for(int32 PlayerIdx = 0; PlayerIdx < GS->PlayerArray.Num(); ++PlayerIdx)
|
|
||||||
{
|
|
||||||
AGSPlayerState* CurrPS = Cast<AGSPlayerState>(GS->PlayerArray[PlayerIdx]);
|
|
||||||
if(CurrPS && CurrPS->GetTeamNum() >= 0 && CurrPS->GetTeamNum() < NumTeamPlayers.Num())
|
|
||||||
{
|
|
||||||
NumTeamPlayers[CurrPS->GetTeamNum()]++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UE_LOG(LogTemp, Error, TEXT("Player %s is on team number %d but only %d teams exist"), *CurrPS->GetPlayerName(), CurrPS->GetTeamNum(), NumTeamPlayers.Num())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 LowestTeamIdx = 0;
|
|
||||||
for(int32 TeamIdx = 0; TeamIdx < NumTeamPlayers.Num(); TeamIdx++)
|
|
||||||
{
|
|
||||||
if(NumTeamPlayers[TeamIdx] < NumTeamPlayers[LowestTeamIdx])
|
|
||||||
{
|
|
||||||
LowestTeamIdx = TeamIdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
PlayerState->SetTeamNum(PlayerState->GetPlayerController()->GetLocalPlayer()->GetControllerId());
|
PlayerState->SetTeamNum(PlayerState->GetPlayerController()->GetLocalPlayer()->GetControllerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,6 +214,28 @@ void AGSGameModeBase::FinishMatch()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AGSGameModeBase::HandleStartingNewPlayer_Implementation(APlayerController* NewPlayer)
|
||||||
|
{
|
||||||
|
// If players should start as spectators, leave them in the spectator state
|
||||||
|
if (!bStartPlayersAsSpectators && !MustSpectate(NewPlayer))
|
||||||
|
{
|
||||||
|
// If match is in progress, start the player
|
||||||
|
if ((GetMatchState() == MatchState::WaitingToStart || IsMatchInProgress()) && PlayerCanRestart(NewPlayer))
|
||||||
|
{
|
||||||
|
RestartPlayer(NewPlayer);
|
||||||
|
}
|
||||||
|
// Check to see if we should start right away, avoids a one frame lag in single player games
|
||||||
|
else if (GetMatchState() == MatchState::WaitingToStart)
|
||||||
|
{
|
||||||
|
// Check to see if we should start the match
|
||||||
|
if (ReadyToStartMatch())
|
||||||
|
{
|
||||||
|
StartMatch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AGSGameModeBase::HandleMatchIsWaitingToStart()
|
void AGSGameModeBase::HandleMatchIsWaitingToStart()
|
||||||
{
|
{
|
||||||
@ -266,6 +257,7 @@ void AGSGameModeBase::HandleMatchIsWaitingToStart()
|
|||||||
AGSPlayerController* PC = Cast<AGSPlayerController>(*It);
|
AGSPlayerController* PC = Cast<AGSPlayerController>(*It);
|
||||||
if(PC)
|
if(PC)
|
||||||
{
|
{
|
||||||
|
RestartPlayer(PC);
|
||||||
PC->Client_WarmupStarted();
|
PC->Client_WarmupStarted();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
void FinishMatch();
|
void FinishMatch();
|
||||||
|
|
||||||
|
virtual void HandleStartingNewPlayer_Implementation(APlayerController* NewPlayer) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up match warmup timer
|
* Sets up match warmup timer
|
||||||
*/
|
*/
|
||||||
|
@ -30,6 +30,9 @@ void AGSPlayerController::Client_OnDeath_Implementation(AGSPlayerState* KillerPl
|
|||||||
|
|
||||||
void AGSPlayerController::Client_WarmupStarted_Implementation()
|
void AGSPlayerController::Client_WarmupStarted_Implementation()
|
||||||
{
|
{
|
||||||
|
// wait for server to tell us we can move
|
||||||
|
SetIgnoreMoveInput(true);
|
||||||
|
|
||||||
OnWarmupStarted();
|
OnWarmupStarted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user