- 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
And the test map.
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.