Spell Sandman

Discussion in 'Spells' started by Jesus4Lyf, Jan 3, 2008.

  1. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    Screenshot:
    Please note that I found it hard to get a good screenshot of this spell in action...
    [​IMG]

    "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("1","20","5")
    		//! runtextmacro BirthPartDestSet("2","-20","5")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("3","20","0")
    		//! runtextmacro BirthPartDestSet("4","-20","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("5","16.5","2")
    		//! runtextmacro BirthPartDestSet("6","-16.5","2")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("7","15","4")
    		//! runtextmacro BirthPartDestSet("8","-15","4")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("9","11","2.5")
    		//! runtextmacro BirthPartDestSet("10","-11","2.5")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("11","7","1")
    		//! runtextmacro BirthPartDestSet("12","-7","1")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("13","3","0")
    		//! runtextmacro BirthPartDestSet("14","-3","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("15","3","0")
    		//! runtextmacro BirthPartDestSet("16","-3","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("17","3","0")
    		//! runtextmacro BirthPartDestSet("18","-3","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("19","3","0")
    		//! runtextmacro BirthPartDestSet("20","-3","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("21","-24","18")
    		//! runtextmacro BirthPartDestSet("22","-20","12")
    		//! runtextmacro BirthPartDestSet("23","-16","6")
    		//! runtextmacro BirthPartDestSet("24","-12","0")
    		//! runtextmacro BirthPartDestSet("25","-8","0")
    		//! runtextmacro BirthPartDestSet("26","-4","0")
    		//! runtextmacro BirthPartDestSet("27","0","0")
    		//! runtextmacro BirthPartDestSet("28","4","0")
    		//! runtextmacro BirthPartDestSet("29","8","0")
    		//! runtextmacro BirthPartDestSet("30","12","0")
    		//! runtextmacro BirthPartDestSet("31","16","6")
    		//! runtextmacro BirthPartDestSet("32","20","12")
    		//! runtextmacro BirthPartDestSet("33","24","18")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("34","0","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("35","7","0")
    		//! runtextmacro BirthPartDestSet("36","0","7")
    		//! runtextmacro BirthPartDestSet("37","-7","0")
    		//! runtextmacro BirthPartDestSet("38","0","7")
    		//! runtextmacro BirthPartDestSet("39","0","0")
    		set z=z+10
    		//! runtextmacro BirthPartDestSet("40","0","0")
    	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<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<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't seem to work. Can't figure it out. =/
    				call SetUnitTimeScale(d.target,5.)
    				call SetUnitAnimation(d.target,"death")
    			endif
    			if d.tick==42 then
    				call SetUnitTimeScale(d.target,1.)
    				call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl",d.target,"head"))
    			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("Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl",GetUnitX(d.target),GetUnitY(d.target)))
    			call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",GetUnitX(d.target),GetUnitY(d.target)))
    			// Alternative to the line above: call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl",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)>=0.405 then
    				call SetUnitAnimation(d.target,"stand")
    			endif
    			set d.target=null
    			set d.tick=0
    			if d.timeleft<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<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),'u000',d.x,d.y,Atan2(GetUnitY(d.target)-d.y,GetUnitX(d.target)-d.x)*bj_RADTODEG)
    			set d.e=AddSpecialEffectTarget("Abilities\\Weapons\\ZigguratMissile\\ZigguratMissile.mdl",d.eu,"origin")
    		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<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<0 then
    					call KT_Add(function Finish,d,0.03)
    				else
    					call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\Impale\\ImpaleHitTarget.mdl",GetUnitX(d.target),GetUnitY(d.target)))
    					call PauseUnit(d.target,true)
    					call UnitAddAbility(d.target,'Amrf')
    					call UnitRemoveAbility(d.target,'Amrf')
    					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<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)>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<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<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),'u000',x,y,f*bj_RADTODEG)
    			set d.parte[i]=AddSpecialEffectTarget(SMmodel,d.part[i],"origin")
    			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

    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.
     

    Attached Files:

    • Like Like x 10
  2. Trollvottel

    Trollvottel never aging title

    Ratings:
    +261 / 0 / -0
    lol its very nice. but a bit weird ;)
    but great work and so i must +rep you
     
  3. Hatebreeder

    Hatebreeder So many apples

    Ratings:
    +383 / 0 / -0
    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 =)
     
  4. Quauhtli

    Quauhtli I have the right to remain silent.

    Ratings:
    +62 / 0 / -0
    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
     
  5. Flare

    Flare Stops copies me! Staff Member

    Ratings:
    +662 / 0 / -0
    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 ^^)
     
  6. Hatebreeder

    Hatebreeder So many apples

    Ratings:
    +383 / 0 / -0
    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...
     
  7. Sim

    Sim Forum Administrator Staff Member

    Ratings:
    +531 / 0 / -0
    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. :)
     
  8. Insane!

    Insane! Shh I didn't edit this, go away.

    Ratings:
    +121 / 0 / -0
    looks as to me the sand is the tiny version of the bear model
     
  9. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    >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.
     
  10. Insane!

    Insane! Shh I didn't edit this, go away.

    Ratings:
    +121 / 0 / -0
    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)
     
  11. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    >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. <_<
     
  12. Sim

    Sim Forum Administrator Staff Member

    Ratings:
    +531 / 0 / -0
    > 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!
     
  13. Tinki3

    Tinki3 Special Member

    Ratings:
    +418 / 0 / -0
    This spell is awesome, gj.

    Maybe make the spell's raw code a constant global to make implementation easier.
     
  14. PurgeandFire

    PurgeandFire zxcvmkgdfg

    Ratings:
    +513 / 0 / -0
    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. ;)
     
  15. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    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.
     
  16. Flare

    Flare Stops copies me! Staff Member

    Ratings:
    +662 / 0 / -0
    lol, so it is an army of mini bears ^^ seems like an unusual choice of... parts... for the... thing...
     
  17. duyen

    duyen New Member

    Ratings:
    +214 / 0 / -0
    That code made me go :eek:
     
  18. Insane!

    Insane! Shh I didn't edit this, go away.

    Ratings:
    +121 / 0 / -0
    well you could always change the sand :rolleyes:
     
  19. cr4xzZz

    cr4xzZz Also known as azwraith_ftL.

    Ratings:
    +51 / 0 / -0
    > 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
     
  20. Tinki3

    Tinki3 Special Member

    Ratings:
    +418 / 0 / -0
    Approved, well done.
     

Share This Page