The reported fall-through was a misdiagnosis: the player never fell. The imported Terrain_DEM had only a bounding-box simple collision proxy, so a downward trace anywhere in the block hit the terrain at Z 819 (the mesh bbox max) and the street sat under an invisible 8 m lid. Standing on that box looked plausible, which is why it read as working. - add UGigLineAssetTools (C++): force CTF_UseComplexAsSimple on a static mesh. UE 5.8 dropped bUseComplexAsSimpleCollision and Python cannot set the flag; the builder also saves the asset, since the flag lives there and a map-only save silently reverts it. - spawn (-13336, -1150, 600): inside the carved corridor (the cut is a 10.7 m half-width around the road centreline), lands on the road at 456. - fix ResetToStart returning to the mid-air PlayerStart captured in BeginPlay: StartLocation is now captured on the first grounded frame. - HighResShot 1280x720 instead of "1280 720", which is a multiplier. - add -qaselftest: scripted walk/reset/pause on a core ticker plus a swept ground transect. Results: walk 746 cm/2 s with Z steady, reset 0 cm from spawn, pause/unpause 1/0, transect 84 samples 0 holes. - rebase onto main, keeping the frontage materials and placement fixes.
22 lines
799 B
C++
22 lines
799 B
C++
#include "GigLineGameModeBase.h"
|
|
|
|
#include "GameFramework/PlayerController.h"
|
|
#include "GigLineCharacter.h"
|
|
#include "GigLineHUD.h"
|
|
|
|
AGigLineGameModeBase::AGigLineGameModeBase()
|
|
{
|
|
DefaultPawnClass = AGigLineCharacter::StaticClass();
|
|
// ODbL attribution must be visible in the running demo, not only in docs.
|
|
HUDClass = AGigLineHUD::StaticClass();
|
|
}
|
|
|
|
void AGigLineGameModeBase::HandleStartingNewPlayer_Implementation(APlayerController* NewPlayer)
|
|
{
|
|
Super::HandleStartingNewPlayer_Implementation(NewPlayer);
|
|
UE_LOG(LogTemp, Log, TEXT("GigLine GM: player %s connected; pawn=%s input=%s"),
|
|
NewPlayer ? *NewPlayer->GetName() : TEXT("null"),
|
|
NewPlayer && NewPlayer->GetPawn() ? *NewPlayer->GetPawn()->GetName() : TEXT("NONE"),
|
|
NewPlayer && NewPlayer->PlayerInput ? TEXT("yes") : TEXT("no"));
|
|
}
|