Паника

Возможно ли без Jass и Lua реализовать испуг или панику юнитов?
Например: когда под божественным щитом атакуешь юнита, он старается убежать от объекта агрессии которого не может атаковать

Ответ

Komkozavr, у меня есть готовые наработки по страху на луа, останется лишь юзать кастом скрипт
function FearUnit(hero,angle,time)
	local x,y=MoveXY(GetUnitX(hero),GetUnitY(hero),400*time,angle)
	local sec=0
	UnitAddAbility(hero,FourCC('Abun'))
	IssuePointOrder(hero,"move",x,y)
	TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
		sec=sec+TIMER_PERIOD
		--
		if GetUnitCurrentOrder(hero)~=String2OrderIdBJ("move") then
			IssuePointOrder(hero,"move",x,y)
		end
		if sec>=time then
			--print("end")
			UnitRemoveAbility(hero,FourCC('Abun'))
			IssueImmediateOrder(hero,"stop")
			DestroyTimer(GetExpiredTimer())
		end
	end)
end
Вызывать через FearUnit(Переменная юнита,угол направления куда следует бежать,время в страхе) в секундах
Надумаешь использовать, скину дочерние функции...
Пс можно это реализовать и на гуях и на джасе, но я не умею

Views: 630

Bergi #1 - 2 years ago 1
Голосов: 1

Komkozavr, у меня есть готовые наработки по страху на луа, останется лишь юзать кастом скрипт
function FearUnit(hero,angle,time)
	local x,y=MoveXY(GetUnitX(hero),GetUnitY(hero),400*time,angle)
	local sec=0
	UnitAddAbility(hero,FourCC('Abun'))
	IssuePointOrder(hero,"move",x,y)
	TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
		sec=sec+TIMER_PERIOD
		--
		if GetUnitCurrentOrder(hero)~=String2OrderIdBJ("move") then
			IssuePointOrder(hero,"move",x,y)
		end
		if sec>=time then
			--print("end")
			UnitRemoveAbility(hero,FourCC('Abun'))
			IssueImmediateOrder(hero,"stop")
			DestroyTimer(GetExpiredTimer())
		end
	end)
end
Вызывать через FearUnit(Переменная юнита,угол направления куда следует бежать,время в страхе) в секундах
Надумаешь использовать, скину дочерние функции...
Пс можно это реализовать и на гуях и на джасе, но я не умею
Komkozavr #2 - 2 years ago 0
Голосов: 0
Bergi_Bear, у меня нет Рефорджа и я не шарю в Луа. Поэтому мне только GUI
Bergi #3 - 2 years ago 0
Голосов: 0
ну суть то ясная? если нет я поясню:
  1. отлавливаешь момент когда надо применить страх
  2. Запускаешь периодический таймер и каждые 0,03 сек или чаще, если приказ героя НЕ равен МОVE (движению), отдаёшь приказ движения в это точку, таким образом даже игрок не сможет перебить страх и перехватить управление (правда я забыл, учесть приказ движения в другую точку в своём примере, но не важно)
  3. Как только надо выходит из страха (пропал бафф, вышло время), уничтожаешь таймер и враждебному юниту возвращается контроль,
Можешь в заклинаниях на заказ попросить это элементращина в 1 триггер и 20 строчек
Proshel_Doty #4 - 2 years ago 0
Голосов: 0
Bergi_Bear:
Мб лучше сделать, через событие получения приказа? Юнит получает приказ какой-либо, то дать ему приказ тот который нужно
Bergi #5 - 2 years ago 0
Голосов: 0
Proshel_Doty, все не отследить... их тонна
Proshel_Doty #6 - 2 years ago (изм. ) 0
Голосов: 0
Bergi_Bear:
Proshel_Doty, все не отследить... их тонна
просто событие на получение приказа, зачем их отслеживать
Bergi #7 - 2 years ago (изм. ) 0
Голосов: 0
Proshel_Doty, просто сделай, я сделал и у меня всё работает, строк кода мало, вызывать легко, а о изьяне, что во время страха единственный вариант игнора контроля это попытка бежать в другую сторону я уже догадался, но против крипов без ИИ опция не сильно нужная
Proshel_Doty #8 - 2 years ago 0
Голосов: 0
Bergi_Bear:
у меня всё работает
я ж не против) просто зачем каждые 0.03 сек что-то вызывать, если можно это делать именно когда юнит получает приказы, чтобы собственно эти приказы и перенаправить на нужный нам
Bergi #9 - 2 years ago 0
Голосов: 0
так если приказ не изменен и равен move, при вызове ничего не происходит, и не важно как часто его юзать, и что ты понимаешь под "отслеживать приказ", это вынудило бы активировать другой триггер, с события отслеживания приказов, без цели, на точку, на юнита... а зачем триггеры когда можно вообще без них?
quq_CCCP #10 - 2 years ago 0
Голосов: 0
Нет не сделать, даже близко ничего дефолтного нету. Только триггерный вариант, если хочется как в д2, это вовсе очень сложно (но возможно), но явно не для тех кто на гуи еще сидит.
Bergi #11 - 2 years ago 0
Голосов: 0
  1. Перевёл карту в режиму луа
  2. Скопировал код что дал Берги
  3. Вызвал 1 строчку кастом скрипта в нужном месте
...
  1. Профит
Можно вообще не разбираться в луа, джасе и прочих триггерах....тут вообще ничего сложного нет
Скопировал - выполнил кастом скрипт - победа
Нет рефорджа -? просите в заклинаниях на заказ для старых патчей
quq_CCCP #12 - 2 years ago 0
Голосов: 0
Bergi_Bear, стоит проверять на смерть юнита или юзать триггер, то наотдаешь приказ мертвому и фатал.
Bergi #13 - 2 years ago 0
Голосов: 0
quq_CCCP, нет не фаталит, просто возвращает false, но проверку да стоит добавить спасибо