Brauche Hilfe, Speicherabrechnung geht nicht wegen RankSystem..


Ich habe einen RankSystem und immer wenn ich das benutzen will kommt das hier, Kann mir bitte jemand helfen versuche schon seid Tagen das zu Fixen … brauche jemand der sich auskennt :slight_smile:

Das ist der Code :
using { /Fortnite.com/UI }

using { /Fortnite.com/Devices }

using { /Fortnite.com/Characters }

using { /Fortnite.com/Game }

using { /Verse.org/Simulation }

using { /Verse.org/Colors }

using { /Verse.org/Assets }

using { /Verse.org/Simulation/Tags }

using { /UnrealEngine.com/Temporary/UI }

using { /UnrealEngine.com/Temporary/Diagnostics }

using { /UnrealEngine.com/Temporary/SpatialMath }

using { AllRanks }

var PlayerStatsMap : weak_map(player, CustomPlayer) = map{}

CustomPlayer := class():

#This is old VVV, do not use

PlayerKills : int = 0

PlayerDeaths : int = 0

PlayerPoints : int = 0

PlayerRank : int = 0

#----------#

#This is old VVV, do not use

NewPlayerKills : int = 0

NewPlayerDeaths : int = 0

NewPlayerPoints : int = 0

NewPlayerRank : int = 0



#----------#  

New1PlayerKills : int = 0

New1PlayerDeaths : int = 0

New1PlayerPoints : int = 0

New1PlayerRank : int = 0

UpdatePlayerStats(New1PlayerKills : int, New1PlayerDeaths:int, New1PlayerPoints:int, New1PlayerRank :int):= CustomPlayer:

New1PlayerKills :=  New1PlayerKills

New1PlayerDeaths := New1PlayerDeaths

New1PlayerPoints := New1PlayerPoints

New1PlayerRank := New1PlayerRank

RankManager := class(creative_device):

@editable PlayerSpawners : \[\]player_spawner_device = array{}

@editable ElimManager : elimination_manager_device = elimination_manager_device{}

@editable GuardSpawner : guard_spawner_device = guard_spawner_device{}

@editable PointsPerKill : int = 5

@editable MinusPointsPerDeath : int = 3

@editable Settings : RankSettings = RankSettings{}



var Players : \[\]player = array{}



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

    set Players = GetPlayspace().GetPlayers()

    InitPlayerManager()

    InitUI()

    Init()

    ElimManager.EliminatedEvent.Subscribe(OnPlayerSpawn)

    ElimManager.EliminationEvent.Subscribe(MaybePlayerSpawn)

    for ( PlayerSpawner : PlayerSpawners): 

        PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn)

    

    spawn{GuardLoop()} 

    Update()



InitPlayerManager():void=

    for(Player:Players):

        InitPlayerStats(Player)



InitPlayerStats(Player:player):void=

    if(PlayerStatsMap\[Player\]):

        Print("Stats Exist")

    else:

        if(set PlayerStatsMap\[Player\] = CustomPlayer{}):

            Print("New Player stats were created")



GetPlayerStats(Player:player):CustomPlayer = 

    PlayerStatsMap\[Player\] or CustomPlayer{}



UpdateStats(Player:player, New1Kills:int, New1Deaths:int, New1Points:int, New1Rank:int):CustomPlayer=

    UpdatedStats := UpdatePlayerStats(New1Kills, New1Deaths, New1Points, New1Rank)

    if ( set PlayerStatsMap\[Player\] = UpdatedStats):

        Print("Updated player stats!")

        Print("Eliminations • {UpdatedStats.New1PlayerKills}")

        Print("Deaths  •  {UpdatedStats.New1PlayerDeaths}")

        Print("Points  • {UpdatedStats.New1PlayerPoints}")

        Print("Rank  • {UpdatedStats.New1PlayerRank}")

        

    return UpdatedStats





Init():void=

    for(Player:Players):

        InitPlayerRank(Player)



GuardLoop()<suspends> : void =

    loop:

        A := GuardSpawner.SpawnedEvent.Await()

        if ( F := A.GetFortCharacter\[\]):

            spawn{AwaitElimi(F)}




OnPlayerSpawn(Agent:agent):void=

    if ( FortCharacter := Agent.GetFortCharacter\[\]):

        spawn{AwaitElimi(FortCharacter)}



AwaitElimi(FortCharacter : fort_character)<suspends>: void=

    Result := FortCharacter.EliminatedEvent().Await()

    OnEliminaion(Result)



MaybePlayerSpawn(MaybeAgent:?agent):void=

    if(Agent := MaybeAgent?):

        if ( FortCharacter := Agent.GetFortCharacter\[\]):

            spawn{AwaitElimi(FortCharacter)}



Update()<suspends> : void=

    sync:

        loop:

            Player := GetPlayspace().PlayerAddedEvent().Await()

            if ( not Players.Find\[Player\]):

                set Players += array{Player}

                InitPlayerStats(Player)

                InitPlayerUI(Player)

                InitPlayerRank(Player)

        loop:

            Player := GetPlayspace().PlayerRemovedEvent().Await()

            set Players = for (CurrentPlayer : Players, CurrentPlayer <> Player) {CurrentPlayer}



InitPlayerRank(Player:player):void=

    InitRankUI(Player, GetPlayerStats(Player),Settings)



OnEliminaion(ElimResult : elimination_result):void=

    EliminatedCharacter := ElimResult.EliminatedCharacter

    MaybeEliminatingCharacter := ElimResult.EliminatingCharacter

    if(Player := player\[EliminatedCharacter.GetAgent\[\]\]):

        UpdateEliminatedPlayerStats(Player)



    if:

        EliminatingCharacter := MaybeEliminatingCharacter?

        EliminatingCharacter <> EliminatedCharacter

        Agent := EliminatingCharacter.GetAgent\[\]

        Player := player\[Agent\]

    then:

        UpdateEliminatingPlayerStats(Player)



UpdateEliminatingPlayerStats(Player:player):void=

    PlayerStats := GetPlayerStats(Player)

    NewKills := PlayerStats.New1PlayerKills + 1

    NewDeaths := PlayerStats.New1PlayerDeaths

    NewPoints := PlayerStats.New1PlayerPoints + PointsPerKill

    NewRank := CountPlayerRankUp(PlayerStats, NewPoints)

    NewStats := UpdateStats(Player, NewKills, NewDeaths, NewPoints, NewRank)

    if ( NewStats.New1PlayerRank <> PlayerStats.New1PlayerRank):

        UpdateRank(Player, NewStats, Settings)

    else:

        UpdateProgress(Player, NewStats, Settings)



UpdateEliminatedPlayerStats(Player:player):void=

    PlayerStats := GetPlayerStats(Player)

    NewPoints := PlayerStats.New1PlayerPoints - MinusPointsPerDeath >= 0 and PlayerStats.New1PlayerPoints - MinusPointsPerDeath or 0

    NewKills := PlayerStats.New1PlayerKills

    NewDeaths := PlayerStats.New1PlayerDeaths + 1

    NewRank := CountPlayerRankDown(PlayerStats, NewPoints)

    NewStats := UpdateStats(Player, NewKills, NewDeaths, NewPoints, NewRank)

    if ( NewStats.New1PlayerRank <> PlayerStats.New1PlayerRank):

        UpdateRank(Player, NewStats, Settings)

    else:

        UpdateProgress(Player, NewStats, Settings)



CountPlayerRankUp(OldStats : CustomPlayer, NewPoints : int):int=

    CurrentRankIndex := OldStats.New1PlayerRank

    if( NextRank := Settings.RankTypes\[CurrentRankIndex + 1\]):

        if( NewPoints >= NextRank.PointsForRank):

            return CurrentRankIndex + 1

    return CurrentRankIndex



CountPlayerRankDown(OldStats : CustomPlayer, NewPoints : int):int=

    CurrentRankIndex := OldStats.New1PlayerRank

    if(CurrentRank := Settings.RankTypes\[CurrentRankIndex\]):

        if( NewPoints < CurrentRank.PointsForRank):

            return CurrentRankIndex - 1

    CurrentRankIndex



var PlayerWidgetsMap : \[player\]PlayerWidget = map{}



InitUI():void=

    for ( Player : Players):

        InitPlayerUI(Player)



InitPlayerUI(Player : player):void=

    Canvas : canvas = canvas{}

    ProgressBar : CustomProgressBar = CustomProgressBar:

        Width := 175.0

        Heigth := 19.0

    ProgressBar.Init()

    CanvasSlot := canvas_slot:

        Widget := ProgressBar.GetRootWidget()

        Anchors := anchors{Minimum := vector2{X:= 0.0, Y:= 1.0}, Maximum := vector2{X:=0.0, Y:=1.0}}

        Offsets := margin{Left:=45.0, Top := -500.0}

    Canvas.AddWidget(CanvasSlot)

    PlayerWidgets := PlayerWidget:

        Canvas := Canvas

        ProgressBar := ProgressBar



    if( set PlayerWidgetsMap \[Player\] = PlayerWidgets, PlayerUI := GetPlayerUI\[Player\]):

        PlayerUI.AddWidget(Canvas)



InitRankUI(Player : player, Custom_Player : CustomPlayer, Rank_Settings : RankSettings): void=

    UpdateRank(Player, Custom_Player, Rank_Settings)



UpdateRank(Player : player, Custom_Player : CustomPlayer, Rank_Settings : RankSettings):void=

    RankIndex := Custom_Player.New1PlayerRank

    if (Widgets := PlayerWidgetsMap\[Player\], NewRank1 := Rank_Settings.RankTypes\[RankIndex\], Image:= Rank_Settings.Images\[RankIndex\]):

        Widgets.ProgressBar.SetForegroundColor(NewRank1.ForegroundColor)

        Widgets.ProgressBar.SetBackgroundColor(NewRank1.BackgroundColor)

        Widgets.ProgressBar.SetRankText(NewRank1.Name)

        Widgets.ProgressBar.SetImage(Image, vector2{X:= 540.0, Y:=500.0})

        UpdateProgress(Player, Custom_Player, Rank_Settings)



UpdateProgress(Player : player, Custom_Player : CustomPlayer, Rank_Settings : RankSettings): void = 

    RankIndex := Custom_Player.New1PlayerRank

    if(Widgets := PlayerWidgetsMap\[Player\], CurrentRank := Rank_Settings.RankTypes\[RankIndex\]):

        if( NextRank := Rank_Settings.RankTypes\[RankIndex +1\]):

            Progress := 1.0\* (Custom_Player.New1PlayerPoints - CurrentRank.PointsForRank) / (1.0\* (NextRank.PointsForRank - CurrentRank.PointsForRank))

            if(Rank_Settings.PointsVisible = true):

                ProgressText := "{Custom_Player.New1PlayerPoints}/{NextRank.PointsForRank}"

                Widgets.ProgressBar.SetProgress(Progress, ProgressText)

            else:

                Widgets.ProgressBar.SetProgress(Progress , "")

        else:

            Progress := 1.0

            if(Rank_Settings.PointsVisible = true):

                ProgressText := "{Custom_Player.New1PlayerPoints}"

                Widgets.ProgressBar.SetProgress(Progress, ProgressText)

            else:

                Widgets.ProgressBar.SetProgress(Progress , "")

PlayerWidget := struct:

Canvas : canvas

ProgressBar : CustomProgressBar

CustomProgressBar := class:

Width : float

Heigth : float



RankTextureBlock : texture_block = texture_block{DefaultImage := AllRanks.Unranked}

ColorBlockForeground : color_block = color_block{}

ColorBlockBackground : color_block = color_block{}

RankTextBlock : text_block = text_block{DefaultTextColor := NamedColors.White}

ProgressTextBlock : text_block = text_block{DefaultTextColor := NamedColors.White}



var RootWidget : widget = color_block{}



Init():void=

    ColorBlockForeground.SetDesiredSize(vector2{X:=Width,Y:=Heigth})

    ColorBlockBackground.SetDesiredSize(vector2{X:=Width,Y:=Heigth})

    set RootWidget = overlay:

        Slots := array:

            overlay_slot:

                Widget := RankTextureBlock

                HorizontalAlignment := horizontal_alignment.Center

                Padding := margin{Right := 20.0, Top := -32.0}

            overlay_slot:

                Widget := stack_box:

                    Orientation := orientation.Vertical

                    Slots := array:

                        stack_box_slot:

                            Widget := overlay:

                                Slots := array:

                                    overlay_slot:

                                        Widget := ColorBlockBackground

                                        HorizontalAlignment := horizontal_alignment.Left

                                    overlay_slot:

                                        Widget := ColorBlockForeground

                                        HorizontalAlignment := horizontal_alignment.Left

                                    overlay_slot:

                                        Widget := ProgressTextBlock

                                        HorizontalAlignment := horizontal_alignment.Center



SetProgress(InProgress : float, ProgressText : string) : void= 

    var NewProgress : float = 0.0

    if ( InProgress > 1.0) then set NewProgress = 1.0

    else if( InProgress < 0.0) then set NewProgress = 0.0

    else set NewProgress = InProgress



    NewWidth := NewProgress \* Width

    ColorBlockForeground.SetDesiredSize(vector2{X:= NewWidth, Y := Heigth})

    SetProgressText(ProgressText)

                                    

GetRootWidget(): widget = RootWidget 

SetForegroundColor(Color : color):void= ColorBlockForeground.SetColor(Color)

SetBackgroundColor(Color : color):void= ColorBlockBackground.SetColor(Color)

SetRankText(String : string):void = RankTextBlock.SetText(StringToMessage(String))

SetProgressText(String : string):void= ProgressTextBlock.SetText(StringToMessage(String))

SetImage(NewImage :texture, NewSize : vector2):void=

    RankTextureBlock.SetImage(NewImage)

    RankTextureBlock.SetDesiredSize(NewSize)

AgentToMessage(Agent:agent):message=“{Agent}”

FloatToMessage(String : string,Float : float):message=“{String}{Float}”

IntToMessage(String : string, Integer : int):message=“{String}{Integer}”

StringsToMessage(String1 : string, String2 : string):message = “{String1}{String2}”

StringToMessage(String : string):message= “{String}”

Rank := class:

@editable Name : string = "Rank Name"

@editable PointsForRank : int = 0

@editable ForegroundColor : color = color{}

@editable BackgroundColor : color = color{}

RankSettings := class:

@editable PointsVisible : logic = false

@editable RankTypes : \[\]Rank = array{}

Images :\[\]texture = array:

    \# Change the names to your rank images names

    AllRanks.Unranked

    AllRanks.Bronze1

    AllRanks.Bronze2

    AllRanks.Bronze3

    AllRanks.Silver1

    AllRanks.Silver2

    AllRanks.Silver3

    AllRanks.Gold1

    AllRanks.Gold2

    AllRanks.Gold3

    AllRanks.Plat1

    AllRanks.Plat2

    AllRanks.Plat3

    AllRanks.Diamond1

    AllRanks.Diamond2

    AllRanks.Diamond3

    AllRanks.Elite

    AllRanks.Champion

    AllRanks.Unreal

AllRanks := module: