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

Содержание:
Включаем показ радиуса вышек в своей ТД или делаем адекватные стаки крипов как в дотке, всё очень просто, нажимаем Alt и видим информацию графическим способом, смотрим видео...
Хотите также, вот код, всё работает даже без импорта
весь код

OutPoint=6000
TIMER_PERIOD = 0.03125
do --Инициализация
	TimerStart(CreateTimer(), 1, false, function()
		--создаёт триггер отлова клавишь
		AltIsPressed()
		AddSquareArea(-845,-1080,400)
		AddSquareArea(567,-1020,800)
	end)
end

AltPlayers={}
function AltIsPressed()
	-----------------------------------------------------------------OSKEY_ALT
	local gg_trg_EventUpALT = CreateTrigger()
	for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
		BlzTriggerRegisterPlayerKeyEvent(gg_trg_EventUpALT, Player(i), OSKEY_LALT, 4, true) -- отлов нажатия альт, работает только при метакей 4
	end
	TriggerAddAction(gg_trg_EventUpALT, function()
		local pid = GetPlayerId(GetTriggerPlayer())
		AltPlayers[pid]=true
		--print("Аль нажат")
	end)
	local TrigDepressALT = CreateTrigger()
	for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
		BlzTriggerRegisterPlayerKeyEvent(TrigDepressALT, Player(i), OSKEY_LALT, 0, false)
	end
	TriggerAddAction(TrigDepressALT, function()
		local pid = GetPlayerId(GetTriggerPlayer())
		AltPlayers[pid]=false
		--print("Аль отпущен")
	end)
end

function AddCircleAreaForUnit(unit,radius)
	local path="circ" -- для нестандартных кругов
	path="replaceabletextures\\selection\\rangeindicator" -- путь до дефолтной иконки
	if not radius then
		radius=BlzGetUnitWeaponRealField(unit,UNIT_WEAPON_RF_ATTACK_RANGE,0)*2.3 -- коэффициент 2,3 подобран методом тыка и исходит из размеров текстуры
		--print(radius)
	end
	local CircleImage=CreateImage(path,radius,radius,radius,OutPoint,OutPoint,0,0,0,0,4)
	SetImageRenderAlways(CircleImage, true)
	ShowImage(CircleImage,false)
	SetImagePosition(CircleImage,GetUnitX(unit),GetUnitY(unit),0)

	TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
		for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
			if AltPlayers[i]==true  then
				if GetLocalPlayer()==Player(i) then
					ShowImage(CircleImage,true)
					local xs,ys=GetUnitX(unit)-radius/2-16,GetUnitY(unit)-radius/2-16
					SetImagePosition(CircleImage,xs,ys,0)
					--print("Показываем круги")
				end
			else
				if GetLocalPlayer()==Player(i) then
					ShowImage(CircleImage,false)
				end
			end
		end
		if not UnitAlive(unit) then
			DestroyTimer(GetExpiredTimer())
			DestroyImage(CircleImage)
			ShowImage(CircleImage,false)
		end
	end)
end

function AddSquareArea(xCenter,yCenter,range)
	local image=CreateImage("Square256",range,range,range,OutPoint,OutPoint,0,0,0,0,4)
	--print("создан новый маркер")
	SetImageRenderAlways(image, true)
	ShowImage(image,false)
	local x,y=xCenter,yCenter
	x,y=x-range/2,y-range/2
	SetImagePosition(image,x,y,0)


	TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
		for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
			if AltPlayers[i]==true  then
				if GetLocalPlayer()==Player(i) then
					ShowImage(image,true)
					--SetImagePosition(image,x,y,0)
					--print("Показываем круги")
				end
			else
				if GetLocalPlayer()==Player(i) then
					ShowImage(image,false)
				end
			end
		end
	end)
end
Круги для юнитов добавляются одной строчкой
AddCircleAreaForUnit(unit,radius)
параметр radius необязательный, если его не передать, то берётся радиус атаки юнита, на видео выше он и используется
Вся необходимая инфа в карте примере

Полезные замечания

Факт отлова ALT багованный, работает благодаря metakey - 4
BlzTriggerRegisterPlayerKeyEvent(gg_trg_EventUpALT, Player(i), OSKEY_LALT, 4, true) 
Через простой oskey события нажатия не детектируется.
Толщина линий растёт вместе с размером кругов и квадратов, если это не устраивает, тогда есть 2 варианта:
  1. Использовать отдельные изображения для отдельных радиусов
  2. Использовать способ отрисовывания точками (возможно на момент этой статьи он ещё не расписан)

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
4 года назад
0
Если кто знает, как сделать так, чтобы Image были яркими в тумане войны и чтобы ночью не накладывалась синева на белый цвет, то расскажите пожалуйста.
0
27
4 года назад
Отредактирован ScorpioT1000
0
Полезная штука

А что с сайтом? Снизу все съехало
Этот комментарий удален
0
27
2 года назад
Отредактирован MpW
0
отрисовка радиусов не работает у тех, кто стоит с краю карты или около возвышенностей?
0
32
2 года назад
0
МрачныйВорон, тут очень старый и кривой алгоритм, я его же 20 раз переделывал и улучшал, тут скорее всего не будет работать отрисовка если центр круга за пределами камеры
2 комментария удалено
Чтобы оставить комментарий, пожалуйста, войдите на сайт.