Files
Promether/Source/Promether/GameModeBase/Deathmatch.cpp

151 lines
4.5 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "Deathmatch.h"
#include "Kismet/GameplayStatics.h"
#include "GameFramework/PlayerStart.h"
#include "Engine/PlayerStartPIE.h"
#include "EngineUtils.h"
#include "../PrometherEnum.h"
#include "../PlayerGeneric/DefaultPlayerController.h"
#include "../DefaultGameInstance.h"
#include "../PlayerGeneric/DefaultPlayerState.h"
#include "../DefaultGameStateBase.h"
#include "../PlayerGeneric/DefaultPlayerCamera.h"
ADeathmatch::ADeathmatch()
{
PrimaryActorTick.bCanEverTick = true;
//DefaultPawnClass = AActor::StaticClass();
PlayerControllerClass = ADefaultPlayerController::StaticClass();
PlayerStateClass = ADefaultPlayerState::StaticClass();
GameStateClass = ADefaultGameStateBase::StaticClass();
}
void ADeathmatch::Tick(float DeltaSeconds)
{
/*
UWorld* World = GetWorld();
for (TActorIterator<AActor> It(World); It; ++It)
{
if (AController* Con = It->GetInstigatorController())
{
if (APlayerState* Sta = Con->GetPlayerState<APlayerState>())
{
if (ADefaultPlayerState* MyState = Cast<ADefaultPlayerState>(Sta))
{
UE_LOG(LogTemp, Warning, TEXT("Server %s State = %d"), *It->GetName(), MyState->GetState());
}
}
}
}
*/
}
AActor* ADeathmatch::ChoosePlayerStart_Implementation(AController* Player)
{
// Choose a player start
APlayerStart* FoundPlayerStart = nullptr;
UClass* PawnClass = nullptr;
if (ADefaultPlayerState* NewPlayerState = Player->GetPlayerState<ADefaultPlayerState>())
{
PawnClass = NewPlayerState->GetCharacterBPRef();
}
APawn* PawnToFit = PawnClass ? PawnClass->GetDefaultObject<APawn>() : nullptr;
TArray<APlayerStart*> UnOccupiedStartPoints;
TArray<APlayerStart*> OccupiedStartPoints;
UWorld* World = GetWorld();
for (TActorIterator<APlayerStart> It(World); It; ++It)
{
APlayerStart* PlayerStart = *It;
if (PlayerStart->IsA<APlayerStartPIE>())
{
// Always prefer the first "Play from Here" PlayerStart, if we find one while in PIE mode
FoundPlayerStart = PlayerStart;
break;
}
else
{
FVector ActorLocation = PlayerStart->GetActorLocation();
const FRotator ActorRotation = PlayerStart->GetActorRotation();
if (!World->EncroachingBlockingGeometry(PawnToFit, ActorLocation, ActorRotation))
{
UnOccupiedStartPoints.Add(PlayerStart);
}
else if (World->FindTeleportSpot(PawnToFit, ActorLocation, ActorRotation))
{
OccupiedStartPoints.Add(PlayerStart);
}
}
}
if (FoundPlayerStart == nullptr)
{
if (UnOccupiedStartPoints.Num() > 0)
{
FoundPlayerStart = UnOccupiedStartPoints[FMath::RandRange(0, UnOccupiedStartPoints.Num() - 1)];
}
else if (OccupiedStartPoints.Num() > 0)
{
FoundPlayerStart = OccupiedStartPoints[FMath::RandRange(0, OccupiedStartPoints.Num() - 1)];
}
}
return FoundPlayerStart;
}
APawn* ADeathmatch::SpawnDefaultPawnAtTransform_Implementation(AController* NewPlayer, const FTransform& SpawnTransform)
{
FActorSpawnParameters SpawnInfo;
SpawnInfo.Instigator = GetInstigator();
SpawnInfo.ObjectFlags |= RF_Transient; // We never want to save default player pawns into a map
UClass* PawnClass = nullptr;
if (ADefaultPlayerState* NewPlayerState = NewPlayer->GetPlayerState<ADefaultPlayerState>())
{
PawnClass = NewPlayerState->GetCharacterBPRef();
}
APawn* ResultPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnInfo);
if (!ResultPawn)
{
UE_LOG(LogGameMode, Warning, TEXT("SpawnDefaultPawnAtTransform: Couldn't spawn Pawn of type %s at %s"), *GetNameSafe(PawnClass), *SpawnTransform.ToHumanReadableString());
}
return ResultPawn;
}
FString ADeathmatch::InitNewPlayer(APlayerController* NewPlayerController, const FUniqueNetIdRepl& UniqueId, const FString& Options, const FString& Portal)
{
FString ErrorMessage = Super::InitNewPlayer(NewPlayerController, UniqueId, Options, Portal);
if (ErrorMessage != "")
{
return ErrorMessage;
}
CharacterType Type = CharacterType(FCString::Atoi(*UGameplayStatics::ParseOption(Options, TEXT("CharacterType"))));
TeamType Team = TeamType(FCString::Atoi(*UGameplayStatics::ParseOption(Options, TEXT("Team"))));
//DebugPerpose
if (Type == CharacterType::Lukriel)
{
Type = CharacterType::Allium;
}
if (Team == TeamType::Null)
{
Team = TeamType::Black;
}
if (ADefaultPlayerState* NewPlayerState = NewPlayerController->GetPlayerState<ADefaultPlayerState>())
{
NewPlayerState->SetCharacterBPRef(GetGameInstance<UDefaultGameInstance>()->GetCharacterBPRef(Type));
//NewPlayerState->InitPlayerStats();
NewPlayerState->SetTeam(Team);
}
return ErrorMessage;
}