Overshield and sprint verse

Hey @KongJoh ! I’m good, thanks for asking :smiley:

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 :smiley:

1 Like