Help with a verse ranked leaderboard script


    var Leaderboard<internal> : []Custom_Player_Rank = array{}
    var IndexMap: [player]int = map{}  #Map to keep track of player indices in the heap

    Swap(arr: []Custom_Player_Rank , i: int, j: int):[]Custom_Player_Rank =
        var  Arr : []Custom_Player_Rank = arr
        if:  
            temp := Arr[i]
           if. Temp := Arr[j] then. set Arr[i] = Temp
           if. set Arr[j] = temp
           iplayer := Arr[i].Player
           jplayer := Arr[j].Player
           if. set IndexMap[player[iplayer]]= i
           if. set IndexMap[player[jplayer]] = j
        return Arr 
  
    MinHeapify(arr: []Custom_Player_Rank, n: int, i: int):[]Custom_Player_Rank=
        var Arr : []Custom_Player_Rank = arr
        var Smallest : int = i
        var Left : int = 2 * i + 1
        var Right : int = 2 * i + 2
        if(Left < n and Arr[Left].Elo < Arr[Smallest].Elo):
            set Smallest = Left
        if(Right < n and Arr[Right].Elo < Arr[Smallest].Elo):
            set Smallest = Right
        if(Smallest <> i):
            set Arr = Swap(Arr, i, Smallest)
            set Arr = MinHeapify(Arr, n, Smallest)
        return Arr

    HeapPush(arr: []Custom_Player_Rank, Dude: Custom_Player_Rank,TopK:int):[]Custom_Player_Rank=
        var Arr: []Custom_Player_Rank = arr
        set Arr = Arr + array{Dude}
        var i :int= Arr.Length - 1 
        if. set IndexMap[player[Dude.Player]] = Arr.Length - 1
        if. i = 0 then. return Arr
            loop:
               if(Parent := Floor((i - 1) / 2)): 
                if(i > 0 and Arr[Parent].Elo > Arr[i].Elo):
                    set Arr =  Swap(Arr, i, Parent)
                    set i = Parent
                else:
                    break
        if (Arr.Length > TopK):
          set Arr = HeapPop(Arr)            
        return Arr    
        
    HeapPop(arr: []Custom_Player_Rank):[]Custom_Player_Rank=
        var Arr : []Custom_Player_Rank = arr
        var n : int = Arr.Length
        if(n = 0):
            return Arr
        set Arr = Swap(Arr, 0, n - 1)
        if. Player := player[Arr[n - 1].Player] then. OnPlayerRemoved(Player)  else. Print("Failed to remove player") # Remove the player from the index map
        if. Sliced := Arr.Slice[0, n - 1] then. set Arr =  Sliced
        set Arr = MinHeapify(Arr, n - 1, 0)
        Print("Heappop Called")
       

        return Arr

    OnPlayerRemoved(PlayerLeaving : player):void=
        var NewMap : [player]int = map{}
        if(Player := player[PlayerLeaving]):
        for(Key -> Value : IndexMap, Key <> PlayerLeaving):
            set NewMap = ConcatenateMaps(NewMap, map{Key => Value})
        set IndexMap = NewMap     
        Print("Player Removed")

    SiftUp(arr: []Custom_Player_Rank, i: int): []Custom_Player_Rank= 
        var I: int = i
        var Arr: []Custom_Player_Rank = arr
        loop:
            if(I > 0):
              if( var Parent: int = Floor((I - 1) / 2)):
                if (Arr[Parent].Elo > Arr[I].Elo):
                   set Arr = Swap(Arr, I, Parent)
                   set I = Parent
                else: 
                    break
            else:
                break
        return Arr
         
    UpdateScore(CustomPlayer:Custom_Player_Rank, NewElo: int):void= 
         Player  := CustomPlayer.Player
        if (Contains := IndexMap[Player]):
           if( var index :int= IndexMap[Player],var OldElo :int= Leaderboard[index].Elo):
            
            if. set Leaderboard[index].Elo = NewElo
            if (NewElo < OldElo):
                set Leaderboard = SiftUp(Leaderboard, index)
            else:
                set Leaderboard = MinHeapify(Leaderboard, Leaderboard.Length, index)
        else: 
          Print("Player not in top 5")
          set Leaderboard = HeapPush(Leaderboard ,CustomPlayer, 5)
       

    InsertionSort(Array: []Custom_Player_Rank): []Custom_Player_Rank =
        var Arr : []Custom_Player_Rank = Array
             for (i := 1..Array.Length - 1):
              if( key := Arr[i]):
                var j :int= i - 1
                loop:
                   if(j >= 0 and Arr[j].Elo < key.Elo):
                       if. Temp:= Arr[j] then. if. set Arr[j + 1] = Temp
                       set j -= 1
                   else:
                       break
                if. set Arr[j + 1] = key        
             return Arr

    GetSortedTopK():[]Custom_Player_Rank=
        var SortedHeap : []Custom_Player_Rank = InsertionSort(Leaderboard)
        return SortedHeap
type or paste code here

I’ve tried multple things, like:

    OnPlayerLeft()<suspends>: void =
        loop:
            Sleep(0.0)
            PlayerRemoved := GetPlayspace().PlayerRemovedEvent().Await()
            if (Player := player[PlayerRemoved]):

but i can’t because it’s not inside a creative device class and i’m stuck inside this loop.
The problem is that the script doesn’t remove the player from the leaderboard when the player has left the game.