HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

The Nether Mage

01-27-2007, 01:42 AM#1
Pyrogasm
The Nether Mage
By Pyrogasm
v1.7 (Now includes both GUI and JASS versions)
JASS version complies with JESP standard
GUI version is "purely educational", according to blu
-

Zoom (requires log in)

The Nether Mage is intended as an addition to the melee hero tavern, and was made for WC3Campaigns.net's Hero Contest, in which it won 4th place. Though that may be the intended use, feel free to utilize the hero in any way; this is not a model/art so much as it is a concept, thus there is no rule against altering it as you see fit. All I ask for is that you give me (Pyrogasm) and the people I credited (in the test map) credit. Rather simple, isn't it?

Backstory: The Nether Mages were once highly esteemed members of the Blood Elf race, but are now banished to live among Elves, Demons, Dwarves and Humans. They were exiled when their leader, Jel'Thêdean, used the powerful magic of Planar Manipulation to completely remove a rioting group of Blood Elves from the worldly plane. This act was deemed too inhumane by the High Council, so the entire covenant was banished. Now, the Nether Mages can be found hanging around taverns, willing to work for the right amount of money...

Nether Mage Stats

Nether Mage Stats:
Base Attack Speed:
Range:
Starting Strength:
Strength Per Level:

Starting Agility:
Agility Per Level:

Starting Intelligence:
Intelligence Per Level:

Main Attribute:
2.25
300
18
1.80
12
1.00
24
3.20
Intelligence
Level 1550 Health
360 Mana
2 Armor
26-32 Damage, Average Speed
Level 6750 Health
600 Mana
3 Armor
42-48 Damage, Average Speed
Level 1950 Health
780 Mana
4 Armor
54-60 Damage, Average Speed



Here's a list of his Abilities:
Nether Mage Abilities:
Planar Rift: Active
Mana Cost: 115

The Nether Mage lets loose a blast of energy, turning target unit and all units around it ethereal for a duration. If a unit is already in ethereal form, that unit will take damage. Banished units have their movement speed slowed by 25%.

Level 1 - 13 second banish, 75 damage.
Level 2 - 14 second banish, 125 damage.
Level 3 - 15 second banish, 175 damage.
Phase: Activated Stun/Banish
Mana Cost: 50

Allows the Nether Mage to switch a target unit between the ethereal and worldly planes. If the targeted unit is ethereal, it will be reverted to the worldly plane and have all magical buffs removed from it; if the unit is corporeal, it will become banished and stunned for a duration.

Level 1 - Banish and Stun both last 3 seconds.
Level 2 - Banish lasts 3.5 seconds, stun lasts 4.
Level 3 - Banish lasts 4 seconds, stun lasts 5 seconds.
Planar Disruptance: Passive Aura
Mana Cost: 0

Attunes the Nether Mage to disruptances in the fabric of space-time, healing allies and banishing enemies whenever they cast a spell. Banish lasts slightly shorter on heroes. Banished units have their movement speed slowed by 25%.

Level 1 - 50 hit points healed, 1.75 second banish, 550 AoE.
Level 2 - 80 hit points healed, 2.5 second banish, 600 AoE.
Level 3 - 110 hit points healed, 3.25 second banish, 650 AoE.
Defabricate (Ultimate): Activated AoE Debuff
Mana Cost: 165

The Nether Mage tears apart space-time, defabricating all units in a target area. Only affects ethereal units. The effect is permanent unless dispelled, but will expire if the unit becomes corporeal. 350 AoE, 80 second cooldown.

Level 1 - Defabricated hostile units take 35 damage per second, while friendly units are healed for 20 hit points per second

And some screenshots:
Defabricate + Planar Disruptance Combo:Zoom (requires log in)Zoom (requires log in)
Defabricate:Zoom (requires log in)Zoom (requires log in)Zoom (requires log in)Zoom (requires log in)Zoom (requires log in)
Planar Disruptance:Zoom (requires log in)Zoom (requires log in)Zoom (requires log in)Zoom (requires log in)
Planar Rift + Planar Disruptance Combo:Zoom (requires log in)
Planar RiftZoom (requires log in)Zoom (requires log in)Zoom (requires log in)Zoom (requires log in)

Everything is native (no custom models, etc.) except for a PASBTN and DISPASBTN I made myself for Planar Disruptance. Additional information about how/what to import in order to successfully implement can be found in the attached text file.

Note: Credit for this nice layout goes directly to Moyack, and indirectly to the Unsung Legends team (apparently).
01-27-2007, 04:37 AM#2
Av3n
We don't need to know about hero stats (unless ppl r curious) Hopefully everything is fixed. (Which is probily fixed anyway) Image has an broken link

-Av3n
01-27-2007, 05:30 AM#3
Rising_Dusk
You know, I knew I was forgetting something.
I'll have to submit mine tomorrow so I stop forgetting about it.

I like this hero.
I think you might be required to clean up the leaks Vex pointed out before it can be accepted as a resource, though.
Either way, good job.
01-27-2007, 08:13 AM#4
Pyrogasm
I did clean up the leaks, actually. I made some major changes and updated everything that needed to be updated.

I've made the stats hidden now.

By-the-way, what link is broken?
EDIT: Ah... I found and updated it.
01-28-2007, 02:29 PM#5
blu_da_noob
For Planar Disruption, why do you use a pseudo detection involving mana used instead of just using 'unit starts the affect an ability'? Also, instead of repeating all your actions for the case of each level, you could just store the level of the buff in a variable (if has buff xx 1 then i = 3, elseif....) and use this in the actions.

Defabricate Periodic Remove leaks a group. Units in XXX creates a new group, so change your clear group to a remove group.
01-28-2007, 09:11 PM#6
Pyrogasm
Quote:
Originally Posted by blu_da_noob
For Planar Disruption, why do you use a pseudo detection involving mana used instead of just using 'unit starts the affect an ability'?
Because that fires when an item is used also.
Quote:
Originally Posted by blu_da_noob
Also, instead of repeating all your actions for the case of each level, you could just store the level of the buff in a variable (if has buff xx 1 then i = 3, elseif....) and use this in the actions.
That's true... I hadn't considered that; fixed.
Quote:
Originally Posted by blu_da_noob
Defabricate Periodic Remove leaks a group. Units in XXX creates a new group, so change your clear group to a remove group.
Fixed.

Original Post updated!
01-28-2007, 10:29 PM#7
Rising_Dusk
Trigger:
Collapse Events -
A unit starts the effects of an ability
Collapse Conditions -
Ability being cast equal to (Your Spell Here)
Collapse Actions -
...
That doesn't run the trigger when your hero uses an item.
And it is much easier than mana checking.
01-30-2007, 11:19 PM#8
Pyrogasm
Ok, aside from fixing that Planar Disruptance trigger, what else needs to be changed for this to be approved...

Dusk's was approved before he made any changes...
01-31-2007, 04:31 PM#9
Rising_Dusk
Quote:
Dusk's was approved before he made any changes...
Blu (The person who approves these things) sent me all of the changes on MSN, to which I fixed as he was reviewing it.
Therefore I posted the updated version a couple minutes after he reviewed/approved. (Since he knew I had fixed them all already)

Blu also has only like 1 day a week where he's really capable of approving/going through stuff.
And most of the other moderators don't really have time.

If nothing's done about it by tonight, I'll go through it and tell you what's up, then get Blu to approve once it's all taken care of.
Don't worry, just be patient. :P
01-31-2007, 11:18 PM#10
Pyrogasm
Ok; that I can do.
Quote:
Originally Posted by Rising_Dusk
Blu also has only like 1 day a week where he's really capable of approving/going through stuff.
And most of the other moderators don't really have time.
Ah... I didn't realize that he isn't usually able to look at things most days. Had I known that, I would've sat back and waited a bit more .
02-01-2007, 04:01 AM#11
Rising_Dusk
Trigger:
Planar Disruptance Spell Cast
Collapse Events
Unit - A unit Starts the effect of an ability
Collapse Conditions
(Unit-type of (Triggering unit)) Not equal to Dummy
Collapse Actions
Set Nether_Mage_Spell_Mana_Cost[1] = (Integer((Mana of (Triggering unit))))
Wait 0.01 game-time seconds
Set Nether_Mage_Spell_Mana_Cost[2] = (Integer((Mana of (Triggering unit))))
Set Nether_Mage_Spell_Mana_Cost[3] = (Nether_Mage_Spell_Mana_Cost[1] - Nether_Mage_Spell_Mana_Cost[2])
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse If - Conditions
Nether_Mage_Spell_Mana_Cost[3] Greater than 0
Collapse Then - Actions
Custom Script - call DoShit(...)
Collapse Else - Actions
Do nothing
You really need to fix that.
Just use as an ability check for that.
That's a really important fix, and you can always add as many conditions as you need to it to modify it as you need to.

Remove all of your "Do Nothing" calls.
While they look pretty in GUI, this is what they do in reality.
Collapse JASS:
function DoNothing takes nothing returns nothing
endfunction
Pretty pointless, eh?
Yeah, drop 'em. :P

Otherwise, it's about as clean as GUI can get.
I still suggest one day you learn jass and then convert this puppy over.
But hey, it's good enough for my tastes if you fix the above issues.

Once that's done, I figure Blu can stick this in the appropriate section.
02-01-2007, 02:00 PM#12
blu_da_noob
Event - A unit starts the affect on an ability
Condition - Level of (ability being used) for (casting unit) is greater than 0
Action - World domination

That should theoretically make it not trigger for items. And yeah, definitely remove those DoNothing's.
02-03-2007, 01:43 AM#13
Pyrogasm
Allright; I've removed all those lovely "Do Nothing"s, so that's fixed.

I've tried all manner of things relating to something that might enable me to remove the mana-detection actions from the trigger that blu_da_noob and Rising_Dusk have suggested, and that I had thought of my self... but to no avail. The trigger will always fire whenever an item is used. I will be looking into Mana Flare soon; Dusk said that's how Tides of Blood does it's spellcast detection.

If anyone else has some ideas, please do share. If I must use Mana flare, then I think I'll have to rework the triggers for it, which I'd rather not do.
02-03-2007, 04:38 AM#14
Rising_Dusk
Yeah, I dunno.
I've been fiddling with it to no avail.

To be quite fair though, your code really *shouldnt* work.
The "spell effect" event fires AFTER mana cost has been factored, therefore the difference should be minimal.
However, it should also ALWAYS fire because mana regen changes a unit's actual mana.
Your way really should not work, especially with an ugly wait in there.

If you ask me, I would just make it work for both items and abilities.
Then if any new developments arise that can easily solve it, update it then.
That's just my opinion though, check with Blu.
02-03-2007, 06:41 AM#15
Pyrogasm
Actually, I'm using an R2I() conversion so the mana regen doesn't show up as some weird real number value. Even if it did, mana regen shouldn't affect the numerical values. Example: 295 (before cast) - 235 (for a spell) = 60; 60 + 0 (0.04 mana regen as an integer) = 60.

I've got one new idea, though it subtracts from the "GUI-only" aspect of the hero: Make a JASS trigger that fires when a spell is cast and uses local integers for the mana costs, then (if the conditions are met) sets the unit to a global variable and runs the other trigger using that variable.

This is what I've changed the trigger(s) to:
Collapse Planar Disruptance JASS:
function Trig_Planar_Disruptance_Spell_Cast_JASS_Conditions takes nothing returns boolean
    if ( not ( GetUnitTypeId(GetTriggerUnit()) != 'u00A' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Planar_Disruptance_Spell_Cast_JASS_Actions takes nothing returns nothing
    local integer array Nether_Mage_Spell_Mana_Cost
    set Nether_Mage_Spell_Mana_Cost[1] = R2I(GetUnitStateSwap(UNIT_STATE_MANA, GetTriggerUnit()))
    call PolledWait( 0.01 )
    set Nether_Mage_Spell_Mana_Cost[2] = R2I(GetUnitStateSwap(UNIT_STATE_MANA, GetTriggerUnit()))
    set Nether_Mage_Spell_Mana_Cost[3] = ( Nether_Mage_Spell_Mana_Cost[1] - Nether_Mage_Spell_Mana_Cost[2] )
    if ( Nether_Mage_Spell_Mana_Cost[3] > 0 ) then
        set udg_Nether_Mage_Unit = GetTriggerUnit()
        call TriggerExecute( gg_trg_Planar_Disruptance_Spell_Cast )
    else
    endif
    set Nether_Mage_Spell_Mana_Cost[1] = 0  //Are these necessary? They are local variables...
    set Nether_Mage_Spell_Mana_Cost[2] = 0
    set Nether_Mage_Spell_Mana_Cost[3] = 0
endfunction

//===========================================================================
function InitTrig_Planar_Disruptance_Spell_Cast_JASS takes nothing returns nothing
    set gg_trg_Planar_Disruptance_Spell_Cast_JASS = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Planar_Disruptance_Spell_Cast_JASS, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Planar_Disruptance_Spell_Cast_JASS, Condition( function Trig_Planar_Disruptance_Spell_Cast_JASS_Conditions ) )
    call TriggerAddAction( gg_trg_Planar_Disruptance_Spell_Cast_JASS, function Trig_Planar_Disruptance_Spell_Cast_JASS_Actions )
endfunction
Trigger:
Planar Disruptance Spell Cast
Events
Conditions
Collapse Actions
Set Nether_Mage_Points[2] = (Position of Nether_Mage_Unit)
Collapse For each (Integer A) from 1 to 3, do (Actions)
Collapse Loop - Actions
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse If - Conditions
(Nether_Mage_Unit has buff Nether_Mage_Buffs[(Integer A)]) Equal to True
Collapse Then - Actions
Special Effect - Create a special effect attached to the chest of Nether_Mage_Unit using Objects\Spawnmodels\Undead\UDeathSmall\UDeathSmall.mdl
Unit - Set life of Nether_Mage_Unit to ((Life of Nether_Mage_Unit) + (20.00 + (30.00 x (Real((Integer A))))))
Special Effect - Destroy (Last created special effect)
Else - Actions
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse If - Conditions
(Nether_Mage_Unit has buff Nether_Mage_Buffs[((Integer A) + 3)]) Equal to True
Collapse Then - Actions
Unit - Create 1 Dummy for (Owner of Nether_Mage_Unit) at Nether_Mage_Points[2] facing Default building facing degrees
Unit - Add Planar Disruptance (Dummy Banish) to (Last created unit)
Unit - Set level of Planar Disruptance (Dummy Banish) for (Last created unit) to (Integer A)
Unit - Order (Last created unit) to Human Blood Mage - Banish Nether_Mage_Unit
Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
Else - Actions
Custom script: call RemoveLocation( udg_Nether_Mage_Points[2] )
Custom script: set udg_Nether_Mage_Unit = null
Is that acceptable?

Post Updated with v1.2