• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Is my de-index wrong?

Status
Not open for further replies.
Level 37
Joined
Jul 22, 2015
Messages
3,485
Well I've been stuck on this problem for over a week. I've bugged enough people through messages and just figured to let everyone know what's going on... for whatever reason in the SP Loop, CurrentIndex is being set to 0 even though MaxIndex is still at 1 (I know this through the messages I have it displaying). Anyone know whats going on? There are 2 other triggers that I felt were irrelevant to this (Config & Death), if you need them, please let me know and I'll update my post.

  • SP Init
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to SP_Ability
    • Actions
      • Set SP_Target = (Target unit of ability being cast)
      • -------- ---------------------------------------------------- --------
      • -------- checking if target is already infected --------
      • -------- if so, do not continue spell --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SP_Target is in SP_InfectedGroup) Equal to False
        • Then - Actions
          • -------- ---------------------------------------------------------------------- --------
          • -------- setting the current instance of spell variables --------
          • Set SP_MaxIndex = (SP_MaxIndex + 1)
          • Set SP_Caster[SP_MaxIndex] = (Triggering unit)
          • Set SP_TargetTest[SP_MaxIndex] = (Target unit of ability being cast)
          • Set SP_Player[SP_MaxIndex] = (Owner of SP_Caster[SP_MaxIndex])
          • Set SP_AbilityLevel[SP_MaxIndex] = (Level of SP_Ability for SP_Caster[SP_MaxIndex])
          • Set SP_Counter[SP_MaxIndex] = 0.00
          • -------- ---------------------------------------------------------------------------------------------------------------------------- --------
          • -------- adding unit to global infection group --------
          • -------- SP_Infected ensures that a unit cannot have more than 1 infection on at a time --------
          • -------- ------------------------------------------------------------------------------------------------------------ --------
          • -------- creating local group variables and adding targeted unit to SP_Group --------
          • -------- SP_Group are units infected by the target of the current instance --------
          • Custom script: if udg_SP_Group[udg_SP_MaxIndex] == null then
          • Custom script: set udg_SP_Group[udg_SP_MaxIndex] = CreateGroup()
          • Custom script: endif
          • Unit Group - Add SP_TargetTest[SP_MaxIndex] to SP_Group[SP_MaxIndex]
          • Unit Group - Add SP_TargetTest[SP_MaxIndex] to SP_InfectedGroup
          • -------- ------------------------------------------------- --------
          • -------- showing infect SFX --------
          • -------- adding movement speed ability --------
          • Special Effect - Create a special effect attached to the SP_InfectSFX_AP of SP_TargetTest[SP_MaxIndex] using SP_InfectSFX
          • Special Effect - Destroy (Last created special effect)
          • Unit - Add SP_AbilityMSFactor to SP_TargetTest[SP_MaxIndex]
          • -------- ------------------------------------------------------------------------ --------
          • -------- checking if user wants to change color of units --------
          • -------- if not, skip this nest --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • SP_ChangeColor Equal to True
            • Then - Actions
              • Animation - Change SP_TargetTest[SP_MaxIndex]'s vertex coloring to (SP_Red%, SP_Green%, SP_Blue%) with 0.00% transparency
            • Else - Actions
              • -------- //////////////////// --------
          • -------- --------------------------------------------------------- --------
          • -------- check if there is an instance running --------
          • -------- if so, turning on loop --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • SP_MaxIndex Equal to 1
            • Then - Actions
              • Trigger - Turn on SP Loop <gen>
            • Else - Actions
              • -------- //////////////////// --------
        • Else - Actions
          • -------- ------------------------------------------------------------------------------------------------------------------------ --------
          • -------- simulates an ingame error message if caster is trying to infect an infected unit --------
          • Custom script: call SimError(GetTriggerPlayer(), "That unit is already infected.")
  • SP Loop
    • Events
      • Time - Every 0.50 seconds of game time
    • Conditions
    • Actions
      • For each (Integer SP_CurrentIndex) from 1 to SP_MaxIndex, do (Actions)
        • Loop - Actions
          • -------- ------------------------------------------------------------------------- --------
          • -------- counting number of units in the group instance --------
          • Set SP_GroupCount[SP_CurrentIndex] = (Number of units in SP_Group[SP_CurrentIndex])
          • Unit Group - Pick every unit in SP_Group[SP_CurrentIndex] and do (Actions)
            • Loop - Actions
              • Set SP_PickedUnitG = (Picked unit)
              • Set SP_PickedUnitGLoc = (Position of SP_PickedUnitG)
              • -------- ----------------------------------------------------- --------
              • -------- looking for potential units to infect --------
              • Set SP_CheckGroup = (Units within SP_InfectRange of SP_PickedUnitGLoc)
              • Unit Group - Pick every unit in SP_CheckGroup and do (Actions)
                • Loop - Actions
                  • Set SP_PickedUnitCG = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (SP_PickedUnitCG is alive) Equal to True
                      • (SP_PickedUnitCG is in SP_InfectedGroup) Equal to False
                      • (SP_PickedUnitCG belongs to an enemy of SP_Player[SP_CurrentIndex]) Equal to True
                      • (SP_PickedUnitCG is Magic Immune) Equal to False
                      • (SP_PickedUnitCG is A structure) Equal to False
                      • (SP_PickedUnitCG is Mechanical) Equal to False
                    • Then - Actions
                      • -------- -------------------------------------------------------------------------------------------- --------
                      • -------- checking if user wants to set a max infected unit limit or not --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • Or - Any (Conditions) are true
                            • Conditions
                              • SP_InfectionLimit Equal to False
                              • And - All (Conditions) are true
                                • Conditions
                                  • SP_InfectionLimit Equal to True
                                  • SP_GroupCount[SP_CurrentIndex] Less than SP_MaxInfect[SP_AbilityLevel[SP_CurrentIndex]]
                        • Then - Actions
                          • Unit Group - Add SP_PickedUnitCG to SP_Group[SP_CurrentIndex]
                          • Unit Group - Add SP_PickedUnitCG to SP_InfectedGroup
                          • Unit - Add SP_AbilityMSFactor to SP_PickedUnitCG
                          • Special Effect - Create a special effect attached to the SP_InfectSFX_AP of SP_PickedUnitCG using SP_InfectSFX
                          • Special Effect - Destroy (Last created special effect)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • SP_ChangeColor Equal to True
                            • Then - Actions
                              • Animation - Change SP_PickedUnitCG's vertex coloring to (SP_Red%, SP_Green%, SP_Blue%) with 0.00% transparency
                            • Else - Actions
                              • -------- //////////////////// --------
                        • Else - Actions
                          • -------- //////////////////// --------
                    • Else - Actions
                      • -------- //////////////////// --------
          • -------- ----------------------- --------
          • -------- removing leaks --------
          • Custom script: call RemoveLocation (udg_SP_PickedUnitGLoc)
          • Custom script: call DestroyGroup (udg_SP_CheckGroup)
          • -------- ----------------------------------------------------------------------------------------------------------- --------
          • -------- adding 0.50 seconds to the duration of the spell until it hits max duration --------
          • Set SP_Counter[SP_CurrentIndex] = (SP_Counter[SP_CurrentIndex] + 0.50)
          • -------- ------------------------------------------------------------------------------ --------
          • -------- checking if duration of debuff has finished --------
          • -------- if not, continue to search for more targets to infect --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • SP_Counter[SP_CurrentIndex] Equal to SP_Duration[SP_AbilityLevel[SP_CurrentIndex]]
            • Then - Actions
              • -------- ------------------------------------------------------------------------------------------------------------------------------------------- --------
              • -------- spell duration has ended, dealing damage and removing MS ability --------
              • Unit Group - Pick every unit in SP_Group[SP_CurrentIndex] and do (Actions)
                • Loop - Actions
                  • Set SP_PickedUnitG = (Picked unit)
                  • Unit - Remove SP_AbilityMSFactor from SP_PickedUnitG
                  • Set SP_DamageCalculate[SP_CurrentIndex] = ((Max life of SP_PickedUnitG) / (100.00 / SP_Damage[SP_AbilityLevel[SP_CurrentIndex]]))
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • SP_ChangeColor Equal to True
                    • Then - Actions
                      • Animation - Change SP_PickedUnitG's vertex coloring to (100.00%, 100.00%, 100.00%) with 0.00% transparency
                    • Else - Actions
                      • -------- //////////////////// --------
                  • Special Effect - Create a special effect attached to the SP_DamageSFX_AP of SP_PickedUnitG using SP_DamageSFX
                  • Special Effect - Destroy (Last created special effect)
                  • Unit - Cause SP_Caster[SP_CurrentIndex] to damage SP_PickedUnitG, dealing SP_DamageCalculate[SP_CurrentIndex] damage of attack type SP_AttackType and damage type SP_DamageType
                  • Unit Group - Remove SP_PickedUnitG from SP_Group[SP_CurrentIndex]
                  • Unit Group - Remove SP_PickedUnitG from SP_InfectedGroup
              • -------- -------------------------- --------
              • -------- recycling variables --------
              • Set SP_Caster[SP_CurrentIndex] = SP_Caster[SP_MaxIndex]
              • Set SP_Player[SP_CurrentIndex] = SP_Player[SP_MaxIndex]
              • Set SP_Group[SP_CurrentIndex] = SP_Group[SP_MaxIndex]
              • Set SP_AbilityLevel[SP_CurrentIndex] = SP_AbilityLevel[SP_MaxIndex]
              • Set SP_Counter[SP_CurrentIndex] = SP_Counter[SP_MaxIndex]
              • Set SP_MaxIndex = (SP_MaxIndex - 1)
              • Set SP_CurrentIndex = (SP_CurrentIndex - 1)
              • Game - Display to (All players) the text: (Max Index Count: + (String(SP_MaxIndex)))
              • Game - Display to (All players) the text: (Number of Units in Group: + (String((Number of units in SP_Group[SP_CurrentIndex]))))
              • -------- ----------------------- --------
              • -------- removing leaks --------
              • Custom script: call DestroyGroup (udg_SP_Group[udg_SP_MaxIndex + 1])
              • Custom script: set udg_SP_Group[udg_SP_MaxIndex + 1] = null
              • -------- -------------------------------------------------------------------------------- --------
              • -------- checking if there are any instances of spell running --------
              • -------- if not, removing remaining leak and turning off loop --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SP_MaxIndex Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
                  • -------- //////////////////// --------
            • Else - Actions
              • -------- //////////////////// --------
EDIT: It seems its not the index, its SP_Group[CurrentIndex] thats causing problems. If I run 2 instances of the spell these are the messages I get.
  1. Max Index: 1
  2. Max Index: 2


    (Instance 1 finishes)
  3. Max Index: 1
  4. Number of Units in Group: 0

    (Instance 2 finishes)
  5. Max Index: 0
  6. Number of Units in Group: 0

EDIT2: Problem was this.

  • Set SP_Group[SP_CurrentIndex] = SP_Group[SP_MaxIndex]
I thought this transfers Units to the the correct unit group. Below is the way that fixed it. Big thanks to Tank-Commander over THW chat.

  • Unit Group - Add all units of SP_Group[SP_MaxIndex] to SP_Group[SP_CurrentIndex]
 
Last edited:
Level 37
Joined
Jul 22, 2015
Messages
3,485
Destruction must happen before re-setting the CurrentIndex group variable, and you destroy the wrong group.

But is this case solved now?

I updated the spell. You can see the new triggers there. On a side note, I shouldnt destroy anything until the spell is done because Im going to be constantly recycling this group until all spell instances are over.
 
Last edited:
Status
Not open for further replies.
Top