Template Jumping Spell Template v3

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

  1. milkman

    milkman Guest

    Ratings:
    +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.

    Ratings:
    +202 / 0 / -0
    JASS:
    //***************************************************************************
    //*                                                                         *
    //* Jumping Spell Template v3                                               *
    //* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯            **URL in the works                 *
    //* Parabola function by Shadow1500                                         *
    //* System by emjlr3                                                        *
    //*                                                                         *
    //* Requires:                                                               *
    //* ¯¯¯¯¯¯¯¯¯                                                               *
    //*                                                                         *
    //* - A vJASS Preprocessor                                                 *
    //*                                                                         *
    //***************************************************************************
    
    library JST initializer InitJST
    
    globals
        // 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'
    endglobals
    
    //=====No touching past this point=====\\
    
    globals
        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)
    endglobals
    
    private function Parabola takes real dist, real maxdist returns real
        local real t = (dist*2)/maxdist-1
        return (-t*t+1)*(maxdist/Arc)
    endfunction
    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.
    endfunction
    
    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
        endif
        call ShowUnit(u,false)
        call KillUnit(u)
        
        call RemoveLocation(l)
        set u = null
        return b
    endfunction
    
    private function SafeX takes real x returns real
        if x<Game_MinX then
            return Game_MinX
        elseif x>Game_MaxX then
            return Game_MaxX
        endif
        return x
    endfunction
    private function SafeY takes real y returns real
        if y<Game_MinY then
            return Game_MinY
        elseif y>Game_MaxY then
            return Game_MaxY
        endif
        return y
    endfunction
    
    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
    endstruct
    
    globals
        private timer T = CreateTimer()
        private dat array D
        private integer Total = 0
    endglobals
    
    //Spell:
    private function Filt takes nothing returns boolean
        return IsUnitEnemy(GetFilterUnit(),bj_groupEnumOwningPlayer) and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)!=true
    endfunction    
    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))
        loop
            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)
        endloop 
       
        call DestroyGroup(g)
        set g = null
    endfunction
    
    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
        
        loop
            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.
                else
                    set height = Parabola(dist,d.maxdist)-(height-d.start_z)
                endif
            else
                set height = Parabola(dist,d.maxdist)
            endif
            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)
                endif
            endif
            
            set i = i + 1
        endloop
    endfunction     
    
    //===========================================================================
    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)
            endif
            return false
        endif
        
        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) 
        endif
        set D[Total] = d
        
        call RemoveLocation(l)
        set l = null 
        return true
    endfunction
    
    endlibrary


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

    milkman Guest

    Ratings:
    +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.

    Ratings:
    +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

    Ratings:
    +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

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

Share This Page