Overshield and sprint verse

Hey i ran into a problem where i am useing a overshield and sprint verse code. and i use it in a map where there is two players but when i interact with eg the overshield trigger the player that interact with it have the same hp and shield before the interact, but player 2 have it reset to 100 health and 100 shield, can you help me so its not reseting for player 2 and will be the same as the player who interact with the triggers

my verse code

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Game }

EachP := class():
Player: player
var CurrentMaxShield : float
var CurrentMaxHealth : float

SprintAndOvershield := class(creative_device):
@editable OverShield : trigger_device = trigger_device{}
@editable Sprint : trigger_device = trigger_device{}
var SprintEnabled : logic = false
var OvershieldEnabled : logic = false
@editable NoSprintNoOvershield : class_and_team_selector_device = class_and_team_selector_device{}
@editable NoSprintOvershield : class_and_team_selector_device = class_and_team_selector_device{}
@editable SprintNoOvershield : class_and_team_selector_device = class_and_team_selector_device{}
@editable SprintOvershield : class_and_team_selector_device = class_and_team_selector_device{}

@editable PlayerSpawner : []player_spawner_device = array{}

var PlayerMap : [player]EachP = map{}

OnBegin<override>()<suspends>:void =

    for(Spawner:PlayerSpawner):
        Spawner.SpawnedEvent.Subscribe(OnPlayerSpawned)

    OverShield.TriggeredEvent.Subscribe(ToggleOvershield)
    Sprint.TriggeredEvent.Subscribe(ToggleSprint)

    NoSprintNoOvershield.ClassSwitchedEvent.Subscribe(ChangeHealthAndShield)
    NoSprintOvershield.ClassSwitchedEvent.Subscribe(ChangeHealthAndShield)
    SprintNoOvershield.ClassSwitchedEvent.Subscribe(ChangeHealthAndShield)
    SprintOvershield.ClassSwitchedEvent.Subscribe(ChangeHealthAndShield)

    GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerLeft)


ChangeHealthAndShield(Agent:agent):void=
    if(Player := player[Agent], ExistingPlayer := PlayerMap[Player], FC := Agent.GetFortCharacter[]):
        FC.SetMaxShield(ExistingPlayer.CurrentMaxShield)
        FC.SetMaxHealth(ExistingPlayer.CurrentMaxHealth)

    
    
ToggleOvershield(Agent : ?agent):void =
    if(NewAgent := Agent?):
        if(Player := player[NewAgent], PlayerExisting := PlayerMap[Player]):
            if(FC := NewAgent.GetFortCharacter[]):
                CurrentMaxShield := FC.GetMaxShield()
                CurrentMaxHealth := FC.GetMaxHealth()

                set PlayerExisting.CurrentMaxShield = CurrentMaxShield
                set PlayerExisting.CurrentMaxHealth = CurrentMaxHealth

                if (OvershieldEnabled?):
                    set OvershieldEnabled = false
                else:
                    set OvershieldEnabled = true
                SwitchPlayers()

           
            

ToggleSprint(Agent : ?agent):void =
    if(NewAgent := Agent?):
        if(Player := player[NewAgent], PlayerExisting := PlayerMap[Player]):
            if(FC := NewAgent.GetFortCharacter[]):

                CurrentMaxShield := FC.GetMaxShield()
                CurrentMaxHealth := FC.GetMaxHealth()

                set PlayerExisting.CurrentMaxShield = CurrentMaxShield
                set PlayerExisting.CurrentMaxHealth = CurrentMaxHealth

                if (SprintEnabled?):
                    set SprintEnabled = false
                else:
                    set SprintEnabled = true
                SwitchPlayers()

              


SwitchPlayers():void =
    for (Player : GetPlayspace().GetPlayers(), FC := Player.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)


OnPlayerSpawned(Agent:agent):void =
    if:
        Player := player[Agent]
        not EachP[Player]
        FC := Agent.GetFortCharacter[]
    then:
        if(set PlayerMap[Player] = EachP{Player := Player, CurrentMaxShield:=  FC.GetMaxShield(), CurrentMaxHealth := FC.GetMaxHealth()}):

OnPlayerLeft(Agent:agent):void=
    if(Player := player[Agent]):
        RemoveKeyFromMap(PlayerMap, Player)


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

Thanks

Hey KongJoh! How are you?

I’m going to try to help you with this! I’ve been testing the issue and I can’t understand the result you want from this interaction, so let me ask you a couple questions:

  1. You are trying to set the new values for all the players on the Island, right? (Example: I have a trigger that sets the Max Shield to 150 instead of 100. Player 1 triggers that change and it’s Max Shield changes to 150. In addition, Max Shield for player 2 is also set to 150.)

  2. And you are doing this by using a Class Designer and a Class Selector for each combination of Max Shield and Move Speed.
    Could you share with me some screenshots of how those devices are condigured?

  3. If I missunderstood this, please, could you explain the expected result for the player interacting with the trigger and the ones that are not triggering it?

I’ll be waiting for your answer!

1 Like

Hey BRGJuanCruzMK sorry for not respanding and im good thanks, how are you.

  1. i have a hp system where i change the players hp and shield to be the same. i want to make so when you change the sliders it will save for all the players when interacting with the overshield or the inf sprint. but when player 1 interact with one of the triggers its he/she is the only player thats keep the health on sliders, but player 2 gets reset to 100 health and 100 shield.

this:

  1. yes i am useing the class device, i use 4

1 inf sprint
2 overshield (1)
3 with both
4 with non of it

do you want all the settings for the class designer?

thanks for youre help :smile:

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

hey BRBJuanCruzMK thanks for the help

its working, and nice work and thanks :smile:

1 Like

(post deleted by author)

can you help me make these two verse code work together, its a spectator verse where you can respawn and the other is a delay respawn verse. but in the spectator verse the player will not being able to spectate the other players becouse of the delay verse, so can you help so that a player can spectate other and not just respawn

do you know how and thanks for youre help and i hope you will have a great day :smile:

spectator verse:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/UI }
using { /Fortnite.com/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Fortnite.com/FortPlayerUtilities }

PlayerUIClass := class():

RespawnClass : class_and_team_selector_device
RespawnText<localizes> : message = "Respawn"
ButtonRespawn : button_loud = button_loud{}
var MyCanvas : canvas = canvas{}


OnRespawnClicked(WidgetPlayer:widget_message):void=
    if(Player:= WidgetPlayer.Player, PlayerUI:= GetPlayerUI[Player]):
            PlayerUI.RemoveWidget(MyCanvas)
            RespawnClass.ChangeClass(Player)
            Player.Respawn(vector3{X:=1.0,Y:=1.0,Z:=1.0}, IdentityRotation())
            

Init() : canvas =
    
    ButtonRespawn.SetText(RespawnText)

    ButtonRespawn.OnClick().Subscribe(OnRespawnClicked)
    
    MainCanvas : canvas = canvas:
        Slots := array:
            canvas_slot:
                Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.2}, Maximum := vector2{X := 0.5, Y := 0.2}}
                Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0}
                Alignment := vector2{X := 0.5, Y := 0.5}
                SizeToContent := true
                Widget := ButtonRespawn

    return MainCanvas

AddUI(Agent : agent) : void=
    if(Player := player[Agent], PlayerUI := GetPlayerUI[Player]):

        set MyCanvas = Init()
        PlayerUI.AddWidget(MyCanvas , player_ui_slot{InputMode := ui_input_mode.All})

A Verse-authored creative device that can be placed in a level

RespawnSpectator := class(creative_device):

@editable SpectateButton:button_device = button_device{}
@editable SpectatorClass:class_and_team_selector_device = class_and_team_selector_device{}
@editable RespawnClass:class_and_team_selector_device = class_and_team_selector_device{}


# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void=

    SpectateButton.InteractedWithEvent.Subscribe(GoToSpectator)

GoToSpectator(Agent:agent):void=
    if(Player:= player[Agent], PlayerUI:=GetPlayerUI[Player]):
        if(FortChar := Player.GetFortCharacter[]):
            SpectatorClass.ChangeClass(Agent)
            FortChar.Damage(300.0)

            EachPlayerUIClass: PlayerUIClass = PlayerUIClass{RespawnClass:=RespawnClass}
            EachPlayerUIClass.AddUI(Agent)


      delay verse 

discord.gg/uefndream

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using {/Fortnite.com/Teams}
using {/Verse.org/Simulation}
using {/Fortnite.com/Characters}
using {/Verse.org/Random}
using {/Fortnite.com/Game}
using {/Fortnite.com/FortPlayerUtilities}
using {/UnrealEngine.com/Temporary/SpatialMath}

InstantRespawn := class(creative_device):

respawnposition: vector3=vector3{X:= 250.00, Y:= 0.01, Z:= 161.9}

@editable
var RespawnTime : float = 0.1

@editable
FastRespawnTrigger : trigger_device = trigger_device{}

@editable
SlowRespawnTrigger : trigger_device = trigger_device{}

@editable
ElimMachine : elimination_manager_device = elimination_manager_device{}
@editable
TeleporterTeam1 : teleporter_device = teleporter_device{}
@editable
TeleporterTeam2 : teleporter_device = teleporter_device{}

NowRespawn(Agent: agent)<suspends>:void=
    Sleep(RespawnTime)
    Agent.Respawn(respawnposition, rotation{})
    TeleporterTeam1.Teleport(Agent)
    TeleporterTeam2.Teleport(Agent)

SelfEliminated(Agent:agent):void=
    spawn{NowRespawn(Agent)}

OnFastRespawnTriggered(Agent:?agent):void=
    set RespawnTime = 0.1

OnSlowRespawnTriggered(Agent:?agent):void=
    set RespawnTime = 1.5

OnBegin<override>()<suspends>:void=
    ElimMachine.EliminatedEvent.Subscribe(SelfEliminated)
    FastRespawnTrigger.TriggeredEvent.Subscribe(OnFastRespawnTriggered)
    SlowRespawnTrigger.TriggeredEvent.Subscribe(OnSlowRespawnTriggered)

hey @KongJoh !

Please mark this post as solved and create a new one for the new problem! I’ll be glad to help you!

1 Like

(post deleted by author)

Thanks for the help. I made a new one