/////////////////////////////////////////////////////////////////////////////
// //
// Knock-Back 3D v. 1.0.0.0 [JASS - GUI] //
// by JAD aka DotCa //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// System Requirements: (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 Script Fixes //
// *PurgeandFire for his CheckWalkability System //
// //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// 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 //
// //
/////////////////////////////////////////////////////////////////////////////
function KB3D_Registration_Actions takes nothing returns boolean
local real R
set udg_KB3D_Counter = udg_KB3D_Counter + 1
set udg_KB3D_Instances = udg_KB3D_Instances + 1
set udg_KB3D_Zoffset = 2 * 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, 3, udg_KB3D_Counter, udg_KB3D_Zoffset )
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 R = udg_KB3D_Range / udg_KB3D_Speed
else
set R = ( 4 * udg_KB3D_Accel * udg_KB3D_Range + ( udg_KB3D_Speed * udg_KB3D_Speed ) )
endif
call SaveReal( udg_KB3D_HA, 11, udg_KB3D_Counter, R )
call SaveReal( udg_KB3D_HA, 12, udg_KB3D_Counter, udg_KB3D_Zoffset / (-1 * udg_KB3D_Speed / udg_KB3D_Accel / 2) )
call SaveReal( udg_KB3D_HA, 13, udg_KB3D_Counter, ( -1 * udg_KB3D_Zoffset / (-1 * udg_KB3D_Speed / udg_KB3D_Accel / 2) ) / (-1 * udg_KB3D_Speed / udg_KB3D_Accel / 2) )
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
//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_Fx_Attach = ""
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 = false
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_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.03125 * Accel )
set Range = Range - ( Speed * 0.03125 )
set ZSpeed = ZSpeed + ( 0.03125 * ZAccel )
set x = X + ( Speed * 0.03125 * Cos(Angle) )
set y = Y + ( Speed * 0.03125 * Sin(Angle) )
set z = Z + ( ZSpeed * 0.03125 )
set ZTot = ZTot + ( ZSpeed * 0.03125 )
if z >= Zoffset then
call SaveReal(udg_KB3D_HA, 13, Loop, -1 * ZAccel)
endif
if ( z < 1250 ) then
call SetUnitFlyHeight(U, 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, 15, Loop, false)
set udg_KB3D_Instances = udg_KB3D_Instances - 1
if ( GetWidgetLife(U) <= 0 ) then
call SetUnitFlyHeight(U, GetUnitDefaultFlyHeight(U), (GetUnitFlyHeight(U) - GetUnitDefaultFlyHeight(U)) / 0.25 )
endif
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 All
set Fx = ""
set Attach = ""
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.03125, 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_Actions )
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