Spellpack Bittersweet Spellpack

Weep

Godspeed to the sound of the pounding
Reaction score
400
Bittersweet Spellpack
by Weep
Version 1.1.0​

-- General Information --
I felt like making a few spells that don't have much in the way of flashy effects, instead focusing on interesting and unusual gameplay properties, with each spell affecting units in ways both positive and negative.

So I did. :p

Made in GUI (with a few JASS triggers) and leakless (as far as GUI can be). All spells are MUI. Requires a unit autoindexer (eg. AIDS) and GDD.


-- Fragile Blessing --
- Description -
Heals a target unit over time. If the unit takes more damage than health restored during that time, it will take additional damage equal to the difference.

Can be used offensively or defensively, if you're careful. Will be cut short, with healing and damage appropriately counted if dispelled.

Ratios are configurable.

- Screenshot (almost pointless for these spells) -
muwh3a.jpg
- Readme -
Code:
Fragile Blessing -- v1.0.0 -- Bittersweet Spellpack -- by Weep

   Requires:
   1. An instant unit autoindexer, such as AIDS by Jesus4Lyf, AutoIndex by grim001, or
      UnitIndexingUtils by Rising_Dusk.  (GUI-AIDS is included in the demo map.)
   2. GDD by Weep (included in the demo map or available from
      http://www.thehelper.net/forums/showthread.php?t=137957)
   3. The base ability "Fragile Blessing".
   4. The buff "Fragile Blessing".
   5. This trigger category and the triggers it contains.

-- What? --
   This spell is like Rejuvination, but with a twist: if the target takes more damage during
   the buff's duration than is healed, it will be additionally damaged for the extra damage
   when the buff wears off.  There are several additional parameters can can be changed to
   fine-tune the exact ratios of damage taken, damage healed, and proportion to cause as
   extra damage.

   It is MPI/MUI/SUI up to 8191 simultaneous instances.  The spell effect WILL STACK if cast
   on the same unit multiple times.

-- How To Implement --
   1. Be sure "Automatically create unknown variables while pasting trigger data" is
      enabled in the World Editor general preferences.
   2. Add the required resources listed above, if not already present in your map.
   3. The rawcodes for the imported units and abilities have probably changed; set the
      "Fragile Blessing" ability to apply the buff "Fragile Blessing" at all levels.  If
      desired, change the duration, cooldown, range, targets allowed, levels, and mana cost to suit your map.
      
      In the "Fragile Blessing Globals" trigger, set FB__Ability to the "Fragile Blessing"
      ability and FB__Buff to the "Fragile Blessing" buff.  Edit any of the other parameters
      to suit your map.
      
      If desired, change the "Fragile Blessing Extra Damage FX" trigger to generate the
      wanted special effects.
      
-- Notes --
   When using a unit autoindexer, you will not be able to have any other triggers in your map
   that set a unit's custom value, since this is what autoindexers do.  Any such triggers can
   be remade using an integer array using the unit's custom value as the index.

-- Credits --
   Credit in your map is not needed but appreciated.  Please include this README.  Do not
   claim this spell as your own work.

-- Version History --
   1.0.0: First release.
- Configuration and Globals -
Trigger:
  • Fragile Blessing Globals
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- The ability used for Fragile Blessing. --------
      • Set FB__Ability = Fragile Blessing
      • -------- The buff applied by Fragile Blessing. --------
      • Set FB__Buff = Fragile Blessing
      • -------- If set to true, the spell will only count actual healing done when evaluating whether the unit took more damage than healing. --------
      • -------- eg. If true, and the unit is at full health the whole time, the total healing would be 0. --------
      • -------- If false, the total healing will be the maximum amount that the spell could have healed. --------
      • Set FB__OnlyActualHealing = False
      • -------- The amount of healing that will be done over the spell's duration. --------
      • Set FB__Healing[1] = 200.00
      • Set FB__Healing[2] = 300.00
      • Set FB__Healing[3] = 400.00
      • -------- The maximum duration of the spell. This should match the duration of the ability itself! --------
      • Set FB__Duration[1] = 12.00
      • Set FB__Duration[2] = 14.00
      • Set FB__Duration[3] = 16.00
      • -------- Damage taken will be multiplied by this value. --------
      • Set FB__Scale[1] = 1.00
      • Set FB__Scale[2] = 1.00
      • Set FB__Scale[3] = 1.00
      • -------- The multiplier for how much of the extra damage taken should be applied as additional damage. --------
      • Set FB__Multiplier[1] = 1.00
      • Set FB__Multiplier[2] = 1.00
      • Set FB__Multiplier[3] = 1.00
      • -------- The limit on how much extra damage can be dealt. --------
      • Set FB__Maximum[1] = 1000000000.00
      • Set FB__Maximum[2] = 1000000000.00
      • Set FB__Maximum[3] = 1000000000.00
      • -------- How often the spell adds health. --------
      • Set FB__HealingPeriod = 1.00
      • -------- How often the spell checks whether the target still has the buff (eg. if it gets purged.) --------
      • Set FB__CheckPeriod = 0.10
      • -------- Precomputation. Don't edit below this line! --------
      • Countdown Timer - Start FB__Timer as a Repeating timer that will expire in FB__CheckPeriod seconds
      • For each (Integer A) from 1 to 100, do (Set FB__Healing[(Integer A)] = (FB__Healing[(Integer A)] x (FB__HealingPeriod / FB__Duration[(Integer A)])))
      • Set FB_LoopIndex = 0

Trigger:
  • Fragile Blessing Extra Damage FX
    • Events
    • Conditions
    • Actions
      • -------- FX to be created when the spell ends, if the target will be dealt extra damage. --------
      • Special Effect - Create a special effect attached to the chest of FB_Target[FB_LoopIndex] using Abilities\Weapons\DemonHunterMissile\DemonHunterMissile.mdl
      • Special Effect - Destroy (Last created special effect)
- Triggers -
Trigger:
  • Fragile Blessing Cleanup
    • Events
    • Conditions
    • Actions
      • Set FB_Caster[FB_LoopIndex] = FB_Caster[FB_Count]
      • Set FB_Target[FB_LoopIndex] = FB_Target[FB_Count]
      • Set FB_StartDamage[FB_LoopIndex] = FB_StartDamage[FB_Count]
      • Set FB_Time[FB_LoopIndex] = FB_Time[FB_Count]
      • Set FB_HealthRestored[FB_LoopIndex] = FB_HealthRestored[FB_Count]
      • Set FB_Level[FB_LoopIndex] = FB_Level[FB_Count]
      • Set FB_Count = (FB_Count - 1)
      • Set FB_LoopIndex = (FB_LoopIndex - 1)

Trigger:
  • Fragile Blessing Damage Detect
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • (GDD_DamagedUnit has buff FB__Buff) Equal to True
    • Actions
      • Set FB_Damage[(Custom value of GDD_DamagedUnit)] = (FB_Damage[(Custom value of GDD_DamagedUnit)] + GDD_Damage)

Trigger:
  • Fragile Blessing Periodic
    • Events
      • Time - FB__Timer expires
    • Conditions
    • Actions
      • For each (Integer FB_LoopIndex) from 1 to FB_Count, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (FB_Target[FB_LoopIndex] has buff FB__Buff) Equal to True
              • FB_Time[FB_LoopIndex] Less than FB__Duration[FB_Level[FB_LoopIndex]]
            • Then - Actions
              • Set FB_Time[FB_LoopIndex] = (FB_Time[FB_LoopIndex] + FB__CheckPeriod)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Or - Any (Conditions) are true
                    • Conditions
                      • (FB_Time[FB_LoopIndex] mod FB__HealingPeriod) Equal to 0.00
                      • ((FB_Time[FB_LoopIndex] mod FB__HealingPeriod) + FB__CheckPeriod) Greater than FB__HealingPeriod
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • FB__OnlyActualHealing Equal to True
                    • Then - Actions
                      • Set FB_HealthRestored[FB_LoopIndex] = (FB_HealthRestored[FB_LoopIndex] + (Min(FB__Healing[FB_Level[FB_LoopIndex]], ((Max life of FB_Target[FB_LoopIndex]) - (Life of FB_Target[FB_LoopIndex])))))
                    • Else - Actions
                      • Set FB_HealthRestored[FB_LoopIndex] = (FB_HealthRestored[FB_LoopIndex] + FB__Healing[FB_Level[FB_LoopIndex]])
                  • Unit - Set life of FB_Target[FB_LoopIndex] to ((Life of FB_Target[FB_LoopIndex]) + FB__Healing[FB_Level[FB_LoopIndex]])
                • Else - Actions
            • Else - Actions
              • Set FB_StartDamage[FB_LoopIndex] = (FB__Scale[FB_Level[FB_LoopIndex]] x (FB_Damage[(Custom value of FB_Target[FB_LoopIndex])] - FB_StartDamage[FB_LoopIndex]))
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FB_StartDamage[FB_LoopIndex] Greater than FB_HealthRestored[FB_LoopIndex]
                • Then - Actions
                  • Trigger - Run Fragile Blessing Extra Damage FX <gen> (ignoring conditions)
                  • Trigger - Turn off Fragile Blessing Damage Detect <gen>
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Unit-type of FB_Caster[FB_LoopIndex]) Not equal to No unit-type
                    • Then - Actions
                      • Unit - Cause FB_Caster[FB_LoopIndex] to damage FB_Target[FB_LoopIndex], dealing (Min(FB__Maximum[FB_Level[FB_LoopIndex]], (FB__Multiplier[FB_Level[FB_LoopIndex]] x (FB_StartDamage[FB_LoopIndex] - FB_HealthRestored[FB_LoopIndex])))) damage of attack type Chaos and damage type Universal
                    • Else - Actions
                      • Unit - Cause FB_Target[FB_LoopIndex] to damage FB_Target[FB_LoopIndex], dealing (Min(FB__Maximum[FB_Level[FB_LoopIndex]], (FB__Multiplier[FB_Level[FB_LoopIndex]] x (FB_StartDamage[FB_LoopIndex] - FB_HealthRestored[FB_LoopIndex])))) damage of attack type Chaos and damage type Universal
                  • Trigger - Turn on Fragile Blessing Damage Detect <gen>
                • Else - Actions
              • Trigger - Run Fragile Blessing Cleanup <gen> (checking conditions)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FB_Count Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                  • Trigger - Turn off Fragile Blessing Damage Detect <gen>
                • Else - Actions

Trigger:
  • Fragile Blessing Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to FB__Ability
    • Actions
      • Set FB_Count = (FB_Count + 1)
      • Set FB_Caster[FB_Count] = (Triggering unit)
      • Set FB_Target[FB_Count] = (Target unit of ability being cast)
      • Set FB_StartDamage[FB_Count] = FB_Damage[(Custom value of FB_Target[FB_Count])]
      • Set FB_Time[FB_Count] = 0.00
      • Set FB_HealthRestored[FB_Count] = 0.00
      • Set FB_Level[FB_Count] = (Level of FB__Ability for FB_Caster[FB_Count])
      • Trigger - Turn on Fragile Blessing Periodic <gen>
      • Trigger - Turn on Fragile Blessing Damage Detect <gen>

-- Fragile Inspiration --
- Description -
Regenerates mana for a target unit over time. If the unit uses more than half as much mana as is regenerated during that time, it will lose additional mana equal to the difference.

Can be used offensively or defensively, if you're careful. Will be cut short, with mana use and regeneration appropriately counted if dispelled. Burned mana is counted.

Ratios are configurable.

- Screenshot (almost pointless for these spells) -
143gr2f.jpg
- Readme -
Code:
Fragile Inspiration -- v1.1.0 -- Bittersweet Spellpack -- by Weep

   Requires:
   1. An instant unit autoindexer, such as AIDS by Jesus4Lyf, AutoIndex by grim001, or
      UnitIndexingUtils by Rising_Dusk.  (GUI-AIDS is included in the demo map.)
   2. GDD by Weep (included in the demo map or available from
      http://www.thehelper.net/forums/showthread.php?t=137957)
   3. The base ability "Fragile Inspiration".
   4. The buff "Fragile Inspiration".
   5. This trigger category and the triggers it contains.

-- What? --
   This spell is like Rejuvination, but with a twist: if the target spends or loses more mana
   during the buff's duration than half what is regenerated, it will lose additional mana
   proportional to the excess usage when the buff wears off.  There are several additional
   parameters can can be changed to fine-tune the exact ratios of mana used, mana gained, and
   proportion to deal as extra mana loss.

   It is MPI/MUI/SUI up to 8191 simultaneous instances.  The spell effect WILL STACK if cast
   on the same unit multiple times.

-- How To Implement --
   1. Be sure "Automatically create unknown variables while pasting trigger data" is
      enabled in the World Editor general preferences.
   2. Add the required resources listed above, if not already present in your map.
   3. The rawcodes for the imported units and abilities have probably changed; set the
      "Fragile Inspiration" ability to apply the buff "Fragile Inspiration" at all levels.
      If desired, change the duration, cooldown, range, targets allowed, levels, and mana
      cost to suit your map.
      
      In the "Fragile Inspiration Globals" trigger, set FI__Ability to the "Fragile
      Inspiration" ability and FI__Buff to the "Fragile Inspiration" buff.  Edit any of the
      other parameters to suit your map.
      
      If desired, change the "Fragile Inspiration Extra Drain FX" trigger to generate the
      wanted special effects.
      
-- Notes --
   When using a unit autoindexer, you will not be able to have any other triggers in your map
   that set a unit's custom value, since this is what autoindexers do.  Any such triggers can
   be remade using an integer array using the unit's custom value as the index.

-- Credits --
   Credit in your map is not needed but appreciated.  Please include this README.  Do not
   claim this spell as your own work.

-- Version History --
   1.1.0: Filters out effects due to changes in maximum mana.
   1.0.0: First release.
- Configuration and Globals -
Trigger:
  • Fragile Inspiration Globals
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- The ability used for Fragile Inspiration. --------
      • Set FI__Ability = Fragile Inspiration
      • -------- The buff applied by Fragile Inspiration. --------
      • Set FI__Buff = Fragile Inspiration
      • -------- If set to true, the spell will only count actual regeneration done when evaluating whether the unit used more mana than gained. --------
      • -------- eg. If true, and the unit is at full mana the whole time, the total regeneration would be 0. --------
      • -------- If false, the total regeneration will be the maximum amount that the spell could have regenerated. --------
      • Set FI__OnlyActualRegen = False
      • -------- The amount of mana that will be regenerated over the spell's duration. --------
      • Set FI__Regeneration[1] = 200.00
      • Set FI__Regeneration[2] = 300.00
      • Set FI__Regeneration[3] = 400.00
      • -------- The maximum duration of the spell. This should match the duration of the ability itself! --------
      • Set FI__Duration[1] = 12.00
      • Set FI__Duration[2] = 14.00
      • Set FI__Duration[3] = 16.00
      • -------- Mana usage will be multiplied by this value. --------
      • Set FI__Scale[1] = 2.00
      • Set FI__Scale[2] = 2.00
      • Set FI__Scale[3] = 2.00
      • -------- The multiplier for how much of the extra mana usage should be applied as additional mana drain. --------
      • Set FI__Multiplier[1] = 0.50
      • Set FI__Multiplier[2] = 0.50
      • Set FI__Multiplier[3] = 0.50
      • -------- The limit on how much extra mana can be drained. --------
      • Set FI__Maximum[1] = 1000000000.00
      • Set FI__Maximum[2] = 1000000000.00
      • Set FI__Maximum[3] = 1000000000.00
      • -------- How often the spell adds mana. --------
      • Set FI__RegenPeriod = 1.00
      • -------- How often the spell checks whether the target still has the buff (eg. if it gets purged.) --------
      • Set FI__CheckPeriod = 0.10
      • -------- Precomputation. Don't edit below this line! --------
      • Countdown Timer - Start FI__Timer as a Repeating timer that will expire in FI__CheckPeriod seconds
      • For each (Integer A) from 1 to 100, do (Set FI__Regeneration[(Integer A)] = (FI__Regeneration[(Integer A)] x (FI__RegenPeriod / FI__Duration[(Integer A)])))
      • Set FI_LoopIndex = 0

Trigger:
  • Fragile Inspiration Extra Drain FX
    • Events
    • Conditions
    • Actions
      • -------- FX to be created when the spell ends, if the target will take a mana penalty. --------
      • Special Effect - Create a special effect attached to the head of FI_Target[FI_LoopIndex] using Abilities\Spells\Undead\AbsorbMana\AbsorbManaBirthMissile.mdl
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the head of FI_Target[FI_LoopIndex] using Abilities\Weapons\SpiritOfVengeanceMissile\SpiritOfVengeanceMissile.mdl
      • Special Effect - Destroy (Last created special effect)
- Triggers -
Trigger:
  • Fragile Inspiration Cleanup
    • Events
    • Conditions
    • Actions
      • Set FI_Target[FI_LoopIndex] = FI_Target[FI_Count]
      • Set FI_ManaUsed[FI_LoopIndex] = FI_ManaUsed[FI_Count]
      • Set FI_LastMana[FI_LoopIndex] = FI_LastMana[FI_Count]
      • Set FI_LastPercentMana[FI_LoopIndex] = FI_LastPercentMana[FI_Count]
      • Set FI_Time[FI_LoopIndex] = FI_Time[FI_Count]
      • Set FI_ManaRegenerated[FI_LoopIndex] = FI_ManaRegenerated[FI_Count]
      • Set FI_Level[FI_LoopIndex] = FI_Level[FI_Count]
      • Set FI_Count = (FI_Count - 1)
      • Set FI_LoopIndex = (FI_LoopIndex - 1)

Trigger:
  • Fragile Inspiration Mana Check
    • Events
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FI_LastMana[FI_LoopIndex] Greater than (Mana of FI_Target[FI_LoopIndex])
          • FI_LastPercentMana[FI_LoopIndex] Greater than (Percentage mana of FI_Target[FI_LoopIndex])
          • (FI_LastMana[FI_LoopIndex] - (Mana of FI_Target[FI_LoopIndex])) Less than ((4.00 x (FI_LastPercentMana[FI_LoopIndex] - (Percentage mana of FI_Target[FI_LoopIndex]))) x (Max mana of FI_Target[FI_LoopIndex]))
        • Then - Actions
          • Set FI_ManaUsed[FI_LoopIndex] = (FI_ManaUsed[FI_LoopIndex] + (FI_LastMana[FI_LoopIndex] - (Mana of FI_Target[FI_LoopIndex])))
          • Game - Display to (All players) the text: (String(FI_LastPercentMana[FI_LoopIndex]))
          • Game - Display to (All players) the text: (String((Percentage mana of FI_Target[FI_LoopIndex])))
        • Else - Actions
      • Set FI_LastMana[FI_LoopIndex] = (Mana of FI_Target[FI_LoopIndex])
      • Set FI_LastPercentMana[FI_LoopIndex] = (Percentage mana of FI_Target[FI_LoopIndex])

Trigger:
  • Fragile Inspiration Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to FI__Ability
    • Actions
      • Set FI_Count = (FI_Count + 1)
      • Set FI_Target[FI_Count] = (Target unit of ability being cast)
      • Set FI_ManaUsed[FI_Count] = 0.00
      • Set FI_LastMana[FI_Count] = (Mana of FI_Target[FI_Count])
      • Set FI_LastPercentMana[FI_Count] = (Percentage mana of FI_Target[FI_Count])
      • Set FI_Time[FI_Count] = 0.00
      • Set FI_ManaRegenerated[FI_Count] = 0.00
      • Set FI_Level[FI_Count] = (Level of FI__Ability for (Triggering unit))
      • Trigger - Turn on Fragile Inspiration Periodic <gen>

Trigger:
  • Fragile Inspiration Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to FI__Ability
    • Actions
      • Set FI_Count = (FI_Count + 1)
      • Set FI_Target[FI_Count] = (Target unit of ability being cast)
      • Set FI_ManaUsed[FI_Count] = 0.00
      • Set FI_LastMana[FI_Count] = (Mana of FI_Target[FI_Count])
      • Set FI_Time[FI_Count] = 0.00
      • Set FI_ManaRegenerated[FI_Count] = 0.00
      • Set FI_Level[FI_Count] = (Level of FI__Ability for (Triggering unit))
      • Trigger - Turn on Fragile Inspiration Periodic <gen>

-- Bleeding Heart --
- Description -
Causes the hero to take more damage than normal, healing nearby allied units for an amount equal to the extra damage.

Ratios are configurable. It has an extra option whereby the special effects for the spell will only be seen by allied players, preventing enemies from easily being able to tell which unit to attack (or avoid).

- Screenshot (almost pointless for these spells) -
2wgawcn.jpg
- Readme -
Code:
Bleeding Heart -- v1.0.0 -- Bittersweet Spellpack -- by Weep

   Requires:
   1. An instant unit autoindexer, such as AIDS by Jesus4Lyf, AutoIndex by grim001, or
      UnitIndexingUtils by Rising_Dusk.  (GUI-AIDS is included in the demo map.)
   2. GDD by Weep (included in the demo map or available from
      http://www.thehelper.net/forums/showthread.php?t=137957)
   3. The base ability "Bleeding Heart".
   4. The buff "Bleeding Heart".
   5. This trigger category and the triggers it contains.

-- What? --
   This spell causes the caster to take extra damage, healing nearby friendly units for an
   amount proportional to the extra damage taken.  It has an extra option whereby the special
   effects for the spell will only be seen by allied players, preventing enemies from easily
   being able to tell which unit to attack (or avoid).
   
   The ability is based on Frenzy, and so can be set to autocast when the unit is attacked.

   It is MPI/MUI up to 8191 simultaneous instances.

-- How To Implement --
   1. Be sure "Automatically create unknown variables while pasting trigger data" is
      enabled in the World Editor general preferences.
   2. Add the required resources listed above, if not already present in your map.
   3. The rawcodes for the imported units and abilities have probably changed; set the
      "Bleeding Heart" ability to apply the buff "Bleeding Heart" at all levels.
      If desired, change the duration, cooldown, levels, and mana cost to suit your map.
      
      In the "Bleeding Heart Globals" trigger, set BH__Ability to the "Bleeding Heart"
      ability and BH__Buff to the "Bleeding Heart" buff.  Edit any of the other parameters to
      suit your map.
      
-- Notes --
   When using a unit autoindexer, you will not be able to have any other triggers in your map
   that set a unit's custom value, since this is what autoindexers do.  Any such triggers can
   be remade using an integer array using the unit's custom value as the index.

-- Credits --
   Credit in your map is not needed but appreciated.  Please include this README.  Do not
   claim this spell as your own work.

-- Version History --
   1.0.0: First release.
- Configuration and Globals -
Trigger:
  • Bleeding Heart Globals
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- The ability used for Bleeding Heart. --------
      • Set BH__Ability = Bleeding Heart
      • -------- The buff applied by Bleeding Heart. --------
      • Set BH__Buff = Bleeding Heart
      • -------- The effect to be displayed on the caster, and the attachment point. --------
      • Set BH__CasterFXModel = Abilities\Spells\Other\Drain\DrainCaster.mdl
      • Set BH__CasterFXAttachment = origin
      • -------- The effect to be displayed on the caster when it takes damage, and the attachment point. --------
      • Set BH__HitFXModel = Objects\Spawnmodels\Critters\Albatross\CritterBloodAlbatross.mdl
      • Set BH__HitFXAttachment = chest
      • -------- The effect to be displayed on a healed unit, and the attachment point. --------
      • Set BH__HealingFXModel = Abilities\Spells\Undead\VampiricAura\VampiricAuraTarget.mdl
      • Set BH__HealingFXAttachment = origin
      • -------- If set to true, enemy players will not see any special effects created by this spell. --------
      • -------- Therefore, they won't easily be able to tell which units to attack, or to not attack. --------
      • Set BH__StealthFX = True
      • -------- If set to true, only damage from enemies will count. --------
      • Set BH__OnlyEnemies = False
      • -------- If set to true, all nearby friendly units will be healed for the full amount. --------
      • -------- If set to false, the total healing will equal the damage taken. Each unit will be healed less proportional to the number of units that get healing. --------
      • Set BH__HealingPerUnit = True
      • -------- The amount of extra damage taken by the caster as a multiplier, for each level of the spell. --------
      • Set BH__Multiplier[1] = 0.30
      • Set BH__Multiplier[2] = 0.45
      • Set BH__Multiplier[3] = 0.60
      • -------- A multiplier for how much of the extra damage will be used for healing. --------
      • Set BH__Scale[1] = 1.00
      • Set BH__Scale[2] = 1.00
      • Set BH__Scale[3] = 1.00
      • -------- The radius in which to heal friendly units. --------
      • Set BH__Radius[1] = 450.00
      • Set BH__Radius[2] = 450.00
      • Set BH__Radius[3] = 450.00
- Triggers -
JASS:
// Method of creating special effects for a local player without desyncing thanks to PurgeandFire
// <a href="http://www.thehelper.net/forums/showthread.php?t=89207" class="link link--internal">http://www.thehelper.net/forums/showthread.php?t=89207</a>
function BH_CasterFXActions takes nothing returns nothing
    local string s = udg_BH__CasterFXModel
    if(udg_BH__StealthFX and IsPlayerEnemy(GetLocalPlayer(), GetOwningPlayer(udg_BH_TempUnit))) then
        set s = &quot;&quot;
    endif
    set udg_BH_CasterFX[udg_BH_Index] = AddSpecialEffectTarget(s, udg_BH_TempUnit, udg_BH__CasterFXAttachment)
    set s = null
endfunction

//===========================================================================
function InitTrig_Bleeding_Heart_Caster_FX takes nothing returns nothing
    set gg_trg_Bleeding_Heart_Caster_FX = CreateTrigger()
    call TriggerAddAction(gg_trg_Bleeding_Heart_Caster_FX, function BH_CasterFXActions)
endfunction

JASS:
// Method of creating special effects for a local player without desyncing thanks to PurgeandFire
// <a href="http://www.thehelper.net/forums/showthread.php?t=89207" class="link link--internal">http://www.thehelper.net/forums/showthread.php?t=89207</a>
function BH_HealingFXActions takes nothing returns nothing
    local string s = udg_BH__HealingFXModel
    if(udg_BH__StealthFX and IsPlayerEnemy(GetLocalPlayer(), GetOwningPlayer(udg_BH_HealSource))) then
        set s = &quot;&quot;
    endif
    call DestroyEffect(AddSpecialEffectTarget(s, udg_BH_TempUnit, udg_BH__HealingFXAttachment))
    set s = null
endfunction

//===========================================================================
function InitTrig_Bleeding_Heart_Healing_FX takes nothing returns nothing
    set gg_trg_Bleeding_Heart_Healing_FX = CreateTrigger()
    call TriggerAddAction(gg_trg_Bleeding_Heart_Healing_FX, function BH_HealingFXActions)
endfunction

JASS:
// Method of creating special effects for a local player without desyncing thanks to PurgeandFire
// <a href="http://www.thehelper.net/forums/showthread.php?t=89207" class="link link--internal">http://www.thehelper.net/forums/showthread.php?t=89207</a>
function BH_HitFXActions takes nothing returns nothing
    local string s = udg_BH__HitFXModel
    if(udg_BH__StealthFX and IsPlayerEnemy(GetLocalPlayer(), GetOwningPlayer(udg_BH_HealSource))) then
        set s = &quot;&quot;
    endif
    call DestroyEffect(AddSpecialEffectTarget(s, udg_BH_HealSource, udg_BH__HitFXAttachment))
    set s = null
endfunction

//===========================================================================
function InitTrig_Bleeding_Heart_Hit_FX takes nothing returns nothing
    set gg_trg_Bleeding_Heart_Hit_FX = CreateTrigger()
    call TriggerAddAction(gg_trg_Bleeding_Heart_Hit_FX, function BH_HitFXActions)
endfunction

Trigger:
  • Bleeding Heart Damage Detect
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • (GDD_DamagedUnit has buff BH__Buff) Equal to True
      • GDD_Damage Not equal to 0.00
    • Actions
      • Set BH_Index = (Custom value of GDD_DamagedUnit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • GDD_Damage Greater than 0.00
        • Then - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Or - Any (Conditions) are true
                • Conditions
                  • BH__OnlyEnemies Equal to False
                  • (GDD_DamageSource belongs to an ally of (Owner of GDD_DamagedUnit)) Equal to False
            • Then - Actions
              • Trigger - Turn off (This trigger)
              • Unit - Cause GDD_DamageSource to damage GDD_DamagedUnit, dealing (BH__Multiplier[BH_Level[BH_Index]] x GDD_Damage) damage of attack type Chaos and damage type Universal
              • Trigger - Turn on (This trigger)
              • Set BH_DamageTotal[BH_Index] = (BH_DamageTotal[BH_Index] + (BH__Multiplier[BH_Level[BH_Index]] x GDD_Damage))
            • Else - Actions
        • Else - Actions
          • Set BH_DamageTotal[BH_Index] = (BH_DamageTotal[BH_Index] + GDD_Damage)
      • Unit Group - Add GDD_DamagedUnit to BH_DamageGroup
      • Countdown Timer - Start BH__Timer as a One-shot timer that will expire in 0.00 seconds

Trigger:
  • Bleeding Heart Healing
    • Events
      • Time - BH__Timer expires
    • Conditions
    • Actions
      • Unit Group - Pick every unit in BH_DamageGroup and do (Actions)
        • Loop - Actions
          • Set BH_HealSource = (Picked unit)
          • Set BH_Index = (Custom value of BH_HealSource)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • BH_DamageTotal[BH_Index] Greater than 0.00
            • Then - Actions
              • Trigger - Run Bleeding Heart Hit FX &lt;gen&gt; (ignoring conditions)
              • Set BH_TempPoint = (Position of BH_HealSource)
              • Set BH_TempGroup = (Units within BH__Radius[BH_Level[BH_Index]] of BH_TempPoint matching ((((((Matching unit) is A structure) Equal to False) and ((Matching unit) Not equal to BH_HealSource)) and (((Matching unit) belongs to an ally of (Owner of BH_HealSource)) Equal to True))
              • Set BH_TempReal = 0.00
              • Unit Group - Pick every unit in BH_TempGroup and do (Actions)
                • Loop - Actions
                  • Set BH_TempUnit = (Picked unit)
                  • -------- Specify what classifications of units will not be healed in the following condition: --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • Or - Any (Conditions) are true
                        • Conditions
                          • (BH_TempUnit is Mechanical) Equal to True
                          • (BH_TempUnit is Magic Immune) Equal to True
                          • (Percentage life of BH_TempUnit) Greater than or equal to 100.00
                    • Then - Actions
                      • Unit Group - Remove BH_TempUnit from BH_TempGroup
                    • Else - Actions
                      • Set BH_TempReal = (BH_TempReal + (1.00 - ((Percentage life of BH_TempUnit) / 100.00)))
              • Unit Group - Pick every unit in BH_TempGroup and do (Actions)
                • Loop - Actions
                  • Set BH_TempUnit = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • BH_TempReal Greater than 0.00
                    • Then - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • BH__HealingPerUnit Equal to True
                        • Then - Actions
                          • Unit - Set life of BH_TempUnit to ((Life of BH_TempUnit) + (BH__Multiplier[BH_Level[BH_Index]] x (BH__Scale[BH_Level[BH_Index]] x BH_DamageTotal[BH_Index])))
                        • Else - Actions
                          • Unit - Set life of BH_TempUnit to ((Life of BH_TempUnit) + (((1.00 - ((Percentage life of BH_TempUnit) / 100.00)) / BH_TempReal) x (BH__Multiplier[BH_Level[BH_Index]] x (BH__Scale[BH_Level[BH_Index]] x BH_DamageTotal[BH_Index]))))
                    • Else - Actions
                  • Trigger - Run Bleeding Heart Healing FX &lt;gen&gt; (ignoring conditions)
              • Custom script: call RemoveLocation(udg_BH_TempPoint)
              • Custom script: call DestroyGroup(udg_BH_TempGroup)
            • Else - Actions
          • Set BH_DamageTotal[BH_Index] = 0.00
      • Unit Group - Remove all units from BH_DamageGroup

Trigger:
  • Bleeding Heart Periodic
    • Events
      • Time - Every 0.10 seconds of game time
    • Conditions
    • Actions
      • For each (Integer BH_LoopIndex) from 1 to BH_CasterCount, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (BH_Casters[BH_IndexList[BH_LoopIndex]] has buff BH__Buff) Equal to False
            • Then - Actions
              • Special Effect - Destroy BH_CasterFX[BH_IndexList[BH_LoopIndex]]
              • Custom script: set udg_BH_CasterFX[udg_BH_IndexList[udg_BH_LoopIndex]] = null
              • Set BH_Casters[BH_IndexList[BH_LoopIndex]] = No unit
              • Set BH_IndexList[BH_LoopIndex] = BH_IndexList[BH_CasterCount]
              • Set BH_CasterCount = (BH_CasterCount - 1)
              • Set BH_LoopIndex = (BH_LoopIndex - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • BH_CasterCount Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                  • Trigger - Turn off Bleeding Heart Damage Detect &lt;gen&gt;
                • Else - Actions
            • Else - Actions

Trigger:
  • Bleeding Heart Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to BH__Ability
    • Actions
      • Set BH_TempUnit = (Triggering unit)
      • Set BH_Index = (Custom value of BH_TempUnit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BH_Casters[BH_Index] Not equal to BH_TempUnit
        • Then - Actions
          • Set BH_CasterCount = (BH_CasterCount + 1)
          • Set BH_IndexList[BH_CasterCount] = BH_Index
        • Else - Actions
      • Set BH_Casters[BH_Index] = BH_TempUnit
      • Set BH_Level[BH_Index] = (Level of BH__Ability for BH_TempUnit)
      • Special Effect - Destroy BH_CasterFX[BH_Index]
      • Trigger - Run Bleeding Heart Caster FX &lt;gen&gt; (ignoring conditions)
      • Trigger - Turn on Bleeding Heart Periodic &lt;gen&gt;
      • Trigger - Turn on Bleeding Heart Damage Detect &lt;gen&gt;

-- Subversion --
- Description -
Switches damage and healing taken by the hero.

Spell requested by Avaleirra, and is nearly identical to a spell from the Flash game "Sonny". Works correctly with the other abilities, ignoring regular damage and counting healing as damage.

- Screenshot (almost pointless for these spells) -
r7r5v5.jpg
- Readme -
Code:
Subversion -- v1.1.0 -- Bittersweet Spellpack -- by Weep

   Requires:
   1. An instant unit autoindexer, such as AIDS by Jesus4Lyf, AutoIndex by grim001, or
      UnitIndexingUtils by Rising_Dusk.  (GUI-AIDS is included in the demo map.)
   2. GDD by Weep (included in the demo map or available from
      http://www.thehelper.net/forums/showthread.php?t=137957)
   3. The base ability "Subversion".
   4. The buff "Subversion".
   5. The item ability "Death Prevention (Subversion)".
   6. This trigger category and the triggers it contains.

-- What? --
   This spell switches healing and damage for the caster; damage will heal it and healing
   will damage it while it has the buff.  The spell can filter out small health changes, so
   gradual healing like the natural regeneration of the hero will not be changed.

   It is MPI/MUI up to 8191 simultaneous instances.

-- How To Implement --
   1. Be sure "Automatically create unknown variables while pasting trigger data" is
      enabled in the World Editor general preferences.
   2. Add the required resources listed above, if not already present in your map.
   3. The rawcodes for the imported units and abilities have probably changed; set the
      "Subversion" ability to apply the buff "Subversion" at all levels.  If desired, change
      the duration, cooldown, levels, and mana cost to suit your map.
      
      In the "Subversion Globals" trigger, set SV__Ability to the "Subversion" ability and
      SV__Buff to the "Subversion" buff.  Set SV__AbilityDeathPrevent to the "Death
      Prevention (Subversion)" item ability.  Edit any of the other parameters to suit your
      map.
      
      If desired, change the "Subversion Damage FX" and "Subversion Heal FX" triggers to
      generate the wanted special effects.
      
-- Notes --
   When using a unit autoindexer, you will not be able to have any other triggers in your map
   that set a unit's custom value, since this is what autoindexers do.  Any such triggers can
   be remade using an integer array using the unit's custom value as the index.

-- Credits --
   Credit in your map is not needed but appreciated.  Please include this README.  Do not
   claim this spell as your own work.

-- Version History --
   1.1.0: Filters out effects due to changes in maximum HP.
   1.0.0: First release.
- Configuration and Globals -
Trigger:
  • Subversion Globals
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- The ability used for Subversion. --------
      • Set SV__Ability = Subversion
      • -------- The buff applied by Subversion. --------
      • Set SV__Buff = Subversion
      • -------- The ability used for preventing unit death. --------
      • Set SV__AbilityDeathPrevent = Death Prevention (Subversion)
      • -------- The minimum health change that will be considered by the spell. --------
      • -------- This will filter out gradual regeneration, such as the hero&#039;s natural regeneration. --------
      • Set SV_MinimumChange = 1.50
      • -------- Precomputation. Don&#039;t edit below this line! --------
      • Set SV_LoopIndex = 0

Trigger:
  • Subversion Damage FX
    • Events
    • Conditions
    • Actions
      • -------- FX to be created if the unit is damaged (switched to healing). --------
      • Special Effect - Create a special effect attached to the overhead of SV_TempUnit using Abilities\Weapons\ProcMissile\ProcMissile.mdl
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the overhead of SV_TempUnit using Abilities\Spells\Items\WandOfNeutralization\NeutralizationMissile.mdl
      • Special Effect - Destroy (Last created special effect)

Trigger:
  • Subversion Heal FX
    • Events
    • Conditions
    • Actions
      • -------- FX to be created if the unit is healed (switched to damage). --------
      • Special Effect - Create a special effect attached to the overhead of SV_TempUnit using Abilities\Spells\Other\BlackArrow\BlackArrowMissile.mdl
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the overhead of SV_TempUnit using Abilities\Spells\NightElf\shadowstrike\ShadowStrikeMissile.mdl
      • Special Effect - Destroy (Last created special effect)
- Triggers -
Trigger:
  • Subversion Health Check
    • Events
    • Conditions
    • Actions
      • Set SV_TempReal = (SV_LastHealth[SV_TempInteger] - (Life of SV_TempUnit))
      • -------- Did its health change more than the minimum? --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Abs(SV_TempReal)) Greater than or equal to SV_MinimumChange
          • SV_LastPercentHealth[SV_TempInteger] Not equal to (Percentage life of SV_TempUnit)
          • (Abs(SV_TempReal)) Less than (Abs(((4.00 x (SV_LastPercentHealth[SV_TempInteger] - (Percentage life of SV_TempUnit))) x (Max life of SV_TempUnit))))
        • Then - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • SV_TempReal Greater than 0.00
            • Then - Actions
              • -------- Actions to be done if the unit is damaged (switched to healing). --------
              • Trigger - Run Subversion Damage FX &lt;gen&gt; (ignoring conditions)
              • -------- Change its life to the opposite. --------
              • Unit - Set life of SV_TempUnit to ((2.00 x SV_TempReal) + (Life of SV_TempUnit))
            • Else - Actions
              • -------- Actions to be done if the unit is healed (switched to damage). --------
              • Trigger - Run Subversion Heal FX &lt;gen&gt; (ignoring conditions)
              • -------- Undo the healing. --------
              • Unit - Set life of SV_TempUnit to SV_LastHealth[SV_TempInteger]
              • -------- Deal the healing as damage. --------
              • Trigger - Turn off Subversion Damage Detect &lt;gen&gt;
              • Unit - Cause SV_TempUnit to damage SV_TempUnit, dealing (0.00 - SV_TempReal) damage of attack type Chaos and damage type Universal
              • Trigger - Turn on Subversion Damage Detect &lt;gen&gt;
        • Else - Actions

Trigger:
  • Subversion Damage Detect
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • GDD_Damage Greater than 0.00
      • (GDD_DamagedUnit has buff SV__Buff) Equal to True
    • Actions
      • Set SV_TempUnit = GDD_DamagedUnit
      • Set SV_TempInteger = (Custom value of SV_TempUnit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SV_TempUnit is in SV_DamageGroup) Equal to False
        • Then - Actions
          • Trigger - Run Subversion Health Check &lt;gen&gt; (ignoring conditions)
        • Else - Actions
      • Unit - Set life of SV_TempUnit to ((Life of SV_TempUnit) + GDD_Damage)
      • -------- Prevent death by temporarily giving the unit a +health ability. --------
      • Unit - Add SV__AbilityDeathPrevent to SV_TempUnit
      • Set SV_LastHealth[SV_TempInteger] = (Life of SV_TempUnit)
      • Set SV_LastPercentHealth[SV_TempInteger] = (Percentage life of SV_TempUnit)
      • -------- Fake GDD negative damage event to let the other abilities know to cancel the damage. --------
      • Trigger - Turn off (This trigger)
      • Set SV_TempReal = GDD_Damage
      • Set GDD_Damage = (0.00 - GDD_Damage)
      • Set GDD_Event = 1.00
      • Set GDD_Event = 0.00
      • Set GDD_Damage = SV_TempReal
      • Trigger - Turn on (This trigger)
      • -------- End fake event. --------
      • Unit Group - Add SV_TempUnit to SV_DamageGroup
      • Countdown Timer - Start SV__Timer as a One-shot timer that will expire in 0.00 seconds

Trigger:
  • Subversion Damage Reset
    • Events
      • Time - SV__Timer expires
    • Conditions
    • Actions
      • Unit Group - Pick every unit in SV_DamageGroup and do (Actions)
        • Loop - Actions
          • Set SV_TempUnit = (Picked unit)
          • Set SV_TempInteger = (Custom value of SV_TempUnit)
          • Unit - Remove SV__AbilityDeathPrevent from SV_TempUnit
          • Set SV_LastHealth[SV_TempInteger] = (Life of SV_TempUnit)
          • Set SV_LastPercentHealth[SV_TempInteger] = (Percentage life of SV_TempUnit)
          • Trigger - Run Subversion Damage FX &lt;gen&gt; (ignoring conditions)
      • Unit Group - Remove all units from SV_DamageGroup

Trigger:
  • Subversion Periodic
    • Events
      • Time - Every 0.01 seconds of game time
    • Conditions
    • Actions
      • -------- Loop through all units with Subversion --------
      • For each (Integer SV_LoopIndex) from 1 to SV_UnitCount, do (Actions)
        • Loop - Actions
          • Set SV_TempUnit = SV_UnitArray[SV_LoopIndex]
          • Set SV_TempInteger = (Custom value of SV_TempUnit)
          • -------- Does it still have the buff? --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (SV_TempUnit has buff SV__Buff) Equal to True
            • Then - Actions
              • Trigger - Run Subversion Health Check &lt;gen&gt; (ignoring conditions)
              • -------- Save its current life. --------
              • Set SV_LastHealth[SV_TempInteger] = (Life of SV_TempUnit)
              • Set SV_LastPercentHealth[SV_TempInteger] = (Percentage life of SV_TempUnit)
            • Else - Actions
              • -------- No buff? Remove it from the array, replacing it with the unit at the end of the array. --------
              • Set SV_UnitArray[SV_LoopIndex] = SV_UnitArray[SV_UnitCount]
              • Set SV_UnitCount = (SV_UnitCount - 1)
              • Set SV_LoopIndex = (SV_LoopIndex - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SV_UnitCount Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                  • Trigger - Turn off Subversion Damage Detect &lt;gen&gt;
                • Else - Actions

Trigger:
  • Subversion Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to SV__Ability
      • ((Triggering unit) has buff SV__Buff) Equal to False
    • Actions
      • Set SV_TempUnit = (Triggering unit)
      • Set SV_TempInteger = (Custom value of SV_TempUnit)
      • Set SV_UnitCount = (SV_UnitCount + 1)
      • Set SV_UnitArray[SV_UnitCount] = SV_TempUnit
      • Set SV_LastHealth[SV_TempInteger] = (Life of SV_TempUnit)
      • Set SV_LastPercentHealth[SV_TempInteger] = (Percentage life of SV_TempUnit)
      • Trigger - Turn on Subversion Periodic &lt;gen&gt;
      • Trigger - Turn on Subversion Damage Detect &lt;gen&gt;

-- Credits --
Credit in your map is not needed but appreciated. Please include the READMEs. Do not claim these spells as your own work.

-- Version History --
1.1.0: Updated Fragile Inspiration and Subversion to ignore effects due to changes in maximum mana/HP.
1.0.0: First release.

--------------------------------------​

All comments welcome.
 

Attachments

  • Bittersweet Spellpack 1.1.0.w3x
    56 KB · Views: 249

tooltiperror

Super Moderator
Reaction score
231
Very Nice, I like the effects.

Simple but Bold.

Good Job!
 

Azlier

Old World Ghost
Reaction score
461
>leakless (as far as GUI can be)

Thank you for not lying to us with a big LEAKLESS!!1! header. You get +rep.

I like bittersweet spells.
 

Weep

Godspeed to the sound of the pounding
Reaction score
400
I like bittersweet spells.
How convenient, I like rep. :D

@ToolTipError and Avalierra: thanks! :)

I think I may be doing a 1.1 release shortly, because I just realized that you could probably abuse Subversion by repeatedly dropping and picking up a +max health item like Khadgar's Gem. This same type of thing also probably affects Fragile Inspiration.
 

Weep

Godspeed to the sound of the pounding
Reaction score
400
Updated with the aforementioned changes.
 

tooltiperror

Super Moderator
Reaction score
231
Maybe you could, maybe, try to add in some more special effects to get some attraction?

You could create an effect that represents swapping with Subversion.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top