/*增加了一个速度参数,删除了JAPI内容,本楼内容全部复制*/
//计时器步骤
function HeroSkill_Jump_Time takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer int = GetHandleId(t)
local unit u = LoadUnitHandle(udg_HT,int,0)
local real jiaodu = LoadReal(udg_HT, int, 1)
// distance 实际作用是用来判断计时器何时终止
local real distance = LoadReal(udg_HT, int, 2)
local real w = LoadReal(udg_HT, int, 3)
local real x = LoadReal(udg_HT, int, 4)
local real speed = LoadReal(udg_HT, int, 5)
local location d1 = GetUnitLoc(u)
local location d2 = PolarProjectionBJ(d1, speed, jiaodu)
// h 为单位跳跃的最高高度,这里设置为跳跃距离的三分之一。z 是指单位的Z轴高度,计时器每次运行都会计算,下面会讲
local real h = w / 3
local real z
// 如果 distance <= 1 的时候,将终止跳跃,并清理计时器
if (distance <= 1) then
call SetUnitFlyHeight(u, 0, 0)
call PauseTimer(t)//暂停计时器
call DestroyTimer(t)//删除计时器
call FlushChildHashtable(udg_HT,int)//清空计时器的哈希表
else
// 设置 distance = distance - speed 并保存,而 x 则是二次函数的关键
set distance = distance - speed
call SaveReal(udg_HT,int,2,distance)
set x = x + speed
call SaveReal(udg_HT, int, 4, x)
// z 是计时器每运行一次的单位的Z轴高度,高度计算公式 z = -1x * x * (h/(w/2)^2) + h
set z = (-1 * x) * x * (h / Pow((w / 2), 2)) + h
// 判断 d2 在地图可用范围内,并且是地面单位可通行的区域。防止技能超出地图边界造成崩溃。
// 如果 d2 超出可用范围,将强行停止跳跃技能
// 想让跳跃技能跨越地形的话,需要删掉 and (IsTerrainPathableBJ(d2, PATHING_TYPE_WALKABILITY) == false) 这部分
if (RectContainsLoc(GetPlayableMapRect(), d2) == true) and (IsTerrainPathableBJ(d2, PATHING_TYPE_WALKABILITY) == false) then
call SetUnitPositionLoc(u, d2)
call SetUnitFlyHeight(u, z, 0)
else
set distance = 0
call SaveReal(udg_HT,int,2,distance)
endif
endif
call RemoveLocation(d1)
call RemoveLocation(d2)
set t = null
set u = null
set d1 = null
set d2 = null
endfunction
//跳跃函数 HeroSkill_Jump
function HeroSkill_Jump takes real speed returns nothing
local timer t = CreateTimer()
local integer int = GetHandleId(t)
local unit u = GetTriggerUnit()
local location d1 = GetUnitLoc(u)
local location d2 = GetSpellTargetLoc()
local real jiaodu = AngleBetweenPoints(d1, d2)
local real w = DistanceBetweenPoints(d1, d2)
local real x = 0 - (w / 2)
//为单位添加并删除(风暴之鸦)技能,必要操作
call UnitAddAbility(u,'Arav')
call UnitRemoveAbility(u,'Arav')
//保存关键数据到哈希表,供计时器调取
call SaveUnitHandle(udg_HT,int,0,u)
call SaveReal(udg_HT, int, 1, jiaodu)
call SaveReal(udg_HT, int, 2, w)
call SaveReal(udg_HT, int, 3, w)
call SaveReal(udg_HT, int, 4, x)
call SaveReal(udg_HT, int, 5, speed)
//开始计时器
call TimerStart(t, 0.01, true, function HeroSkill_Jump_Time)
call RemoveLocation(d1)
call RemoveLocation(d2)
set t = null
set u = null
set d1 = null
set d2 = null
endfunction