| 06-19-2009, 04:34 AM | #1 |
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. 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 here |
