Spell Sandman

Jesus4Lyf

Good Idea™
Reaction score
397
Screenshot:
Please note that I found it hard to get a good screenshot of this spell in action...
sandmanpe6.jpg

"Sandman" summons an invulnerable sandman which can morph into things (no big custom model, just one for a dummy unit... It is made up of 40 dummy units controlled by Key Timers). It will slide along the ground to the closest enemy ground unit to it's summoner within 500 range, then flick it up into the air, turn into a hammer, and slam it into the ground for a specified amount of damage. This process then repeats for the duration of the spell.

Made with vJASS.
Fully MUI, but due to trigger intensiveness and displaying 40 units at once per instance, I don't recommend multiple instances in general. ;)

Requires Key Timers 2, vJASS, and a simple dummy unit (as per example).

I must warn you, you don't want to see my code... So don't reveal the spoiler below... It could kill you... You've been warned... Don't do it!!

You're brave, I'll give you that.
JASS:
library Sandman initializer InitSandman uses KT
	// Easy to use library. Just call Sandman_Create(summoner, duration, damage per hit)
	// Spell made by Jesus4Lyf. Please give credit if you use any part of it...
	// As you can see, it was a lot of work.
	// This spell demonstrates the power of Key Timers 2.
	// Note: While this spell is fully MUI, it is very intensive, and shouldn't be spammed.
	globals
		private constant string SMmodel="units\\creeps\\GrizzlyBear\\GrizzlyBear.mdl"
		private constant real SMscale=0.09
		
		private integer NewOrderSubject
		private trigger NewOrderTrig=CreateTrigger()
		
		private real array Height
	endglobals

	private struct sandman
		real timeleft
		
		unit caster
		unit target
		real x
		real y
		real f
		real speed
		effect e
		unit eu
		unit array part[41]
		effect array parte[41]
		real array partdestx[41]
		real array partdesty[41]
		real array partdestz[41]
		real dmg
		
		integer tick=0
	endstruct
	
	private function NewOrder takes sandman d returns nothing
		set NewOrderSubject=d
		call TriggerEvaluate(NewOrderTrig)
	endfunction
	
	private function Finish takes nothing returns boolean
		local sandman d=GetTriggerExecCount(GetTriggeringTrigger())
		local integer i=40
		if d.tick==0 then
			call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Undead\\UDeathMedium\\UDeath.mdl",d.x,d.y))
		endif
		set d.tick=d.tick+1
		if d.tick<41 then
			set i=d.tick
		endif
		loop
			call SetUnitFlyHeight(d.part<i>,GetUnitFlyHeight(d.part<i>)+(d.tick-i)*2.,0)
			set i=i-1
			exitwhen i==0
		endloop
		if d.tick==120 then
			set i=0
			loop
				set i=i+1
				call DestroyEffect(d.parte<i>)
				set d.parte<i>=null
				call KillUnit(d.part<i>)
				call RemoveUnit(d.part<i>)
				set d.part<i>=null
				exitwhen i==40
			endloop
			set d.target=null
			set d.caster=null
			call d.destroy()
			return true
		endif
		return false
	endfunction
	
	//! textmacro BirthPartDestSet takes ID, X, Y
		set d.partdestx[$ID$]=x+cosf*$Y$-sinf*$X$
		set d.partdesty[$ID$]=y+sinf*$Y$+cosf*$X$
		set d.partdestz[$ID$]=z
	//! endtextmacro
	private function InitBirth takes sandman d returns nothing
		local real cosf=Cos(d.f)
		local real sinf=Sin(d.f)
		local real x=d.x
		local real y=d.y
		local real z=0
		//! runtextmacro BirthPartDestSet(&quot;1&quot;,&quot;20&quot;,&quot;5&quot;)
		//! runtextmacro BirthPartDestSet(&quot;2&quot;,&quot;-20&quot;,&quot;5&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;3&quot;,&quot;20&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;4&quot;,&quot;-20&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;5&quot;,&quot;16.5&quot;,&quot;2&quot;)
		//! runtextmacro BirthPartDestSet(&quot;6&quot;,&quot;-16.5&quot;,&quot;2&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;7&quot;,&quot;15&quot;,&quot;4&quot;)
		//! runtextmacro BirthPartDestSet(&quot;8&quot;,&quot;-15&quot;,&quot;4&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;9&quot;,&quot;11&quot;,&quot;2.5&quot;)
		//! runtextmacro BirthPartDestSet(&quot;10&quot;,&quot;-11&quot;,&quot;2.5&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;11&quot;,&quot;7&quot;,&quot;1&quot;)
		//! runtextmacro BirthPartDestSet(&quot;12&quot;,&quot;-7&quot;,&quot;1&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;13&quot;,&quot;3&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;14&quot;,&quot;-3&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;15&quot;,&quot;3&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;16&quot;,&quot;-3&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;17&quot;,&quot;3&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;18&quot;,&quot;-3&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;19&quot;,&quot;3&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;20&quot;,&quot;-3&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;21&quot;,&quot;-24&quot;,&quot;18&quot;)
		//! runtextmacro BirthPartDestSet(&quot;22&quot;,&quot;-20&quot;,&quot;12&quot;)
		//! runtextmacro BirthPartDestSet(&quot;23&quot;,&quot;-16&quot;,&quot;6&quot;)
		//! runtextmacro BirthPartDestSet(&quot;24&quot;,&quot;-12&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;25&quot;,&quot;-8&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;26&quot;,&quot;-4&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;27&quot;,&quot;0&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;28&quot;,&quot;4&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;29&quot;,&quot;8&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;30&quot;,&quot;12&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;31&quot;,&quot;16&quot;,&quot;6&quot;)
		//! runtextmacro BirthPartDestSet(&quot;32&quot;,&quot;20&quot;,&quot;12&quot;)
		//! runtextmacro BirthPartDestSet(&quot;33&quot;,&quot;24&quot;,&quot;18&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;34&quot;,&quot;0&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;35&quot;,&quot;7&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;36&quot;,&quot;0&quot;,&quot;7&quot;)
		//! runtextmacro BirthPartDestSet(&quot;37&quot;,&quot;-7&quot;,&quot;0&quot;)
		//! runtextmacro BirthPartDestSet(&quot;38&quot;,&quot;0&quot;,&quot;7&quot;)
		//! runtextmacro BirthPartDestSet(&quot;39&quot;,&quot;0&quot;,&quot;0&quot;)
		set z=z+10
		//! runtextmacro BirthPartDestSet(&quot;40&quot;,&quot;0&quot;,&quot;0&quot;)
	endfunction
	private function Birth takes nothing returns boolean
		local sandman d=GetTriggerExecCount(GetTriggeringTrigger())
		local integer i=0
		if d.tick==0 then
			call InitBirth(d)
		endif
		set d.tick=d.tick+1
		loop
			set i=i+1
			call SetUnitX(d.part<i>,GetUnitX(d.part<i>)+(d.partdestx<i>-GetUnitX(d.part<i>))*0.2)
			call SetUnitY(d.part<i>,GetUnitY(d.part<i>)+(d.partdesty<i>-GetUnitY(d.part<i>))*0.2)
			call SetUnitFlyHeight(d.part<i>,GetUnitFlyHeight(d.part<i>)+(d.partdestz<i>-GetUnitFlyHeight(d.part<i>))*0.1,0)
			exitwhen i==40
		endloop
		if d.tick==50 then
			set d.tick=0
			call NewOrder(d)
			return true
		endif
		return false
	endfunction
	
	private function InitHit takes sandman d returns nothing
		local real cosf=Cos(d.f)
		local real sinf=Sin(d.f)
		local integer i=0
		set d.x=GetUnitX(d.target)
		set d.y=GetUnitY(d.target)
		set d.speed=90*bj_DEGTORAD
		// x = modfacing. y = modvert. z = distance.
		loop
			set i=i+1
			set d.partdestx<i>=-1.*bj_DEGTORAD
			set d.partdesty<i>=0
			set d.partdestz<i>=i*8+20
			exitwhen i==10
		endloop
		loop
			set i=i+1
			set d.partdestx<i>=1.*bj_DEGTORAD
			set d.partdesty<i>=0
			set d.partdestz<i>=(i-10)*8+20
			exitwhen i==20
		endloop
		loop
			set i=i+1
			set d.partdestx<i>=1.*bj_DEGTORAD
			set d.partdesty<i>=((i-23)*7.)*bj_DEGTORAD
			set d.partdestz<i>=105
			exitwhen i==25
		endloop
		loop
			set i=i+1
			set d.partdestx<i>=-1.*bj_DEGTORAD
			set d.partdesty<i>=((i-28)*7.)*bj_DEGTORAD
			set d.partdestz<i>=105
			exitwhen i==30
		endloop
		loop
			set i=i+1
			set d.partdestx<i>=1.*bj_DEGTORAD
			set d.partdesty<i>=((i-33)*7.)*bj_DEGTORAD
			set d.partdestz<i>=115
			exitwhen i==35
		endloop
		loop
			set i=i+1
			set d.partdestx<i>=-1.*bj_DEGTORAD
			set d.partdesty<i>=((i-38)*7.)*bj_DEGTORAD
			set d.partdestz<i>=115
			exitwhen i==40
		endloop
	endfunction
	
	private function Hit takes nothing returns boolean
		local sandman d=GetTriggerExecCount(GetTriggeringTrigger())
		local integer i=0
		local real r
		if d.tick==0 then
			call InitHit(d)
		endif
		set d.tick=d.tick+1
		if d.tick&lt;42 then
			call SetUnitFlyHeight(d.target,Height[d.tick],0)
			// x = modfacing. y = modvert. z = distance. speed = modvert.
			set d.speed=d.speed+bj_DEGTORAD
			loop
				set i=i+1
				set r=Cos(d.partdesty<i>+d.speed)
				call SetUnitX(d.part<i>,GetUnitX(d.part<i>)+(d.partdestz<i>*Cos(d.f+d.partdestx<i>)*r-GetUnitX(d.part<i>)+d.x)*0.1)
				call SetUnitY(d.part<i>,GetUnitY(d.part<i>)+(d.partdestz<i>*Sin(d.f+d.partdestx<i>)*r-GetUnitY(d.part<i>)+d.y)*0.1)
				call SetUnitFlyHeight(d.part<i>,GetUnitFlyHeight(d.part<i>)+(d.partdestz<i>*Sin(d.partdesty<i>+d.speed)-GetUnitFlyHeight(d.part<i>))*0.1,0)
				exitwhen i==40
			endloop
		elseif d.tick&lt;52 then
			set d.speed=d.speed-13.*bj_DEGTORAD
			loop
				set i=i+1
				set r=Cos(d.partdesty<i>+d.speed)
				call SetUnitX(d.part<i>,d.partdestz<i>*Cos(d.f+d.partdestx<i>)*r+d.x)
				call SetUnitY(d.part<i>,d.partdestz<i>*Sin(d.f+d.partdestx<i>)*r+d.y)
				call SetUnitFlyHeight(d.part<i>,d.partdestz<i>*Sin(d.partdesty<i>+d.speed),0)
				exitwhen i==40
			endloop
			set r=Cos(d.speed-10.*bj_DEGTORAD)
			call SetUnitX(d.target,80.*Cos(d.f)*r+d.x)
			call SetUnitY(d.target,80.*Sin(d.f)*r+d.y)
			call SetUnitFlyHeight(d.target,80*Sin(d.speed-10.*bj_DEGTORAD),0)
			if d.tick==41 then
				// This bit doesn&#039;t seem to work. Can&#039;t figure it out. =/
				call SetUnitTimeScale(d.target,5.)
				call SetUnitAnimation(d.target,&quot;death&quot;)
			endif
			if d.tick==42 then
				call SetUnitTimeScale(d.target,1.)
				call DestroyEffect(AddSpecialEffectTarget(&quot;Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl&quot;,d.target,&quot;head&quot;))
			endif
		elseif d.tick==52 then
			call UnitDamageTarget(d.caster,d.target,d.dmg,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
			call DestroyEffect(AddSpecialEffect(&quot;Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl&quot;,GetUnitX(d.target),GetUnitY(d.target)))
			call DestroyEffect(AddSpecialEffect(&quot;Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl&quot;,GetUnitX(d.target),GetUnitY(d.target)))
			// Alternative to the line above: call DestroyEffect(AddSpecialEffect(&quot;Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl&quot;,GetUnitX(d.target),GetUnitY(d.target)))
			call SetUnitFlyHeight(d.target,0,0)
		elseif d.tick==100 then
			call PauseUnit(d.target,false)
			if GetWidgetLife(d.target)&gt;=0.405 then
				call SetUnitAnimation(d.target,&quot;stand&quot;)
			endif
			set d.target=null
			set d.tick=0
			if d.timeleft&lt;0 then
				call KT_Add(function Finish,d,0.03)
			else
				call KT_Add(function Birth,d,0.02)
			endif
			return true
		endif
		return false
	endfunction
	
	private function Attack takes nothing returns boolean
		local sandman d=GetTriggerExecCount(GetTriggeringTrigger())
		local real x
		local real y
		local integer i=0
		set d.tick=d.tick+1
		if d.tick&lt;50 then
			loop
				set i=i+1
				call SetUnitX(d.part<i>,GetUnitX(d.part<i>)+(d.x-GetUnitX(d.part<i>))*0.1)
				call SetUnitY(d.part<i>,GetUnitY(d.part<i>)+(d.y-GetUnitY(d.part<i>))*0.1)
				call SetUnitFlyHeight(d.part<i>,GetUnitFlyHeight(d.part<i>)*0.9,0)
				exitwhen i==40
			endloop
		elseif d.tick==50 then
			loop
				set i=i+1
				call SetUnitX(d.part<i>,d.x)
				call SetUnitY(d.part<i>,d.y)
				call SetUnitFlyHeight(d.part<i>,0,0)
				call SetUnitFacing(d.part<i>,GetRandomReal(0,360))
				exitwhen i==40
			endloop
			set d.speed=0
			set d.eu=CreateUnit(Player(15),&#039;u000&#039;,d.x,d.y,Atan2(GetUnitY(d.target)-d.y,GetUnitX(d.target)-d.x)*bj_RADTODEG)
			set d.e=AddSpecialEffectTarget(&quot;Abilities\\Weapons\\ZigguratMissile\\ZigguratMissile.mdl&quot;,d.eu,&quot;origin&quot;)
		else
			loop
				set i=i+1
				exitwhen i==40
				call SetUnitX(d.part<i>,GetUnitX(d.part[i+1]))
				call SetUnitY(d.part<i>,GetUnitY(d.part[i+1]))
				call SetUnitFlyHeight(d.part<i>,0,0)
			endloop
			set x=GetUnitX(d.target)-GetUnitX(d.part<i>)
			set y=GetUnitY(d.target)-GetUnitY(d.part<i>)
			set x=SquareRoot(x*x+y*y)
			set d.speed=d.speed+0.1
			if x&lt;d.speed*2 then
				call SetUnitX(d.part<i>,GetUnitX(d.target))
				call SetUnitY(d.part<i>,GetUnitY(d.target))
				call DestroyEffect(d.e)
				set d.e=null
				call KillUnit(d.eu)
				call RemoveUnit(d.eu)
				set d.eu=null
				set d.tick=0
				set d.x=GetUnitX(d.target)
				set d.y=GetUnitY(d.target)
				if d.timeleft&lt;0 then
					call KT_Add(function Finish,d,0.03)
				else
					call DestroyEffect(AddSpecialEffect(&quot;Abilities\\Spells\\Undead\\Impale\\ImpaleHitTarget.mdl&quot;,GetUnitX(d.target),GetUnitY(d.target)))
					call PauseUnit(d.target,true)
					call UnitAddAbility(d.target,&#039;Amrf&#039;)
					call UnitRemoveAbility(d.target,&#039;Amrf&#039;)
					set d.f=Atan2(GetUnitY(d.target)-GetUnitY(d.caster),GetUnitX(d.target)-GetUnitX(d.caster))
					call KT_Add(function Hit,d,0.02)
				endif
				return true
			endif
			set x=d.speed/x
			set y=GetUnitY(d.part<i>)+y*x
			set x=GetUnitX(d.part<i>)+(GetUnitX(d.target)-GetUnitX(d.part<i>))*x
			call SetUnitX(d.part<i>,x)
			call SetUnitY(d.part<i>,y)
			call SetUnitX(d.eu,x)
			call SetUnitY(d.eu,y)
		endif
		return false
	endfunction
	
	private function Idle takes nothing returns boolean
		call NewOrder(GetTriggerExecCount(GetTriggeringTrigger()))
		return true
	endfunction
	
	private function DoNewOrder takes nothing returns boolean
		local sandman d=NewOrderSubject
		local real x=GetUnitX(d.caster)
		local real y=GetUnitY(d.caster)
		local player p=GetOwningPlayer(d.caster)
		local group g=CreateGroup()
		local real dd=500*500
		local real dx
		local real dy
		local unit u
		local unit t=null
		if d.timeleft&lt;0 then
			call DestroyGroup(g)
			set g=null
			call KT_Add(function Finish,d,0.03)
			return true
		endif
		call GroupEnumUnitsInRange(g,x,y,500,null)
		loop
			set u=FirstOfGroup(g)
			exitwhen u==null
			call GroupRemoveUnit(g,u)
			if IsUnitEnemy(u,p) and GetWidgetLife(u)&gt;0.405 and IsUnitType(u,UNIT_TYPE_GROUND)==true!=IsUnitType(u,UNIT_TYPE_STRUCTURE) then
				set dx=GetUnitX(u)-x
				set dy=GetUnitY(u)-y
				set dx=dx*dx+dy*dy
				if dx&lt;dd then
					set dd=dx
					set t=u
				endif
			endif
		endloop
		call DestroyGroup(g)
		set g=null
		if t==null then
			call KT_Add(function Idle,d,1.0)
			return false
		endif
		set d.target=t
		call KT_Add(function Attack,d,0.01)
		return false
	endfunction
	
	private function CountDown takes nothing returns boolean
		local sandman d=GetTriggerExecCount(GetTriggeringTrigger())
		set d.timeleft=d.timeleft-0.1
		return d.timeleft&lt;0
	endfunction
	
	public function Create takes unit caster, real duration, real damage returns nothing
		local integer i=0
		local real f=GetUnitFacing(caster)*bj_DEGTORAD
		local real x=GetUnitX(caster)+Cos(f)*50
		local real y=GetUnitY(caster)+Sin(f)*50
		local sandman d=sandman.create()
		set d.caster=caster
		set d.timeleft=duration
		set d.dmg=damage
		set d.x=x
		set d.y=y
		set d.f=f
		loop
			set i=i+1
			set d.part<i>=CreateUnit(Player(15),&#039;u000&#039;,x,y,f*bj_RADTODEG)
			set d.parte<i>=AddSpecialEffectTarget(SMmodel,d.part<i>,&quot;origin&quot;)
			call SetUnitScale(d.part<i>,SMscale,SMscale,SMscale)
			exitwhen i==40
		endloop
		call KT_Add(function CountDown,d,0.1)
		call KT_Add(function Birth,d,0.02)
	endfunction
	
	private function InitSandman takes nothing returns nothing
		local integer i=0
		local real h=0
		call TriggerAddCondition(NewOrderTrig,Condition(function DoNewOrder))
		loop
			set i=i+1
			set h=h-5*(I2R(i-22)*.25+Pow(I2R(i-22)/-100.,3.))
			set Height<i>=h
			exitwhen i==44
		endloop
	endfunction
endlibrary</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>

Did you learn your lesson?


This is my first spell I've submitted to The Helper. I suddenly got the urge to demonstrate the power of Key Timers with it's multi-period functionality and such, along with my JASS knowledge. I got the distinct feeling that people in this community assumed I was a noob at JASS coding or noob at SOMETHING, so I hope this helps dispell that. Hell, I know if I ever saw someone make this I'd be impressed... It took me one full day. No more, no less.

Feel free to use this spell (but please give credit as this was a ton of work), or even write extra addons and actions for Sandman to perform... It shouldn't be too hard if you want to figure out how. The hard bit is the animations.

Who needs custom models when we can just mass little units...? :p

IMPLEMENTATION
This depends on what you know/what your map has in terms of dummy units.
You need a dummy unit which is:
-A flying unit.
-Invulnerable.
-Locusted.
-Does not attack.
-Has an invisible model that still has an origin attach point (you can rip the model out of my demo map by exporting).

Now I'm assuming you have JASS NewGen.
If you don't have the dummy unit, follow these steps to make it.
1. Open my demo map, go to the place where you import customs, and export dummy.mdx to somewhere.
2. Open the unit editor, go to the bottom, find the dummy unit, and copy it (to clipboard).
3. Open your map.
4. Go to the unit editor, and paste the unit.
5. Go to the place where you import customs, and import dummy.mdx from where you exported it to (and you can delete it now from your computer).
6. Double click on the imported dummy.mdx, click custom path, and set it to "dummy.mdx".
7. Just make sure that the dummy unit's model is indeed set to dummy.mdx or dummy.mdl, whatever displays.

Now that you have the dummy unit...
If you don't have Key Timers 2 in your map, you just need to copy the KT trigger across to get it, though I recommend checking if it's the most recent version.
Once you have Key Timers in your map, simply copy the library above into your map... Perhaps to Custom Script. If you know what you're doing, you can put it anywhere, though.
==Last important bit==
Find the line "set d.part=CreateUnit(Player(15),'u000',x,y,f*bj_RADTODEG)" (it's right near the end, second function from the bottom, in the loop in the most indented part of the code... There's a find function in wc3 anyway) and change 'u000' to the ID of the dummy unit type in your map. This can be found by going to the unit editor, finding the dummy unit, pressing Ctrl+D, remembering the leftmost 4 digit code that shows up (case sensitive!) and then pressing Ctrl+D again, going back to the code and typing it in.
Now you're ready to use it. If you want, copy over my spell from the abilities section of the map, otherwise you can feel free to make your own dummy spell. Mine is nice because it is based off channel.
Now make a trigger:
Event: Unit - Unit starts the effect of an ability.
Condition: Ability Being Cast == <the spell ability>
Action: Custom Script: call Sandman_Create(GetSpellAbilityUnit(), <Duration>, <DamagePerHit>)
Example... Custom Script: call Sandman_Create(GetSpellAbilityUnit(), 17, 100)
That would make it last 17 seconds, and deal 100 damage every time it slams a unit.
You're done! If you run into any problems, feel free to post them here.

Hope you like it! :D

Edit: Updated it to use new KT2 versions (now 1.3). Why bother? Because it's a -lot- faster! It now multi-instances very nicely, and doesn't lag. Download was at 215 views.
 

Attachments

  • Spell - Sandman.w3x
    30.3 KB · Views: 1,013

Hatebreeder

So many apples
Reaction score
381
Jesus,
I never underestimated you, but, this whole shit about "What is faster" realy annoys some of the other Helpers. This Spell realy is coded very well ^^ (Honestly, I don't understand shit, maybe it would be a bit usefull, if you Comment on that Spell).
Well, now over to that what I tested: From the look of the Spell... Well, isn't realy appealing. I like the way the Sandman moves, and how it attacks/casts. The Units that are hit, and fall from the air look kinda weird, because they are slightly misplaced apon landing.

If I ought to rate this, you'd get an 8/10. Those 2 Points are just about the selection of SFX, but that's a question of taste.
And one more thing: You don't have to proove shit to others, just because they think you're a noob. Looks like to me, that you lack selfconfidence :rolleyes:

Greetings, Hatebreeder, your friendly Hater =)
 

Quauhtli

I have the right to remain silent.
Reaction score
62
agnjerbhapcvfhkjarpghvamrtvfcurahmtvgpurhnp gh hpf << that means my head fell on my keyboard because I died after reading your trigger.

The spell is nice , very nice, it's just that the sandman looks a little, well weird.
8.5/10
+rep
 

Flare

Stops copies me!
Reaction score
662
ahm... sfx bundled together to literally create a model and animate it? and absolutely ingenious way of removing any need for custom models imo.

I never underestimated you, but, this whole shit about "What is faster" realy annoys some of the other Helpers. This Spell realy is coded very well ^^

And one more thing: You don't have to proove shit to others, just because they think you're a noob.

well, you cant really put the whole blame on the big 'What is faster' argument on him hatebreeder, wouldnt be much of an argument if he was the only one involved (would be a bit freaky if someone was arguing with himself/herself...)

proving things to others because they think that youre not good enough to do something is quite fun, since you have rub-in-face potential if you do succeed (and possibly -rep potential for being an ass in the process ^^)
 

Hatebreeder

So many apples
Reaction score
381
ahm... sfx bundled together to literally create a model and animate it? and absolutely ingenious way of removing any need for custom models imo.





well, you cant really put the whole blame on the big 'What is faster' argument on him hatebreeder, wouldnt be much of an argument if he was the only one involved (would be a bit freaky if someone was arguing with himself/herself...)

proving things to others because they think that youre not good enough to do something is quite fun, since you have rub-in-face potential if you do succeed (and possibly -rep potential for being an ass in the process ^^)

I didn't say He would be the only one. There are... Mmmmhhhh... Some, that keep on claiming: OMZOR, I made the best System in the World. It is sooooooo fucking fast. Use it god damnit !
Or something like that ^^ You get the Point.

Well, to that with the Rub-In-Face potential... Well, go ahead, Paper Tiger ^^

*Off topic*
Do you listen to Iced Earth or something? "Ten thousend Strong" remindes me about something like that...
 

Sim

Forum Administrator
Staff member
Reaction score
534
Jesus,
I never underestimated you, but, this whole shit about "What is faster" realy annoys some of the other Helpers. This Spell realy is coded very well ^^ (Honestly, I don't understand shit, maybe it would be a bit usefull, if you Comment on that Spell).
Well, now over to that what I tested: From the look of the Spell... Well, isn't realy appealing. I like the way the Sandman moves, and how it attacks/casts. The Units that are hit, and fall from the air look kinda weird, because they are slightly misplaced apon landing.

If I ought to rate this, you'd get an 8/10. Those 2 Points are just about the selection of SFX, but that's a question of taste.
And one more thing: You don't have to proove shit to others, just because they think you're a noob. Looks like to me, that you lack selfconfidence :rolleyes:

Greetings, Hatebreeder, your friendly Hater =)

Drop the swearing.

> *Off topic*
> Do you listen to Iced Earth or something? "Ten thousend Strong" remindes me about something like that...

You are already off-topic really.

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

Impressive work. I like the accelerating effect when it spots and enemy far away (Unless I'm seeing things...? :rolleyes:). How it kills enemies is great, and how it looks like is very nice too!

Your spell needs implementation instructions. Other than that, it is ready for approval. :)
 

Insane!

Shh I didn't edit this, go away.
Reaction score
122
looks as to me the sand is the tiny version of the bear model
 

Jesus4Lyf

Good Idea™
Reaction score
397
>Comment on that Spell
See, I thought about that, and then decided that I couldn't be bothered writing comments for 450 lines of code. The important thing to understand if you want to mod it is the basics of how it works: it attaches a sequence to a key timer, loops and counts by ticks, initiates on tick=0 (so set it before you return true), and in initiation it sets the point where eat part should end up.

>the sandman looks a little, well weird.
Yeah. Unavoidable. I don't think it's too bad though. However, if you look at the first few lines, you can change the model it uses! This means you can change his appearence to suit any map theme. And if you want to try making a better version, by all means...

>proving things to others because they think that youre not good enough to do something is quite fun
That's why I did it. Because I could and it was fun.

>I like the accelerating effect when it spots and enemy far away
You're not seeing things. :D
Even when it dies and the parts get "raptured" they speed up into the air. If you remove the UDdeath model you may get a better look...

>looks as to me the sand is the tiny version of the bear model
That's right. And I purposely made it a constant global so it can be changed easily to suit any map theme. If the model you change it to has a different size, change the "scale" variable too. This variable ONLY effects the scaled size of the model specified. :)

>Your spell needs implementation instructions. Other than that, it is ready for approval.
Great, I'll get right on it. Thanks! :D

I'm glad everyone likes the spell and appreciates the work. I'd love to see people use it in their maps, too, if appropriate. Oh, and someone said it offsets the unit when it falls... That's when the hammer hits it. I attached the target to the front of the hammer. ;)

Edit: Finished the instructions. I hope they're thorough enough. I didn't actually test them (terrible, I know) but... yeah. If people run into problems they can post and I'll update it.
 

Insane!

Shh I didn't edit this, go away.
Reaction score
122
3 problems

1 the blood gets stuck in the air
2.it would be nice if it would detect if there were any enemy units near by, if not cancel the spell out
3.you are not using the spell template (provided by the fourms)
 

Jesus4Lyf

Good Idea™
Reaction score
397
>1 the blood gets stuck in the air
It's either that or no blood. I know this is the case, but it isn't major. It is indeed unfixable.
>2.it would be nice if it would detect if there were any enemy units near by, if not cancel the spell out
To be honest, I disagree. I like how it will go and attack units at a huge distance if you walk away, the accelerate effect appeals to me. However, if you want to use this in a map and need some customisations, I can do them for you.
>3.you are not using the spell template (provided by the fourms)
You mean JESP? I read how to correctly submit a resource, and it didn't mention JESP. Personally I like my method of just passing the variables.
If there's some standard I must follow in the future, please tell me where it is. I don't like the idea of rewriting much of this though. Depends if it's necessary.
Edit: Found JESP on the site. I will probably use it in the future. For this spell though... Probably not. Unless I get a lot of people wanting it done. <_<
 

Sim

Forum Administrator
Staff member
Reaction score
534
> 3.you are not using the spell template (provided by the fourms)

>> You mean JESP?

No, the Spell map template by Tinki3. It isn't necessary. :)

> 2.it would be nice if it would detect if there were any enemy units near by, if not cancel the spell out

I believe it attacks who you are currently attacking.

> Implementation

Unfortunately, it must be located inside the test map!
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Damn, I never even knew you registered here Jesus. :D

(I'm from Maps and Mods, the person who could never or would even bother solving your problem challenge majigger in the problem and solution thread >_>)

Anyways, the coding is flawless as far as I read. But I skimmed it. :p

Great spell. ;)
 

Jesus4Lyf

Good Idea™
Reaction score
397
Actually, it attacks the closest enemy ground unit to the summoner. The point is to protect the summoner kinda... I basically thought this was most suitable. So yeah, the thing basically has AI... Stands around till a ground unit comes in range, finds the closest ground unit, then goes and owns it.

I just put the instructions inside the map as well. :) Darn viewcount reset. :p Was on 14 views.

>Maybe make the spell's raw code a constant global to make implementation easier.
Actually, if you follow my implementation, it ends up being a GUI trigger... In future I'll probably make my spells follow JESP. In fact, I -may- even redo this one.

>Damn, I never even knew you registered here Jesus.
Hey Purge, I remember you well, I believe. And I remember owning everyone with the problem/solution thread. Lol, it got closed. Good times.
You should try using Key Timers to make some stuff if you're into JASS, Purge. As you can see with this spell, it makes anything possible. XD
Btw, I only signed up here a couple of weeks ago, if that. Decided it was time to give back to a mapping community... Whose forum consistantly works (not Maps and Mods, lol).

Edit: Just looked at that temple... Nice. I'm gonna customise it a little, but it looks good.
 

cr4xzZz

Also known as azwraith_ftL.
Reaction score
51
> I must warn you, you don't want to see my code... So don't reveal the spoiler below... It could kill you... You've been warned... Don't do it!!
No, really, it made me live longer :D I love looking at long crappy unknown texts... It makes me feel... Refreshing! Long codes ftw!
Nice spell anyway... Mini bears .. huh... strange... :nuts:+rep if I can
 
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