For the every 30 seconds part you can either use a Timer event, which requires a variable, or the Periodic Interval event:
-
Events
-

Time - YourTimer expires
-
Events
-

Time - Every 30.00 seconds of game time
Both work fine. Timers have a bit more flexibility but it's not a big deal.
So now that our trigger has the correct Event, we simply need to Pick every unit in our "Build" Region and Create copies of them at our "Spawn" Region:
-
Spawn P1
-

Events
-


Time - Every 30.00 seconds of game time
-

Conditions
-

Actions
-


Set VariableSet TempGroup = (Units in P1Build <gen>)
-


Set VariableSet TempPoint = (Center of P1Spawn <gen>)
-


Unit Group - Pick every unit in TempGroup and do (Actions)
-



Loop - Actions
-




Unit - Create 1 (Unit-type of (Picked unit)) for Player 1 (Red) at TempPoint facing Default building facing degrees
-


Custom script: call DestroyGroup(udg_TempGroup)
-


Custom script: call RemoveLocation(udg_TempPoint)
The Variables/Custom script are there to help with
memory leaks. Doing this is basically "emptying your recycle bin", it's not necessary but it's recommended.
If your map has multiple Players I would recommend a more advanced approach that uses a similar method but takes advantage of Array variables to greatly improve the flexibility. The best thing you can learn early on is how to use an Array variable and how to use a Player's Number as the [index]. The earlier you start using this design pattern the easier, cleaner, and more efficient your triggers will be.
With that in mind, I would use a Player Group that contains all of my active Players, either a Timer array variable which gives each Player their own "Spawn Timer" or a single Timer variable that is shared, and two Region array variables which track each Player's Build and Spawn Regions. Having these variables will greatly improve all of your future triggers since you would now have access to this data at any time.
Here's an example of setting up your Region arrays:
-
Events
-

Map initialization
-
Actions
-

Set Variable BuildRegion[1] = P1Build <gen>
-

Set Variable BuildRegion[2] = P2Build <gen>
-

Set Variable BuildRegion[3] = P3Build <gen>
-

Set Variable SpawnRegion[1] = P1Spawn <gen>
-

Set Variable SpawnRegion[2] = P2Spawn <gen>
-

Set Variable SpawnRegion[3] = P3Spawn <gen>
Here's an example of using BuildRegion[]. This trigger would create a Paladin for each of our active Players at the Center of their Build Region:
-
Events
-

Time - Every 10.00 seconds of game time
-
Actions
-

Player Group - Pick every player in ActivePlayers and do (Actions)
-


Loop - Actions
-



Set Variable TempPoint = (Center of BuildRegion[(Player number of (Picked player))])
-



Unit - Create 1 Paladin for (Picked player) at TempPoint facing Default building facing degrees
-



Custom script: call RemoveLocation(udg_TempPoint)
ActivePlayers is a Player Group variable which would be Set to all of our Users that are actively playing the game. Player Groups are a great way of doing something for multiple Players all at once. Also, when a Player leaves the game you could Remove them from this Player Group. This allows you to easily manage what happens to each Player, for example, a Leaver wouldn't receive a Paladin in the above trigger.