Hello,
I’ve been running into a bug where trying to access a PlayerState as anything other than the first player (both local and network) results in an access violation error. What’s particularly strange to me is that I have identical code on Engine 4.15.3 and it works perfectly. Any suggestions? Crash report and code below:
Crash Report:
LoginId:be5890fe4e65140a06f3d2ae97944984
EpicAccountId:6a6ce7abdb4a4ea89d1e0acdd9047c7f
Access violation - code c0000005 (first/second chance not available)
UE4Editor_FPSWizard!AMP_FPSDemoCharacter::BeginPlay() [d:\users\cw_si\documents\unreal projects\fpswizardeditor\plugins\fpswizard\source\fpswizard\private\mp_fpsdemocharacter.cpp:348]
UE4Editor_Engine!AActor::DispatchBeginPlay() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:3104]
UE4Editor_Engine!AActor::PostActorConstruction() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:2970]
UE4Editor_Engine!AActor::FinishSpawning() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:2876]
UE4Editor_Engine!AActor::PostSpawnInitialize() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:2818]
UE4Editor_Engine!UWorld::SpawnActor() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\levelactor.cpp:459]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnAtTransform_Implementation() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1123]
UE4Editor_Engine!AGameModeBase::execSpawnDefaultPawnAtTransform() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\classes\gameframework\gamemodebase.h:47]
UE4Editor_CoreUObject!UFunction::Invoke() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\coreuobject\private\uobject\class.cpp:4461]
UE4Editor_CoreUObject!UObject::ProcessEvent() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\coreuobject\private\uobject\scriptcore.cpp:1313]
UE4Editor_Engine!AActor::ProcessEvent() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:695]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnAtTransform()
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnFor_Implementation() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1115]
UE4Editor_Engine!AGameModeBase::execSpawnDefaultPawnFor() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\classes\gameframework\gamemodebase.h:47]
UE4Editor_CoreUObject!UFunction::Invoke() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\coreuobject\private\uobject\class.cpp:4461]
UE4Editor_CoreUObject!UObject::ProcessEvent() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\coreuobject\private\uobject\scriptcore.cpp:1313]
UE4Editor_Engine!AActor::ProcessEvent() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:695]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnFor()
UE4Editor_Engine!AGameModeBase::RestartPlayerAtPlayerStart() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1185]
UE4Editor_Engine!AGameModeBase::RestartPlayer() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1152]
UE4Editor_Engine!AGameModeBase::execHandleStartingNewPlayer() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\classes\gameframework\gamemodebase.h:47]
UE4Editor_CoreUObject!UFunction::Invoke() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\coreuobject\private\uobject\class.cpp:4461]
UE4Editor_CoreUObject!UObject::ProcessEvent() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\coreuobject\private\uobject\scriptcore.cpp:1313]
UE4Editor_Engine!AActor::ProcessEvent() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\actor.cpp:695]
UE4Editor_Engine!AGameModeBase::HandleStartingNewPlayer()
UE4Editor_Engine!AGameMode::PostLogin() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\gamemode.cpp:126]
UE4Editor_Engine!UWorld::SpawnPlayActor() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\levelactor.cpp:721]
UE4Editor_Engine!UWorld::NotifyControlMessage() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\world.cpp:4286]
UE4Editor_Engine!UControlChannel::ReceivedBunch() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\datachannel.cpp:1298]
UE4Editor_Engine!UChannel::ReceivedSequencedBunch() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\datachannel.cpp:290]
UE4Editor_Engine!UChannel::ReceivedNextBunch() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\datachannel.cpp:656]
UE4Editor_Engine!UChannel::ReceivedRawBunch() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\datachannel.cpp:381]
UE4Editor_Engine!UNetConnection::ReceivedPacket() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\netconnection.cpp:1207]
UE4Editor_Engine!UNetConnection::ReceivedRawPacket() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\netconnection.cpp:626]
UE4Editor_OnlineSubsystemUtils!UIpNetDriver::TickDispatch() [d:\build\++ue4+release-4.16+compile\sync\engine\plugins\online\onlinesubsystemutils\source\onlinesubsystemutils\private\ipnetdriver.cpp:227]
UE4Editor_Engine!TBaseUObjectMethodDelegateInstance<0,UNetDriver,void __cdecl(float)>::ExecuteIfSafe() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\core\public\delegates\delegateinstancesimpl.h:858]
UE4Editor_Engine!TBaseMulticastDelegate<void,float>::Broadcast() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\core\public\delegates\delegatesignatureimpl.inl:937]
UE4Editor_Engine!UWorld::Tick() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\engine\private\leveltick.cpp:1262]
UE4Editor_UnrealEd!UEditorEngine::Tick() [d:\build\++ue4+release-4.16+compile\sync\engine\source\editor\unrealed\private\editorengine.cpp:1633]
UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [d:\build\++ue4+release-4.16+compile\sync\engine\source\editor\unrealed\private\unrealedengine.cpp:386]
UE4Editor!FEngineLoop::Tick() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\launch\private\launchengineloop.cpp:3119]
UE4Editor!GuardedMain() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\launch\private\launch.cpp:166]
UE4Editor!GuardedMainWrapper() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:134]
UE4Editor!WinMain() [d:\build\++ue4+release-4.16+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:210]
UE4Editor!__scrt_common_main_seh() [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253]
kernel32
ntdll
Code:
//If there is another player already with the same name, append the player's index to our name (ie Namehere[1])
if (NetIndex > 0)
{
//Holds the number of players with the same name
int NumPlayersWithSameName = 0;
//Iterate through all FPSCharacters in the world
for (TActorIterator<AMP_FPSDemoCharacter> ActorItr(GetWorld()); ActorItr; ++ActorItr)
{
//Ptr to character
AMP_FPSDemoCharacter* OtherChar = *ActorItr;
//Confirm the above
if (OtherChar)
{
//If the other character isn't this and the other player's name (in their player state) is either the same name or is "samename["
//VVV THIS LINE IS THE ONE IN CRASH REPORT, THOUGH IT SEEMS ANY PLAYER STATE ACCESS WILL CRASH THE ENGINE VVV
if (OtherChar != this && OtherChar->PlayerState->PlayerName == this->PlayerState->PlayerName || OtherChar->PlayerState->PlayerName.Contains(FString::Printf(TEXT("%s["), *this->PlayerState->PlayerName), ESearchCase::CaseSensitive))
{
//Add one to the players w/ same name count
NumPlayersWithSameName++;
}
}
}
//If we have one or more characters with the same name
if (NumPlayersWithSameName > 0)
{
//Create a new player name as "ourname[number of players with same name - 1]"
//IE if our name is "Chris" and there's another player already with the name "Chris" then change our name to "Chris[0]"
FString NewPlayerString = FString::Printf(TEXT("%s[%d]"), *this->PlayerState->PlayerName, NumPlayersWithSameName - 1);
//Get our player state and change the player name to the above string
AFPSDemoPlayerState* PS = Cast<AFPSDemoPlayerState>(this->PlayerState);
if (PS)
PS->PlayerName = *NewPlayerString;
}
}
//Set our player name to the above
if (Cast<AFPSDemoPlayerState>(this->PlayerState))
this->PlayerName = FName(*Cast<AFPSDemoPlayerState>(this->PlayerState)->PlayerName);