Coding Error With ?agent

I’m trying to write code for a game where random minigames trigger during the round, but I’m getting the following error:
(52,60, 52,71) : Script error 3509: This function parameter expects a value of type ?agent->void, but this argument is an incompatible value of type type{_():void}.

I don’t need an agent for the trigger devices, I use them to activate the minigames, which is for the same for all players.
This is my code:

using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }

# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.

# A Verse-authored creative device that can be placed in a level
minigame_zonewars_device := class(creative_device):

    @editable
    TimedObjectiveIsCompleted:trigger_device=trigger_device{}
    @editable
    Minigame1:trigger_device=trigger_device{}
    @editable
    Minigame2:trigger_device=trigger_device{}
    @editable
    Minigame3:trigger_device=trigger_device{}
    @editable
    Minigame4:trigger_device=trigger_device{}
    @editable
    Minigame5:trigger_device=trigger_device{}
    @editable
    Minigame6:trigger_device=trigger_device{}
    @editable
    Minigame7:trigger_device=trigger_device{}
    @editable
    Minigame8:trigger_device=trigger_device{}
    @editable
    Minigame9:trigger_device=trigger_device{}
    @editable
    Minigame10:trigger_device=trigger_device{}
    @editable
    Minigame11:trigger_device=trigger_device{}
    @editable
    Minigame12:trigger_device=trigger_device{}
    @editable
    Minigame13:trigger_device=trigger_device{}
    @editable
    Minigame14:trigger_device=trigger_device{}
    @editable
    Minigame15:trigger_device=trigger_device{}
    @editable
    Minigame16:trigger_device=trigger_device{}


        
    # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=
        TimedObjectiveIsCompleted.TriggeredEvent.Subscribe(OnTriggered)
    
    OnTriggered()<suspends>:void=
        loop:
            var Minigame:int = GetRandomInt(1, 16)
            Print("Current minigame is {Minigame}")

            if (Minigame = 1):
                Minigame1.Trigger()
            else if (Minigame = 2):
                Minigame2.Trigger()
            else if (Minigame = 3):
                Minigame3.Trigger()
            else if (Minigame = 4):
                Minigame4.Trigger()
            else if (Minigame = 5):
                Minigame5.Trigger()
            else if (Minigame = 6):
                Minigame6.Trigger()
            else if (Minigame = 7):
                Minigame7.Trigger()
            else if (Minigame = 8):
                Minigame8.Trigger()
            else if (Minigame = 9):
                Minigame9.Trigger()
            else if (Minigame = 10):
                Minigame10.Trigger()
            else if (Minigame = 11):
                Minigame11.Trigger()
            else if (Minigame = 12):
                Minigame12.Trigger()
            else if (Minigame = 13):
                Minigame13.Trigger()
            else if (Minigame = 14):
                Minigame14.Trigger()
            else if (Minigame = 15):
                Minigame15.Trigger()
            else if (Minigame = 16):
                Minigame16.Trigger()
            break
    

Hey, is the loop in your triggered event needed? That would be making the code in that function run repeatedly rather than fire once to activate the trigger device.

It seems like you might want a script like this:

using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation }
using { /Verse.org/Random }
using { /UnrealEngine.com/Temporary/Diagnostics }


minigame_zonewars_device := class(creative_device):

    @editable
    TimedObjectiveIsCompleted:trigger_device=trigger_device{}

    @editable
    MinigameTriggers: []trigger_device = array{}
 

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

        TimedObjectiveIsCompleted.TriggeredEvent.Subscribe(OnTriggered)

    
    OnTriggered(MaybeAgent: ?agent):void=

        var MinigameIndex: int = GetRandomInt(0, MinigameTriggers.Length-1)

        Print("Current minigame is {MinigameIndex}")

        # Get the random minigame trigger from array
        if (RandomMinigameTrigger := MinigameTriggers[MinigameIndex])
        then. RandomMinigameTrigger.Trigger()

This worked! Thank you so much. Do you happen to know when loops should be used? For example, in this game 2 timer devices repeatedly switch eachother on and off. So when one completes, the other turns on, and vice versa

You’re welcome, glad it’s a help. Loops can be used in a range of ways in both a synchronous and asynchronous context. Basically all it does is say this code block will run repeatedly until a break or return is hit in the code. For the timer scenario you described, it sounds like you could do it with event handler functions similar to above and likely doesn’t need a loop.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.