Template Jumping Spell Template v3

Discussion in 'Spells' started by emjlr3, Nov 25, 2007.

  1. milkman

    milkman Guest

    +0 / 0 / -0
    Hi, the units animation is freezed after using this jump ability, any suggests how to make the unit use the "stand" animation after the jump? (i am new to jass)
  2. Kenny

    Kenny Back for now.

    +202 / 0 / -0
    //*                                                                         *
    //* Jumping Spell Template v3                                               *
    //* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯            **URL in the works                 *
    //* Parabola function by Shadow1500                                         *
    //* System by emjlr3                                                        *
    //*                                                                         *
    //* Requires:                                                               *
    //* ¯¯¯¯¯¯¯¯¯                                                               *
    //*                                                                         *
    //* - A vJASS Preprocessor                                                 *
    //*                                                                         *
    library JST initializer InitJST
        // Speed at which unit's periodic movement is completed (.01-.04 recommended)
        private constant real Interval          = .025
        // Value which represents the arc of the jump movement (1.-2.), closer to 2. for a flatter arc
        private constant real Arc               = 1.3 
        // Rawcode of the Crow Form ability in your map.  This need only be changed if you have edited this ability
        // in which case, create a new, unedited copy and use it here
        private constant integer CrowForm       = 'Amrf' 
        // Rawcode of peasant unit in your map.  This need only be changed if you have edited this unit
        // in which case, create a new, unedited copy and ise it here
        private constant integer Peasant        = 'hpea'
    //=====No touching past this point=====\\
        private real Game_MaxX 
        private real Game_MinX 
        private real Game_MaxY 
        private real Game_MinY
        private constant real Runs = 1./Interval
        private constant integer HalfRuns = R2I(Runs/2.)
        private location L
        private sound S = CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
    private function Parabola takes real dist, real maxdist returns real
        local real t = (dist*2)/maxdist-1
        return (-t*t+1)*(maxdist/Arc)
    private function InitJST takes nothing returns nothing
        set Game_MaxX = GetRectMaxX(bj_mapInitialPlayableArea)-50.
        set Game_MinX = GetRectMinX(bj_mapInitialPlayableArea)+50.
        set Game_MaxY = GetRectMaxY(bj_mapInitialPlayableArea)-50.
        set Game_MinY = GetRectMinY(bj_mapInitialPlayableArea)+50.
    public function CheckLocPathing takes location l returns boolean
        local unit u = CreateUnitAtLoc( Player(13), Peasant, l, 0. )
        local real x = GetUnitX(u) - GetLocationX(l)
        local real y = GetUnitY(u) - GetLocationY(l)
        local boolean b = false
        if x < 1. and x > -1. and  y < 1. and y > -1. then        
            set b = true
        call ShowUnit(u,false)
        call KillUnit(u)
        call RemoveLocation(l)
        set u = null
        return b
    private function SafeX takes real x returns real
        if x<Game_MinX then
            return Game_MinX
        elseif x>Game_MaxX then
            return Game_MaxX
        return x
    private function SafeY takes real y returns real
        if y<Game_MinY then
            return Game_MinY
        elseif y>Game_MaxY then
            return Game_MaxY
        return y
    private struct dat
        unit u
        real area
        real damage
        real maxdist
        real movedist
        real cos
        real sin
        real diff
        real start_z
        string sfx  
        integer i = 0
        private timer T = CreateTimer()
        private dat array D
        private integer Total = 0
    private function Filt takes nothing returns boolean
        return IsUnitEnemy(GetFilterUnit(),bj_groupEnumOwningPlayer) and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)!=true
    private function Damage takes unit u, real dam, real x, real y, real area returns nothing
        local group g = CreateGroup()
        local unit v
        set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
        call GroupEnumUnitsInRange(g, x, y, area, Condition(function Filt))
            set v = FirstOfGroup(g)
            exitwhen v == null
            call GroupRemoveUnit(g,v)
            call UnitDamageTarget(u,v,dam,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
        call DestroyGroup(g)
        set g = null
    private function Movement takes nothing returns nothing
        local dat d
        local integer i = 1
        local real dist  
        local real height
        local real x
        local real y
            exitwhen i>Total
            set d = D[i]
            set d.i = d.i + 1
            set dist = d.i*d.movedist
            set L = GetUnitLoc(d.u)
            set height = GetLocationZ(L)
            if height<d.start_z then
                set height = (d.start_z-height)+Parabola(dist,d.maxdist)
            elseif height>d.start_z then
                if d.start_z+Parabola(dist,d.maxdist)<=height then
                    set height = 0.
                    set height = Parabola(dist,d.maxdist)-(height-d.start_z)
                set height = Parabola(dist,d.maxdist)
            call RemoveLocation(L)
            call SetUnitX(d.u,SafeX(GetUnitX(d.u)+d.movedist*d.cos))
            call SetUnitY(d.u,SafeY(GetUnitY(d.u)+d.movedist*d.sin))
            call SetUnitFlyHeight(d.u,height,0.)
            call DisplayTextToPlayer(Player(0),0.,0.,"ZLoc = "+R2S(GetLocationZ(GetUnitLoc(d.u)))+" : FlyHeight = "+R2S(GetUnitFlyHeight(d.u)))
            if d.i == HalfRuns then
                call SetUnitTimeScale(d.u, 1.)
            elseif height<=1. then
                call PauseUnit( d.u,false )
                call SetUnitPathing( d.u, true )           
                call SetUnitFlyHeight(d.u,GetUnitDefaultFlyHeight(d.u),0.) 
                call SetUnitAnimation(d.u,"stand") // <<<<<<--------------------------------
                set x = GetUnitX(d.u) + d.diff * d.cos
                set y = GetUnitY(d.u) + d.diff * d.sin 
                call DestroyEffect(AddSpecialEffect(d.sfx, x,y))  
                call Damage(d.u, d.area, x, y, d.damage)  
                call d.destroy() 
                set D[i] = D[Total]
                set Total = Total - 1
                set i = i - 1
                if Total==0 then
                    call PauseTimer(T)
            set i = i + 1
    public function Cast takes unit u, real damage, real area, real diff, string anim, string sfx returns boolean
        local dat d      
        local real ux
        local real uy   
        local location l 
        local real ang
        local real x
        local real y 
        if u==null or damage<0. or area<0. then
            if GetLocalPlayer()==GetOwningPlayer(u) then
                call ClearTextMessages()
                call BJDebugMsg("|c00FF0000JST Error: Invalid inputs in function Cast.")
                call StartSound(S)
            return false
        set d = dat.create()       
        set ux = GetUnitX(u)
        set uy = GetUnitY(u)   
        set l = GetSpellTargetLoc() 
        set ang = Atan2((GetLocationY(l)-uy),(GetLocationX(l)-ux))
        set x = GetLocationX(l) - diff * Cos(ang)
        set y = GetLocationY(l) - diff * Sin(ang)
        set d.u = u
        set d.damage = damage
        set d.area = area
        set d.sfx = sfx
        set d.maxdist = SquareRoot((ux-x)*(ux-x) + (uy-y)*(uy-y))
        set d.cos = Cos(ang)
        set d.sin = Sin(ang)
        set d.movedist = d.maxdist/Runs
        set d.diff = diff
        set L = GetUnitLoc(d.u)
        set d.start_z = GetLocationZ(L)
        call RemoveLocation(L)
        call PauseUnit( u,true )
        call SetUnitPathing( u, false )
        call UnitAddAbility( u,CrowForm )
        call UnitRemoveAbility( u,CrowForm )
        call SetUnitAnimation(u, anim) 
        call SetUnitTimeScale(u, .30) 
        set Total = Total + 1
        if Total == 1 then
            call TimerStart(T,Interval,true,function Movement) 
        set D[Total] = d
        call RemoveLocation(l)
        set l = null 
        return true

    That should work i think. I've highlighted what i added with a big arrow.
  3. milkman

    milkman Guest

    +0 / 0 / -0
    Yep it's working. Thanks. I kinda had the same command but in the wrong place.

    Offtopic: are there any tutorials out there on getting into jass?
  4. Kenny

    Kenny Back for now.

    +202 / 0 / -0
    Heaps. Here, here, here and here are just a few starting off tutorials from our tutorials section.
  5. tommerbob

    tommerbob Minecraft. :D

    +110 / 0 / -0
    Is it possible to use this, but instead have the location in front of the caster at X distance? I'm trying to create a leap spell, but it is instant cast with no target. How would I do this?
  6. emjlr3

    emjlr3 Change can be a good thing Staff Member

    +396 / 0 / -0
    polar project out from the caster along its facing angle and use that as the target location

Share This Page