• 🏆 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!
  • ✅ The POLL for Hive's Texturing Contest #33 is OPEN! Vote for the TOP 3 SKINS! 🔗Click here to cast your vote!

Starforce v1.1

This bundle is marked as high quality. It exceeds standards and is highly desirable.
Hello there, I'm back with another simple spell that you might like and enjoy.
Just don't forget to give me credits if you use this in your map. ~
- Starforce -
Calls down 4 falling stars to surround a target location, the stars land and then move in circular motion towards the center of the target location, pulling the enemy units in its path towards them while dealing damage. As the stars reach the center, they will explode, dealing final damage to enemy units within 500 range and slow them down by 50% for 2 seconds.
Level 1 - Deals 75 initial damage and 100 final damage.
Level 2 -Deals 150 initial damage and 150 final damage.
Level 3 - Deals 225 initial damage and 200 final damage.
full
full
full
full
full
=======================
IMPORTING INSTRUCTION
=======================
1. Copy Starforce, Starforce (Slow) Abilities
2. Copy Starforce Buff
3. Import StarfallTarget2 model file from this link -> https://www.hiveworkshop.com/threads/starfall-missile.65884/
and Import AncientExplode model file from this link -> https://www.hiveworkshop.com/threads/ancient-explosion-sfx.104179/
or just export the ones in this map and import it to your map. Don't forget to credit Pyritie and WILL THE ALMIGHTY for these awesome models.
4. Copy Starforce Dummies (SF_DummyCaster, SF_DummyMissile)
5. Make sure your World Editor has "Automatically Create Unknown Variable" enabled. You can find it in File => Preferences
6. Copy all the triggers in "Starforce" folder
7. Make sure the variables are assigned properly
8. Enjoy!
  • SF Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- ---------- --------
      • -------- This is configuration part of the spell --------
      • -------- You can change the values to whatever you desire to certain extent --------
      • -------- ---------- --------
      • -------- Make sure the following variable store the ability you will use in object editor --------
      • Set SF_Ability = Starforce
      • -------- ---------- --------
      • -------- These are dummy units we will use in the spell --------
      • -------- SF_DummyType[1] is the starfall missile that will move around --------
      • -------- SF_DummyType[2] is dummy caster used to cast slow --------
      • -------- Make sure to change these values accordingly when you import this to your map --------
      • Set SF_DummyType[1] = SF_DummyMissile
      • Set SF_DummyType[2] = SF_DummyCaster
      • -------- ---------- --------
      • -------- These are the special effects we will use in the spell --------
      • -------- SF_SpecialEffect[1] is the starfall effect --------
      • -------- SF_SpecialEffect[2] is the landing effect --------
      • -------- SF_SpecialEffect[3] is the explosion effect --------
      • Set SF_SpecialEffect[1] = Abilities\Spells\NightElf\Starfall\StarfallTarget.mdl
      • Set SF_SpecialEffect[2] = Abilities\Spells\Human\Thunderclap\ThunderClapCaster.mdl
      • Set SF_SpecialEffect[3] = war3mapImported\AncientExplode.mdl
      • -------- ---------- --------
      • -------- These are dummy abilities we will use in the spell --------
      • -------- SF_DummyAbility[1] is Starforce (Slow) --------
      • -------- SF_DummyAbility[2] is Harvest (Gold and Lumber); we will use this to destroy tree later on --------
      • Set SF_DummyAbility[1] = Starforce (Slow)
      • Set SF_DummyAbility[2] = Harvest (Gold and Lumber)
      • -------- ---------- --------
      • -------- The following variable determines the number of stars you want to summon per level --------
      • Set SF_Number[1] = 4
      • Set SF_Number[2] = 4
      • Set SF_Number[3] = 4
      • -------- ---------- --------
      • -------- The following variable determines the radius of your spell per level --------
      • -------- Also used to determine where the stars will be spawned --------
      • Set SF_BaseRadius[1] = 500.00
      • Set SF_BaseRadius[2] = 500.00
      • Set SF_BaseRadius[3] = 500.00
      • -------- ---------- --------
      • -------- The following variable determines the radius used by the spell to detect enemy units within range --------
      • -------- Used when the spell is dealing damage to enemy units in its path --------
      • -------- Basically used by the swirly stars --------
      • Set SF_AoE[1] = 150.00
      • Set SF_AoE[2] = 150.00
      • Set SF_AoE[3] = 150.00
      • -------- ---------- --------
      • -------- The following variable determines the radius used by the spell to detect enemy units within range --------
      • -------- Used when the spell is dealing final damage to enemy units after explosion --------
      • Set SF_FinalAoE[1] = 500.00
      • Set SF_FinalAoE[2] = 500.00
      • Set SF_FinalAoE[3] = 500.00
      • -------- ---------- --------
      • -------- The following variable determines the amount of damage you deal towards the enemy units --------
      • -------- Used when the spell is dealing damage to enemy units in its path --------
      • Set SF_1stDamage[1] = 75.00
      • Set SF_1stDamage[2] = 150.00
      • Set SF_1stDamage[3] = 225.00
      • -------- ---------- --------
      • -------- The following variable determines the amount of damage you deal towards the enemy units --------
      • -------- Used when the spell is dealing final damage to enemy units after explosion --------
      • Set SF_2ndDamage[1] = 100.00
      • Set SF_2ndDamage[2] = 150.00
      • Set SF_2ndDamage[3] = 200.00
      • -------- ---------- --------
      • -------- The following variable determines the type of attack and damage used when dealing damage --------
      • Set SF_1stAttackType = Spells
      • Set SF_1stDamageType = Magic
      • Set SF_2ndAttackType = Spells
      • Set SF_2ndDamageType = Magic
      • -------- ---------- --------
      • -------- The following variable determines the horizontal arc of the projectile as it moves toward the center --------
      • -------- Positive Value = Clockwise, Negative Value = Counter Clockwise --------
      • -------- If you're using default config, don't go over the value of 74 or else the spell will break --------
      • -------- If you change the base radius, the max value for Arc Variable can differ --------
      • Set SF_Arc[1] = 70.00
      • Set SF_Arc[2] = 70.00
      • Set SF_Arc[3] = 70.00
      • -------- ---------- --------
      • -------- The following variable determines the projectile speed as it moves toward the center --------
      • Set SF_BaseSpeed[1] = 900.00
      • Set SF_BaseSpeed[2] = 900.00
      • Set SF_BaseSpeed[3] = 900.00
      • -------- ---------- --------
      • -------- The following variable determines how much delay that it takes before the spell starts --------
      • -------- Adjust accordingly depending on starfall animation, don't change this unless you change the model --------
      • Set SF_Delay[1] = 0.75
      • Set SF_Delay[2] = 0.75
      • Set SF_Delay[3] = 0.75
      • -------- ---------- --------
      • -------- Do you want this spell to have a pulling effect? If yes, set it to true. If not, set it to false. --------
      • Set SF_StarPull[1] = True
      • Set SF_StarPull[2] = True
      • Set SF_StarPull[3] = True
      • -------- ---------- --------
      • -------- The following variable determines how strong it's pulling the enemy units toward the stars --------
      • -------- Recommendations: 3.00 for a slight pull, 5.00 for a strong pull, 7.00 for a crazy strong pull --------
      • Set SF_PullPower[1] = 3.00
      • Set SF_PullPower[2] = 5.00
      • Set SF_PullPower[3] = 7.00
      • -------- ---------- --------
      • -------- Do you want this spell to damage buildings? If yes, set it to true. If not, set it to false. --------
      • Set SF_DmgBuilding = True
      • -------- ---------- --------
      • -------- This will determine whether the spell deal full damage to buildings or not by percentage --------
      • -------- 1 = full (100%) damage --------
      • -------- 2 = double (200%) damage --------
      • -------- 0.5 = half (50%) damage --------
      • Set SF_DmgBuildingFactor[1] = 1.00
      • Set SF_DmgBuildingFactor[2] = 1.00
      • Set SF_DmgBuildingFactor[3] = 1.00
      • -------- ---------- --------
      • -------- Do you want this spell to destroy trees? If yes, set it to true. If not, set it to false. --------
      • Set SF_DestroyTree = True
      • -------- ---------- --------
      • -------- +> OFF LIMIT <+ --------
      • -------- Do Not Change Anything Below This Point --------
      • -------- Or Else The Spell Might Not Work As Intended --------
      • -------- Make Sure You Know What You Are Doing --------
      • -------- ---------- --------
      • -------- The value of Periodic Timer in Looping Trigger --------
      • Set SF_PeriodicTimer = 0.03
      • -------- The looping trigger itself --------
      • Set SF_Loop = SF Loop <gen>
      • -------- Adding the event to the trigger --------
      • Trigger - Add to SF_Loop the event (Time - Every SF_PeriodicTimer seconds of game time)
      • -------- ---------- --------
      • Set SF_TempLoc = (Center of (Playable map area))
      • -------- Preloading --------
      • Unit - Create 1 SF_DummyType[1] for Player 1 (Red) at SF_Loc[1] facing Default building facing degrees
      • Unit - Remove (Last created unit) from the game
      • Unit - Create 1 SF_DummyType[2] for Player 1 (Red) at SF_Loc[1] facing Default building facing degrees
      • Unit - Add SF_Ability to (Last created unit)
      • Unit - Remove SF_Ability from (Last created unit)
      • Unit - Add SF_DummyAbility[1] to (Last created unit)
      • Unit - Remove SF_DummyAbility[1] from (Last created unit)
      • Unit - Add SF_DummyAbility[2] to (Last created unit)
      • Unit - Remove SF_DummyAbility[2] from (Last created unit)
      • Unit - Remove (Last created unit) from the game
      • -------- Create a caster dummy --------
      • Unit - Create 1 SF_DummyType[2] for Neutral Passive at SF_TempLoc facing Default building facing degrees
      • Set SF_DummyCaster = (Last created unit)
      • Unit - Add SF_DummyAbility[1] to SF_DummyCaster
      • Unit - Add SF_DummyAbility[2] to SF_DummyCaster
      • -------- Clear memory leak --------
      • Custom script: call RemoveLocation(udg_SF_TempLoc)
      • -------- END OF CONFIGURATION --------
  • SF Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to SF_Ability
    • Actions
      • Set SF_SpellCount = (SF_SpellCount + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • SF_SpellCount Equal to 1
        • Then - Actions
          • Trigger - Turn on SF_Loop
        • Else - Actions
          • -------- loop is already on; do nothing --------
      • -------- - --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • SF_RecycledSize Equal to 0
        • Then - Actions
          • Set SF_MaxIndex = (SF_MaxIndex + 1)
          • Set SF_Spell_ID = SF_MaxIndex
        • Else - Actions
          • Set SF_RecycledSize = (SF_RecycledSize - 1)
          • Set SF_Spell_ID = SF_RecycledStack[SF_RecycledSize]
      • Set SF_NodeNext[SF_Spell_ID] = 0
      • Set SF_NodeNext[SF_NodePrev[0]] = SF_Spell_ID
      • Set SF_NodePrev[SF_Spell_ID] = SF_NodePrev[0]
      • Set SF_NodePrev[0] = SF_Spell_ID
      • -------- - --------
      • Set SF_Caster[SF_Spell_ID] = (Triggering unit)
      • Set SF_Owner[SF_Spell_ID] = (Triggering player)
      • Set SF_TargetLoc[SF_Spell_ID] = (Target point of ability being cast)
      • Set SF_Level[SF_Spell_ID] = (Level of SF_Ability for SF_Caster[SF_Spell_ID])
      • Set SF_Stage[SF_Spell_ID] = 1
      • Set SF_Counter[SF_Spell_ID] = 0.00
      • Set SF_Speed[SF_Spell_ID] = (SF_BaseSpeed[SF_Level[SF_Spell_ID]] x SF_PeriodicTimer)
      • Set SF_Radius[SF_Spell_ID] = (SF_BaseRadius[SF_Level[SF_Spell_ID]] / 2.00)
      • Custom script: if udg_SF_DMissileGroup[udg_SF_Spell_ID] == null then
      • Custom script: set udg_SF_DMissileGroup[udg_SF_Spell_ID] = CreateGroup()
      • Custom script: endif
      • Custom script: if udg_SF_PullGroup[udg_SF_Spell_ID] == null then
      • Custom script: set udg_SF_PullGroup[udg_SF_Spell_ID] = CreateGroup()
      • Custom script: endif
      • Custom script: if udg_SF_UndamagedGroup[udg_SF_Spell_ID] == null then
      • Custom script: set udg_SF_UndamagedGroup[udg_SF_Spell_ID] = CreateGroup()
      • Custom script: endif
      • Custom script: if udg_SF_UndamagedGroup2[udg_SF_Spell_ID] == null then
      • Custom script: set udg_SF_UndamagedGroup2[udg_SF_Spell_ID] = CreateGroup()
      • Custom script: endif
      • -------- - --------
      • For each (Integer SF_TempInt) from 1 to SF_Number[SF_Level[SF_Spell_ID]], do (Actions)
        • Loop - Actions
          • Set SF_TempLoc = (SF_TargetLoc[SF_Spell_ID] offset by SF_Radius[SF_Spell_ID] towards ((Real(SF_TempInt)) x (360.00 / (Real(SF_Number[SF_Level[SF_Spell_ID]])))) degrees)
          • Special Effect - Create a special effect at SF_TempLoc using SF_SpecialEffect[1]
          • Set SF_SpawnEffect[((SF_Number[SF_MaxLevel] x (SF_Spell_ID - 1)) + SF_TempInt)] = (Last created special effect)
          • Custom script: call RemoveLocation(udg_SF_TempLoc)
  • SF Loop
    • Events
    • Conditions
    • Actions
      • Set SF_Spell_ID = 0
      • For each (Integer SF_LoopInt) from 1 to SF_SpellCount, do (Actions)
        • Loop - Actions
          • Set SF_Spell_ID = SF_NodeNext[SF_Spell_ID]
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • SF_Stage[SF_Spell_ID] Equal to 1
            • Then - Actions
              • -------- check if the delay time has passed --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SF_Counter[SF_Spell_ID] Greater than or equal to SF_Delay[SF_Level[SF_Spell_ID]]
                • Then - Actions
                  • -------- it has; destroy spawn effect then create dummy units that act as starforce missiles and add them to DMissileGroup --------
                  • For each (Integer SF_TempInt) from 1 to SF_Number[SF_Level[SF_Spell_ID]], do (Actions)
                    • Loop - Actions
                      • Special Effect - Destroy SF_SpawnEffect[((SF_Number[SF_MaxLevel] x (SF_Spell_ID - 1)) + SF_TempInt)]
                      • Set SF_Loc[1] = (SF_TargetLoc[SF_Spell_ID] offset by SF_Radius[SF_Spell_ID] towards ((Real(SF_TempInt)) x (360.00 / (Real(SF_Number[SF_Level[SF_Spell_ID]])))) degrees)
                      • Special Effect - Create a special effect at SF_Loc[1] using SF_SpecialEffect[2]
                      • Special Effect - Destroy (Last created special effect)
                      • Unit - Create 1 SF_DummyType[1] for SF_Owner[SF_Spell_ID] at SF_Loc[1] facing ((Angle from SF_Loc[1] to SF_TargetLoc[SF_Spell_ID]) + 45.00) degrees
                      • Unit Group - Add (Last created unit) to SF_DMissileGroup[SF_Spell_ID]
                      • Custom script: call RemoveLocation(udg_SF_Loc[1])
                  • -------- proceed to stage 2 --------
                  • Set SF_Stage[SF_Spell_ID] = 2
                • Else - Actions
                  • -------- it has not; increase counter value --------
                  • Set SF_Counter[SF_Spell_ID] = (SF_Counter[SF_Spell_ID] + SF_PeriodicTimer)
            • Else - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SF_Stage[SF_Spell_ID] Equal to 2
                • Then - Actions
                  • -------- check if unit group is empty --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Number of units in SF_DMissileGroup[SF_Spell_ID]) Not equal to 0
                    • Then - Actions
                      • -------- it's not; move them towards the center --------
                      • Unit Group - Pick every unit in SF_DMissileGroup[SF_Spell_ID] and do (Actions)
                        • Loop - Actions
                          • Set SF_DummyMissile[SF_Spell_ID] = (Picked unit)
                          • Set SF_Loc[1] = (Position of SF_DummyMissile[SF_Spell_ID])
                          • Set SF_Angle[SF_Spell_ID] = ((Angle from SF_Loc[1] to SF_TargetLoc[SF_Spell_ID]) + SF_Arc[SF_Level[SF_Spell_ID]])
                          • Set SF_Loc[2] = (SF_Loc[1] offset by SF_Speed[SF_Spell_ID] towards SF_Angle[SF_Spell_ID] degrees)
                          • Custom script: call SetUnitX(udg_SF_DummyMissile[udg_SF_Spell_ID], GetLocationX(udg_SF_Loc[2]))
                          • Custom script: call SetUnitY(udg_SF_DummyMissile[udg_SF_Spell_ID], GetLocationY(udg_SF_Loc[2]))
                          • Custom script: set bj_wantDestroyGroup = true
                          • Unit Group - Pick every unit in (Units within SF_AoE[SF_Level[SF_Spell_ID]] of SF_Loc[1]) and do (Actions)
                            • Loop - Actions
                              • Set SF_TempUnit = (Picked unit)
                              • -------- filter --------
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (SF_TempUnit is alive) Equal to True
                                  • (SF_TempUnit belongs to an enemy of SF_Owner[SF_Spell_ID]) Equal to True
                                  • (SF_TempUnit is Magic Immune) Equal to False
                                  • (SF_TempUnit is in SF_UndamagedGroup[SF_Spell_ID]) Equal to False
                                • Then - Actions
                                  • -------- another filter for building check --------
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • SF_DmgBuilding Equal to True
                                    • Then - Actions
                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                        • If - Conditions
                                          • (SF_TempUnit is A structure) Equal to True
                                        • Then - Actions
                                          • Unit - Cause SF_Caster[SF_Spell_ID] to damage SF_TempUnit, dealing (SF_1stDamage[SF_Level[SF_Spell_ID]] x SF_DmgBuildingFactor[SF_Level[SF_Spell_ID]]) damage of attack type SF_1stAttackType and damage type SF_1stDamageType
                                          • -------- preventing them from being affected more than once --------
                                          • Unit Group - Add SF_TempUnit to SF_UndamagedGroup[SF_Spell_ID]
                                        • Else - Actions
                                          • Unit - Cause SF_Caster[SF_Spell_ID] to damage SF_TempUnit, dealing SF_1stDamage[SF_Level[SF_Spell_ID]] damage of attack type SF_1stAttackType and damage type SF_1stDamageType
                                          • -------- preventing them from being affected more than once --------
                                          • Unit Group - Add SF_TempUnit to SF_UndamagedGroup[SF_Spell_ID]
                                          • -------- adding necessary unit to pull group --------
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • (SF_TempUnit is in SF_PullGroup[SF_Spell_ID]) Equal to False
                                            • Then - Actions
                                              • Unit Group - Add SF_TempUnit to SF_PullGroup[SF_Spell_ID]
                                            • Else - Actions
                                    • Else - Actions
                                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                        • If - Conditions
                                          • (SF_TempUnit is A structure) Equal to False
                                        • Then - Actions
                                          • Unit - Cause SF_Caster[SF_Spell_ID] to damage SF_TempUnit, dealing SF_1stDamage[SF_Level[SF_Spell_ID]] damage of attack type SF_1stAttackType and damage type SF_1stDamageType
                                          • -------- preventing them from being affected more than once --------
                                          • Unit Group - Add SF_TempUnit to SF_UndamagedGroup[SF_Spell_ID]
                                          • -------- adding necessary unit to pull group --------
                                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                            • If - Conditions
                                              • (SF_TempUnit is in SF_PullGroup[SF_Spell_ID]) Equal to False
                                            • Then - Actions
                                              • Unit Group - Add SF_TempUnit to SF_PullGroup[SF_Spell_ID]
                                            • Else - Actions
                                        • Else - Actions
                                • Else - Actions
                          • -------- check if user wants to have a pulling effect --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • SF_StarPull[SF_Level[SF_Spell_ID]] Equal to True
                            • Then - Actions
                              • Unit Group - Pick every unit in SF_PullGroup[SF_Spell_ID] and do (Actions)
                                • Loop - Actions
                                  • Set SF_TempUnit = (Picked unit)
                                  • Set SF_Loc[3] = (Position of SF_TempUnit)
                                  • Set SF_Angle2[SF_Spell_ID] = (Angle from SF_Loc[3] to SF_Loc[1])
                                  • Set SF_Loc[4] = (SF_Loc[3] offset by SF_PullPower[SF_Level[SF_Spell_ID]] towards SF_Angle2[SF_Spell_ID] degrees)
                                  • Custom script: call SetUnitX(udg_SF_TempUnit, GetLocationX(udg_SF_Loc[4]))
                                  • Custom script: call SetUnitY(udg_SF_TempUnit, GetLocationY(udg_SF_Loc[4]))
                                  • Custom script: call RemoveLocation(udg_SF_Loc[3])
                                  • Custom script: call RemoveLocation(udg_SF_Loc[4])
                            • Else - Actions
                              • -------- false; no pulling effect --------
                          • -------- check if user wants to destroy trees --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • SF_DestroyTree Equal to True
                            • Then - Actions
                              • Destructible - Pick every destructible within SF_AoE[SF_Level[SF_Spell_ID]] of SF_Loc[1] and do (Actions)
                                • Loop - Actions
                                  • Set SF_TempDest = (Picked destructible)
                                  • Unit - Order SF_DummyCaster to Harvest SF_TempDest
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • (Current order of SF_DummyCaster) Equal to (Order(harvest))
                                    • Then - Actions
                                      • Destructible - Kill SF_TempDest
                                    • Else - Actions
                                  • Unit - Order SF_DummyCaster to Stop
                            • Else - Actions
                          • -------- check if it has reached the center --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Distance between SF_Loc[1] and SF_TargetLoc[SF_Spell_ID]) Less than or equal to 50.00
                            • Then - Actions
                              • -------- It has; kill the dummy inside the unit group --------
                              • Unit - Kill SF_DummyMissile[SF_Spell_ID]
                            • Else - Actions
                              • -------- It has not; do nothing --------
                          • Custom script: call RemoveLocation(udg_SF_Loc[1])
                          • Custom script: call RemoveLocation(udg_SF_Loc[2])
                    • Else - Actions
                      • -------- it is empty; create special effect --------
                      • Special Effect - Create a special effect at SF_TargetLoc[SF_Spell_ID] using SF_SpecialEffect[3]
                      • Special Effect - Destroy (Last created special effect)
                      • Custom script: set bj_wantDestroyGroup = true
                      • Unit Group - Pick every unit in (Units within SF_FinalAoE[SF_Level[SF_Spell_ID]] of SF_TargetLoc[SF_Spell_ID]) and do (Actions)
                        • Loop - Actions
                          • Set SF_TempUnit = (Picked unit)
                          • -------- filter --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (SF_TempUnit is alive) Equal to True
                              • (SF_TempUnit belongs to an enemy of SF_Owner[SF_Spell_ID]) Equal to True
                              • (SF_TempUnit is Magic Immune) Equal to False
                              • (SF_TempUnit is in SF_UndamagedGroup2[SF_Spell_ID]) Equal to False
                            • Then - Actions
                              • -------- another filter for building check --------
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • SF_DmgBuilding Equal to True
                                • Then - Actions
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • (SF_TempUnit is A structure) Equal to True
                                    • Then - Actions
                                      • Unit - Cause SF_Caster[SF_Spell_ID] to damage SF_TempUnit, dealing (SF_2ndDamage[SF_Level[SF_Spell_ID]] x SF_DmgBuildingFactor[SF_Level[SF_Spell_ID]]) damage of attack type SF_2ndAttackType and damage type SF_2ndDamageType
                                      • -------- preventing them from being affected more than once --------
                                      • Unit Group - Add SF_TempUnit to SF_UndamagedGroup2[SF_Spell_ID]
                                    • Else - Actions
                                      • Unit - Order SF_DummyCaster to Human Sorceress - Slow SF_TempUnit
                                      • Unit - Cause SF_Caster[SF_Spell_ID] to damage SF_TempUnit, dealing SF_2ndDamage[SF_Level[SF_Spell_ID]] damage of attack type SF_2ndAttackType and damage type SF_2ndDamageType
                                      • -------- preventing them from being affected more than once --------
                                      • Unit Group - Add SF_TempUnit to SF_UndamagedGroup2[SF_Spell_ID]
                                • Else - Actions
                                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    • If - Conditions
                                      • (SF_TempUnit is A structure) Equal to False
                                    • Then - Actions
                                      • Unit - Order SF_DummyCaster to Human Sorceress - Slow SF_TempUnit
                                      • Unit - Cause SF_Caster[SF_Spell_ID] to damage SF_TempUnit, dealing SF_2ndDamage[SF_Level[SF_Spell_ID]] damage of attack type SF_2ndAttackType and damage type SF_2ndDamageType
                                      • -------- preventing them from being affected more than once --------
                                      • Unit Group - Add SF_TempUnit to SF_UndamagedGroup2[SF_Spell_ID]
                                    • Else - Actions
                            • Else - Actions
                      • -------- proceed to stage 3 --------
                      • Set SF_Stage[SF_Spell_ID] = 3
                • Else - Actions
                  • -------- stage 3; clean up time --------
                  • Custom script: call DestroyGroup(udg_SF_PullGroup[udg_SF_Spell_ID])
                  • Custom script: set udg_SF_PullGroup[udg_SF_Spell_ID] = null
                  • Custom script: call DestroyGroup(udg_SF_DMissileGroup[udg_SF_Spell_ID])
                  • Custom script: set udg_SF_DMissileGroup[udg_SF_Spell_ID] = null
                  • Custom script: call DestroyGroup(udg_SF_UndamagedGroup[udg_SF_Spell_ID])
                  • Custom script: set udg_SF_UndamagedGroup[udg_SF_Spell_ID] = null
                  • Custom script: call DestroyGroup(udg_SF_UndamagedGroup2[udg_SF_Spell_ID])
                  • Custom script: set udg_SF_UndamagedGroup2[udg_SF_Spell_ID] = null
                  • Custom script: call RemoveLocation(udg_SF_TargetLoc[udg_SF_Spell_ID])
                  • -------- - --------
                  • Set SF_RecycledStack[SF_RecycledSize] = SF_Spell_ID
                  • Set SF_RecycledSize = (SF_RecycledSize + 1)
                  • Set SF_NodeNext[SF_NodePrev[SF_Spell_ID]] = SF_NodeNext[SF_Spell_ID]
                  • Set SF_NodePrev[SF_NodeNext[SF_Spell_ID]] = SF_NodePrev[SF_Spell_ID]
                  • -------- - --------
                  • Set SF_SpellCount = (SF_SpellCount - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • SF_SpellCount Equal to 0
                    • Then - Actions
                      • Trigger - Turn off SF_Loop
                    • Else - Actions
                      • -------- there still a spell instance running; do not turn loop off --------
Credits:
- Pyritie for his awesome StarfallTarget2 model
- WILL THE ALMIGHTY for his awesome AncientExplosion model
v1.1 (Minor Fix)
- Removed SpawnEffect[] properly as it wasn't removed properly.

v1.1
- Added SF_DmgBuilding (boolean) to Config Trigger, in case end-user wants the spell to deal damage to buildings.
- Added SF_DmgBuildingFactor (real) to Config Trigger, to determine damage reduction / increase vs buildings.
- Removed SF_DummySpawn from Object Editor and replaced it with Special Effect in Trigger Editor.

v1.0
- First Public Release.
Previews
Contents

Starforce v1.1 (Map)

Reviews
Antares
The definition of SF_AoE is a bit unclear. I would have guessed at first that the explosions of the stars falling to the ground deal the initial damage, but it's actually the swirly stars moving past a unit for the first time that do it. It might be...
The definition of SF_AoE is a bit unclear. I would have guessed at first that the explosions of the stars falling to the ground deal the initial damage, but it's actually the swirly stars moving past a unit for the first time that do it. It might be worth clarifying that.

I understand why the swirly stars have to be dummy units as the special effect natives are not available in the version you're using (🙄), but I don't see a reason for the initial starfall effect to be done with dummy units. Using special effects should always be prefered if possible, since they are more performant and don't cause a small memory leak like units do. You'd have to store the special effects in a pseudo-2D-array and destroy them after the initial spell delay.

A useful option for the config could be whether the spell deals damage to buildings or not (and maybe a parameter for damage reduction on buildings).

That's as far as my criticisms go. This is a well-written, well-documented, highly configurable spell, and just looks great overall.

deliciousGUI.jpg

High Quality
 
Level 23
Joined
Aug 27, 2013
Messages
4,038
Awesome! Thanks a lot, @Antares!

Updated to v1.1:
  • Added SF_DmgBuilding (boolean) to Config Trigger, in case end-user wants the spell to deal damage to buildings.
  • Added SF_DmgBuildingFactor (real) to Config Trigger, to determine damage reduction / increase vs buildings.
  • Removed SF_DummySpawn from Object Editor and replaced it with Special Effect in Trigger Editor.

Feedback on the newly added filter block would be nice, while it is functional, I feel like it can be optimized further.
All that aside, enjoy the spell, folks!
 
Feedback on the newly added filter block would be nice, while it is functional, I feel like it can be optimized further.
All that aside, enjoy the spell, folks!
It seems like you're leaking special effects in a situation where multiple spells are cast at the same time. The special effects are assigned to SF_SpawnEffect[1 to 4], then on the next cast, the same indices are used and the old effects are overwritten and never destroyed.

For the Starfall effect, it looks like you can just destroy it immediately and the animation will play till the end, but it might not work for a different effect a user might use. That's, however, quite a niche problem, so I wouldn't hold it against you if you just destroy the effect immediately and ignored that problem.

But if you wanna do it 100% properly, you'd have to make sure that the effects of the next cast are assigned to indices 5 to 8, and the next to 9 to 12 etc. So that would be NumberOfEffects * Index of Spell Instance + SF_TempInt.
 
Level 23
Joined
Aug 27, 2013
Messages
4,038
It seems like you're leaking special effects in a situation where multiple spells are cast at the same time. The special effects are assigned to SF_SpawnEffect[1 to 4], then on the next cast, the same indices are used and the old effects are overwritten and never destroyed.
You're completely right. I overlooked that fact. Thanks for the feedback!

I updated the resource to fix the issue, hope you don't mind that I'm keeping the version number since it's just a small fix.
Do let me know what you think about the approach I took. Hopefully, it's alright.
 
Hate to be that guy again but this solution doesn't work either. 🙈

You can't make the offset dependent on the number of effects of the level of the spell cast. One player could cast level 2 Starforce and create six special effects, which get the indices 1-6, then another player could cast Starforce level 1 creating four special effects, getting the indices 5-8, overwriting 6 and 7.

The offset needs to be based on the number of effects of the max rank of the spell.
 
Level 23
Joined
Aug 27, 2013
Messages
4,038
Hate to be that guy again but this solution doesn't work either. 🙈
Haha, it's alright. Please keep it that way, sir.

You can't make the offset dependent on the number of effects of the level of the spell cast. One player could cast level 2 Starforce and create six special effects, which get the indices 1-6, then another player could cast Starforce level 1 creating four special effects, getting the indices 5-8, overwriting 6 and 7.

The offset needs to be based on the number of effects of the max rank of the spell.
You're right again, I didn't think of that. What if I allow the end-user to specify the max level in config and make the offset based on number of effects of that instead? That should be fine, right? Of course, I would also have to specify in documentation that the max level number of effects must be >= the previous level number of effects.
 
Below the config:
  • Set VariableSet SF_TempInt = 1
  • Custom script: loop
  • Custom script: exitwhen udg_SF_Number[udg_SF_TempInt] == null
  • Set VariableSet SF_TempInt = (SF_TempInt + 1)
  • Custom script: endloop
  • Set VariableSet SF_MaxLevel = (SF_TempInt - 1)
No need to have the user do it manually.
 
Top