How to add persistence (in respawn and between sessions) in this code?

I found this code to modify the player’s HP without using classes in the game and I want to use it to place an “HP store” for players to gradually buy HP to make them stronger within my map:

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


MODIFICATIONTYPE := enum{Add,Set,Remove}
HPTYPE := enum{Health,Shield}

health_manager := class(creative_device):
    @editable DeviceSettings : DefaultSettingsClass = DefaultSettingsClass{}  
    var SaveHP :logic=true 
    var ReGrantTime : float = 10.0
    var DefaultHP : HPAmounts = HPAmounts{}

    var SavedSubscriptions : [agent]?cancelable = map{} 

    @editable HPTriggers : []HPDeviceClass = array{} 
    OnBegin<override>()<suspends>:void=
        set SaveHP = DeviceSettings.SaveHP;set ReGrantTime = DeviceSettings.ReGrantTime;set DefaultHP = DeviceSettings.DefaultHP
        for(HPClass:HPTriggers){HPClass.Init(Self,SaveHP)}
        if(DeviceSettings.SaveHP?):
            if(TeamSettings:=DeviceSettings.Optional_TeamSettingDevice?,TeamSettings.GetTransform().Translation.X<>0.0): 
                TeamSettings.TeamMemberSpawnedEvent.Subscribe(PlayerSpawned)
            else:
                for(Player:GetPlayspace().GetPlayers()). PlayerAdded(Player)
                GetPlayspace().PlayerAddedEvent().Subscribe(PlayerAdded)
                GetPlayspace().PlayerRemovedEvent().Subscribe(PlayerRemoved) 
            
            SyncHP(false)
        
    PlayerAdded(Player:player):void= 
        if(FC:=Player.GetFortCharacter[]):
            Subscription:=FC.EliminatedEvent().Subscribe(PlayerEliminatedP1)
            if(set SavedSubscriptions[Player]=option{Subscription}){}
            SyncHP(option{FC})

    PlayerRemoved(Player:player):void= 
        if(SavedSubscription:=SavedSubscriptions[Player]?). SavedSubscription.Cancel()


    PlayerEliminatedP1(EliminatedResult:elimination_result):void=spawn{PlayerEliminatedP2(EliminatedResult.EliminatedCharacter)}

    PlayerEliminatedP2(FC:fort_character)<suspends>:void=
        Sleep(ReGrantTime)
        SyncHP(option{FC})

    PlayerSpawned(Agent:agent):void= if(FC:=Agent.GetFortCharacter[]){ SyncHP(option{FC} )}

    SyncHP(MFC:?fort_character):void= 
        if(FC:=MFC?):
            FC.SetMaxHealth(DefaultHP.Health);FC.SetMaxShield(DefaultHP.Shield);FC.SetHealth(DefaultHP.Health);FC.SetShield(DefaultHP.Shield)            
        else if(SaveHP?):
            for(Player:GetPlayspace().GetPlayers()):
                if(FC:=Player.GetFortCharacter[]):
                    FC.SetMaxHealth(DefaultHP.Health);FC.SetMaxShield(DefaultHP.Shield);FC.SetHealth(DefaultHP.Health);FC.SetShield(DefaultHP.Shield)
    
    ChangeHP(Type:MODIFICATIONTYPE,HPType:HPTYPE,Amount:float,MFC:?fort_character):void=
        if(SaveHP?):
            case(HPType):
                HPTYPE.Health =>
                    set DefaultHP.Health = CalculateNewHP(DefaultHP.Health,Amount,Type)
                HPTYPE.Shield =>
                    set DefaultHP.Shield = CalculateNewHP(DefaultHP.Shield,Amount,Type)
                    
            SyncHP(false)
        else if(FC:=MFC?):
            case(HPType):
                HPTYPE.Health =>
                    NewHealth:=CalculateNewHP(FC.GetMaxHealth(),Amount,Type)
                    FC.SetMaxHealth(NewHealth);FC.SetHealth(NewHealth)
                HPTYPE.Shield =>
                    NewShield:=CalculateNewHP(FC.GetMaxShield(),Amount,Type)
                    FC.SetMaxShield(NewShield);FC.SetShield(NewShield)

            SyncHP( option{FC} )
        
    CalculateNewHP(PreviousHP:float,Amount:float,ModificationType:MODIFICATIONTYPE):float=
        case(ModificationType):
            MODIFICATIONTYPE.Add => PreviousHP+Amount
            MODIFICATIONTYPE.Remove => PreviousHP-Amount
            MODIFICATIONTYPE.Set => Amount

DefaultSettingsClass:=class<concrete>:
    @editable Optional_TeamSettingDevice : ?team_settings_and_inventory_device = false 
    @editable var DefaultHP : HPAmounts = HPAmounts{}
    @editable ReGrantTime : float = 9.0 
    @editable SaveHP : logic = true 


HPDeviceClass:=class<concrete>:
    @editable ModifyType : MODIFICATIONTYPE = MODIFICATIONTYPE.Add 
    @editable Amount : float = 10.0
    @editable Type : HPTYPE = HPTYPE.Health
    @editable ResetHPOnChange : logic = false
    @editable Trigger : trigger_device = trigger_device{} 
    var SelfDevice : health_manager = health_manager{}
    var SaveHP : logic = true # 
    Init(HealthDevice:health_manager,ShouldSave:logic):void=
        set SelfDevice=HealthDevice;set SaveHP=ShouldSave
        Trigger.TriggeredEvent.Subscribe(Triggered)
    Triggered(MAgent:?agent):void=
        SelfDevice.ChangeHP(ModifyType,Type,Amount,option{MAgent?.GetFortCharacter[]})


HPAmounts:=class<concrete>:
    @editable var Health:float=100.0
    @editable var Shield:float=100.0

I tested it and it’s working. But I need to include persistence in Verse in it, so that the extra HP purchased persists after the player dies and respawns, and also after the player leaves the map and returns in a new session, because in both cases the HP goes back to 100 as soon as the player spawns.

Someone can please help me?

I would use a stat creator device with persistence on, then when a player spawns in load from their stat creator device what their health should be and apply with SetMaxHealth and SetHealth. When they buy from the store then upgrade the level of their stat creator

1 Like

Great idea! But I tried all day to implement this and I couldn’t do it =(

Can you help me please?

If you share your code I can take a look, here’s a good tutorial too: Keep in mind if you’re testing in editor the persistent stats reset each game, but will stay in a playtest version