Hey @KongJoh ! Iām good, thanks for asking
I made some changes to your code to ensure we are changing the stats for all the players on the island and recently connected players, and to update the map when someone leaves!
Let me show you:
# Updated function to change all the players' stats
SwitchAllPlayers():void =
AllPlayers := GetPlayspace().GetPlayers()
for (CurrentPlayer : AllPlayers):
if(FC := CurrentPlayer.GetFortCharacter[], Agent := FC.GetAgent[]):
# update stats for each player before changing Class
if(PlayerData := PlayerMap[CurrentPlayer]):
set PlayerData.CurrentMaxShield = FC.GetMaxShield()
set PlayerData.CurrentMaxHealth = FC.GetMaxHealth()
# Apply new Class based on the current state
if (SprintEnabled? and OvershieldEnabled?):
SprintOvershield.ChangeClass(Agent)
else if (not SprintEnabled? and OvershieldEnabled?):
NoSprintOvershield.ChangeClass(Agent)
else if (SprintEnabled? and not OvershieldEnabled?):
SprintNoOvershield.ChangeClass(Agent)
else if (not SprintEnabled? and not OvershieldEnabled?):
NoSprintNoOvershield.ChangeClass(Agent)
OnPlayerSpawned(Agent:agent):void =
if:
CurrentPlayer := player[Agent]
not PlayerMap[CurrentPlayer]
FC := Agent.GetFortCharacter[]
then:
if(set PlayerMap[CurrentPlayer] = EachP{Player := CurrentPlayer, CurrentMaxShield:= FC.GetMaxShield(), CurrentMaxHealth := FC.GetMaxHealth()}):
# Apply state to recently spawned player
SwitchSinglePlayer(CurrentPlayer)
# New function to change the Class to a single player (used in "OnPlayerSpawned")
SwitchSinglePlayer(TargetPlayer:player):void =
if(FC := TargetPlayer.GetFortCharacter[], Agent := FC.GetAgent[]):
if (SprintEnabled? and OvershieldEnabled?):
SprintOvershield.ChangeClass(Agent)
else if (not SprintEnabled? and OvershieldEnabled?):
NoSprintOvershield.ChangeClass(Agent)
else if (SprintEnabled? and not OvershieldEnabled?):
SprintNoOvershield.ChangeClass(Agent)
else if (not SprintEnabled? and not OvershieldEnabled?):
NoSprintNoOvershield.ChangeClass(Agent)
OnPlayerLeft(Agent:agent):void=
if(Player := player[Agent]):
set PlayerMap = RemoveKeyFromMap(PlayerMap, Player) # Now we use set PlayerMap to properly change the map
RemoveKeyFromMap(OgMap:[player]EachP, Player:player):[player]EachP=
var NewMap:[player]EachP = map{}
for (Key -> Value : OgMap, Key <> Player):
set NewMap = ConcatenateMaps(NewMap, map{Key => Value})
return NewMap
This should work as you want! Let me know if you need a deeper explanation or more help!
Hope this helps