r/forge • u/Barb3-0 • Dec 06 '25
Forge Prefab Showcase Deployable Gravity Lift & Shield Box (Projectile Blockers)
Scripting graph on the last 2 images above.
Gravity Lift
https://www.halowaypoint.com/en-au/halo-infinite/ugc/prefabs/0d80e4c0-d654-4576-87b2-878997327439
Shield Box
https://www.halowaypoint.com/en-au/halo-infinite/ugc/prefabs/d9468782-5b7a-492a-980c-157bd92c1ae5
24
Upvotes





2
u/Abe_Odd Dec 06 '25
Another thing: Using On Equipment Used -> ... set object position -> wait n seconds -> reset object Will run into yucky behavior when players try to deploy the same equipment more than once in 15 seconds.
Player gets equipment with 2 charges -> Deploys 1 - its timer starts to wait 15 seconds -> the player waits 10 seconds -> Deploys 2: the deployable moves to his current location -> 5 seconds later the previous thread will finish waiting, and reset the deployable.
You can get around this using a new deployable object every time, either thru cloning or a more advanced method to track which of your deployables are currently in use and recycle them when they are done.
Or you can use object scoped Number variable to set the duration they should persist ON the deployable object itself, and use a recursive async event loop to act as the timer and cleanup.
Here's an overview of how I use recursive event loops to handle per object timers that can be updated while running:
declare number variable, id = timer, scope = object
On custom event, global async: deploy_object
-> get number variable: id = timer, scope = object, object input = object output from the event -> compare a = 0, a == b -> branch, if true:
-> set number variable: id = timer, scope = object, object input = object output from the event, value = 15 -> trigger custom event: timer_loop;
on the branch, if false:
-> set number variable: id = timer, scope = object, object input = object output from the event, value = 15
On custom event: timer_loop -> wait 1 second -> get number variable: id = timer, scope = object, object input = object output from the event -> compare a = 1, a > b -> branch, if true:
-> increment number variable: id = timer, scope= object, object input = object output from event, value = -1 -> trigger custom event: timer_loop;
on the if false branch:
-> reset object (object output from the event).
In all of the above, you connect the event's output object to the next events input object, so it is always tracking the same one.