Calling a variables from a different class

I’m trying to make a game manger, that can handle player stats and call on them. I currently want to be able to trigger events based on Elimination/Kill Streaks eg. end game when agent gets 25 kill streak.

Can anyone explain how I could do this below is the code i’m working. The Stats work currently just don’t understand how to link them.

PlayerStats := class<unique>():
    
    var TotalEliminations : int = 0
    var TotalDeaths : int = 0 
    var CurrentDistance : int = 0
    var ElimStreak : int = 0

    AddCurrentStreak(c:int):void=
        set ElimStreak += c
    
    AddElimination(e:int):void=
        set TotalEliminations += e

    AddDeath(d:int):void=
        set TotalDeaths += d

    SetCurrentDistance (distance:int):void=
        set CurrentDistance = distance
        block:

    GetEliminationCount():int=
        return TotalEliminations

    GetDeathCount():int=
        return TotalDeaths
    
    GetElimStreak():int=
        return ElimStreak

    ResetElimStreak(c:int):void=
        set ElimStreak = 0

  
    
    

    
   
    
Game_Manager := class(creative_device):
    
    @editable
    Team1Spawner: player_spawner_device = player_spawner_device{}

    @editable
    Team2Spawner: player_spawner_device = player_spawner_device{}

    @editable
    var Sentries : []sentry_device = array{}

    @editable
    StatsButton:button_device = button_device{}



    var AllPlayersMap : [player]PlayerStats = map {}

    OnBegin<override>()<suspends>:void=
        Team1Spawner.SpawnedEvent.Subscribe(OnPlayerAdded)
        Team2Spawner.SpawnedEvent.Subscribe(OnPlayerAdded)
        GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)

        for (Sentry : Sentries):
            Sentry.EliminatedEvent.Subscribe(TestPlayerEliminated)
     
        StatsButton.InteractedWithEvent.Subscribe(OnButtonClick)

    OnButtonClick(Agent:agent):void=
        Print("Click")

        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print ("Current Streak{AgentStats.GetElimStreak()}")



    OnPlayerAdded(NewPlayer:agent):void=
        Print("new Player Added")
        if(PlayerOBJ := player[NewPlayer]):
            if(PlayerExist := AllPlayersMap[NewPlayer]):
            else:
                if(set AllPlayersMap[PlayerOBJ] = PlayerStats{}):
                    Print("Stats Set Up")
                    if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                        Print("My Elims: {AgentStats.GetEliminationCount()}")

                if (FortChar: fort_character := NewPlayer.GetFortCharacter[]):
                    FortChar.EliminatedEvent().Subscribe(OnEliminted)


    OnEliminted(Result:elimination_result):void=
        Eliminator := Result.EliminatingCharacter
        Eliminated := Result.EliminatedCharacter
        if (FortCharacter := Eliminator?, EliminatorAgent := FortCharacter.GetAgent[]):
            AddElimination(EliminatorAgent)
            AddCurrentStreak(EliminatorAgent)
            CheckElimStreak(EliminatorAgent)
        

        if (FortCharacter := Eliminated, EliminatedAgent := FortCharacter.GetAgent[]):
            AddDeath(EliminatedAgent)
            ResetElimStreak(EliminatedAgent)
    
    TestPlayerEliminated(Agent: ?agent) : void =
        Print("Sentry Down!")
        if(PlayerOBJ := Agent?):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                AddCurrentStreak(PlayerOBJ)
                CheckElimStreak(PlayerOBJ)
                Print("Streak {AgentStats.GetEliminationCount()}")


    AddElimination(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("+ Elimination")
                AgentStats.AddElimination(1)

    AddDeath(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("+ Death")
                AgentStats.AddDeath(1)
            
    AddCurrentStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("Streak {AgentStats.GetElimStreak()} ")
                AgentStats.AddCurrentStreak(1)
   
    ResetElimStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("Streak Reset")
                AgentStats.ResetElimStreak

    GetElimStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                AgentStats.GetElimStreak
                if (GetElimStreak )

    CheckElimStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                AgentStats.
                

    
    
    OnPlayerRemoved(OutPlayer:player):void=
        if(ActualPlayer := AllPlayersMap[OutPlayer]):
            var TempAllPlayersMap:[player]PlayerStats = map{}
            for (Key -> Value : AllPlayersMap, Key <> OutPlayer):
                set TempAllPlayersMap = ConcatenateMaps(TempAllPlayersMap, map{Key => Value})

            set AllPlayersMap = TempAllPlayersMap

idk if this is what you meant but for get, Reset and check ElimStreak i have made some changes.

For reset you forgot the () on AgentStats.ResetElimStreak() and forgot to remove the input in ResetElimStreak(). No reason to input a int when we always has to set it to 0.

for GetElimStreak you forgot AgentStats.GetElimStreak() and for it to return a int value.

for CheckElimStreak() i made it so when its called to check to see if the Player has a streak that matches one of the expressions. So if PlayerStreak = 5 it would run 5 => code. for now it just prints. if the streak dont match one of the expressions it runs _=> Print(“Not matching streak”). If you want to end game on 25 streak you can just delete the other exepts _=> and instead of printing 25 streak you can call a function like EndGame().

For linking between 2 classes you have this code if(PlayerOBJ := player[Agent], AgentStats:= AllPlayersMap[PlayerOBJ]): where you first check if the Agent is a player and then set the player in as key in the AllPlayersMap map. Map works as you put in a key and it return a value. so for AllPlayersMap you get the class PlayerStats as the value. then you just need to do as you did by typing the class variable name with a dot after and then the function you want to use in the class. so ClassVaribleName.FunctionInTheClass()

PlayerStats := class<unique>():
    
    var TotalEliminations : int = 0
    var TotalDeaths : int = 0 
    var CurrentDistance : int = 0
    var ElimStreak : int = 0

    AddCurrentStreak(c:int):void=
        set ElimStreak += c
    
    AddElimination(e:int):void=
        set TotalEliminations += e

    AddDeath(d:int):void=
        set TotalDeaths += d

    SetCurrentDistance (distance:int):void=
        set CurrentDistance = distance
      

    GetEliminationCount():int=
        return TotalEliminations

    GetDeathCount():int=
        return TotalDeaths
    
    GetElimStreak():int=
        return ElimStreak

    ResetElimStreak():void=
        set ElimStreak = 0

    
   
    
Game_Manager := class(creative_device):
    
    @editable
    Team1Spawner: player_spawner_device = player_spawner_device{}

    @editable
    Team2Spawner: player_spawner_device = player_spawner_device{}

    @editable
    var Sentries : []sentry_device = array{}

    @editable
    StatsButton:button_device = button_device{}



    var AllPlayersMap : [player]PlayerStats = map {}

    OnBegin<override>()<suspends>:void=
        Team1Spawner.SpawnedEvent.Subscribe(OnPlayerAdded)
        Team2Spawner.SpawnedEvent.Subscribe(OnPlayerAdded)
        GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)

        for (Sentry : Sentries):
            Sentry.EliminatedEvent.Subscribe(TestPlayerEliminated)
     
        StatsButton.InteractedWithEvent.Subscribe(OnButtonClick)

    OnButtonClick(Agent:agent):void=
        Print("Click")

        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print ("Current Streak{AgentStats.GetElimStreak()}")



    OnPlayerAdded(NewPlayer:agent):void=
        Print("new Player Added")
        if(PlayerOBJ := player[NewPlayer]):
            if(PlayerExist := AllPlayersMap[NewPlayer]):
            else:
                if(set AllPlayersMap[PlayerOBJ] = PlayerStats{}):
                    Print("Stats Set Up")
                    if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                        Print("My Elims: {AgentStats.GetEliminationCount()}")

                if (FortChar: fort_character := NewPlayer.GetFortCharacter[]):
                    FortChar.EliminatedEvent().Subscribe(OnEliminted)


    OnEliminted(Result:elimination_result):void=
        Eliminator := Result.EliminatingCharacter
        Eliminated := Result.EliminatedCharacter
        if (FortCharacter := Eliminator?, EliminatorAgent := FortCharacter.GetAgent[]):
            AddElimination(EliminatorAgent)
            AddCurrentStreak(EliminatorAgent)
            CheckElimStreak(EliminatorAgent)
        

        if (FortCharacter := Eliminated, EliminatedAgent := FortCharacter.GetAgent[]):
            AddDeath(EliminatedAgent)
            ResetElimStreak(EliminatedAgent)
    
    TestPlayerEliminated(Agent: ?agent) : void =
        Print("Sentry Down!")
        if(PlayerOBJ := Agent?):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                AddCurrentStreak(PlayerOBJ)
                CheckElimStreak(PlayerOBJ)
                Print("Streak {AgentStats.GetEliminationCount()}")


    AddElimination(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("+ Elimination")
                AgentStats.AddElimination(1)

    AddDeath(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("+ Death")
                AgentStats.AddDeath(1)
            
    AddCurrentStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("Streak {AgentStats.GetElimStreak()} ")
                AgentStats.AddCurrentStreak(1)
   
    ResetElimStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent]):
            if(AgentStats:= AllPlayersMap[PlayerOBJ]):
                Print("Streak Reset")
                AgentStats.ResetElimStreak()

    GetElimStreak(Agent:agent):int=
        if(PlayerOBJ := player[Agent], AgentStats:= AllPlayersMap[PlayerOBJ]):
            AgentStats.GetElimStreak() # Returns the current Elimination Streak.
        else:
            Err("Not Found") # Returns an error if the player is not found and stops the code.
                
    CheckElimStreak(Agent:agent):void=
        if(PlayerOBJ := player[Agent], AgentStats:= AllPlayersMap[PlayerOBJ]):
            PlayerStreak := AgentStats.GetElimStreak()
            # Check PlayerStreak and if it is one of the following it prints the message. Can change to do what ever.
            case(PlayerStreak):
                5 => Print("5 Elim Streak")
                10 => Print("10 Elim Streak")
                15 => Print("15 Elim Streak")
                20 => Print("20 Elim Streak")
                25 => Print("25 Elim Streak")
                _ => Print("No matching streak")

        
    OnPlayerRemoved(OutPlayer:player):void=
        if(ActualPlayer := AllPlayersMap[OutPlayer]):
            var TempAllPlayersMap:[player]PlayerStats = map{}
            for (Key -> Value : AllPlayersMap, Key <> OutPlayer):
                set TempAllPlayersMap = ConcatenateMaps(TempAllPlayersMap, map{Key => Value})

            set AllPlayersMap = TempAllPlayersMap
3 Likes

Thanks so much, I come from the VFX side code isn’t my strong point !!