• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[JASS] Jump System

Status
Not open for further replies.
Level 6
Joined
Nov 10, 2006
Messages
181
Here's a little system that I have been working on, can I have some feedbacks, criticism, comments or any function that you guys wish to have.
This is also very nice for vertical jumps.

I made it work with my system EKB and it takes elevation angle, google for a picture and you'll understand, a value of around 70 makes the unit fly really really high.

A W.I.P
JASS:
library Jump uses AutoIndex
//=================SYSTEM Jump PROS & CONS =========================
//
//
//  Jump System is a system that makes SetUnitFlyHeight for users more comfortable and makes it stackable
//  for usage as if you had a spell that made a unit jump 600 feets infront with x height which will only
//  stop when height is < 0 and then another spell fired on the unit that makes the unit fly 800 feets above
//  will cripple things. If you don't like that then this is the system for you. This system stacks jumps
// by adding velocity to the existing velocity if the unit is flying.
//
//
//      Pros
//    - Extending SetUnitFlyHeight
//    - Jumps can stack correctly and properly
//    - Works pretty well
//    - Configurable stuffs like velocity and gravity which can do many things
//    - Smooth
//    - Can be used for vertical jumps
//    - Works well with libraries and knockback systems like EKB (Extended Knockback System)
//
//
//      Cons
//      - With this system, some functions like IsUnitFlying and StopUnitFlight will
//        break things that use SetUnitFlyHeight although you don't need to do any more of those with this
//      - Does not display a very clear parabola if your knockback ends earlier or later then the jump
//
//
//=================================================================
//                 WHAT IS AVAILABLE TO USE?
//
//  function SetUnitFlight takes unit u, real velocity returns nothing
//  function SetUnitGravity takes unit u, real gravity returns nothing
//  function StopUnitFlight takes unit u returns boolean
//  function SetEndCode takes unit u, EndJump f returns nothing
//  function IsUnitFlying takes unit u returns boolean
//
//=================================================================
//                  HOW TO USE ?
//=================================================================
//
//  function SetUnitFlight takes unit u, real velocity returns nothing
//
//     -This is used to throw unit in to the air
//
//
//  function SetUnitGravity takes unit u, real gravity, returns nothing
//
//    - this can be used to change unit's gravity
//    - use it only after you have called SetUnitFlight
//
//
//  function SetEndCode takes unit u, EndJump f returns nothing
//
//  Use this after you have called SetUnitFlight, it calls the function that you set
//  after the jump has ended.
//
//  function IsUnitFlying takes unit u returns boolean
//
//  Checks whether the unit is in the air or not
//
//  function StopUnitFlight takes unit u returns boolean
//
//  Stops a unit flight and make it return to the ground instantly
//
//
//  How to use SetUnitFlight?
//
//  A value of let's say negative 400 will pull the unit down if it is in the air and a value of 400
//  will make the unit fly up. The value of velocity works somewhat similar to height after some testing
//  so if you don't understand, imagine velocity = height.
//  
//
//
//
//
//=================================================================
//                 SYSTEM CODE:
//=================================================================

globals
    private constant real TIMEOUT = 0.03
    private constant real DEFAULT_GRAVITY = -981.
    private constant integer FLY_ID = 'Amrf'
    private timer Timer = CreateTimer()
    private integer Count = 0
    private group HitGroup = CreateGroup()
    private integer array FlyZ
endglobals

function interface EndJump takes unit u returns nothing

struct Jump   
    EndJump Code
    unit target
    real vi 
    real vz
    real gravity 
    
static method create takes unit u, real velocity returns Jump
    local Jump d = Jump.allocate()
    set d.target = u
    set d.vz = velocity
    set d.vi = 0.
    set d.Code = 0
    set d.gravity = DEFAULT_GRAVITY
    call UnitAddAbility(u,FLY_ID)
    call UnitRemoveAbility(u,FLY_ID)
    return d
endmethod
    
method onDestroy takes nothing returns nothing
    call GroupRemoveUnit(HitGroup,.target)
    call SetUnitFlyHeight(.target,GetUnitDefaultFlyHeight(.target),0)
endmethod

    implement AutoData
endstruct

private function Periodic takes nothing returns nothing
    local integer i = 0
    local Jump d
    loop
        exitwhen i >= Count
        set d = FlyZ[i]
        set d.vz= d.vz+ 0.5 * d.gravity * TIMEOUT
        set d.vi= d.vi+ d.vz *TIMEOUT
        call SetUnitFlyHeight(d.target,d.vi,0.0)
        if d.vi < 0. or GetWidgetLife(d.target) <= 0.0451 then
            call d.destroy()
            call d.Code.execute(d.target)
            set Count = Count - 1
            if Count > 0 then
                set FlyZ[i] = FlyZ[Count]
                set i = i - 1
            else
                call PauseTimer(Timer)
            endif
        endif
        set i = i + 1
    endloop
endfunction
    
function SetUnitFlight takes unit u, real velocity returns nothing
        local Jump d
        if IsUnitInGroup(u,HitGroup) then
            set d = Jump[u]
            set d.vz = d.vz+velocity
        else
            if Count == 0 then
                call TimerStart(Timer,TIMEOUT,true,function Periodic)
            endif
            set d = Jump.create(u,velocity)
            set Jump[u] = d
            set FlyZ[Count] = d
            set Count = Count + 1
            call GroupAddUnit(HitGroup,u)
        endif
endfunction

function SetUnitGravity takes unit u, real gravity returns nothing
     local Jump d = Jump[u]
     if IsUnitInGroup(u,HitGroup) then
        set d.gravity = gravity
    endif
endfunction

function SetEndCode takes unit u, EndJump f returns nothing
    local Jump d = Jump[u]
    if IsUnitInGroup(u,HitGroup) then
        set d.Code = f
    endif
endfunction

function IsUnitFlying takes unit u returns boolean
    return IsUnitInGroup(u,HitGroup)
endfunction

function StopUnitFlight takes unit u returns boolean
    local Jump d = Jump[u]
    if IsUnitInGroup(u,HitGroup) then
        call SetUnitFlyHeight(u,GetUnitDefaultFlyHeight(u),0)
        call GroupRemoveUnit(HitGroup,u) 
        call d.destroy()
        return true
    endif
    return false
endfunction

endlibrary

And the test map.
 

Attachments

  • JumpSystem.w3x
    102.9 KB · Views: 81
Level 3
Joined
Aug 9, 2008
Messages
60
Would look cooler if it was all a struct that did everything by itself, after you created it with parameters.
 
Status
Not open for further replies.
Top