Half Activating Trigger

jhnam95

Active Member
Reaction score
12
I tried making a stamina system like in Diablo and it works for the most part. But for some reason, it works half the time. When it's "walking" it gains the stamina properly but when it's "running" the trigger doesn't run. It doesn't run every .25 seconds as it should and it runs irregularly, sometimes triggering after 10 seconds and sometimes triggering 4 times (as it should) in a single second (those 2 values are the extremes though, and it's usually not like that. It's usually around twice each second).

I don't know what's wrong since half works perfectly and the other half runs very irregularly.

Here's the trigger. If unit toggles "run" on, then the boolean is set true and if it's set off, then the boolean sets false. The game messages were so I could tell how fast the trigger was running.

Trigger:
  • Stamina DrainRegen
    • Events
      • Time - Every 0.25 seconds of game time
    • Conditions
    • Actions
      • Do Multiple ActionsFor each (Integer A) from 1 to 10, do (Actions)
        • Loop - Actions
          • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Boolean_Running[(Integer A)] Equal to (==) True
              • Real_CurrentStamina[(Integer A)] Greater than (>) 0.00
            • Then - Actions
              • Set Point_StaminaA[(Integer A)] = (Position of Unit_PlayerHero[(Integer A)])
              • Wait 0.10 game-time seconds
              • Set Point_StaminaB[(Integer A)] = (Position of Unit_PlayerHero[(Integer A)])
                • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
                  • If - Conditions
                    • (Distance between Point_StaminaA[(Integer A)] and Point_StaminaB[(Integer A)]) Less than or equal to (<=) 150.00
                    • (Distance between Point_StaminaA[(Integer A)] and Point_StaminaB[(Integer A)]) Greater than (>) 0.00
                  • Then - Actions
                    • Set Real_CurrentStamina[(Integer A)] = (Real_CurrentStamina[(Integer A)] - Real_StaminaDrainRate[(Integer A)])
                    • Player - Set (Player((Integer A))) Food used to (Integer(Real_CurrentStamina[(Integer A)]))
                    • Player - Set (Player((Integer A))) Food cap to Integer_MaxStamina[(Integer A)]
                    • Game - Display to (Player group((Player((Integer A))))) the text: (String(Real_CurrentStamina[(Integer A)]))
                  • Else - Actions
                    • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
                      • If - Conditions
                        • Real_CurrentStamina[(Integer A)] Less than (<) (Real(Integer_MaxStamina[(Integer A)]))
                      • Then - Actions
                        • Set Real_CurrentStamina[(Integer A)] = (Real_CurrentStamina[(Integer A)] + Real_StaminaRegenRate[(Integer A)])
                      • Else - Actions
                    • Player - Set (Player((Integer A))) Food used to (Integer(Real_CurrentStamina[(Integer A)]))
                    • Player - Set (Player((Integer A))) Food cap to Integer_MaxStamina[(Integer A)]
                    • Game - Display to (Player group((Player((Integer A))))) the text: (String(Real_CurrentStamina[(Integer A)]))
            • Else - Actions
              • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Real_CurrentStamina[(Integer A)] Less than (<) (Real(Integer_MaxStamina[(Integer A)]))
                • Then - Actions
                  • Set Real_CurrentStamina[(Integer A)] = (Real_CurrentStamina[(Integer A)] + Real_StaminaRegenRate[(Integer A)])
                • Else - Actions
              • Player - Set (Player((Integer A))) Food used to (Integer(Real_CurrentStamina[(Integer A)]))
              • Player - Set (Player((Integer A))) Food cap to Integer_MaxStamina[(Integer A)]
              • Game - Display to (Player group((Player((Integer A))))) the text: (String(Real_CurrentStamina[(Integer A)]))
 

Bogrim

y hello thar
Reaction score
154
You have a wait action in the loop.

The loop uses a global variable (Integer A) to keep track of the loop's data. But this data can be overwritten during the wait since it's a global variable you're using. This is why it seems to run "irregular" because other triggers in your map (presumably even the same trigger) are interfering with your trigger.

I've written a tutorial on how to fix loops with waits here.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top