У эффекта есть 1 нюанс, созданные эффекты не отображаются в тумане войны, но если применить хитрость со смещением центра, то всё возможно
function CreateVisualPointerForUnit(hero, flag)
local pid = GetPlayerId(GetOwningPlayer(hero))
local LastMouseX = 0
local LastMouseY = 0
local arrowname = "s_arr1"
if GetLocalPlayer() ~= Player(pid) then
arrowname = ""
end
local eff = AddSpecialEffect(arrowname, OutPoint, OutPoint)
BlzSetSpecialEffectAlpha(eff, 128)
BlzSetSpecialEffectColor(eff, 0, 255, 0)
local distance = 0
local mouseMoving = false
local savedDistance = 0
local lastAngle = -180 + AngleBetweenXY(GetPlayerMouseX[pid], GetPlayerMouseY[pid], GetUnitXY(hero)) / bj_DEGTORAD
local curAngle = lastAngle
local function Destroy()
DestroyTimer(GetExpiredTimer())
--print("destroy")
BlzSetSpecialEffectPosition(eff, OutPoint, OutPoint, 0)
DestroyEffect(eff)
end
TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
local xs, ys = GetUnitXY(hero)
lastAngle = AngleBetweenXY(xs, ys, GetPlayerMouseX[pid], GetPlayerMouseY[pid]) / bj_DEGTORAD
if LastMouseX == GetPlayerMouseX[pid] then
mouseMoving = false
savedDistance = DistanceBetweenXY(GetPlayerMouseX[pid], GetPlayerMouseY[pid], GetUnitXY(hero))
else
mouseMoving = true
--print("движется")
end
curAngle = lerpTheta(curAngle, lastAngle, TIMER_PERIOD * 8)
if mouseMoving then
distance = DistanceBetweenXY(GetPlayerMouseX[pid], GetPlayerMouseY[pid], GetUnitXY(hero))
savedDistance = DistanceBetweenXY(GetPlayerMouseX[pid], GetPlayerMouseY[pid], GetUnitXY(hero))
else
distance = savedDistance
end
local nx, ny = MoveXY(xs, ys, 50, curAngle)
BlzSetSpecialEffectPosition(eff, nx, ny, BlzGetLocalUnitZ(hero) + 30)
BlzSetSpecialEffectYaw(eff, math.rad(curAngle))
BlzSetSpecialEffectMatrixScale(eff, distance / 135, 0.15, 0.1)
if flag == 1 then
if not MarkerIsON[GetHandleId(hero)] then
Destroy()
end
end
LastMouseX = GetPlayerMouseX[pid]
LastMouseY = GetPlayerMouseY[pid]
end)
end
Особо комментариев к коду не будет, в карте примере куча вспомогательного кода, который повторяется из статьи про квадратные изображения
Если способностей будет больше то регистрируем отлов способностей вот так
Если способностей будет больше то регистрируем отлов способностей вот так
TriggerRegisterCommandEvent(trigger, AbilityIDMark, "entanglingroots")
Указываем ID и строковый приказ, если же активация способности будет отлавливаться другим способом, то просто вызываем
CreateVisualPointerForUnit(udg_unit,1)
где 1 - флаг окончания способности, любое иное число сделает маркер бесконечным, ну это условность для меня удобней.
Сам эффект это жуткая транформация и перекраска кодом вот этой модели
Сам эффект это жуткая транформация и перекраска кодом вот этой модели
В результате получается вот так
Ред. PROSHELDOTU
Я второй эффект для чего собственно сделал, который в конкретной точке - потому что у меня эффект ещё относительно высоты местности менялся, и иногда его плохо было видно за рельефом, поэтому я подумал, что было бы неплохо добавить и в самой точке ещё один эффект, вот у модели этого второго эффекта надо сместить центр, чтобы его было видно в тумане войны