1. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  2. DID YOU KNOW - That you can unlock new rank icons by posting on the forums or winning contests? Click here to customize your rank or read our User Rank Policy to see a list of ranks that you can unlock. Have you won a contest and still havn't received your rank award? Then please contact the administration.
    Dismiss Notice
  3. The Lich King demands your service! We've reached the 19th edition of the Icon Contest. Come along and make some chilling servants for the one true king.
    Dismiss Notice
  4. The 4th SFX Contest has started. Be sure to participate and have a fun factor in it.
    Dismiss Notice
  5. The poll for the 21st Terraining Contest is LIVE. Be sure to check out the entries and vote for one.
    Dismiss Notice
  6. The results are out! Check them out.
    Dismiss Notice
  7. Don’t forget to sign up for the Hive Cup. There’s a 555 EUR prize pool. Sign up now!
    Dismiss Notice
  8. The Hive Workshop Cup contest results have been announced! See the maps that'll be featured in the Hive Workshop Cup tournament!
    Dismiss Notice
  9. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Zephyr Contest #11 - My aura, Your aura

Discussion in 'Contest Archive' started by Pharaoh_, Jul 1, 2014.

Thread Status:
Not open for further replies.
  1. Pharaoh_

    Pharaoh_

    Joined:
    Nov 6, 2008
    Messages:
    8,127
    Resources:
    11
    Icons:
    3
    Skins:
    1
    Spells:
    6
    Tutorials:
    1
    Resources:
    11
    You did well actually, don't apologize for that. I have had a lot of ideas in the past, solely due to breaking words down to a literal or metaphorical meaning. :)

    That was an off-topic note, nothing to be taken seriously!
     
  2. Tank-Commander

    Tank-Commander

    Spell Reviewer

    Joined:
    May 26, 2009
    Messages:
    1,542
    Resources:
    44
    Packs:
    1
    Spells:
    41
    Tutorials:
    2
    Resources:
    44
    Wasn't there a big debate about this? to my knowledge it ended in favour of no wurst (The debate about it just sort of disappeared after it being stated not to be included one last time)
    Sources:
    http://www.hiveworkshop.com/forums/2495424-post56.html
    http://www.hiveworkshop.com/forums/2493634-post37.html
    http://www.hiveworkshop.com/forums/2493659-post39.html

    Doesn't appear to be any "official" verdict on it though
     
  3. Zeatherann

    Zeatherann

    Joined:
    Nov 25, 2008
    Messages:
    1,303
    Resources:
    6
    Skins:
    1
    Tools:
    1
    Maps:
    4
    Resources:
    6
    My Aura's Tooltip

    Aura
    Frozen Ground

    Active: Empowers the aura, freezing all affected enemy units for 5 seconds and slowing them by 50% for 5 more seconds after thawing.



    Passive (State 1): All enemy units that enter the area of effect for the aura are frozen for 1 second.



    Passive (State 2): All enemy units that leave the area of effect for the aura are frozen for 1 second.



    Right-click to toggle the passive effect.
    Configurables
    • Length of passive freezing.
    • Length of active freezing.
    • Radius of area of effect.
    • And of course; all the object data of the spell (cooldown, mana cost, etc.)

    The spell object is based off of "Restore" which is the unused ability of the Undead's Obsidian Statue, which has the life and mana variants. This spell's base is supposed to be for both. It is an autocast ability that has no target when clicked, allowing for a state based activated ability. The activated aspect of this is taken from Diablo III's Crusaders' auras and their ability to empower them with a cooldown for additional effect. Only passive state is shown at a time, as the tooltip adjusts itself to show which passive effect is displayed based on if the spell's autocast aspect is turned on or off. I haven't finished it yet so I don't know what the autocast AI will do for the spell, since it is ment to target allies and the spell can't target allies it might not function with AI (which is my goal) versus casting it at the wrong moment.

    A simple spell with a neat twist on passive in my opinion. Hopefully my supporting aura code will allow for a higher coding score.

    Nice spell Tank-Commander.

    Edit:
    Systems Used
    • Spell Handler - Zeatherann
    • Order Handler - Zeatherann
    • Aura Handler - Zeatherann
    ~ Note: While I've written some of these systems before, I rewrote them for this map as well ~
    Edit 2
    Systems
    Code (vJASS):
    //====================================================================================================
    //
    //   Order Handler System
    //
    //   Author: Zeatherann
    //   Description: Catches anytime a unit is issued any order and handles triggers listening for those
    //                orders in O(log n) time.
    //
    //====================================================================================================
    //****************************************************************************************************
    //*
    //*  Global Variables
    //*
    //****************************************************************************************************
    globals
        // Non-system specific globals.
        hashtable Hash=InitHashtable()
        // System globals.
        constant trigger Event_Ordered=CreateTrigger()
        constant integer EVENT_UNIT_ORDERED=2
    endglobals
    //****************************************************************************************************
    //*
    //*  Order Handler System
    //*
    //****************************************************************************************************
    // RegisterOrder
    //    takes integer  Order_Id - The orderid to listen for.
    //          boolexpr Function - The code to run when a unit is issued the order.
    //    returns nothing
    //
    //    Attaches the given order to a trigger to be called in O(log n) time.
    function RegisterOrder takes integer Order_Id,boolexpr Function returns nothing
        local trigger Order=CreateTrigger()
        call TriggerAddCondition(Order,Function)
        call SaveTriggerHandle(Hash,EVENT_UNIT_ORDERED,Order_Id,Order)
        set Order=null
    endfunction
    //====================================================================================================
    //   Registered Orders.
    //====================================================================================================
    //====================================================================================================
    //   Order Handler Functions - Called and handled internally.
    //====================================================================================================
    function RegisterOrders takes nothing returns nothing
        local timer Caller=GetExpiredTimer()
        call DestroyTimer(Caller)
        set Caller=null
        // ***** Register all orders ***** //
    endfunction

    function Event_OrderedFunction takes nothing returns nothing
        call TriggerEvaluate(LoadTriggerHandle(Hash,EVENT_UNIT_ORDERED,GetIssuedOrderId()))
    endfunction
    // OrderHandler_Initialization
    //    takes nothing
    //    returns nothing
    //
    //    Call this once on map initialization.
    function OrderHandler_Initialization takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function RegisterOrders)
        call TriggerAddCondition(Event_Ordered,Filter(function Event_OrderedFunction))
        call TriggerRegisterAnyUnitEventBJ(Event_Ordered,EVENT_PLAYER_UNIT_ISSUED_ORDER)
        call TriggerRegisterAnyUnitEventBJ(Event_Ordered,EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
        call TriggerRegisterAnyUnitEventBJ(Event_Ordered,EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
    endfunction
    Code (vJASS):
    //====================================================================================================
    //
    //   Spell Handler System
    //
    //   Author: Zeatherann
    //   Description: Catches any spell cast event and maps it to a hashtable of saved functions for given
    //                spells. Works in O(log n) time. Currently supports EVENT_PLAYER_UNIT_SPELL_CAST and
    //                EVENT_PLAYER_UNIT_SPELL_EFFECT events, but can be easily modified to add support for
    //                the other events.
    //
    //====================================================================================================
    //****************************************************************************************************
    //*
    //*  Global Variables
    //*
    //****************************************************************************************************
    globals
        // Non-system specific globals.
        hashtable Hash=InitHashtable()
        // System globals.
        constant trigger Event_SpellCast=CreateTrigger()
        constant trigger Event_SpellEffect=CreateTrigger()
        constant integer EVENT_SPELL_CAST=0
        constant integer EVENT_SPELL_EFFECT=1
    endglobals
    //****************************************************************************************************
    //*
    //*  Spell Handler System
    //*
    //****************************************************************************************************
    // RegisterSpell
    //    takes integer  SpellId  - The spell's object id to attach a function to.
    //          integer  Event    - The event to listen for.
    //          boolexpr Function - The code to run when the spell's event is triggered.
    //    returns nothing
    //
    //    Attaches the given spell to a trigger to be called in O(log n) time.
    function RegisterSpell takes integer SpellId,integer Event,boolexpr Function returns nothing
        local trigger Spell=CreateTrigger()
        call TriggerAddCondition(Spell,Function)
        call SaveTriggerHandle(Hash,Event,SpellId,Spell)
        set Spell=null
    endfunction
    //====================================================================================================
    //   Registered Spells.
    //====================================================================================================
    //====================================================================================================
    //   Spell Handler Functions - Called and handled internally.
    //====================================================================================================
    function RegisterSpells takes nothing returns nothing
        local timer Caller=GetExpiredTimer()
        call DestroyTimer(Caller)
        set Caller=null
        // ***** Register all spells ***** //
    endfunction

    function Event_SpellCastFunction takes nothing returns nothing
        call TriggerEvaluate(LoadTriggerHandle(Hash,EVENT_SPELL_CAST,GetSpellAbilityId()))
    endfunction

    function Event_SpellEffectFunction takes nothing returns nothing
        call TriggerEvaluate(LoadTriggerHandle(Hash,EVENT_SPELL_EFFECT,GetSpellAbilityId()))
    endfunction
    // SpellHandler_Initialization
    //    takes nothing
    //    returns nothing
    //
    //    Call this once on map initialization.
    function SpellHandler_Initialization takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function RegisterSpells)
        call TriggerAddCondition(Event_SpellCast,Filter(function Event_SpellCastFunction))
        call TriggerAddCondition(Event_SpellEffect,Filter(function Event_SpellEffectFunction))
        call TriggerRegisterAnyUnitEventBJ(Event_SpellCast,EVENT_PLAYER_UNIT_SPELL_CAST)
        call TriggerRegisterAnyUnitEventBJ(Event_SpellEffect,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    endfunction
     
    Last edited: Jul 4, 2014
  4. GunSlinger

    GunSlinger

    Joined:
    Oct 17, 2009
    Messages:
    1,441
    Resources:
    0
    Resources:
    0
    We got some nice entries here.
    As for me, I'm gonna make a freezing aura. It gradually slows down attack speed/movement speed if you're not attacking/moving. Once the slow reaches a certain point, it will freeze and you will not be able to attack or cast/move. When in the AOE, the enemy has the choice to either run(sacrificing damage), attack(take the danger of being rooted), or alternate between moving and attacking(Balance out the slows).
     
  5. Zeatherann

    Zeatherann

    Joined:
    Nov 25, 2008
    Messages:
    1,303
    Resources:
    6
    Skins:
    1
    Tools:
    1
    Maps:
    4
    Resources:
    6

    GunSlinger21; How does a unit become unfrozen?

     
  6. GunSlinger

    GunSlinger

    Joined:
    Oct 17, 2009
    Messages:
    1,441
    Resources:
    0
    Resources:
    0
    Oops. Forgot to add that. The freeze will last for a few seconds and the "frozen" speed will go back to normal afterwards.
     
  7. Kyrbi0

    Kyrbi0

    Joined:
    Jul 29, 2008
    Messages:
    7,882
    Resources:
    1
    Models:
    1
    Resources:
    1
    Lotta "freezing auras", guys, lol. :p That being said...

    This is downright fascinating; I've heard of abilities that are able to be used like this (toggled-state Active abilities with different effects per state), but never truly contemplated the possibilities! Even greater kudos for finding & utilizing an un(der)-used in-game ability for your base; too many people base off of Channel & call it a day, in my opinion. :p

    So I'm curious; does this trick work with any Autocast ability (i.e. Searing/Black/Cold Arrows? Raise Dead? Abolish Magic? Orb of Annihilation?), or is this hidden "Restore" unique (OK, it's a no-target Autocast, but aside from that; could I have used Spirit Touch or Essence of Blight (the actual Obsidian Statue abilities) instead?)?

    Neat-o.
     
  8. Kingz

    Kingz

    Joined:
    Jun 5, 2008
    Messages:
    2,470
    Resources:
    6
    Spells:
    5
    Tutorials:
    1
    Resources:
    6
    It's because it's a consensus that all (if possible) custom spells should use Channel because you can change Channels OrderId to avoid conflicts. (And not to mention the options it further allows).

    So unless you are doing something different like the shown here (Autocast), all custom spells should use channel, no exceptions.

    Also afaik there is a way to detect Autocast activation/deactivation by catching unit orders (Activation/Deactivation will proc a unit order event) so you can do that with probably any autocast. Major difference between autocast spells is when it is cast.

    It certainly won't proc on enemies. It will most certainly proc when allies nearby lose health and/or mana in the AoE if it can target them.
    Edit:

    You can try basing it on Frenzy (Neutral Hostile, looks like Bloodlust) and then it will proc when it comes into range of enemies. Or base it on Phase Shift maybe to proc on taking damage.
    Problem is then it will proc for users at that time also, i would say that you shouldn't worry about AI using it, it's not a requirement. (A lot of custom spells don't get used by melee AI, you need a custom AI or a scripted AI system for that)
     
    Last edited: Jul 4, 2014
  9. Zeatherann

    Zeatherann

    Joined:
    Nov 25, 2008
    Messages:
    1,303
    Resources:
    6
    Skins:
    1
    Tools:
    1
    Maps:
    4
    Resources:
    6

    Restore is one of the few auto cast abilities that don't have a target, and can be clicked with no valid targets in the AoE. Raise Dead requires a corpse, though you don't explicitly target the corpse. I hope that since my version of the Restore doesn't target allies the AI will not cast it automatically.

    The hard part here is getting proper aura handling, which isn't specific to any aura ability. My hope is to create a fluid enough of a system to fulfill the coding requirements, and have the spell itself be the creative part. I have a ton of time to do this, so I have no worries.

    Happy Fourth!
     
  10. Kyrbi0

    Kyrbi0

    Joined:
    Jul 29, 2008
    Messages:
    7,882
    Resources:
    1
    Models:
    1
    Resources:
    1
    Yeah yeah, I'm aware... Lol, I'm sorry if I sounded serious. I was being somewhat facetious. I know how useful Channel is (though to be honest, the OrderID things never really made sense to me; I've not really had problems with that, I should say). But yeah, it's a standard for a reason. I just sometimes wish people would utilize in-game abilities more & depend on completely coding them less.

    I looked it up; do you mean "Replenish"? Because the only "Restore" is the Acolyte's "building repair" ability. "Replenish" looks just like Essence of Blight/Spirit Touch, but is unused AFAIK.

    Anyway, super-cool. I'm gonna have to find a use for that. Somewhere.

    ~~~

    On a spell-related note, did some testing, and YEAH my "malediction" idea is solid gold (i.e. the base ability I tested, it works). Unfortunately my "benediction" idea is a little shaky; apparently reversing the fields on Cleaving Attack does not create a "Heal nearby Allies upon Attack (for a Percentage of Attack Damage)" ability naturally. :< Should've figured. However, there may still be a work-around I have cooked up (though it'll be a bit clunky & perhaps lose me points for configurability (not a word?)). That being the case, even if I get both to work, I'll likely go with the former.

    Trolls are better anyhow. :p
     
  11. Quilnez

    Quilnez

    Joined:
    Oct 12, 2011
    Messages:
    3,251
    Resources:
    37
    Icons:
    2
    Tools:
    1
    Maps:
    7
    Spells:
    21
    Tutorials:
    2
    JASS:
    4
    Resources:
    37
    WIP :)
    Code (vJASS):
    scope StaticWard

        /************************************************************************************
        *                                                                                   *
        *                            'Static Ward' v1.0                                     *
        *                                      *****                                        *
        *                                    by Dalvengyr                                   *
        *                                                                                   *
        *  A. Descriptions                                                                  *
        *      Summons an immobilizing static ward. The ward sends shockbolt to every enemy *
        *  units nearby. They will deal minor damage and slows their victims down. Affected *
        *  unit will obtain another negative effects.                                       *
        *                                                                                   *
        *  B. Requirements                                                                  *
        *       - JNGP                                                                      *
        *       - UnitIndexer                                                               *
        *       - StunEngine                                                                *
        *       - WorldBounds                                                               *
        *                                                                                   *
        ************************************************************************************/

       
        globals
            private constant integer    SPELL_ID        = 'A000'
            private constant integer    DUMMY_ID        = 'h000'
            private constant integer    SLOW_ID         = 'A000'
            private constant real       ACCURACY        = 0.03125
            private constant real       EFFECT_DECAY    = 5.0
            private constant real       MISSILE_SPEED   = 15.0
            private constant real       MISSILE_Z       = 0.0
            private constant real       MISSILE_ARC     = 0.9
            private constant real       ARC_FACTOR      = 0.15
            private constant real       ARC_MAX         = 300.0
            private constant boolean    ENABLE_VISION   = true
            private constant string     MISSILE_SFX     = "war3mapImported\\LightningArrow1.mdx"
            private constant string     WARD_SFX        = "war3mapImported\\ManaWard.mdx"
        endglobals
       
        private function getDamage takes integer level returns real
            return 40.0 + (30.0 * level)
        endfunction
       
        private function getAoE takes integer level returns real
            return 200.0 + (50.0 * level)
        endfunction
       
        private function getWardDuration takes integer level returns real
            return 8.0
        endfunction
       
        private function getEffectDuration takes integer level returns real
            return 3.0
        endfunction
       
        private function getMinorEffectDuration takes integer level returns real
            return 1.25
        endfunction
       
        private function getStunDuration takes integer level returns real
            return 0.35
        endfunction
       
        private function filterTarget takes unit target returns boolean
            return not (IsUnitType(target, UNIT_TYPE_DEAD) or IsUnitType(target, UNIT_TYPE_STRUCTURE) or IsUnitType(target, UNIT_TYPE_MECHANICAL) or IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE))
        endfunction
       
        globals
            private integer array This
            private integer array This2
            private integer Total = -1
            private integer Total2 = -1
            private timer WardTimer = CreateTimer()
            private timer BoltTimer = CreateTimer()
        endglobals
       
        private function getDistance takes real x, real y, real xt, real yt returns real
            return SquareRoot((xt - x) * (xt - x) + (yt - y) * (yt - y))
        endfunction
       
        private function getRadian takes real x, real y, real xt, real yt returns real
            return Atan2(yt - y, xt - x)
        endfunction
       
        private function IsInBound takes real x, real y returns boolean
            return x < WorldBounds.maxX and x > WorldBounds.minX and y < WorldBounds.maxY and y > WorldBounds.minY
        endfunction
       
        private struct ShockBolt
       
            private unit Missile
            private unit Target
           
            private real ArcReal
            private real Dx
            private real Dc
            private real Ax
            private real Angle
            private real X
            private real Y
           
            private boolean TargetState
           
            private integer Level
           
            static method onPeriodic takes nothing returns nothing
               
                local integer i = 0
                local real x
                local real y
                local real h
                local thistype this
               
                loop
                    exitwhen i > Total2
                    set this = This2[i]
                    if .TargetState then
                    else
                        set h = ((4. * .Ax) / .Dx) * (.Dx - .Dc) * (.Dc / .Dx)
                        if h > ARC_MAX then
                            set h = ARC_MAX
                        endif
                        set .X = .X + MISSILE_SPEED * Cos(.Angle)
                        set .Y = .Y + MISSILE_SPEED * Sin(.Angle)
                        set x = .X + h * Cos(.Angle + ((90. * .ArcReal) * bj_DEGTORAD))
                        set y = .Y + h * Sin(.Angle + ((90. * .ArcReal) * bj_DEGTORAD))
                        if IsInBound(x, y) then
                            call SetUnitX(.Missile, x)
                            call SetUnitY(.Missile, y)
                        endif
                        set .Dc = .Dc + MISSILE_SPEED
                        if .Dc >= .Dx then
                            set .Dc = 0.
                            set .Dx = getDistance(.X, .Y, GetUnitX(.Target), GetUnitY(.Target)) * ARC_FACTOR
                            set .ArcReal = .ArcReal * -1.
                        endif
                    endif
                    set i = i + 1
                endloop
               
            endmethod
           
            static method launch takes player p, real x, real y, unit target, integer level returns nothing
           
                local thistype this = allocate()
               
                set Total2 = Total2 + 1
                set This2[Total2] = this
                set .ArcReal = 1.
                set .TargetState = false
                set .Angle = getRadian(x, y, GetUnitX(target), GetUnitY(target))
                set .Missile = CreateUnit(p, DUMMY_ID, x, y, .Angle * bj_RADTODEG)
                set .Target = target
                set .Level = level
                set .Dc = 0.
                set .Dx = getDistance(x, y, GetUnitX(target), GetUnitY(target)) * ARC_FACTOR
                set .X = x
                set .Y = y
                if UnitAddAbility(.Missile, 'Amrf') and UnitRemoveAbility(.Missile, 'Amrf') then
                endif
                call SetUnitFlyHeight(.Missile, MISSILE_Z, 0.)
                if Total2 == 0 then
                    call TimerStart(BoltTimer, ACCURACY, true, function ShockBolt.onPeriodic)
                endif
               
            endmethod
           
        endstruct
       
        private struct Ward
       
            private real Dur
            private real X
            private real Y
           
            private unit Ward
           
            private player Owner
           
            private integer Level
           
            private fogmodifier Vision
           
            private effect Sfx
           
            static method onPeriodic takes nothing returns nothing
               
                local integer i = 0
                local group g
                local unit u
                local thistype this
               
                loop
                    exitwhen i > Total
                    set this = This[i]
                    if .Dur > ACCURACY then
                        set .Dur = .Dur - ACCURACY
                        set g = CreateGroup()
                        call GroupEnumUnitsInRange(g, .X, .Y, getAoE(.Level), null)
                        loop
                            set u = FirstOfGroup(g)
                            exitwhen u == null
                            if filterTarget(u) then
                                call ShockBolt.launch(.Owner, .X, .Y, u, .Level)
                            endif
                            call GroupRemoveUnit(g, u)
                        endloop
                    else
                        call UnitApplyTimedLife(.Ward, 'BTLF', EFFECT_DECAY)
                        call DestroyEffect(.Sfx)
                        call DestroyFogModifier(.Vision)
                        call destroy()
                        set This[i] = This[Total]
                        set Total = Total - 1
                        if Total < 0 then
                            call PauseTimer(WardTimer)
                        else
                            set i = i - 1
                        endif
                    endif
                    set i = i + 1
                endloop
               
            endmethod
           
            static method summon takes player p, real x, real y, real a, integer level returns nothing
           
                local thistype this = allocate()
               
                set Total = Total + 1
                set This[Total] = this
                set .Dur = getWardDuration(level)
                set .X = x
                set .Y = y
                set .Level = level
                set .Owner = p
                set .Ward = CreateUnit(p, DUMMY_ID, x, y, a)
                set .Sfx = AddSpecialEffectTarget(WARD_SFX, .Ward, "origin")
                static if ENABLE_VISION then
                    set .Vision = CreateFogModifierRadius(p, FOG_OF_WAR_VISIBLE, x, y, getAoE(level), true, true)
                    call FogModifierStart(.Vision)
                endif
                if Total == 0 then
                    call TimerStart(WardTimer, ACCURACY, true, function Ward.onPeriodic)
                endif
               
            endmethod
           
        endstruct
       
        private struct SummonStaticWard
       
            private static method onCast takes nothing returns boolean
           
                if GetSpellAbilityId() == SPELL_ID then
                    call Ward.summon(GetTriggerPlayer(), GetSpellTargetX(), GetSpellTargetY(), 270., GetUnitAbilityLevel(GetTriggerUnit(), SPELL_ID))
                endif
               
                return false
            endmethod
           
            private static method onInit takes nothing returns nothing
               
                local trigger t = CreateTrigger()
               
                call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
                call TriggerAddCondition(t, Condition(function SummonStaticWard.onCast))
               
            endmethod
           
        endstruct
       
    endscope


    This spell is inspired from Torchlight II's shock effect. It works just like TankCommander's entry.
     
  12. Empirean

    Empirean

    Joined:
    Jun 20, 2014
    Messages:
    390
    Resources:
    8
    Spells:
    8
    Resources:
    8
    Hi everyone, sorry it took so long for me to find out how to hide spell icons. Now its done.

    The spell is now called "Savior's Aura", taunt is added to the aura itself so we have an active icon and still emit an aura so we may see how far the aura can reach. here is the new tooltip:


    New Tooltip

    Emits an aura that heals nearby allied units whenever the bearer of the aura is attacked. Also allows you to force nearby enemy units to attack you for a duration.

    |cffffcc00Level 1|r - Heals nearby units based on 30% of the bearer's |cffffcc00Strength|r.
    |cffffcc00Level 2|r - Heals nearby units based on 60% of the bearer's |cffffcc00Strength|r.
    |cffffcc00Level 3|r - Heals nearby units based on 90% of the bearer's |cffffcc00Strength|r.
    |cffffcc00Level 4|r - Heals nearby units based on 120% of the bearer's |cffffcc00Strength|r.

    Area of Effect: 500
    |cffffcc00Units that has this ability will not be healed by this aura.|r


    EDIT: by the way the code stays the same.

    The Code

    Configuration Trigger

    • SaviorAuraTrigConfig
      • Events
        • Map initialization
      • Conditions
      • Actions
        • -------- set the ability that will be the basis for the aura --------
        • -------- - --------
        • Set SA_A_PassiveAbility = Savior's Aura (Container)
        • Set SA_A_ActiveAbility = Savior's Aura (Active)
        • -------- - --------
        • -------- set the buff that the ability will emit --------
        • -------- - --------
        • Set SA_BF_Buff = Savior's Aura
        • -------- - --------
        • -------- if set to true, the amount healed will be based on the percentage of strength of the hero --------
        • -------- if set to false, the number will directly heal units --------
        • -------- please note that 20% is 20.00 and not 0.2 --------
        • -------- - --------
        • Set SA_B_UseStat = True
        • -------- - --------
        • Set SA_R_Heal[1] = 30.00
        • Set SA_R_Heal[2] = 60.00
        • Set SA_R_Heal[3] = 90.00
        • Set SA_R_Heal[4] = 120.00
        • -------- - --------
        • -------- special effects configurables --------
        • -------- attachment point --------
        • -------- - --------
        • Set SA_S_Attach = origin
        • -------- - --------
        • -------- special effects attached to unit --------
        • -------- - --------
        • Set SA_S_SFX = Abilities\Spells\Undead\VampiricAura\VampiricAuraTarget.mdl
        • -------- - --------
        • -------- if true, it will heal structures only if they have the buff from the aura --------
        • -------- - --------
        • Set SA_B_HealStructures = False
        • -------- - --------
        • -------- if true, it will heal magic immunes only if they have the buff from the aura --------
        • -------- - --------
        • Set SA_B_HealImmune = False
        • -------- - --------
        • -------- Area of effect of the aura --------
        • -------- - --------
        • Set SA_R_AoE[1] = 500.00
        • Set SA_R_AoE[2] = 500.00
        • Set SA_R_AoE[3] = 500.00
        • Set SA_R_AoE[4] = 500.00
        • -------- - --------
        • -------- list abilities that unlearns all hero skills --------
        • -------- - --------
        • Set SA_I_Total = 1
        • -------- - --------
        • Set SA_A_Unlearn[1] = Tome of Retraining
        • -------- - --------
        • -------- Disable spellbook --------
        • -------- - --------
        • For each (Integer SA_I_TempInt) from 1 to 12, do (Actions)
          • Loop - Actions
            • Player - Disable SA_A_PassiveAbility for (Player(SA_I_TempInt))


    The effect trigger

    • SaviorAuraEffect
      • Events
        • Unit - A unit Is attacked
      • Conditions
        • (Level of SA_A_ActiveAbility for (Attacked unit)) Greater than 0
        • ((Attacking unit) belongs to an enemy of (Owner of (Attacked unit))) Equal to True
      • Actions
        • Set SA_U_AtkUnit = (Attacked unit)
        • Set SA_PL_Player = (Owner of SA_U_AtkUnit)
        • Set SA_I_Level = (Level of SA_A_ActiveAbility for SA_U_AtkUnit)
        • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • SA_B_UseStat Equal to True
          • Then - Actions
            • Set SA_R_HealAmt = ((Real((Strength of SA_U_AtkUnit (Include bonuses)))) x (SA_R_Heal[SA_I_Level] x 0.01))
          • Else - Actions
            • Set SA_R_HealAmt = SA_R_Heal[SA_I_Level]
        • Set SA_P_AtkPos = (Position of (Attacked unit))
        • Set SA_UG_UnitGroup = (Units within SA_R_AoE[SA_I_Level] of SA_P_AtkPos matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an ally of SA_PL_Player) Equal to True) and ((((Matching unit) is A structure) Equal to SA_B_HealStructures) and ((((Match
        • Game - Display to (All players) the text: (String(SA_R_HealAmt))
        • Unit Group - Pick every unit in SA_UG_UnitGroup and do (Actions)
          • Loop - Actions
            • Set SA_U_Picked = (Picked unit)
            • Unit - Set life of SA_U_Picked to ((Life of SA_U_Picked) + SA_R_HealAmt)
            • Special Effect - Create a special effect attached to the SA_S_Attach of SA_U_Picked using SA_S_SFX
            • Special Effect - Destroy (Last created special effect)
        • Unit Group - Remove all units from SA_UG_UnitGroup
        • Custom script: call DestroyGroup(udg_SA_UG_UnitGroup)
        • Custom script: call RemoveLocation(udg_SA_P_AtkPos)




    other triggers are for adding and removing the spell when unlearned.
     

    Attached Files:

    Last edited: Jul 5, 2014
  13. Mythic

    Mythic

    Joined:
    Apr 24, 2012
    Messages:
    7,731
    Resources:
    102
    Models:
    87
    Icons:
    4
    Maps:
    3
    Spells:
    6
    Tutorials:
    2
    Resources:
    102
    Really nice idea SallyAnna, keep it up!
     
  14. Empirean

    Empirean

    Joined:
    Jun 20, 2014
    Messages:
    390
    Resources:
    8
    Spells:
    8
    Resources:
    8
    Thank you!

    EDIT: i changed my mind its OP.

    Here is my final output for now.


    Tooltip

    Emits an aura that heals nearby allied units whenever the bearer of the aura is attacked. Also allows you to force nearby enemy units to attack you for a duration.

    |cffffcc00Level 1|r - Heals nearby units based on 30% of the bearer's |cffffcc00Strength|r.
    |cffffcc00Level 2|r - Heals nearby units based on 60% of the bearer's |cffffcc00Strength|r.
    |cffffcc00Level 3|r - Heals nearby units based on 90% of the bearer's |cffffcc00Strength|r.
    |cffffcc00Level 4|r - Heals nearby units based on 120% of the bearer's |cffffcc00Strength|r.

    Area of Effect: 500
    |cffffcc00Units that has this ability will not be healed by this aura.|r


    The Code

    Configuration Trigger

    • SaviorAuraTrigConfig
      • Events
        • Map initialization
      • Conditions
      • Actions
        • -------- set the ability that will be the basis for the aura --------
        • -------- - --------
        • Set SA_A_PassiveAbility = Savior's Aura (Container)
        • Set SA_A_ActiveAbility = Savior's Aura (Active)
        • -------- - --------
        • -------- set the buff that the ability will emit --------
        • -------- - --------
        • Set SA_BF_Buff = Savior's Aura
        • -------- - --------
        • -------- if set to true, the amount healed will be based on the percentage of strength of the hero --------
        • -------- if set to false, the number will directly heal units --------
        • -------- please note that 20% is 20.00 and not 0.2 --------
        • -------- - --------
        • Set SA_B_UseStat = True
        • -------- - --------
        • Set SA_R_Heal[1] = 30.00
        • Set SA_R_Heal[2] = 60.00
        • Set SA_R_Heal[3] = 90.00
        • Set SA_R_Heal[4] = 120.00
        • -------- - --------
        • -------- special effects configurables --------
        • -------- attachment point --------
        • -------- - --------
        • Set SA_S_Attach = origin
        • -------- - --------
        • -------- special effects attached to unit --------
        • -------- - --------
        • Set SA_S_SFX = Abilities\Spells\Undead\VampiricAura\VampiricAuraTarget.mdl
        • -------- - --------
        • -------- if true, it will heal structures only if they have the buff from the aura --------
        • -------- - --------
        • Set SA_B_HealStructures = False
        • -------- - --------
        • -------- if true, it will heal magic immunes only if they have the buff from the aura --------
        • -------- - --------
        • Set SA_B_HealImmune = False
        • -------- - --------
        • -------- Area of effect of the aura --------
        • -------- - --------
        • Set SA_R_AoE[1] = 500.00
        • Set SA_R_AoE[2] = 500.00
        • Set SA_R_AoE[3] = 500.00
        • Set SA_R_AoE[4] = 500.00
        • -------- - --------
        • -------- list abilities that unlearns all hero skills --------
        • -------- - --------
        • Set SA_I_Total = 1
        • -------- - --------
        • Set SA_A_Unlearn[1] = Tome of Retraining
        • -------- - --------
        • -------- Disable spellbook --------
        • -------- - --------
        • For each (Integer SA_I_TempInt) from 1 to 12, do (Actions)
          • Loop - Actions
            • Player - Disable SA_A_PassiveAbility for (Player(SA_I_TempInt))


    The effect trigger

    • SaviorAuraEffect
      • Events
        • Unit - A unit Is attacked
      • Conditions
        • (Level of SA_A_ActiveAbility for (Attacked unit)) Greater than 0
        • ((Attacking unit) belongs to an enemy of (Owner of (Attacked unit))) Equal to True
      • Actions
        • Set SA_U_AtkUnit = (Attacked unit)
        • Set SA_PL_Player = (Owner of SA_U_AtkUnit)
        • Set SA_I_Level = (Level of SA_A_ActiveAbility for SA_U_AtkUnit)
        • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • SA_B_UseStat Equal to True
          • Then - Actions
            • Set SA_R_HealAmt = ((Real((Strength of SA_U_AtkUnit (Include bonuses)))) x (SA_R_Heal[SA_I_Level] x 0.01))
          • Else - Actions
            • Set SA_R_HealAmt = SA_R_Heal[SA_I_Level]
        • Set SA_P_AtkPos = (Position of (Attacked unit))
        • Set SA_UG_UnitGroup = (Units within SA_R_AoE[SA_I_Level] of SA_P_AtkPos matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an ally of SA_PL_Player) Equal to True) and ((((Matching unit) is A structure) Equal to SA_B_HealStructures) and ((((Match
        • Game - Display to (All players) the text: (String(SA_R_HealAmt))
        • Unit Group - Pick every unit in SA_UG_UnitGroup and do (Actions)
          • Loop - Actions
            • Set SA_U_Picked = (Picked unit)
            • Unit - Set life of SA_U_Picked to ((Life of SA_U_Picked) + SA_R_HealAmt)
            • Special Effect - Create a special effect attached to the SA_S_Attach of SA_U_Picked using SA_S_SFX
            • Special Effect - Destroy (Last created special effect)
        • Unit Group - Remove all units from SA_UG_UnitGroup
        • Custom script: call DestroyGroup(udg_SA_UG_UnitGroup)
        • Custom script: call RemoveLocation(udg_SA_P_AtkPos)


     
    Last edited: Jul 5, 2014
  15. Hell_Master

    Hell_Master

    Joined:
    Nov 29, 2012
    Messages:
    5,513
    Resources:
    4
    Maps:
    3
    Template:
    1
    Resources:
    4
    Looks good but I don't know if it's intended but you should use BB Codes for tooltip, not the standard code in Warcraft tooltips for colors.

    Anyway, to all of you, may the best one wins, good luck!
     
  16. Cokemonkey11

    Cokemonkey11

    Wurst Reviewer

    Joined:
    May 9, 2006
    Messages:
    3,240
    Resources:
    18
    Tools:
    1
    Maps:
    5
    Spells:
    3
    Tutorials:
    2
    JASS:
    7
    Resources:
    18
    I gotta get in on this ^^ I'm leaving the country though so WIP #1 will be much later, if at all.
     
  17. Mythic

    Mythic

    Joined:
    Apr 24, 2012
    Messages:
    7,731
    Resources:
    102
    Models:
    87
    Icons:
    4
    Maps:
    3
    Spells:
    6
    Tutorials:
    2
    Resources:
    102
    Tank Commander wins! :thumbs_up:
     
  18. Empirean

    Empirean

    Joined:
    Jun 20, 2014
    Messages:
    390
    Resources:
    8
    Spells:
    8
    Resources:
    8
    Tada

    Emits an aura that heals nearby allied units whenever the bearer of the aura is attacked. Also allows you to force nearby enemy units to attack you for a duration.

    Level 1 - Heals nearby units based on 30% of the bearer's Strength.
    Level 2 - Heals nearby units based on 60% of the bearer's Strength.
    Level 3 - Heals nearby units based on 90% of the bearer's Strength.
    Level 4 - Heals nearby units based on 120% of the bearer's Strength.

    Area of Effect: 500
    Units that has this ability will not be healed by this aura.


    EDIT: Epic fail!
    haha
     
  19. Hell_Master

    Hell_Master

    Joined:
    Nov 29, 2012
    Messages:
    5,513
    Resources:
    4
    Maps:
    3
    Template:
    1
    Resources:
    4

    Emits an aura that heals nearby allied units whenever the bearer of the aura is attacked. Also allows you to force nearby enemy units to attack you for a duration.

    Level 1 - Heals nearby units based on 30% of the bearer's Strength.
    Level 2 - Heals nearby units based on 60% of the bearer's Strength.
    Level 3 - Heals nearby units based on 90% of the bearer's Strength.
    Level 4 - Heals nearby units based on 1200% of the bearer's Strength.

    Area of Effect: 500
    Units that has this ability will not be healed by this aura.

    Code (Text):
    [noparse]Emits an aura that heals nearby allied units whenever the bearer of the aura is attacked. Also allows you to force nearby enemy units to attack you for a duration.

    [color=yellow]Level 1[/color] - Heals nearby units based on 30% of the bearer's [color=red]Strength[/color].
    [color=yellow]Level 2[/color] - Heals nearby units based on 60% of the bearer's [color=red]Strength[/color].
    [color=yellow]Level 3[/color] - Heals nearby units based on 90% of the bearer's [color=red]Strength[/color].
    [color=yellow]Level 4[/color] - Heals nearby units based on 120% of the bearer's [color=red]Strength[/color].

    Area of Effect: 500
    [color=yellow]Units that has this ability will not be healed by this aura.[/color][/noparse]
     
  20. GywGod133

    GywGod133

    Joined:
    Jul 16, 2012
    Messages:
    646
    Resources:
    3
    Maps:
    1
    Spells:
    1
    Tutorials:
    1
    Resources:
    3
    :3 many days to create a AWESOME Spell Aura
     
Thread Status:
Not open for further replies.