Modelpack [IconPack] [Spellpack] Wolfie And Fabioz Frosty Tauren Chieftain

WolfieeifloW

WEHZ Helper
Reaction score
372
Frost Tauren Chieftain Model / Icon / Spell Pack
Created By: Wolfie[NoCT] and Fabioz

Version:
1.0

If something needs to be added for these to be approved, please tell me mods.

Credits:
All icons were edited by Wolfie[NoCT].
All models, except Frost Stomp, were done by Fabioz.
Frostincarnation vJASS triggers by saw792.
Frost Stomp credits here.


If you take the time to download / look at these, please at least leave a comment.

Icon Previews:
btnfrostwavedk6.jpg
disbtnfrostwavewg3.jpg

btnfroststompdu1.jpg
disbtnfroststomphx2.jpg

btnfrostauradz5.jpg
disbtnfrostauraor8.jpg

btnfrostincarnationih6.jpg
disbtnfrostincarnationts9.jpg


Models Preview:
frostmodelszr4.jpg


Icon paths follow:
ReplaceableTextures\CommandButtons\BTN<IconName>.blp
ReplaceableTextures\CommandButtonsDisabled\DISBTN<IconName>.blp​

Spell Descriptions:
Frostwave said:
A freezing wave ripples outward, releasing a slowing and damaging Frost Nova on any enemy units it comes in contact with.
Level 1 - 75 damage Frost Nova.
Level 2 - 150 damage Frost Nova.
Level 3 - 225 damage Frost Nova.
Frost Stomp said:
Slams the ground releasing the power of the Lich King. This force stuns and damages nearby enemy land units.
Level 1 - 50 damage, 3 second stun.
Level 2 - 100 damage, 4 second stun.
Level 3 - 150 damage, 5 second stun.
Frost Aura said:
Decreases the movement speed and attack rate of nearby enemy units.
Level 1 - -15% movement, -10% attack.
Level 2 - -30% movement, -20% attack.
Level 3 - -45% movement, -30% attack.
Frostincarnation said:
When killed, the Tauren Chieftain will come back to life, releasing a Frost Stomp upon revival. Frostincarnation has a 150 second cooldown.

Triggers Code:
Frostwave
Code:
Frostwave
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to (==) Frostwave 
    Actions
        Set tempTargetPoint = (Target point of ability being cast)
        Set wavePointOne = (Position of (Triggering unit))
        Set wavePointTwo = (wavePointOne offset by 800.00 towards (Angle from wavePointOne to tempTargetPoint) degrees)
        Set waveGroupRegion = (Region(wavePointOne, wavePointTwo))
        Set waveGroup = (Units in waveGroupRegion matching (((Matching unit) belongs to an enemy of (Owner of (Casting unit))) Equal to (==) True))
        Unit Group - Pick every unit in waveGroup and do (Actions)
            Loop - Actions
                Set tempPoint = (Position of (Picked unit))
                Unit - Create 1 DummyCaster for (Owner of (Casting unit)) at tempPoint facing Default building facing (270.0) degrees
                Custom script:   call RemoveLocation(udg_tempPoint)
                Unit - Order (Last created unit) to Undead Lich - Frost Nova (Picked unit)
                Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
        Custom script:   call DestroyGroup(udg_waveGroup)
        Custom script:   call RemoveRect(udg_waveGroupRegion)
        Custom script:   call RemoveLocation(udg_wavePointTwo)
        Custom script:   call RemoveLocation(udg_wavePointOne)
        Custom script:   call RemoveLocation(udg_tempTargetPoint)
Frostincarnation
JASS:
library RemovalDetection initializer Init needs TimerUtils
    // Notes: CANNOT have two defend based abilities on same unit, or fires twice.
    // ASSUMES that summoned units cannot be revived in any way. This ought to be true.
    // If not, replace IsAnimated with &#039;return false&#039; and don&#039;t use animate dead, or something.
    // Devour ain&#039;t a problem, but they&#039;ll die and then decay, you just can&#039;t see them decaying.
    
    //Config
    
    // This line creates a new ability based off of defend - make sure it doesn&#039;t conflict.
    //! external ObjectMerger w3a Adef rdd&amp; anam &quot;Removal Detection Defend&quot;
    
    globals
        private constant integer SPELL_ID = &#039;rdd&amp;&#039; // must be the same as the parameter after &quot;w3a Adef&quot; above
        private constant integer ORDER_ID = 852056 // undefend
        private constant integer MAX_ARRAY_SIZE = 401000 //for the unit flag arrays
    endglobals
    
    private function AddAbility takes unit u returns nothing // have ALL defend based spells here
        if (GetUnitAbilityLevel(u, SPELL_ID) + GetUnitAbilityLevel(u, &#039;Adef&#039;)) == 0 then
            call UnitAddAbility(u, SPELL_ID)
        endif
    endfunction
    
    private function IsAnimated takes unit u returns boolean
        debug if IsUnitType(u, UNIT_TYPE_SUMMONED) then
            // check needed due to animate dead sucking
            debug call BJDebugMsg(&quot;Animated&quot;)
        debug endif
        return IsUnitType(u, UNIT_TYPE_SUMMONED)
    endfunction
    
    // DO NOT EDIT BELOW HERE
    
    globals
        //Unit flags
        private boolean array dead[MAX_ARRAY_SIZE]
        private boolean array animated[MAX_ARRAY_SIZE]
        private boolean array reincarnated[MAX_ARRAY_SIZE]
        
        //Event handling
        private trigger array reincS
        private trigger array reincF
        private trigger array rez
        private trigger array oos
        
        private integer reincSMax = 0
        private integer reincFMax = 0
        private integer rezMax = 0
        private integer oosMax = 0
        
        private integer cnt = 0
        
        //Event responses
        private unit trg = null
        private boolean amd = false
    endglobals
    
    //&quot;Event Responses&quot; and event registration
    
    function TriggerRegisterReincarnationEvent takes trigger t, boolean finish returns nothing
        if finish then
            set reincF[reincFMax] = t
            set reincFMax = reincFMax + 1
        else
            set reincS[reincSMax] = t
            set reincSMax = reincSMax + 1
        endif
    endfunction
    
    function TriggerRegisterResurrectionEvent takes trigger t returns nothing
        set rez[rezMax] = t
        set rezMax = rezMax + 1
    endfunction
    
    function TriggerRegisterOutOfScopeEvent takes trigger t returns nothing
        set oos[oosMax] = t
        set oosMax = oosMax + 1
    endfunction
    
    function GetReincarnatingUnit takes nothing returns unit
        return trg
    endfunction
    
    function GetResurrectedUnit takes nothing returns unit
        return trg
    endfunction
    
    function GetScopingUnit takes nothing returns unit
        return trg
    endfunction
    
    function GetWasAnimated takes nothing returns boolean
        return amd
    endfunction
    
    //System
    
    private function H2I takes handle h returns integer
        return h
        return 0
    endfunction
    
    private function GetIndex takes handle h returns integer
        return H2I(h) - 0x100000
    endfunction

    private struct Data
        integer i
        unit u
        static method create takes unit u, integer i returns Data
            local Data dat = Data.allocate()
            set dat.u = u
            set dat.i = i
            return dat
        endmethod
    endstruct

    private function Child takes nothing returns nothing
        local Data dat = GetTimerData(GetExpiredTimer())
        if reincarnated[dat.i] then
            set trg = dat.u
            if GetUnitTypeId(trg) != 0 then
                set cnt = 0
                loop
                    exitwhen cnt &gt;= reincSMax
                    if TriggerEvaluate(reincS[cnt]) then
                        call TriggerExecute(reincS[cnt])
                    endif
                    set cnt = cnt + 1
                endloop
                debug call BJDebugMsg(&quot;Reincarnating&quot;)
            else
                set reincarnated[dat.i] = false
                debug call BJDebugMsg(&quot;Removed&quot;)
            endif
        endif
        set dat.u = null
        call dat.destroy()
        call ReleaseTimer(GetExpiredTimer())
    endfunction
    
    private function Ordered takes nothing returns boolean
        local integer index = GetIndex(GetTriggerUnit())
        local timer t
        set trg = GetTriggerUnit()
        if GetTriggerEventId() == EVENT_PLAYER_UNIT_ISSUED_ORDER then
            if GetIssuedOrderId() == ORDER_ID then
                set amd = false
                if IsUnitType(trg,UNIT_TYPE_DEAD) then
                    if dead[index] or animated[index] then
                        if dead[index] then
                            set dead[index] = false //it has just gone out of scope
                            debug call BJDebugMsg(&quot;Out of scope&quot;)
                        else
                            set animated[index] = false
                            debug call BJDebugMsg(&quot;Out of scope from animated&quot;)
                            set amd = true
                        endif
                        set cnt = 0
                        loop
                            exitwhen cnt &gt;= oosMax
                            if TriggerEvaluate(oos[cnt]) then
                                call TriggerExecute(oos[cnt])
                            endif
                            set cnt = cnt + 1
                        endloop
                    else
                        set dead[index] = true
                        set reincarnated[index] = true //Set to false if the unit
                        set t = NewTimer()             //is registered to have died
                        call SetTimerData(t,Data.create(trg,index))
                        call TimerStart(t,0,false,function Child)
                        set t = null
                    endif
                elseif dead[index] then
                    if IsAnimated(trg) then
                        set animated[index] = true
                        set amd = true
                    endif
                    if reincarnated[index] then
                        set reincarnated[index] = false
                        set cnt = 0
                        loop
                            exitwhen cnt &gt;= reincFMax
                            if TriggerEvaluate(reincF[cnt]) then
                                call TriggerExecute(reincF[cnt])
                            endif
                            set cnt = cnt + 1
                        endloop
                        debug call BJDebugMsg(&quot;Reincarnated&quot;)
                    elseif not IsUnitType(trg,UNIT_TYPE_HERO) then
                        set cnt = 0          //hero revive already has an event
                        loop
                            exitwhen cnt &gt;= rezMax
                            if TriggerEvaluate(rez[cnt]) then
                                call TriggerExecute(rez[cnt])
                            endif
                            set cnt = cnt + 1
                        endloop
                        debug call BJDebugMsg(&quot;Resurrected&quot;)
                    endif
                    set dead[index] = false //it has just been resurrected/reincarnated
                endif //the else is just a normal call
            endif
        else
            set reincarnated[index] = false //The order fires before the death event
            debug call BJDebugMsg(&quot;Died&quot;)   //and thus lame workarounds are required
        endif
        return false
    endfunction
    
    private function Ex takes nothing returns boolean
        call AddAbility(GetFilterUnit())
        return false
    endfunction
    
    private function Enters takes nothing returns boolean
        call AddAbility(GetTriggerUnit())
        return false
    endfunction
    
    private function Init takes nothing returns nothing
        local group g = CreateGroup()
        local rect r = GetWorldBounds()
        local region world = CreateRegion()
        local trigger t = CreateTrigger()
        local integer i = 0
        
        call RegionAddRect(world, r)
        call GroupEnumUnitsInRect(g, r, Condition(function Ex))
        call DestroyGroup(g)
        set g = null
        call RemoveRect(r)
        set r = null
        
        call TriggerAddCondition(t, Condition(function Enters))
        call TriggerRegisterEnterRegion(t, world, null)
        
        set t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH)
        call TriggerAddCondition(t, Condition(function Ordered))
        
        loop
            exitwhen i &gt;= 16
            call SetPlayerAbilityAvailable(Player(i), SPELL_ID, false)
            set i = i + 1
        endloop
    endfunction
endlibrary
JASS:
scope StompOnRez initializer Init

  globals
    private integer UNIT_TYPE = &#039;Otch&#039;  //Rawcode of reincarnating unit-type
    private integer DUMMY_ID = &#039;n000&#039;  //Rawcode of dummy unit
    private integer ABILITY_ID = &#039;A001&#039;  //Rawcode of stomp ability
    private string STOMP_ORDER_STRING = &quot;stomp&quot; //Order string of base ability
    private boolean USE_DUMMY = true //Have dummy cast or hero cast
                                     //Recommended true
  endglobals
  
  private function Conditions takes nothing returns boolean
    return GetUnitTypeId(GetTriggerUnit()) == UNIT_TYPE
  endfunction
  
  private function AltActions takes nothing returns nothing
    local unit rez = GetReincarnatingUnit()
    call TriggerSleepAction(0.0) //Required
    call IssueImmediateOrder(rez, STOMP_ORDER_STRING)
    set rez = null
  endfunction
  
  private function Actions takes nothing returns nothing
    local unit rez = GetReincarnatingUnit()
    local unit u = CreateUnit(GetOwningPlayer(rez), DUMMY_ID, GetUnitX(rez), GetUnitY(rez), 0)
    call UnitAddAbility(u, ABILITY_ID)
    call IssueImmediateOrder(u, STOMP_ORDER_STRING)
    call UnitApplyTimedLife(u, &#039;BTLF&#039;, 3)
    call DestroyEffect(AddSpecialEffectTarget(&quot;war3mapImported\\FrostStomp.mdx&quot;, rez, &quot;origin&quot;))
    set rez = null
    set u = null
  endfunction
  
  private function Init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterReincarnationEvent(t, true)
    call TriggerAddCondition(t, Condition(function Conditions))
    if USE_DUMMY then
      call TriggerAddAction(t, function Actions)
    else
      call TriggerAddAction(t, function AltActions)
    endif
  endfunction
  
endscope

Test map included.
Constructive criticism is welcomed, flaming is not.
These icons will only be submitted to TH.net.
Do not redistribute or modify without permission.
Credits are not needed but are appreciated.
+Rep is also appreciated.
Would also be nice if you send me a message if you plan to use it.​
 

Ryuu

I am back with Chocolate (:
Reaction score
64
So these are spells, with icons and models included?
 

CaptDeath

New Member
Reaction score
103
Hey wolfie Nice i think i might "steal" them
as in use them in my project
very nice For any frost hero
5/5
 

WolfieeifloW

WEHZ Helper
Reaction score
372
Mhmm.
Well, the Tauren Chieftain is just tinted blue for now until Fabioz finished the real model :p .
But yes, there's four spells, all ready to go with the icons and models included.
 

wraithseeker

Tired.
Reaction score
122
I like the warstomp effect, the shockwave effect is ok. The ahnk, needs to be redone, take a look at the originial ahnk and you see some marks, ask fabios to do.. some marks and not just pure blue, might look better, aura is decent. And why do I see shockwave shooting and then a frost nova popping up:nuts: The tauren looks weird, did you reskin it or just changed the color?::confused: I think originial color is better to use :thup:

Rating I give is 6.5/10 quite decent for a start.

If you improve those, It will look much greater <3

+REP to you.
 

WolfieeifloW

WEHZ Helper
Reaction score
372
Frostwave looks better in-game, check it out ;) .
I'll ask him to redo the ahnk.
Frostwave releases a Frost Nova on all units caught in it :) .
And I just tinted him for now, read the post above you :rolleyes: .
And thanks!
 

wraithseeker

Tired.
Reaction score
122
For the aura, what does it do? Just like the standard game? It would be better if it was a chilling aura which reduces movement speed and attackspeed and make another FX to put under them, just a suggestion
 

WolfieeifloW

WEHZ Helper
Reaction score
372
@wraithseeker: It's fine, I'll do it GUI by the method I said in the thread.
@Blackrage: Thanks, I'll be sure to tell Fabioz ;) .
 

NullCurrent

( ゚ε ゚)
Reaction score
110
K, I got it.
Ill try to do some marks, although... the texture is "ice" (found it in the MPQ Browser),
Ill try to spice it up though =P
Same with the hero model.
But at the moment, Im making a tutorial =P and then its christmas time. I hope I have time.
 

Azlier

Old World Ghost
Reaction score
461
Frost Tauren Chieftan? Strangest idea I ever heard! :p Where did you come across such a crazy idea?
 

saw792

Is known to say things. That is all.
Reaction score
280
Icons look good, Frostwave looks nice too.

Interested to see the actual unit model that goes with this.

You can remove the TimerUtils library from the code there, since that is well known and not mine. Credits to Captain Griffen and PurplePoot on wc3c for the RemovalDetection library.
 

WolfieeifloW

WEHZ Helper
Reaction score
372
Alright Fabioz, just send them to my email when you're done and I'll add them in here.
azlier, I made up a spell called Frostwave a while back, and decided to just make the rest of his skills "Frost" type ;) .
saw792, removed TimerUtils code, and thanks for the feedback!
 

Flare

Stops copies me!
Reaction score
662
Code:
        Set wavePointOne = (Position of [B](Casting unit))[/B]
        Set wavePointTwo = [B]((Position of (Triggering unit)) [/B]offset by 800.00 towards (Angle from ([B]Position of (Triggering unit)) to (Target point of ability being cast)) [/B]degrees)
        Set waveGroup = ([B]Units in (Region(wavePointOne, wavePointTwo)) [/B]matching (((Matching unit) belongs to an enemy of (Owner of (Casting unit))) Equal to (==) True))
1) Change Casting Unit to Triggering Unit
2) Source location for second point leaks
3) The points used for the Angle From are leaking
4) Dynamic region creation - leak
5) The region won't act the way you might want it to - the region will be rectangular, and parallel to the X axis, so if you cast the spell diagonally, you've just enclosed a box of units, and alot of those units may not be in the path (if I remember correctly)

my.php

In that picture, red spots are caster/target point, red line is the shockwave's path, and black box is the region created
 

WolfieeifloW

WEHZ Helper
Reaction score
372
Code:
Frostwave
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to (==) Frostwave 
    Actions
        Set tempCasterPoint = (Position of (Triggering unit))
        Set tempTargetPoint = (Target point of ability being cast)
        Set wavePointOne = (Position of (Triggering unit))
        Set wavePointTwo = (tempCasterPoint offset by 800.00 towards (Angle from tempCasterPoint to tempTargetPoint) degrees)
        Set waveGroupRegion = (Region(wavePointOne, wavePointTwo))
        Set waveGroup = (Units in waveGroupRegion matching (((Matching unit) belongs to an enemy of (Owner of (Casting unit))) Equal to (==) True))
        Unit Group - Pick every unit in waveGroup and do (Actions)
            Loop - Actions
                Set tempPoint = (Position of (Picked unit))
                Unit - Create 1 DummyCaster for (Owner of (Casting unit)) at tempPoint facing Default building facing (270.0) degrees
                Custom script:   call RemoveLocation(udg_tempPoint)
                Unit - Order (Last created unit) to Undead Lich - Frost Nova (Picked unit)
                Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
        Custom script:   call DestroyGroup(udg_waveGroup)
        Custom script:   call RemoveRect(udg_waveGroupRegion)
        Custom script:   call RemoveLocation(udg_wavePointTwo)
        Custom script:   call RemoveLocation(udg_wavePointOne)
        Custom script:   call RemoveLocation(udg_tempTargetPoint)
        Custom script:   call RemoveLocation(udg_tempCasterPoint)
How's that ;) ?
 

WolfieeifloW

WEHZ Helper
Reaction score
372
UPDATE
Added new code/test map.
Credits to Flare for helping me fix the code.

@Flare: Are you sure the region it makes is rectangular :eek: ?
And how would I fix that..?
 

Flare

Stops copies me!
Reaction score
662
IIRC, GUI regions ('rects') can only be shaped rectangularly (with sides parallel to XY-axes), or as circles. If I cast diagonally, I could still form a rectangle, but it wouldn't be parallel to any axis, so a rect wouldn't be capable of doing what I need

I believe AceHart made a GroupEnumUnitsInLine function, that'd be ideal for what you're doing
 

WolfieeifloW

WEHZ Helper
Reaction score
372
On my tests I just ran, this Rect I'm using works fine.
The spell is only 800 range also, so it works.
I'll look into AceHart's system, but for now, mine works fine ;) .
Thanks for all the feedback though!
 

vypur85

Hibernate
Reaction score
803
Code:
Frostwave
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to (==) Frostwave 
    Actions
        Set tempTargetPoint = (Target point of ability being cast)
        Set wavePointOne = (Position of (Triggering unit))
        Set wavePointTwo = (wavePointOne offset by [B](Distance between (Position of (Triggering unit)) and (Target point of ability being cast))[/B] towards (Angle from wavePointOne to tempTargetPoint) degrees)
        Set waveGroupRegion = (Region(wavePointOne, wavePointTwo))
        Set waveGroup = (Units in waveGroupRegion matching (((Matching unit) belongs to an enemy of (Owner of (Casting unit))) Equal to (==) True))
        Unit Group - Pick every unit in waveGroup and do (Actions)
            Loop - Actions
                Set tempPoint = (Position of (Picked unit))
                Unit - Create 1 DummyCaster for (Owner of (Casting unit)) at tempPoint facing Default building facing (270.0) degrees
                Custom script:   call RemoveLocation(udg_tempPoint)
                Unit - Order (Last created unit) to Undead Lich - Frost Nova (Picked unit)
                Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
        Custom script:   call DestroyGroup(udg_waveGroup)
        Custom script:   call RemoveRect(udg_waveGroupRegion)
        Custom script:   call RemoveLocation(udg_wavePointTwo)
        Custom script:   call RemoveLocation(udg_wavePointOne)
        Custom script:   call RemoveLocation(udg_tempTargetPoint)

Using preset range doesn't seem to fit. Try the bolded line. And, as mentioned by Flare, using Rects is not appropriate. Damaging units in line can be simply achieved by comparing range and then use integer loops (this should be similar to Ace's system, if I'm not mistaken).

Edit:
Btw, nice icons :). But the spells are... too simple, in my opinion. Why not just submit this as Icon/Model pack instead?
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top