Codigo de rankeada esta muito pesada

Estou aprendendo verse e criei um codigo de rank, funciona do jeito que eu quero mas esta pesado por causa do loop, quero substituir o loop do codigo por um gatilho mas não consigo, pfvr me ajuda :sneezing_face:
esse e meu codigo completo: using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Game }
using { /Fortnite.com/UI }
using { /Verse.org/Simulation/Tags }
using { /UnrealEngine.com/Temporary/UI }
using { /Verse.org/Colors/NamedColors }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Colors }

spawner := class(tag){}
sentries := class(tag){}

TextForUI(InText : string, Agent : agent) : message = " {Agent} Fez {InText} Kills"
TextForRank(Rank : string) : message = “{Rank}”
TextForRankLabel() : message = “rank atual:”
TextForInfo(NextRankKills : string, CurrentKills : string) : message = “próximo \nrank: {NextRankKills} pts”

RankDeviceManager := class(creative_device):
var PlayerMap : [player]RankDeviceManager = map{}
var CurrentRank : string = “”

@editable Tracker : tracker_device = tracker_device{}
@editable Spawners : []player_spawner_device = array{}
@editable Sentries : []sentry_device = array{}
@editable InicianteLabel : string = "INICIANTE"
@editable BronzeLabel : string = "BRONZE"
@editable PrataLabel : string = "PRATA"
@editable OuroLabel : string = "OURO"
@editable PlatinaLabel : string = "PLATINA"
@editable DiamanteLabel : string = "DIAMANTE"
@editable EliteLabel : string = "ELITE"
@editable LendaLabel : string = "LENDA"
@editable SurrealLabel : string = "SURREAL"
@editable TopWinnerLabel : string = "TOP WINNER"


@editable InicianteColor : color = color{R := 0.3, G := 0.0, B := 0.0}
@editable BronzeColor : color = color{R := 0.85, G := 0.45, B := 0.15}
@editable PrataColor : color = color{R := 0.9, G := 0.8, B := 0.9}
@editable OuroColor : color = color{R := 1.0, G := 0.8, B := 0.1}
@editable PlatinaColor : color = color{R := 0.65, G := 0.85, B := 1.0}
@editable DiamanteColor : color = color{R := 0.1, G := 0.9, B := 1.0}
@editable EliteColor : color = color{R := 0.7, G := 0.1, B := 0.9}
@editable LendaColor : color = color{R := 1.0, G := 0.6, B := 0.1}
@editable SurrealColor : color = color{R := 0.9, G := 0.1, B := 0.1}
@editable TopWinnerColor : color = color{R := 0.0, G := 1.0, B := 1.0}
@editable BronzePoints : int = 45
@editable PrataPoints : int = 150
@editable OuroPoints : int = 300
@editable PlatinaPoints : int = 525
@editable DiamantePoints : int = 825
@editable ElitePoints : int = 1200
@editable LendaPoints : int = 1700
@editable SurrealPoints : int = 2400
@editable TopWinnerPoints : int = 3000


GetRankColor(Rank : string) : color =
    case (Rank):
        "INICIANTE" => InicianteColor
        "BRONZE" => BronzeColor
        "PRATA" => PrataColor
        "OURO" => OuroColor
        "PLATINA" => PlatinaColor
        "DIAMANTE" => DiamanteColor
        "ELITE" => EliteColor
        "LENDA" => LendaColor
        "SURREAL" => SurrealColor
        "TOP WINNER" => TopWinnerColor
        _ => color{R := 1.0, G := 1.0, B := 1.0}  # Default color for unknown ranks


InitSpawners():void =
    for (Spawner : Spawners):
        Spawner.SpawnedEvent.Subscribe(OnPlayerSpawned)


OnPlayerSpawned(NewPlayer : agent):void =
    spawn{OnPlayerAdded(NewPlayer)}


OnBegin<override>()<suspends>:void =
    InitSpawners()
    GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)


RankSpawnLoop(Player : player, RankLabelBlock : text_block, RankTextBlock : text_block, RankShadowBlock : text_block, InfoTextBlock : text_block, Agent : agent)<suspends>:void =
    loop:
        Sleep(5.0)
        if (PlayerUi := GetPlayerUI[Player]):
            Kills := Tracker.GetValue(Player)
            var NewRank : string = ""
            var NextRankKills : string = ""
            if (Kills < BronzePoints):
                set NewRank = "INICIANTE"
                set NextRankKills = ToString(BronzePoints)
            else if (Kills >= BronzePoints and Kills < PrataPoints):
                set NewRank = "BRONZE"
                set NextRankKills = ToString(PrataPoints)
            else if (Kills >= PrataPoints and Kills < OuroPoints):
                set NewRank = "PRATA"
                set NextRankKills = ToString(OuroPoints)
            else if (Kills >= OuroPoints and Kills < PlatinaPoints):
                set NewRank = "OURO"
                set NextRankKills = ToString(PlatinaPoints)
            else if (Kills >= PlatinaPoints and Kills < DiamantePoints):
                set NewRank = "PLATINA"
                set NextRankKills = ToString(DiamantePoints)
            else if (Kills >= DiamantePoints and Kills < ElitePoints):
                set NewRank = "DIAMANTE"
                set NextRankKills = ToString(ElitePoints)
            else if (Kills >= ElitePoints and Kills < LendaPoints):
                set NewRank = "ELITE"
                set NextRankKills = ToString(LendaPoints)
            else if (Kills >= LendaPoints and Kills < SurrealPoints):
                set NewRank = "LENDA"
                set NextRankKills = ToString(SurrealPoints)
            else if (Kills >= SurrealPoints and Kills < TopWinnerPoints):
                set NewRank = "SURREAL"
                set NextRankKills = ToString(TopWinnerPoints)
            else if (Kills >= TopWinnerPoints):
                set NewRank = "TOP WINNER"
                set NextRankKills = ToString(TopWinnerPoints)


            StoredRank := GetPlayerRank(Player)
            if (NewRank <> StoredRank):
                SetPlayerRank(Player, NewRank)


            RankLabelBlock.SetText(TextForRankLabel())
            RankLabelBlock.SetTextColor(color{R := 0.6, G := 0.6, B := 0.6})  # Gray for label
            RankTextBlock.SetText(TextForRank(NewRank))
            RankTextBlock.SetTextColor(GetRankColor(NewRank))
            RankShadowBlock.SetText(TextForRank(NewRank))
            RankShadowBlock.SetTextColor(color{R := 0.0, G := 0.0, B := 0.0})  # Black for shadow
            InfoTextBlock.SetText(TextForInfo(NextRankKills, ToString(Kills)))
            InfoTextBlock.SetTextColor(color{R := 0.6, G := 0.6, B := 0.6})  # Gray for info


GetPlayerRank(Player : player) : string =
    if (Data := PlayerMap[Player]):
        return Data.CurrentRank
    return ""


SetPlayerRank(Player : player, Rank : string):void =
    if (Data := PlayerMap[Player]):
        set Data.CurrentRank = Rank


OnPlayerAdded(NewPlayer : agent)<suspends>:void =
    if (PlayerObj := player[NewPlayer]):
        if (PlayerExists := PlayerMap[NewPlayer]):
        else:
            if (set PlayerMap[PlayerObj] = RankDeviceManager{}):
                if(PlayerUI := GetPlayerUI[PlayerObj]):
                    Kills := Tracker.GetValue(PlayerObj)
                    var InitialRank : string = ""
                    var NextRankKills : string = ""
                    if (Kills < BronzePoints):
                        set InitialRank = "INICIANTE"
                        set NextRankKills = ToString(BronzePoints)
                    else if (Kills >= BronzePoints and Kills < PrataPoints):
                        set InitialRank = "BRONZE"
                        set NextRankKills = ToString(PrataPoints)
                    else if (Kills >= PrataPoints and Kills < OuroPoints):
                        set InitialRank = "PRATA"
                        set NextRankKills = ToString(OuroPoints)
                    else if (Kills >= OuroPoints and Kills < PlatinaPoints):
                        set InitialRank = "OURO"
                        set NextRankKills = ToString(PlatinaPoints)
                    else if (Kills >= PlatinaPoints and Kills < DiamantePoints):
                        set InitialRank = "PLATINA"
                        set NextRankKills = ToString(DiamantePoints)
                    else if (Kills >= DiamantePoints and Kills < ElitePoints):
                        set InitialRank = "DIAMANTE"
                        set NextRankKills = ToString(ElitePoints)
                    else if (Kills >= ElitePoints and Kills < LendaPoints):
                        set InitialRank = "ELITE"
                        set NextRankKills = ToString(LendaPoints)
                    else if (Kills >= LendaPoints and Kills < SurrealPoints):
                        set InitialRank = "LENDA"
                        set NextRankKills = ToString(SurrealPoints)
                    else if (Kills >= SurrealPoints and Kills < TopWinnerPoints):
                        set InitialRank = "SURREAL"
                        set NextRankKills = ToString(TopWinnerPoints)
                    else if (Kills >= TopWinnerPoints):
                        set InitialRank = "TOP WINNER"
                        set NextRankKills = ToString(TopWinnerPoints)


                    var RankLabelBlock : text_block = text_block{DefaultTextColor := color{R := 0.6, G := 0.6, B := 0.6}}
                    var RankTextBlock : text_block = text_block{DefaultTextColor := GetRankColor(InitialRank)}
                    var RankShadowBlock : text_block = text_block{DefaultTextColor := color{R := 0.0, G := 0.0, B := 0.0}}  # Black shadow
                    var InfoTextBlock : text_block = text_block{DefaultTextColor := color{R := 0.6, G := 0.6, B := 0.6}}
                    MyCanvas := canvas:
                        Slots := array:
                            canvas_slot:  # Slot for "RANK:"
                                Anchors := anchors{Minimum := vector2{X := 0.025, Y := 0.32}, Maximum := vector2{X := 0.025, Y := 0.32}}
                                Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0}
                                Alignment := vector2{X := 0.025, Y := 0.32}
                                SizeToContent := true
                                Widget := RankLabelBlock
                            canvas_slot:  # Slot for shadow of rank name
                                Anchors := anchors{Minimum := vector2{X := 0.026, Y := 0.351}, Maximum := vector2{X := 0.026, Y := 0.351}}
                                Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0}
                                Alignment := vector2{X := 0.026, Y := 0.351}
                                SizeToContent := true
                                Widget := RankShadowBlock
                            canvas_slot:  # Slot for rank name
                                Anchors := anchors{Minimum := vector2{X := 0.025, Y := 0.35}, Maximum := vector2{X := 0.025, Y := 0.35}}
                                Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0}
                                Alignment := vector2{X := 0.025, Y := 0.35}
                                SizeToContent := true
                                Widget := RankTextBlock
                            canvas_slot:  # Slot for info
                                Anchors := anchors{Minimum := vector2{X := 0.025, Y := 0.42}, Maximum := vector2{X := 0.025, Y := 0.42}}
                                Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0}
                                Alignment := vector2{X := 0.025, Y := 0.42}
                                SizeToContent := true
                                Widget := InfoTextBlock
                    PlayerUI.AddWidget(MyCanvas)
                    RankLabelBlock.SetText(TextForRankLabel())
                    RankLabelBlock.SetTextColor(color{R := 0.6, G := 0.6, B := 0.6})
                    RankTextBlock.SetText(TextForRank(InitialRank))
                    RankTextBlock.SetTextColor(GetRankColor(InitialRank))
                    RankShadowBlock.SetText(TextForRank(InitialRank))
                    RankShadowBlock.SetTextColor(color{R := 0.0, G := 0.0, B := 0.0})  # Black shadow
                    InfoTextBlock.SetText(TextForInfo(NextRankKills, ToString(Kills)))
                    InfoTextBlock.SetTextColor(color{R := 0.6, G := 0.6, B := 0.6})
                    SetPlayerRank(PlayerObj, InitialRank)
                    spawn{RankSpawnLoop(PlayerObj, RankLabelBlock, RankTextBlock, RankShadowBlock, InfoTextBlock, NewPlayer)}


OnPlayerRemoved(PlayerLeaving : player):void =
    if (ActualPlayer := PlayerMap[PlayerLeaving]):
        var TempPlayerMap : [player]RankDeviceManager = map{}
        for (Key -> Value : PlayerMap, Key <> PlayerLeaving):
            set TempPlayerMap = ConcatenateMaps(TempPlayerMap, map{Key => Value})
        set PlayerMap = TempPlayerMap