Name | Type | is_array | initial_value |
friction | real | No | 0.10 |
gravity | real | No | 2.00 |
htable | hashtable | No | |
link_len | real | No | 400.00 |
link_num | integer | No | 4 |
link_res | real | No | 0.10 |
link_sublen | real | No | 60.00 |
linked_human_height | real | No | 80.00 |
linked_tower_height | real | No | 200.00 |
function ChainLoop_Actions takes nothing returns nothing
local unit human
local unit tower
local integer a
local real array cX
local real array cY
local real array cZ
local hashtable t
local real sX
local real sY
local real sZ
local real fX
local real fY
local real fZ
local real rX
local real rY
local real rZ
local real l
local real minZ
local location loc
set t=udg_htable
set human = LoadUnitHandleBJ(0, StringHashBJ("units"), t)
set tower = LoadUnitHandleBJ(1, StringHashBJ("units"), t)
set loc = GetUnitLoc(tower)
set cX[0] = GetUnitX(tower)
set cY[0] = GetUnitY(tower)
set cZ[0] = GetLocationZ(loc) + udg_linked_tower_height
call RemoveLocation(loc)
set loc = GetUnitLoc(human)
set cX[udg_link_num] = GetUnitX(human)
set cY[udg_link_num] = GetUnitY(human)
set cZ[udg_link_num] = GetLocationZ(loc) + udg_linked_human_height
call RemoveLocation(loc)
set rX = cX[udg_link_num] - cX[0]
set rY = cY[udg_link_num] - cY[0]
set l = SquareRoot(rX*rX + rY*rY)
if(l > udg_link_len) then
set loc = Location(cX[0]+udg_link_len/l*rX, cY[0]+udg_link_len/l*rY)
call SetUnitPositionLoc( human, loc)
call RemoveLocation(loc)
endif
set a=1
loop
exitwhen a > udg_link_num-1
set cX[a] = LoadRealBJ(0+3*a, StringHashBJ("coords"), t)
set cY[a] = LoadRealBJ(1+3*a, StringHashBJ("coords"), t)
set cZ[a] = LoadRealBJ(2+3*a, StringHashBJ("coords"), t)
set a = a + 1
endloop
set a=1
loop
exitwhen a > udg_link_num-1
set sX = LoadRealBJ(0+3*a, StringHashBJ("speeds"), t)
set sY = LoadRealBJ(1+3*a, StringHashBJ("speeds"), t)
set sZ = LoadRealBJ(2+3*a, StringHashBJ("speeds"), t)
set fX = 0
set fY = 0
set fZ = -udg_gravity
set rX = cX[a-1] - cX[a]
set rY = cY[a-1] - cY[a]
set rZ = cZ[a-1] - cZ[a]
set l = SquareRoot(rX*rX + rY*rY + rZ*rZ)
set fX = fX + udg_link_res*(1-udg_link_sublen/l)*rX
set fY = fY + udg_link_res*(1-udg_link_sublen/l)*rY
set fZ = fZ + udg_link_res*(1-udg_link_sublen/l)*rZ
set rX = cX[a+1] - cX[a]
set rY = cY[a+1] - cY[a]
set rZ = cZ[a+1] - cZ[a]
set l = SquareRoot(rX*rX + rY*rY + rZ*rZ)
set fX = fX + udg_link_res*(1-udg_link_sublen/l)*rX
set fY = fY + udg_link_res*(1-udg_link_sublen/l)*rY
set fZ = fZ + udg_link_res*(1-udg_link_sublen/l)*rZ
set sX = sX + fX - udg_friction * sX
set sY = sY + fY - udg_friction * sY
set sZ = sZ + fZ - udg_friction * sZ
set cX[a] = cX[a] + sX
set cY[a] = cY[a] + sY
set cZ[a] = cZ[a] + sZ
set loc = Location(cX[a], cY[a])
set minZ = GetLocationZ(loc)
call RemoveLocation(loc)
if(cZ[a] < minZ) then
set cZ[a] = minZ
endif
call SaveRealBJ( sX, 0+3*a, StringHashBJ("speeds"), t)
call SaveRealBJ( sY, 1+3*a, StringHashBJ("speeds"), t)
call SaveRealBJ( sZ, 2+3*a, StringHashBJ("speeds"), t)
call SaveRealBJ( cX[a], 0+3*a, StringHashBJ("coords"), t)
call SaveRealBJ( cY[a], 1+3*a, StringHashBJ("coords"), t)
call SaveRealBJ( cZ[a], 2+3*a, StringHashBJ("coords"), t)
set a = a + 1
endloop
set a=0
loop
exitwhen a > udg_link_num-1
call MoveLightningEx( LoadLightningHandleBJ(a, StringHashBJ("lightnings"), t), true, cX[a], cY[a], cZ[a], cX[a+1], cY[a+1], cZ[a+1] )
set a = a + 1
endloop
set human = null
set tower = null
set t = null
set loc = null
endfunction
//===========================================================================
function InitTrig_ChainLoop takes nothing returns nothing
set gg_trg_ChainLoop = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_ChainLoop, 0.03 )
call TriggerAddAction( gg_trg_ChainLoop, function ChainLoop_Actions )
endfunction
function ChainInit_Actions takes nothing returns nothing
local unit human
local unit tower
local integer a
local real array cX
local real array cY
local real array cZ
local lightning lgt
local hashtable t
local group grp
local location loc1
local location loc2
call InitHashtableBJ()
set udg_htable = GetLastCreatedHashtableBJ()
set t = udg_htable
set grp = GetUnitsOfTypeIdAll('hatw')
set tower = FirstOfGroup(grp)
call SaveUnitHandleBJ(tower, 1, StringHashBJ("units"), udg_htable)
call DestroyGroup(grp)
set grp = GetUnitsOfTypeIdAll('hpea')
set human = FirstOfGroup(grp)
call SaveUnitHandleBJ(human, 0, StringHashBJ("units"), udg_htable)
call DestroyGroup(grp)
set a=0
loop
exitwhen a > udg_link_num
set cX[a] = ((a)*GetUnitX(human) + (udg_link_num-a)*GetUnitX(tower))/udg_link_num
set cY[a] = ((a)*GetUnitY(human) + (udg_link_num-a)*GetUnitY(tower))/udg_link_num
set loc1 = GetUnitLoc(human)
set loc2 = GetUnitLoc(tower)
set cZ[a] = ((a)*GetLocationZ(loc1) + (udg_link_num-a)*GetLocationZ(loc2))/udg_link_num + udg_linked_human_height
call RemoveLocation(loc1)
call RemoveLocation(loc2)
set a = a + 1
endloop
set a=1
loop
exitwhen a > udg_link_num-1
call SaveRealBJ( cX[a], 0+3*a, StringHashBJ("coords"), t)
call SaveRealBJ( cY[a], 1+3*a, StringHashBJ("coords"), t)
call SaveRealBJ( cZ[a], 2+3*a, StringHashBJ("coords"), t)
call SaveRealBJ( 0, 0+3*a, StringHashBJ("speeds"), t)
call SaveRealBJ( 0, 1+3*a, StringHashBJ("speeds"), t)
call SaveRealBJ( 0, 2+3*a, StringHashBJ("speeds"), t)
set a = a + 1
endloop
set a=0
loop
exitwhen a > udg_link_num-1
set lgt = AddLightningEx( "LEAS", true, cX[a], cY[a], cZ[a], cX[a+1], cY[a+1], cZ[a+1] )
call SetLightningColorBJ( lgt, 0, .5, 1, 1 )
call SaveLightningHandleBJ(lgt, a, StringHashBJ("lightnings"), t)
set a = a + 1
endloop
call AddSpecialEffectTargetUnitBJ( "chest", human, "Abilities\\Spells\\Other\\GeneralAuraTarget\\GeneralAuraTarget.mdl" )
call EnableTrigger( gg_trg_ChainLoop )
set human = null
set tower = null
set lgt = null
set t = null
set grp = null
set loc1 = null
set loc2 = null
endfunction
//===========================================================================
function InitTrig_ChainInit takes nothing returns nothing
set gg_trg_ChainInit = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_ChainInit, 0.00 )
call TriggerAddAction( gg_trg_ChainInit, function ChainInit_Actions )
endfunction