function Trig_UnitTrail takes nothing returns boolean
local unit u = null
local unit TrainedUnit = null
local unit Building = null
local integer id = 0
local real x = 0.00
local real y = 0.00
local real z = 0.00
if FirstOfGroup(FF_UnitTrail_Group) != null then
loop
set u = FirstOfGroup(FF_UnitTrail_Group)
exitwhen u == null
set id = GetUnitUserData(u)
call GroupRemoveUnit(FF_UnitTrail_Group, u)
if UnitAlive(u) then
if FF_UnitTrail_Progress[id] < FF_UnitTrail_Distance[id] then
call GroupAddUnit(FF_UnitTrail_GroupTemp, u)
if not FF_UnitTrail_IsTrainingFinished[id] then
//Steadily move the dummy towards the destination
set FF_UnitTrail_Progress[id] = FF_UnitTrail_Progress[id] + FF_UnitTrail_Speed[id]
else
//dummy has reached destination. Begin acceleration and ascent.
set FF_UnitTrail_Progress[id] = FF_UnitTrail_Acceleration[id] * (FF_UnitTrail_Time[id] * FF_UnitTrail_Time[id])
set FF_UnitTrail_Height[id] = FF_UnitTrail_AccelerationZ[id] * (FF_UnitTrail_Progress[id] * FF_UnitTrail_Progress[id])
set FF_UnitTrail_Time[id] = FF_UnitTrail_Time[id] + 1
call SetUnitFlyHeight(u, FF_UnitTrail_Height[id], 0.00)
endif
set x = FF_UnitTrail_X[id] + Cos(FF_UnitTrail_Angle[id]) * FF_UnitTrail_Progress[id]
set y = FF_UnitTrail_Y[id] + Sin(FF_UnitTrail_Angle[id]) * FF_UnitTrail_Progress[id]
call SetUnitX(u, x)
call SetUnitY(u, y)
call SetUnitFacing(u, (FF_UnitTrail_Angle[id] * bj_RADTODEG) + 180.00)
if not UnitAlive(FF_UnitTrail_Source[id]) then
call UnitApplyTimedLife(u, 'BTLF', 0.01)
endif
else
//dummy has reached destination. Set training to true and begin ascent and acceleration.
if not FF_UnitTrail_IsTrainingFinished[id] then
call GroupAddUnit(FF_UnitTrail_GroupTemp, u)
//call SetUnitColor(u, GetPlayerColor(GetOwningPlayer(u)))
set FF_UnitTrail_IsTrainingFinished[id] = true
set FF_UnitTrail_Progress[id] = 0.00
set FF_UnitTrail_Distance[id] = FF_UnitTrail_FinalDistance[id] - GetRandomReal(10, 100)
//set FF_UnitTrail_Speed[id] = FF_UnitTrail_Speed[id] + FF_TRAIN_SPEED_BUMP
//set FF_UnitTrail_Height[id] = FF_UnitTrail_Height[id] + FF_UnitTrail_Speed[id]
//set FF_UnitTrail_Acceleration[id] = FF_UnitTrail_Distance[id] / (FF_CURVE_TIME * FF_CURVE_TIME)
set FF_UnitTrail_Acceleration[id] = (FF_UnitTrail_Distance[id] - FF_UnitTrail_Speed[id] * FF_CURVE_TIME) / (FF_CURVE_TIME * FF_CURVE_TIME)
set FF_UnitTrail_AccelerationZ[id] = (GetRandomReal(600, 1000) - GetUnitFlyHeight(u) * FF_UnitTrail_Distance[id]) / (FF_UnitTrail_Distance[id] * FF_UnitTrail_Distance[id])
set FF_UnitTrail_Time[id] = 1
set FF_UnitTrail_X[id] = GetUnitX(u)
set FF_UnitTrail_Y[id] = GetUnitY(u)
//dummy has died (either was killed or training canceled)
else
call AddSpecialEffect(FF_TRAIN_EFFECT, GetUnitX(u), GetUnitY(u))
call DestroyEffect(bj_lastCreatedEffect)
set TrainedUnit = ReplaceUnitBJ(u, FF_UnitTrail_UnitType[id], bj_UNIT_STATE_METHOD_RELATIVE)
set Building = FF_UnitTrail_Source[id]
//call SetUnitFacing(TrainedUnit, (FF_UnitTrail_Angle[id] * bj_RADTODEG) + 180.00)
call IssuePointOrder(TrainedUnit, "move", GetLocationX(GetUnitRallyPoint(Building)), GetLocationY(GetUnitRallyPoint(Building)))
set FF_UnitTrail_IsTrainingFinished[id] = false
set FF_UnitTrail_UnitType[id] = 0
set FF_UnitTrail_Progress[id] = 0.00
set FF_UnitTrail_Distance[id] = 0.00
set FF_UnitTrail_FinalDistance[id] = 0.00
set FF_UnitTrail_Acceleration[id] = 0.00
set FF_UnitTrail_AccelerationZ[id] = 0.00
set FF_UnitTrail_Height[id] = 0.00
set FF_UnitTrail_Source[id] = null
set FF_UnitTrail_Speed[id] = 0.00
set FF_UnitTrail_Angle[id] = 0.00
set FF_UnitTrail_X[id] = 0.00
set FF_UnitTrail_Y[id] = 0.00
set TrainedUnit = null
set Building = null
endif
endif
else //if the dummy is dead, refund part of the cost
endif
endloop
loop
set u = FirstOfGroup(FF_UnitTrail_GroupTemp)
exitwhen u == null
call GroupRemoveUnit(FF_UnitTrail_GroupTemp, u)
call GroupAddUnit(FF_UnitTrail_Group, u)
endloop
else
call DisableTrigger(gg_trg_Unit_Trail)
endif
return false
endfunction
//===========================================================================
function InitTrig_Unit_Trail takes nothing returns nothing
set gg_trg_Unit_Trail = CreateTrigger()
call DisableTrigger(gg_trg_Unit_Trail)
call TriggerRegisterTimerEvent( gg_trg_Unit_Trail, 0.03125, true )
call TriggerAddCondition( gg_trg_Unit_Trail, function Trig_UnitTrail )
endfunction