Spellpack Hero: Shadow Assassin

Hero

─║╣ero─
Reaction score
250
Shadow Assassin
Made by: Hero12341234
Updated

Spells:

Shadow Glaive
The Shadow Assassin throws a shadow glaive that will move toward the target location. As it flies through enemies they take 100/200/300 damage.
WC3ScrnShot_060907_145929_03.jpg


Shadow Meld
The Shadow Assassin merges with the shadows giving her enemies a chance to miss her upon attacking.
The Evasion is lost if the Shadow Assassin is not moving.
Level 1- 30% chance to dodge an attack. Last 10 seconds.
Level 2- 40% chance to dodge an attack. Last 20 seconds.
Level 3- 50% chance to dodge an attack. Last 30 seconds.

WC3ScrnShot_060907_145827_01.jpg


Shadow Impact
Gives a 30/40/50% chance that the Shadow Assassin will attack twice. When the Shadow Assassin attacks twice she regains 30% of the damage in hp.

WC3ScrnShot_060907_145924_02.jpg


Flying Daggers
The Shadow Assassin jumps around in the vicinity throwing knives alll around her. Each explosion of knives deals 70/80/90 damage. Jumps 6/12/18 times.

WC3ScrnShot_060907_145933_04.jpg




Comments, Feedback, and Questions Welcomed!

Download Below:
 

Attachments

  • Shadow Assassin.w3x
    73.4 KB · Views: 1,313

Doom-Angel

Jass User (Just started using NewGen)
Reaction score
167
i liked the Shadow Meld how did u make the assasin's animation dragged like that? (im too lazy to open WE and check...)
 

Hatebreeder

So many apples
Reaction score
381
WOW!!!!
I must say, this is my favourite Spell Pack so far <3 <3 <3
I like all the Skills featured in this Spellpack
+++++++++Rep !!!!!
 

Akatsuki

New Member
Reaction score
24
I had so much fun testing them out that I spent like 30 minutes killing everyone and used the thereisnospoon cheat just so I won't run out of mana.
 

Sim

Forum Administrator
Staff member
Reaction score
534
Some of them sure are impressive, good job.

--> Shadow Meld

The best one. My favorite :)

JASS:
function Trig_Shadow_Meld_Actions takes nothing returns nothing
    local unit caster=GetTriggerUnit()
    local timer t=CreateTimer()
    local location unitloc=GetUnitLoc(caster)

    
    call SetHandleHandle(t,&quot;caster&quot;,caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
    
    call TimerStart(t,.10,true,function Shadow_Meld_CallBack)
    call PolledWait(GetUnitAbilityLevel(caster,&#039;A006&#039;)*10)
    call UnitRemoveAbility(caster,EvasionDummyId())
    call PauseTimer(t)
    call DestroyTimer(t)
    set caster=null
    call FlushHandleLocals(t)
    set t=null
endfunction


You need to remove "unitloc" at the end.

JASS:
function Shadow_Meld_CallBack takes nothing returns nothing
    local unit dummy
    local timer t=GetExpiredTimer()
    local unit caster=GetHandleUnit(t,&quot;caster&quot;)
    local location unitloc
    local location newloc=GetUnitLoc(caster)
    set unitloc=GetHandleLocation(t,&quot;unitloc&quot;)
if  DistanceBetweenPoints(unitloc,newloc) &gt;1 then 
    call UnitAddAbility(caster,EvasionDummyId())
    call SetUnitAbilityLevel(caster,EvasionDummyId(),GetUnitAbilityLevel(caster,&#039;A006&#039;))
    set dummy=CreateUnit(GetOwningPlayer(caster),ShadowMeldDummyId(),GetUnitX(caster),GetUnitY(caster),GetUnitFacing(caster))
    call UnitApplyTimedLife(dummy,&#039;BTLF&#039;,3)
    call UnitFadeTimed(dummy,2,100)
    call SetUnitAnimationByIndex(dummy,2)  
    set unitloc=GetUnitLoc(caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
    set dummy=null
else
    call UnitRemoveAbility(caster,EvasionDummyId())
    set unitloc=GetUnitLoc(caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
endif
endfunction


It is safe to null your variables in this function. You also need to remove "newloc", but not unitloc.

--> Flying Daggers

Good, except the spell shouldn't deselect your hero, as you can just reselect him...

JASS:
set e=AddSpecialEffect(&quot;Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl&quot;,GetUnitX(caster),GetUnitY(caster))
// Other stuff...
set e=AddSpecialEffect(&quot;Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl&quot;,GetUnitX(caster),GetUnitY(caster))
// Other stuff...
call DestroyEffect(e)


You need to destroy e before setting it to a new value.

JASS:
local location nextjumpspot
// Other stuff
loop
set nextjumpspot=PolarProjectionBJ(jumpspot,GetRandomReal(1,500),GetRandomReal(1,360))
// Other stuff
endloop
call RemoveLocation(nextjumpspot)


You need to remove "nextjumpspot" inside the loop.

JASS:
    set e=null
    set caster=null
    set dummy=null


You don't null enough stuff.

--> Shadow Glaive

Nice!

JASS:
    local timer t=CreateTimer()
    local unit caster=GetTriggerUnit()
    local location c=GetUnitLoc(caster)
    local location end=GetSpellTargetLoc()
    local real angle=AngleBetweenPoints(c,end)
    local unit dummy=CreateUnit(GetOwningPlayer(caster),&#039;u002&#039;,GetUnitX(caster),GetUnitY(caster),0)
    local real distance=DistanceBetweenPoints(c,end)/15*.03
// Other stuff
    set t=null
    set dummy=null


You don't null enough stuff.

JASS:
function Move_Glaive takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit dummy=GetHandleUnit(t,&quot;dummy&quot;)
    local location gp=GetUnitLoc(dummy)
    local real angle=GetHandleReal(t,&quot;angle&quot;)
    local location end=GetHandleLocation(t,&quot;end&quot;)
    local location movenext=PolarProjectionBJ(gp,15,angle)
    call SetUnitX(dummy,GetLocationX(movenext))
    call SetUnitY(dummy,GetLocationY(movenext))
    call RemoveLocation(gp)
    call RemoveLocation(movenext)
endfunction


You null nothing >_<

--> Shadow Impact

It doesn't show the unit attacking twice. Increase its attack speed for a short duration somehow.

call PolledWait instead of TriggerSleepAction. More accurate.

JASS:
    local real lifeadd=damage/.30


A number divided by 0.30 actually becomes 3 times higher. Multiply it by 0.30 instead.

-----------------

You really need to add constant functions in your spells. Such as the ability id (which we see about 5 times in every trigger) and dummy abilities.

Null more things and remove the leaks.

Otherwise, great!
 

ZypHeRx™

New Member
Reaction score
17
ARrgH!!! i wanna learn how to make Shadow Meld which makes the shadow-like thingy follow her .. but i dont know JASS!! can anyone do it in GUI for me ?? please!!
 

substance

New Member
Reaction score
34
JASS:
    call DamDetect_Attacks(&quot;Trig_Shadow_Impact_Actions&quot;)


That runs on ALL damage events, so throw in a condition or set it up for your hero at map int. Also I dont see why you have tables AND handle vars in your header.. and for some reason you chose to use handle vars :/

There could be alot of optimization here, but other than that, good looking spells.

**Oh and you should try
JASS:
		call SetUnitVertexColor(u,alpha,alpha,alpha,alpha)
In your fade function.
 

Ninja_sheep

Heavy is credit to team!
Reaction score
64
I really dont understand the shadowmeld.

you use this:

JASS:

    local location unitloc
    local location newloc=GetUnitLoc(caster)
    set unitloc=GetHandleLocation(t,&quot;unitloc&quot;)
if  DistanceBetweenPoints(unitloc,newloc) &gt;1 then


first you get the location of the unit and then you get another strange location wich i dont know what it is. Can you explain the second loc?

Then the rest. In the first part you create the illusion. But if i read this trigger i think i just get 1 illusion. Why it doesn't just make 1 illusion?! There are no loops oO
 

substance

New Member
Reaction score
34
He basically gets the old location and the new location, then he check the distance between the two locations.

If there is no distance between the two locations, then that means the unit isnt moving, therefore the effect isnt run.
 

Hero

─║╣ero─
Reaction score
250
Ok Will fix those bugs

It doesn't show the unit attacking twice. Increase its attack speed for a short duration somehow.

actually..it creates a clone of her...(the shadow meld clone) then it sets the vertex coloring to a very transparent and black coloring...tells it to play attack animation then does the same damage as the hero...

If you don't believe me attack something and when you hear a second attack sound move away...the clone will still be there but will fade away very shortly after

Also I dont see why you have tables AND handle vars in your header.. and for some reason you chose to use handle vars

Eghm... I still have to learn how to use Tables :eek:

______________________
Updated [All times are GMT -4. The time now is 01:48 PM.]
 

Sim

Forum Administrator
Staff member
Reaction score
534
JASS:
function Move_Glaive takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit dummy=GetHandleUnit(t,&quot;dummy&quot;)
    local location gp=GetUnitLoc(dummy)
    local real angle=GetHandleReal(t,&quot;angle&quot;)
    local location end=GetHandleLocation(t,&quot;end&quot;)
    local location movenext=PolarProjectionBJ(gp,15,angle)
    call SetUnitX(dummy,GetLocationX(movenext))
    call SetUnitY(dummy,GetLocationY(movenext))
    call RemoveLocation(gp)
    call RemoveLocation(movenext)
    set dummy=null
endfunction


You need to null everything. Everything, except integers, reals and booleans. Null them!

JASS:
function Trig_Shadow_Glaive_Actions takes nothing returns nothing
    local timer t=CreateTimer()
    local unit caster=GetTriggerUnit()
    local location c=GetUnitLoc(caster)
    local location end=GetSpellTargetLoc()
    local real angle=AngleBetweenPoints(c,end)
    local unit dummy=CreateUnit(GetOwningPlayer(caster),&#039;u002&#039;,GetUnitX(caster),GetUnitY(caster),0)
    local real distance=DistanceBetweenPoints(c,end)/15*.03
    call SetUnitAbilityLevel(dummy,Glaive_Dmg(),GetUnitAbilityLevel(caster,GlaiveSpellId()))

    
    call SetHandleHandle(t,&quot;dummy&quot;,dummy)
    call SetHandleReal(t,&quot;angle&quot;,angle)
    call SetHandleHandle(t,&quot;end&quot;,end)
    
    call TimerStart(t,.03,true,function Move_Glaive)
    call RemoveLocation(c)
    call PolledWait(distance)
    call PauseTimer(t)
    call KillUnit(dummy)
    call FlushHandleLocals(t)
    call DestroyTimer(t)
    set t=null
    set dummy=null
    set caster=null
    call RemoveLocation(end)
endfunction


Null, null, null, null!

JASS:
function Shadow_Meld_CallBack takes nothing returns nothing
    local unit dummy
    local timer t=GetExpiredTimer()
    local unit caster=GetHandleUnit(t,&quot;caster&quot;)
    local location unitloc
    local location newloc=GetUnitLoc(caster)
    set unitloc=GetHandleLocation(t,&quot;unitloc&quot;)
if  DistanceBetweenPoints(unitloc,newloc) &gt;1 then 
    call UnitAddAbility(caster,EvasionDummyId())
    call SetUnitAbilityLevel(caster,EvasionDummyId(),GetUnitAbilityLevel(caster,ShadowMeldSpellId()))
    set dummy=CreateUnit(GetOwningPlayer(caster),ShadowMeldDummyId(),GetUnitX(caster),GetUnitY(caster),GetUnitFacing(caster))
    call UnitApplyTimedLife(dummy,&#039;BTLF&#039;,3)
    call UnitFadeTimed(dummy,2,100)
    call SetUnitAnimationByIndex(dummy,2)  
    set unitloc=GetUnitLoc(caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
    set dummy=null
else
    call UnitRemoveAbility(caster,EvasionDummyId())
    set unitloc=GetUnitLoc(caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
endif
    set dummy=null
    set caster=null
    call RemoveLocation(newloc)
endfunction


Null!

JASS:
function Trig_Shadow_Meld_Actions takes nothing returns nothing
    local unit caster=GetTriggerUnit()
    local timer t=CreateTimer()
    local location unitloc=GetUnitLoc(caster)

    
    call SetHandleHandle(t,&quot;caster&quot;,caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
    
    call TimerStart(t,.10,true,function Shadow_Meld_CallBack)
    call PolledWait(GetUnitAbilityLevel(caster,ShadowMeldSpellId())*10)
    call UnitRemoveAbility(caster,EvasionDummyId())
    call PauseTimer(t)
    call DestroyTimer(t)
    set caster=null
    call FlushHandleLocals(t)
    call RemoveLocation(unitloc)
    set t=null
endfunction


Null the location!

JASS:
function Trig_Flying_Daggers_Actions takes nothing returns nothing
    local location nextjumpspot
    local effect e
    local unit dummy
    local real Nob=0
    local unit caster=GetTriggerUnit()
    local location jumpspot=GetUnitLoc(caster)
    local real number=GetUnitAbilityLevel(caster,FlyingDaggerSpellId())*3
    call SelectUnit(caster,false)
loop
    exitwhen Nob==number
    set nextjumpspot=PolarProjectionBJ(jumpspot,GetRandomReal(1,500),GetRandomReal(1,360))
if IsPointNotPath (GetLocationX(jumpspot),GetLocationY(jumpspot))==true then
    set nextjumpspot=PolarProjectionBJ(jumpspot,GetRandomReal(1,500),GetRandomReal(1,360))
else
    call SelectUnit(caster,false)
    set e=AddSpecialEffect(&quot;Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl&quot;,GetUnitX(caster),GetUnitY(caster))
    call DestroyEffect(e)
    call SetUnitX(caster,GetLocationX(nextjumpspot))
    call SetUnitY(caster,GetLocationY(nextjumpspot))
    set dummy=CreateUnit(GetOwningPlayer(caster),Dummy_Unit(),GetUnitX(caster),GetUnitY(caster),0)
    call UnitAddAbility(dummy,DummyFanofKnives())
    call SetUnitAbilityLevel(dummy,DummyFanofKnives(),GetUnitAbilityLevel(caster,FlyingDaggerSpellId()))
    call IssueImmediateOrder(dummy,&quot;fanofknives&quot;)
    call SetUnitAnimation(caster,&quot;Spell Slam&quot;)
    set e=AddSpecialEffect(&quot;Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl&quot;,GetUnitX(caster),GetUnitY(caster))
    call DestroyEffect(e)
    set Nob=Nob+1
    call RemoveLocation(nextjumpspot)
    call TriggerSleepAction(.30)
endif
endloop
    call SelectUnit(caster,true)
    call ResetUnitAnimation(caster)
    call RemoveLocation(jumpspot)
    call RemoveLocation(nextjumpspot)
    call DestroyEffect(e)
    set e=null
    set caster=null
    set dummy=null
endfunction


Null the locations!

Except that well... Everything's fine. Null the stuff.
 

Sim

Forum Administrator
Staff member
Reaction score
534
Approved, but you didn't null the timer "t" in the 2 following functions:

JASS:
function Move_Glaive takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit dummy=GetHandleUnit(t,&quot;dummy&quot;)
    local location gp=GetUnitLoc(dummy)
    local real angle=GetHandleReal(t,&quot;angle&quot;)
    local location end=GetHandleLocation(t,&quot;end&quot;)
    local location movenext=PolarProjectionBJ(gp,15,angle)
    call SetUnitX(dummy,GetLocationX(movenext))
    call SetUnitY(dummy,GetLocationY(movenext))
    call RemoveLocation(gp)
    call RemoveLocation(movenext)
    set dummy=null
    set gp=null
endfunction


JASS:
function Shadow_Meld_CallBack takes nothing returns nothing
    local unit dummy
    local timer t=GetExpiredTimer()
    local unit caster=GetHandleUnit(t,&quot;caster&quot;)
    local location unitloc
    local location newloc=GetUnitLoc(caster)
    set unitloc=GetHandleLocation(t,&quot;unitloc&quot;)
if  DistanceBetweenPoints(unitloc,newloc) &gt;1 then 
    call UnitAddAbility(caster,EvasionDummyId())
    call SetUnitAbilityLevel(caster,EvasionDummyId(),GetUnitAbilityLevel(caster,ShadowMeldSpellId()))
    set dummy=CreateUnit(GetOwningPlayer(caster),ShadowMeldDummyId(),GetUnitX(caster),GetUnitY(caster),GetUnitFacing(caster))
    call UnitApplyTimedLife(dummy,&#039;BTLF&#039;,3)
    call UnitFadeTimed(dummy,2,100)
    call SetUnitAnimationByIndex(dummy,2)  
    set unitloc=GetUnitLoc(caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
else
    call UnitRemoveAbility(caster,EvasionDummyId())
    set unitloc=GetUnitLoc(caster)
    call SetHandleHandle(t,&quot;unitloc&quot;,unitloc)
endif
    set dummy=null
    set caster=null
    call RemoveLocation(newloc)
    set newloc=null
endfunction


Fix that anytime soon, please.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      • Ghan
        Administrator - Servers are fun

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top