I know I can do that but 30 seconds is too short of a time.
You can use VCE loops for this to extend a relay counter infinitely. I have used this technique to increase a delay to a real-time day.
[0] [x] [0] [OnActivate] [Self] [VCE_ModVariable] [Brick] [Count] [Set] [0]
[1] [x] [0] [OnActivate] [Self] [FireRelay]
[2] [x] [1000] [OnRelay] [Self] [FireRelay]
This is the base for an infinitely continuing loop. It includes an original setting of the counting variable (below examples use Minute and Hour as counting variables), an original start for the Relay, and an OnRelay-FireRelay event.
[0] [x] [0] [OnActivate] [Self] [VCE_ModVariable] [Brick] [Count] [Set] [0]
[1] [x] [0] [OnActivate] [Self] [FireRelay]
[2] [x] [1000] [OnRelay] [Self] [FireRelay]
[3] [x] [0] [OnRelay] [Self] [VCE_IfVariable] [Minute] [==] [59] [4 6]
[4] [x] [0] [OnVariableFalse] [Self] [VCE_ModVariable] [Brick] [Minute] [Add] [1]
[5] [x] [0] [OnVariableTrue] [Self] [VCE_ModVariable] [Brick] [Minute] [Set] [0]
[6] [x] [0] [OnVariableTrue] [Self] [VCE_ModVariable] [Brick] [Hour] [Add] [1]
This is a basic snippet as an example from my current project. Every second, it adds 1 to the Minute variable (1 second in real life = 1 minute in blockland). If the Minute variable reaches 59, it adds 1 to the Hour variable and resets the Minute variable.
[3] [x] [0] [OnRelay] [Self] [VCE_IfVariable] [Minute] [==] [59] [4 6]
[4] [x] [0] [OnVariableFalse] [Self] [VCE_ModVariable] [Brick] [Minute] [Add] [1]
[5] [x] [0] [OnVariableTrue] [Self] [VCE_ModVariable] [Brick] [Minute] [Set] [0]
[6] [x] [0] [OnVariableTrue] [Self] [VCE_ModVariable] [Brick] [Hour] [Add] [1]
Use this bit for every different process you want your loop to carry out. It includes a check (line 3), a repeat if the check returns false (line 4), a reset if the check returns true (line 5), and a process if the check returns true (line 6 and everything else you want).
Basically, the good thing about this way is that it produces no lag and can go on forever.
As for a solution to your problem, you are going about this wrong. You can use VCE for this too (if you have it). If people are sent out to find bricks, they can click the brick, have a client variable representing that item set to 1 to indicate that have found it, then when the minigame is reset, they can click a brick (or use OnMinigameReset or OnMinigameSpawn) to check every variable on the client, and if any of those variables are set to 1, they get the item.
It would look like this.
On the found brick:
[0] [x] [0] [OnActivate] [Client] [VCE_IfVariable] [Gun] [==] [1] [1 3]
[1] [x] [0] [OnVariableFalse] [VCE_ModVariable] [Gun] [Set] [1]
[2] [x] [0] [OnVariableFalse] [Client] [CenterPrint] [You have found the Gun!]
[3] [x] [0] [OnVariableTrue] [Client] [CenterPrint] [You have already found the Gun]
On some random brick if you want the items to be given to the player when they spawn:
[0] [x] [0] [OnMinigameReset] [Client] [VCE_IfVariable] [Gun] [==] [1] [1 1]
[1] [x] [0] [OnVariableTrue] [Player] [AddItem] [Gun]
Repeat this for every item you want to have added.
or use this if you want the player to click something to get their items:
[0] [x] [0] [OnActivate] [Client] [VCE_IfVariable] [Gun] [==] [1] [1 1]
[1] [x] [0] [OnVariableTrue] [Player] [AddItem] [Gun]