After some very extensive troubleshooting after still getting JIP errors this is what I landed on, and what tested stable. Single PlayerCounter, with a validating array, and a new confirmation state in the Validating function for Players.
PlayerCounter:player_counter_device=player_counter_device:
var Players:[]player=array:
var Validating:[]player=array:
PlayerDetectedListener()<suspends>:void=
loop:
Agent:=PlayerCounter.CountedEvent.Await()
if(Player:=player[Agent]):
spawn. Player.Detected()
(Player:player).Detected()<suspends>:void=
if(not Validating.Find[Player]):
Validated:=Player.Validate()
if(Validated?):
if(not Players.Find[Player]):
Player.Joined()
else:
Player.Spawned()
An important part of this is that I found even when a player passed Player.IsActive[]
and FortChar.IsActive[]
that essentially means nothing, because you will still have players failing initialization after those checks. The only way to truly validate everyone is to require the player to move themselves. No amount of additional detection methods between the Player Counter (which is an actual reliable Playspace) and this input has any relevance due to the existence of these failures without this additional handling.
if(Player.IsActive[],FC:=Player.GetFortCharacter[],FC.IsActive[]):
FC.SprintedEvent().Await()
The only thing from the Playspace i use at this point is the PlayerRemoved event, as as far as I know once they’re in and leave the Playspace functions properly but if you’d heard otherwise let me know and I suppose I’ll finish the full replacement.