- Joined
- Sep 14, 2012
- Messages
- 3,413
Sorry was eating could have find it xD
Anyway nice you got it
Anyway nice you got it
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
if ( udg_KB3D_Accel == 0.00 ) then
set Time = udg_KB3D_Range / udg_KB3D_Speed
else
if ( udg_KB3D_Accel > 0 ) then
set Time = ( -2*udg_KB3D_Speed + SquareRoot(4*udg_KB3D_Speed*udg_KB3D_Speed + 4*udg_KB3D_Accel*2*udg_KB3D_Range ) ) / 2*udg_KB3D_Accel
endif
if ( udg_KB3D_Accel < 0 ) then
set R = ( - 1 * udg_KB3D_Speed / udg_KB3D_Accel )
set R1 = 0.5 * udg_KB3D_Accel * R * R
if R1 < udg_KB3D_Range then
set Time = R
else
////////////////Stuck
endif
endif
Me said:i need to find the time taken for the knockback in the condtions:


set udg_KB3D_Loop = CreateTrigger( )
call TriggerRegisterTimerEvent( udg_KB3D_Loop, 0.031250000, true )
call TriggerAddCondition( udg_KB3D_Loop, function KB3D_Loop_Actions )
call DisableTrigger( udg_KB3D_Loop )
/////////////////////////////////////////////////////////////////////////////
// //
// Knock-Back 3D v. 1.0.0.0 [JASS - GUI] //
// by JAD aka DotCa //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// System Informations: //
// //
// The System is a well performing, ultra-purpose knockback (see uses //
// below ) Coded in JASS making it possible for all users to take //
// advantage of it, and GUI friendly to use, see Examples in the triggers //
// above //
// Configurations have default values: //
// //
// - KB3D_DestroyTree == FALSE by defalut //
// - KB3D_DisableUnit == FALSE by defalut //
// - KB3D_UnpathaableStop == TRUE by defalut //
// //
// The System also uses Always positive values for some configurations //
// to not make the knockback go worng, those configurations are: //
// //
// "KB3D_Range" - "KB3D_Speed" - "KB3D_ZOffset" //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// System Requirements: Basic WE - (NONE) //
// //
// The System uses implemented CheckWalkability System by PurgeandFire //
// You "can" remove the initialization trigger of PnF's System since //
// it is directly implemented in the System, all will work fine with or //
// without removing your Initializer trigger //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// Credits: //
// //
// *Chobibo for helping in Script Fixes //
// *Malhorne for helping in main codes and fixes //
// *PurgeandFire for his CheckWalkability System //
// *Nestharus for his GetCollision function //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// How to Import? //
// //
// 1. Check that Create Unkown Variables is ticked in your WE Settings //
// 2. Copy the Paste this Trigger //
// 3. Congratulations, the System is now implemented in your map //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// How to Use? //
// //
// 1. There are 3 Examples of use in the KB3D Example Folder //
// 2. Documentations are there in each of the 3 examples to help you //
// 3. The KB3D System is an Ultra-Purpose System where you can use it for://
// -Projectiles, the system supports homming so a projectile is easy //
// -Jump, the System's smoothness in the fly is useful for a jump spell//
// -And of course, a 2D Knock-Back //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// Bug Reports - Feedbacks //
// //
// * We count on you to report bugs in the system, also telling the source//
// * Feedbacks about the system are much appreciated //
// * We mostly hope suggestions about enhancements for the System //
// //
/////////////////////////////////////////////////////////////////////////////
function KB3D_AlwaysNeg takes real R returns real
if R > 0 then
set R = R * -1
endif
return R
endfunction
function KB3D_AlwaysPos takes real R returns real
if R < 0 then
set R = R * -1
endif
return R
endfunction
function KB3D_InBetween takes real Min, real Max, real R returns real
if R < Min then
set R = Min
endif
if R > Max then
set R = Max
endif
return R
endfunction
function KB3D_RegisterUnitCollision takes unit u, real x, real y, integer i returns real
local real l = 0
local real h = 300
local real m = 150
local real nm
loop
if (IsUnitInRangeXY(u, x+m, y, 0)) then
set l = m
else
set h = m
endif
set nm = (l+h)/2
exitwhen nm+.001 > m and nm-.001 < m
set m = nm
endloop
set m = R2I(m*10)/10.
call SaveReal( udg_KB3D_HA, 16, GetUnitTypeId(u), m )
return m
endfunction
function KB3D_GetUnitCollision takes unit u returns real
local integer i = GetUnitTypeId(u)
if HaveSavedReal( udg_KB3D_HA, 16, i) then
return LoadReal(udg_KB3D_HA, 16, i)
endif
return KB3D_RegisterUnitCollision(u, GetUnitX(u), GetUnitY(u), i)
endfunction
function KB3D_Registration takes nothing returns boolean
local real Time
local real R
local real R1
set udg_KB3D_Speed = KB3D_AlwaysPos(udg_KB3D_Speed)
set udg_KB3D_Range = KB3D_AlwaysPos(udg_KB3D_Range)
set udg_KB3D_Counter = udg_KB3D_Counter + 1
set udg_KB3D_Instances = udg_KB3D_Instances + 1
set udg_KB3D_Zoffset = 2 * KB3D_AlwaysPos(udg_KB3D_Zoffset)
call SaveUnitHandle( udg_KB3D_HA, 0, udg_KB3D_Counter, udg_KB3D_Unit )
call SaveReal( udg_KB3D_HA, 1, udg_KB3D_Counter, udg_KB3D_Range )
call SaveReal( udg_KB3D_HA, 2, udg_KB3D_Counter, udg_KB3D_Speed )
call SaveReal( udg_KB3D_HA, 4, udg_KB3D_Counter, udg_KB3D_Accel )
if ( udg_KB3D_Targeted_Unit == null ) then
call SaveReal( udg_KB3D_HA, 5, udg_KB3D_Counter, udg_KB3D_Angle * 3.14159 / 180 )
else
call SaveUnitHandle( udg_KB3D_HA, 5, udg_KB3D_Counter, udg_KB3D_Targeted_Unit )
endif
call SaveBoolean( udg_KB3D_HA, 6, udg_KB3D_Counter, udg_KB3D_DisableUnit )
call SaveBoolean( udg_KB3D_HA, 7, udg_KB3D_Counter, udg_KB3D_UnpathableStop )
call SaveBoolean( udg_KB3D_HA, 8, udg_KB3D_Counter, udg_KB3D_DestroyTree )
call SaveStr( udg_KB3D_HA, 9, udg_KB3D_Counter, udg_KB3D_Fx )
call SaveStr( udg_KB3D_HA, 10, udg_KB3D_Counter, udg_KB3D_Fx_Attach )
if ( udg_KB3D_Accel == 0.00 ) then
set Time = udg_KB3D_Range / udg_KB3D_Speed
else
if ( udg_KB3D_Accel > 0 ) then
set Time = (( -2*udg_KB3D_Speed + SquareRoot((4*udg_KB3D_Speed) + (8*udg_KB3D_Accel*udg_KB3D_Range) ) ) / (2*udg_KB3D_Accel) )
endif
if ( udg_KB3D_Accel < 0 ) then
set R = ( - 1 * udg_KB3D_Speed / udg_KB3D_Accel )
set R1 = (0.5 * udg_KB3D_Accel * R * R) + (udg_KB3D_Speed * R)
if R1 < udg_KB3D_Range then
set Time = R
else
set Time = KB3D_AlwaysPos(( -2*udg_KB3D_Speed + SquareRoot(KB3D_AlwaysPos((4*udg_KB3D_Speed*udg_KB3D_Speed) + (8*udg_KB3D_Accel*udg_KB3D_Range) )) ) / (2*udg_KB3D_Accel) )
endif
endif
endif
call SaveReal( udg_KB3D_HA, 11, udg_KB3D_Counter, Time )
call SaveBoolean( udg_KB3D_HA, 15, udg_KB3D_Counter, true )
if UnitAddAbility(udg_KB3D_Unit, 'Amrf') then
call UnitRemoveAbility(udg_KB3D_Unit, 'Amrf')
endif
if ( udg_KB3D_Counter == 1 ) then
call EnableTrigger(udg_KB3D_Loop)
endif
call SaveReal( udg_KB3D_HA, 3, udg_KB3D_Counter, udg_KB3D_Zoffset )
call SaveReal( udg_KB3D_HA, 12, udg_KB3D_Counter, udg_KB3D_Zoffset / ( Time / 2) )
call SaveReal( udg_KB3D_HA, 13, udg_KB3D_Counter, KB3D_AlwaysNeg(( -1 * udg_KB3D_Zoffset / ( Time / 2) ) / ( Time / 2)) )
//Nulling
set udg_KB3D_Accel = 0.00
set udg_KB3D_Angle = 0.00
set udg_KB3D_DestroyTree = false
set udg_KB3D_DisableUnit = false
set udg_KB3D_Range = 0.00
set udg_KB3D_Speed = 0.00
set udg_KB3D_Targeted_Unit = null
set udg_KB3D_Unit = null
set udg_KB3D_UnpathableStop = true
set udg_KB3D_Zoffset = 0.00
return false
endfunction
function KB3D_Tree_Check takes destructable D returns boolean
local boolean B = false
call IssueTargetOrder( udg_KB3D_Harvester, "harvest", D )
if ( GetUnitCurrentOrder(udg_KB3D_Harvester) == OrderId("harvest") ) then
set B = true
endif
call IssueImmediateOrder(udg_KB3D_Harvester, "stop")
return B
endfunction
function KB3D_KillifTree takes destructable D returns nothing
if ( KB3D_Tree_Check(D) ) then
call KillDestructable(D)
endif
endfunction
function KB3D_KillEnumDest takes nothing returns nothing
call KB3D_KillifTree(GetEnumDestructable())
endfunction
function KB3D_CircleTreeKill takes real radius, real x, real y returns nothing
local rect r
set r = Rect(x-radius, y-radius, x+radius, y+radius)
call EnumDestructablesInRect(r, null, function KB3D_KillEnumDest)
call RemoveRect(r)
set r = null
endfunction
function KB3D_CW_Loop takes nothing returns nothing
if IsItemVisible(GetEnumItem()) then
set udg_CP_HiddenItems[udg_CP_HiddenItemsIndex] = GetEnumItem()
call SetItemVisible(udg_CP_HiddenItems[udg_CP_HiddenItemsIndex], false)
set udg_CP_HiddenItemsIndex = ( udg_CP_HiddenItemsIndex + 1 )
endif
endfunction
function KB3D_CW takes real x, real y returns boolean
local real x2 = 0
local real y2 = 0
call MoveRectTo(udg_CP_Rect, x, y)
call EnumItemsInRect(udg_CP_Rect, null, function KB3D_CW_Loop )
call SetItemPosition(udg_CP_Item, x, y)
set x2 = GetItemX(udg_CP_Item)
set y2 = GetItemY(udg_CP_Item)
call SetItemVisible(udg_CP_Item, false)
loop
exitwhen udg_CP_HiddenItemsIndex <= 0
set udg_CP_HiddenItemsIndex = udg_CP_HiddenItemsIndex - 1
call SetItemVisible(udg_CP_HiddenItems[udg_CP_HiddenItemsIndex], true)
set udg_CP_HiddenItems[udg_CP_HiddenItemsIndex] = null
endloop
set udg_CP_PointIsWalkable = ((x2-x)*(x2-x) + (y2-y)*(y2-y) <= 100) and (not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY))
return udg_CP_PointIsWalkable
endfunction
function KB3D_Deindex takes integer index returns nothing
call SaveUnitHandle( udg_KB3D_HA, 0, index, LoadUnitHandle(udg_KB3D_HA, 0, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 1, index, LoadReal(udg_KB3D_HA, 1, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 2, index, LoadReal(udg_KB3D_HA, 2, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 3, index, LoadReal(udg_KB3D_HA, 3, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 4, index, LoadReal(udg_KB3D_HA, 4, udg_KB3D_Counter) )
if ( LoadUnitHandle(udg_KB3D_HA, 5, udg_KB3D_Counter) == null ) then
call SaveReal( udg_KB3D_HA, 5, index, LoadReal(udg_KB3D_HA, 5, udg_KB3D_Counter) )
else
call SaveUnitHandle( udg_KB3D_HA, 5, index, LoadUnitHandle(udg_KB3D_HA, 5, udg_KB3D_Counter) )
endif
call SaveBoolean( udg_KB3D_HA, 6, index, LoadBoolean(udg_KB3D_HA, 6, udg_KB3D_Counter) )
call SaveBoolean( udg_KB3D_HA, 7, index, LoadBoolean(udg_KB3D_HA, 7, udg_KB3D_Counter) )
call SaveBoolean( udg_KB3D_HA, 8, index, LoadBoolean(udg_KB3D_HA, 8, udg_KB3D_Counter) )
call SaveStr( udg_KB3D_HA, 9, index, LoadStr(udg_KB3D_HA, 9, udg_KB3D_Counter) )
call SaveStr( udg_KB3D_HA, 10, index, LoadStr(udg_KB3D_HA, 10, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 11, index, LoadReal(udg_KB3D_HA, 11, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 12, index, LoadReal(udg_KB3D_HA, 12, udg_KB3D_Counter) )
call SaveReal( udg_KB3D_HA, 13, index, LoadReal(udg_KB3D_HA, 13, udg_KB3D_Counter) )
call SaveBoolean( udg_KB3D_HA, 15, index, true)
set udg_KB3D_Counter = udg_KB3D_Counter - 1
endfunction
function KB3D_Group_Loop takes integer Loop returns nothing
local unit U = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
local real X = GetUnitX(U)
local real Y = GetUnitY(U)
local real Z = GetUnitFlyHeight(U)
local real x
local real y
local real z
local real Range = LoadReal(udg_KB3D_HA, 1, Loop)
local real Speed = LoadReal(udg_KB3D_HA, 2, Loop)
local real Zoffset = LoadReal(udg_KB3D_HA, 3, Loop)
local real Accel = LoadReal(udg_KB3D_HA, 4, Loop)
local real Angle
local real ZSpeed = LoadReal(udg_KB3D_HA, 12, Loop)
local real ZAccel = LoadReal(udg_KB3D_HA, 13, Loop)
local real ZTot = LoadReal(udg_KB3D_HA, 14, Loop)
local unit Target = LoadUnitHandle(udg_KB3D_HA, 5, Loop)
local boolean DisableUnit = LoadBoolean(udg_KB3D_HA, 6, Loop)
local boolean UnpathableStop = LoadBoolean(udg_KB3D_HA, 7, Loop)
local boolean DestroyTree = LoadBoolean(udg_KB3D_HA, 8, Loop)
local string Fx = LoadStr(udg_KB3D_HA, 9, Loop)
local string Attach = LoadStr(udg_KB3D_HA, 10, Loop)
if ( Target == null ) then
set Angle = LoadReal(udg_KB3D_HA, 5, Loop)
else
set Angle = Atan2(GetUnitY(Target) - Y, GetUnitX(Target) - X)
endif
set Speed = Speed + ( 0.031250000 * Accel )
set Range = Range - ( Speed * 0.031250000 )
set ZSpeed = ZSpeed + ( 0.031250000 * ZAccel )
set x = X + ( Speed * 0.031250000 * Cos(Angle) )
set y = Y + ( Speed * 0.031250000 * Sin(Angle) )
set z = Z + ( ZSpeed * 0.031250000 )
set ZTot = ZTot + ( ZSpeed * 0.031250000 )
if (DestroyTree) then
call KB3D_CircleTreeKill( 5 * KB3D_GetUnitCollision(U), x, y )
endif
if ( z < 1250 ) then
call SetUnitFlyHeight(U, KB3D_InBetween(GetUnitDefaultFlyHeight(U), 99999, z), 9999)
endif
if ( z > 0 ) then
call DestroyEffect(AddSpecialEffectTarget(Fx, U, Attach))
else
call DestroyEffect(AddSpecialEffect(Fx, x, y))
endif
if ( not(UnpathableStop) or ( KB3D_CW(x, y) ) ) then
if ( DisableUnit ) then
else
call SetUnitX(U, x)
call SetUnitY(U, y)
endif
endif
////// Stop All
if ( (Speed <= 0) or ( Range <= 0 ) or ( GetWidgetLife(U) <= 0 ) ) then
call SaveBoolean(udg_KB3D_HA, 17, Loop, false)
call KB3D_Deindex(Loop)
set udg_KB3D_Instances = udg_KB3D_Instances - 1
call SaveReal(udg_KB3D_HA, 0, -1 * GetHandleId(U), LoadReal(udg_KB3D_HA, 0, -1 * GetHandleId(U))-1)
if ( GetWidgetLife(U) <= 0 ) then
call SetUnitFlyHeight(U, GetUnitDefaultFlyHeight(U), (GetUnitFlyHeight(U) - GetUnitDefaultFlyHeight(U)) / 0.25 )
endif
endif
if
////// Save Changes
call SaveReal(udg_KB3D_HA, 1, Loop, Range)
call SaveReal(udg_KB3D_HA, 2, Loop, Speed)
call SaveReal(udg_KB3D_HA, 12, Loop, ZSpeed)
call SaveReal(udg_KB3D_HA, 14, Loop, ZTot)
////// Clear All
set U = null
set Target = null
endfunction
function KB3D_Loop_Actions takes nothing returns boolean
local integer x = 0
loop
exitwhen x >= udg_KB3D_Counter
set x = x + 1
if ( LoadBoolean(udg_KB3D_HA, 15, x) ) then
call KB3D_Group_Loop(x)
endif
endloop
if ( udg_KB3D_Instances == 0 ) then
set udg_KB3D_Counter = 0
call DisableTrigger(GetTriggeringTrigger())
endif
return false
endfunction
//===========================================================================
function InitTrig_KB3D takes nothing returns nothing
////////LOOP
set udg_KB3D_Loop = CreateTrigger( )
call TriggerRegisterTimerEvent( udg_KB3D_Loop, 0.031250000, true )
call TriggerAddCondition( udg_KB3D_Loop, function KB3D_Loop_Actions )
call DisableTrigger( udg_KB3D_Loop )
////////REGISTRATION
set udg_KB3D_Registration = CreateTrigger( )
call TriggerAddCondition( udg_KB3D_Registration, function KB3D_Registration )
set udg_KB3D_Harvester = CreateUnit(Player(15), 'hpea', 0, 0, 0)
call ShowUnit(udg_KB3D_Harvester, false)
call UnitAddAbility(udg_KB3D_Harvester, 'Aloc')
set udg_KB3D_HA = InitHashtable()
////////Check Walkability System by PnF
set udg_CP_Rect = Rect(0, 0, 128.00, 128.00)
set udg_CP_Item = CreateItem('wtlg', 0, 0)
call SetItemVisible( udg_CP_Item, false )
endfunction
if ( not(UnpathableStop) or ( KB3D_CW(x, y) ) ) then
if ( DisableUnit ) then
else
call SetUnitX(U, x)
call SetUnitY(U, y)
endif
endif
if ( not(UnpathableStop) or ( KB3D_CW(x, y) ) ) then
call SetUnitX(U, x)
call SetUnitY(U, y)
if ( DisableUnit ) then
endif
endif
SetUnitPropWindow(u, 0)
GetUnitPropWindow(u)
/////////////////////////////////////////////////////////////////////////////
// //
// Knock-Back 3D v. 1.0.0.0 [JASS - GUI] //
// by JAD aka DotCa //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// System Informations: //
// //
// The System is a well performing, ultra-purpose knockback (see uses //
// below ) Coded in JASS making it possible for all users to take //
// advantage of it, and GUI friendly to use, see Examples in the triggers //
// above //
// Configurations have default values: //
// //
// - KB3D_DestroyTree == FALSE by defalut //
// - KB3D_DisableUnit == FALSE by defalut //
// - KB3D_UnpathaableStop == TRUE by defalut //
// //
// The System also uses Always positive values for some configurations //
// to not make the knockback go worng, those configurations are: //
// //
// "KB3D_Range" - "KB3D_Speed" - "KB3D_ZOffset" //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// System Requirements: Basic WE - (NONE) //
// //
// The System uses implemented CheckWalkability System by PurgeandFire //
// You "can" remove the initialization trigger of PnF's System since //
// it is directly implemented in the System, all will work fine with or //
// without removing your Initializer trigger //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// Credits: //
// //
// *Chobibo for helping in Script Fixes //
// *Malhorne for helping in main codes and fixes //
// *PurgeandFire for his CheckWalkability System //
// *Nestharus for his GetCollision function //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// How to Import? //
// //
// 1. Check that Create Unkown Variables is ticked in your WE Settings //
// 2. Copy the Paste this Trigger //
// 3. Congratulations, the System is now implemented in your map //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// How to Use? //
// //
// 1. There are 3 Examples of use in the KB3D Example Folder //
// 2. Documentations are there in each of the 3 examples to help you //
// 3. The KB3D System is an Ultra-Purpose System where you can use it for://
// -Projectiles, the system supports homming so a projectile is easy //
// -Jump, the System's smoothness in the fly is useful for a jump spell//
// -And of course, a 2D Knock-Back //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// Bug Reports - Feedbacks //
// //
// * We count on you to report bugs in the system, also telling the source//
// * Feedbacks about the system are much appreciated //
// * We mostly hope suggestions about enhancements for the System //
// //
/////////////////////////////////////////////////////////////////////////////
function KB3D_AlwaysNeg takes real R returns real
if R > 0 then
set R = R * -1
endif
return R
endfunction
function KB3D_AlwaysPos takes real R returns real
if R < 0 then
set R = R * -1
endif
return R
endfunction
function KB3D_RegisterUnitCollision takes unit u, real x, real y, integer i returns real
local real l = 0
local real h = 300
local real m = 150
local real nm
loop
if (IsUnitInRangeXY(u, x+m, y, 0)) then
set l = m
else
set h = m
endif
set nm = (l+h)/2
exitwhen nm+.001 > m and nm-.001 < m
set m = nm
endloop
set m = R2I(m*10)/10.
call SaveReal( udg_KB3D_HA, 16, GetUnitTypeId(u), m )
return m
endfunction
function KB3D_GetUnitCollision takes unit u returns real
local integer i = GetUnitTypeId(u)
if HaveSavedReal( udg_KB3D_HA, 16, i) then
return LoadReal(udg_KB3D_HA, 16, i)
endif
return KB3D_RegisterUnitCollision(u, GetUnitX(u), GetUnitY(u), i)
endfunction
function KB3D_Registration takes nothing returns boolean
local real Time
local real R
local real R1
set udg_KB3D_Range = KB3D_AlwaysPos(udg_KB3D_Range)
set udg_KB3D_Speed = KB3D_AlwaysPos(udg_KB3D_Speed)
set udg_KB3D_Counter = udg_KB3D_Counter + 1
set udg_KB3D_Instances = udg_KB3D_Instances + 1
set udg_KB3D_Zoffset = 2 * KB3D_AlwaysPos(udg_KB3D_Zoffset)
call SaveUnitHandle( udg_KB3D_HA, 0, udg_KB3D_Counter, udg_KB3D_Unit )
call SaveReal( udg_KB3D_HA, 1, udg_KB3D_Counter, udg_KB3D_Range )
call SaveReal( udg_KB3D_HA, 2, udg_KB3D_Counter, udg_KB3D_Speed )
call SaveReal( udg_KB3D_HA, 4, udg_KB3D_Counter, udg_KB3D_Accel )
if ( udg_KB3D_Targeted_Unit == null ) then
call SaveReal( udg_KB3D_HA, 5, udg_KB3D_Counter, udg_KB3D_Angle * 3.14159 / 180 )
else
call SaveUnitHandle( udg_KB3D_HA, 5, udg_KB3D_Counter, udg_KB3D_Targeted_Unit )
endif
call SaveBoolean( udg_KB3D_HA, 6, udg_KB3D_Counter, udg_KB3D_DisableUnit )
call SaveBoolean( udg_KB3D_HA, 7, udg_KB3D_Counter, udg_KB3D_UnpathableStop )
call SaveBoolean( udg_KB3D_HA, 8, udg_KB3D_Counter, udg_KB3D_DestroyTree )
call SaveStr( udg_KB3D_HA, 9, udg_KB3D_Counter, udg_KB3D_Fx )
call SaveStr( udg_KB3D_HA, 10, udg_KB3D_Counter, udg_KB3D_Fx_Attach )
if ( udg_KB3D_Accel == 0.00 ) then
set Time = udg_KB3D_Range / udg_KB3D_Speed
else
if ( udg_KB3D_Accel > 0 ) then
set Time = (( -2*udg_KB3D_Speed + SquareRoot((4*udg_KB3D_Speed) + (8*udg_KB3D_Accel*udg_KB3D_Range) ) ) / (2*udg_KB3D_Accel) )
endif
if ( udg_KB3D_Accel < 0 ) then
set R = ( - 1 * udg_KB3D_Speed / udg_KB3D_Accel )
set R1 = (0.5 * udg_KB3D_Accel * R * R) + (udg_KB3D_Speed * R)
if R1 < udg_KB3D_Range then
set Time = R
else
set Time = KB3D_AlwaysPos(( -2*udg_KB3D_Speed + SquareRoot(KB3D_AlwaysPos((4*udg_KB3D_Speed*udg_KB3D_Speed) + (8*udg_KB3D_Accel*udg_KB3D_Range) )) ) / (2*udg_KB3D_Accel) )
endif
endif
endif
call SaveReal( udg_KB3D_HA, 11, udg_KB3D_Counter, Time )
call SaveBoolean( udg_KB3D_HA, 15, udg_KB3D_Counter, true )
if UnitAddAbility(udg_KB3D_Unit, 'Amrf') then
call UnitRemoveAbility(udg_KB3D_Unit, 'Amrf')
endif
if ( udg_KB3D_Counter == 1 ) then
call EnableTrigger(udg_KB3D_Loop)
endif
call SaveReal( udg_KB3D_HA, 3, udg_KB3D_Counter, udg_KB3D_Zoffset )
call SaveReal( udg_KB3D_HA, 12, udg_KB3D_Counter, udg_KB3D_Zoffset / ( Time / 2) )
call SaveReal( udg_KB3D_HA, 13, udg_KB3D_Counter, KB3D_AlwaysNeg(( -1 * udg_KB3D_Zoffset / ( Time / 2) ) / ( Time / 2)) )
//Nulling
set udg_KB3D_Accel = 0.00
set udg_KB3D_Angle = 0.00
set udg_KB3D_DestroyTree = false
set udg_KB3D_DisableUnit = false
set udg_KB3D_Fx = ""
set udg_KB3D_Range = 0.00
set udg_KB3D_Speed = 0.00
set udg_KB3D_Targeted_Unit = null
set udg_KB3D_Unit = null
set udg_KB3D_UnpathableStop = true
set udg_KB3D_Zoffset = 0.00
return false
endfunction
function KB3D_Tree_Check takes destructable D returns boolean
local boolean B = false
call IssueTargetOrder( udg_KB3D_Harvester, "harvest", D )
if ( GetUnitCurrentOrder(udg_KB3D_Harvester) == OrderId("harvest") ) then
set B = true
endif
call IssueImmediateOrder(udg_KB3D_Harvester, "stop")
return B
endfunction
function KB3D_KillifTree takes destructable D returns nothing
if ( KB3D_Tree_Check(D) ) then
call KillDestructable(D)
endif
endfunction
function KB3D_KillEnumDest takes nothing returns nothing
call KB3D_KillifTree(GetEnumDestructable())
endfunction
function KB3D_CircleTreeKill takes real radius, real x, real y returns nothing
local rect r
set r = Rect(x-radius, y-radius, x+radius, y+radius)
call EnumDestructablesInRect(r, null, function KB3D_KillEnumDest)
call RemoveRect(r)
set r = null
endfunction
function KB3D_CW_Loop takes nothing returns nothing
if IsItemVisible(GetEnumItem()) then
set udg_CP_HiddenItems[udg_CP_HiddenItemsIndex] = GetEnumItem()
call SetItemVisible(udg_CP_HiddenItems[udg_CP_HiddenItemsIndex], false)
set udg_CP_HiddenItemsIndex = ( udg_CP_HiddenItemsIndex + 1 )
endif
endfunction
function KB3D_CW takes real x, real y returns boolean
local real x2 = 0
local real y2 = 0
call MoveRectTo(udg_CP_Rect, x, y)
call EnumItemsInRect(udg_CP_Rect, null, function KB3D_CW_Loop )
call SetItemPosition(udg_CP_Item, x, y)
set x2 = GetItemX(udg_CP_Item)
set y2 = GetItemY(udg_CP_Item)
call SetItemVisible(udg_CP_Item, false)
loop
exitwhen udg_CP_HiddenItemsIndex <= 0
set udg_CP_HiddenItemsIndex = udg_CP_HiddenItemsIndex - 1
call SetItemVisible(udg_CP_HiddenItems[udg_CP_HiddenItemsIndex], true)
set udg_CP_HiddenItems[udg_CP_HiddenItemsIndex] = null
endloop
set udg_CP_PointIsWalkable = ((x2-x)*(x2-x) + (y2-y)*(y2-y) <= 100) and (not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY))
return udg_CP_PointIsWalkable
endfunction
function KB3D_Group_Loop takes integer Loop returns nothing
local unit U = LoadUnitHandle(udg_KB3D_HA, 0, Loop)
local real X = GetUnitX(U)
local real Y = GetUnitY(U)
local real Z = GetUnitFlyHeight(U)
local real x
local real y
local real z
local real Range = LoadReal(udg_KB3D_HA, 1, Loop)
local real Speed = LoadReal(udg_KB3D_HA, 2, Loop)
local real Zoffset = LoadReal(udg_KB3D_HA, 3, Loop)
local real Accel = LoadReal(udg_KB3D_HA, 4, Loop)
local real Angle
local real ZSpeed = LoadReal(udg_KB3D_HA, 12, Loop)
local real ZAccel = LoadReal(udg_KB3D_HA, 13, Loop)
local real ZTot = LoadReal(udg_KB3D_HA, 14, Loop)
local unit Target = LoadUnitHandle(udg_KB3D_HA, 5, Loop)
local boolean DisableUnit = LoadBoolean(udg_KB3D_HA, 6, Loop)
local boolean UnpathableStop = LoadBoolean(udg_KB3D_HA, 7, Loop)
local boolean DestroyTree = LoadBoolean(udg_KB3D_HA, 8, Loop)
local string Fx = LoadStr(udg_KB3D_HA, 9, Loop)
local string Attach = LoadStr(udg_KB3D_HA, 10, Loop)
if ( Target == null ) then
set Angle = LoadReal(udg_KB3D_HA, 5, Loop)
else
set Angle = Atan2(GetUnitY(Target) - Y, GetUnitX(Target) - X)
endif
set Speed = Speed + ( 0.031250000 * Accel )
set Range = Range - ( Speed * 0.031250000 )
set ZSpeed = ZSpeed + ( 0.031250000 * ZAccel )
set x = X + ( Speed * 0.031250000 * Cos(Angle) )
set y = Y + ( Speed * 0.031250000 * Sin(Angle) )
set z = Z + ( ZSpeed * 0.031250000 )
set ZTot = ZTot + ( ZSpeed * 0.031250000 )
if (DestroyTree) then
call KB3D_CircleTreeKill( 4 * KB3D_GetUnitCollision(U), x, y )
endif
call SetUnitFlyHeight(U, z, 9999)
if ( z > 0 ) then
call DestroyEffect(AddSpecialEffectTarget(Fx, U, Attach))
else
call DestroyEffect(AddSpecialEffect(Fx, x, y))
endif
if ( not(UnpathableStop) or ( KB3D_CW(x, y) ) ) then
call SetUnitX(U, x)
call SetUnitY(U, y)
endif
if ( DisableUnit ) then
call SetUnitPropWindow(U, 0)
call SetUnitTurnSpeed(U, 0)
endif
////// Stop All
if ( (Speed <= 0) or ( Range <= 0 ) or ( GetWidgetLife(U) <= 0 ) ) then
call SaveBoolean(udg_KB3D_HA, 15, Loop, false)
set udg_KB3D_Instances = udg_KB3D_Instances - 1
call SaveReal(udg_KB3D_HA, 0, -1 * GetHandleId(U), LoadReal(udg_KB3D_HA, 0, -1 * GetHandleId(U))-1)
if ( GetWidgetLife(U) <= 0 ) then
call SetUnitFlyHeight(U, GetUnitDefaultFlyHeight(U), 750 )
endif
if DisableUnit then
call SetUnitPropWindow(U, GetUnitDefaultPropWindow(U))
call SetUnitTurnSpeed(U, GetUnitDefaultTurnSpeed(U))
endif
else
call SaveReal(udg_KB3D_HA, 1, Loop, Range)
call SaveReal(udg_KB3D_HA, 2, Loop, Speed)
call SaveReal(udg_KB3D_HA, 12, Loop, ZSpeed)
call SaveReal(udg_KB3D_HA, 14, Loop, ZTot)
endif
////// Save Changes
call SaveReal(udg_KB3D_HA, 1, Loop, Range)
call SaveReal(udg_KB3D_HA, 2, Loop, Speed)
call SaveReal(udg_KB3D_HA, 12, Loop, ZSpeed)
call SaveReal(udg_KB3D_HA, 14, Loop, ZTot)
////// Clear
set U = null
set Target = null
endfunction
function KB3D_Loop_Actions takes nothing returns boolean
local integer x = 0
loop
exitwhen x >= udg_KB3D_Counter
set x = x + 1
if ( LoadBoolean(udg_KB3D_HA, 15, x) ) then
call KB3D_Group_Loop(x)
endif
endloop
if ( udg_KB3D_Instances == 0 ) then
set udg_KB3D_Counter = 0
call DisableTrigger(GetTriggeringTrigger())
endif
return false
endfunction
//===========================================================================
function InitTrig_KB3D takes nothing returns nothing
////////LOOP
set udg_KB3D_Loop = CreateTrigger( )
call TriggerRegisterTimerEvent( udg_KB3D_Loop, 0.031250000, true )
call TriggerAddCondition( udg_KB3D_Loop, function KB3D_Loop_Actions )
call DisableTrigger( udg_KB3D_Loop )
////////REGISTRATION
set udg_KB3D_Registration = CreateTrigger( )
call TriggerAddCondition( udg_KB3D_Registration, function KB3D_Registration )
set udg_KB3D_Harvester = CreateUnit(Player(15), 'hpea', 0, 0, 0)
call ShowUnit(udg_KB3D_Harvester, false)
call UnitAddAbility(udg_KB3D_Harvester, 'Aloc')
set udg_KB3D_HA = InitHashtable()
////////Check Walkability System by PnF
set udg_CP_Rect = Rect(0, 0, 128.00, 128.00)
set udg_CP_Item = CreateItem('wtlg', 0, 0)
call SetItemVisible( udg_CP_Item, false )
endfunction
/////////////////////////////////////////////////////////////////////////////
// //
// Credits: //
// //
// *Chobibo for helping in Script Fixes //
// *Malhorne for helping in main codes and fixes //
// *PurgeandFire for his CheckWalkability System //
// *Nestharus for his GetCollision function //
// *Rheiko for Beta Stage Testings //
// //
/////////////////////////////////////////////////////////////////////////////
//*Malhorne for helping in main codes and fixes
//*Malhorne for helping in main coder, subcodes, and everything !
