[lua] Всё о визуализации способностей в Warcraft3

Содержание:
У эффекта есть 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 - флаг окончания способности, любое иное число сделает маркер бесконечным, ну это условность для меня удобней.
Сам эффект это жуткая транформация и перекраска кодом вот этой модели
В результате получается вот так

`
ОЖИДАНИЕ РЕКЛАМЫ...
33
Самое лучшее применения таким маркерам - стрельба, когда нужно видеть попадание в промежуточные цели. Или же ошибка в дальности способности, но тут надо делать перекрас в красный, но это уже проще. Есть ещё идеи как это применить, пишете в комментариях
1
Bergi_Bear:
Самое лучшее применения таким маркерам - стрельба, когда нужно видеть попадание в промежуточные цели. Или же ошибка в дальности способности, но тут надо делать перекрас в красный, но это уже проще. Есть ещё идеи как это применить, пишете в комментариях
там же в комментах кто то делал со смещением в центр почему его не выложить) и кнопка прикольная подумается платная)
33
Soul7, ну это его реализация, я не могу выложить чужое (не имея исходников)
21
У эффекта есть 1 нюанс, созданные эффекты не отображаются в тумане войны, но если применить хитрость со смещением центра, то всё возможно
Если делать только через один указатель, то это вообще не играет роли, потому что минимальный обзор у юнита будет всегда, значит и эффект этот в виде треугольника будет видно
Я второй эффект для чего собственно сделал, который в конкретной точке - потому что у меня эффект ещё относительно высоты местности менялся, и иногда его плохо было видно за рельефом, поэтому я подумал, что было бы неплохо добавить и в самой точке ещё один эффект, вот у модели этого второго эффекта надо сместить центр, чтобы его было видно в тумане войны

Хотя в данном случае эффект тоже не будет видно за рельефом, если наводить на местность, которая выше

А как в доте маркеры сделано, когда есть разница высот, я чёт вообще не обращал внимание, надо чекнуть
33
А как в доте маркеры сделано, когда есть разница высот, я чёт вообще не обращал внимание, надо чекнуть
В доте маркеры сделаны через сплаты, только их можно вращать и они не косячат, но об этом в другой темке
Чтобы оставить комментарий, пожалуйста, войдите на сайт.