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.