Добавлен , опубликован
Способ реализации:
Lua
Версия Warcraft:
В основе наработки лежит новая функция BlzPauseUnitEx и 2 её самые главные особенности:
  1. Не исчезают иконки с панели приказов, в отличии от старой паузы
  2. Если юнит уже запаузен, то он не выйдет из паузы после её окончания, есть так называемый счетчик пауз (жаль его количество нельзя узнать), Вкратце: если на юнита 10 раз наложили паузу, нужно её 10 раз снять
раскрыть
stunEff="Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget"
StunSystem={}
function StunUnit(hero,dur)
	if not StunSystem[GetHandleId(hero)] then
	--	print("оглушен первый раз")
		StunSystem[GetHandleId(hero)]={
			Time=0,
			Eff=nil,
			Timer=nil
		}
	end
	local data=StunSystem[GetHandleId(hero)]
	local curdur=0
	if data.Time==0 then
		data.Timer=CreateTimer()
		--print("старт нового таймера")
		data.Eff=AddSpecialEffectTarget(stunEff,hero,"overhead")
		BlzPauseUnitEx(hero,true)
	end

	if data.Time<dur  then
		--print("Более сильное оглушение, обновляем время")
		data.Time=dur
	else
		--print("Есть более долгое оглушение ничего не делаем")
		return
	end

	TimerStart(data.Timer, 0.1, true, function()
		curdur=curdur+0.1
		data.Time=data.Time-0.1
		if curdur>=dur or not UnitAlive(hero) then
			--print("Вышел из стана")
			BlzPauseUnitEx(hero,false)
			DestroyTimer(GetExpiredTimer())
			data.Time=0
			DestroyEffect(data.Eff)
			data.Timer=nil
		end
	end)
end
Вызывать в любом месте через StunUnit(hero,dur).
Где hero - юнит которого хотим оглушить
А dur - время оглушения в секундах
Чтобы узнать в стане ли юнит, достаточно проверить состояние функцией IsUnitPaused, тут конечно да, есть пересечения с простой паузой, но можно этим просто пренебречь.
В будущем планируется:
  1. Добавить индикатор стана в виде прогресс бара, для оглушенного юнита или же просто отображать секунды через текстаг
  2. Добавить очищение от оглушения, ну скажем сильное развеивание достаточно редкая вещь, как только надобность появиться - сразу сделаю
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
9
Еще нужно добавить параметр, что стан не продлевается, а начинает отсчет заново.
Ну или если стан который чел получил по времени меньше, чем текущий(который остался), то заменить, иначе - нет.
22
Я лишь прочитал текст описания и код. Пожалуй раскритикую данную функцию.
  • В статус баре юнита нет иконки баффа "Оглушения" (или другого баффа вообще)
  • При паузе у юнита ставятся на паузу таймеры все баффоы, типа ауры, отравленный нож...
  • Как писал quq_CCCP, нативное оглушение в вар3 - это приказ, а поскольку механика в функции отличается, то могут быть проблемы с метаморфозами и сном (в теории)
21
В будущем планируется:
Добавить индикатор стана в виде прогресс бара, для оглушенного юнита или же просто отображать секунды через текстаг
а шо мешало сразу это добавить? )

Если юнит уже запаузен, то он не выйдет из паузы после её окончания, есть так называемый счетчик пауз (жаль его количество нельзя узнать), Вкратце: если на юнита 10 раз наложили паузу, нужно её 10 раз снять
внатуре? ля так это ж изи тогда ваще

В статус баре юнита нет иконки баффа "Оглушения" (или другого баффа вообще)
ну это легко дополнить, если добавить кастомный бафф
Тут суть в другом - имеет ли смысл этот метод, если в мапе энивэй используется дамми для каких-нибудь других целей? Если используется дамми для чего-то ещё, то просто тогда сделать стан от дамми и не париться
Тем более, что можно параметры абилки менять щас, т.е. можно перед кастом стана от дамми, установить ему нужную длительность стана и всё
22
local dbUnits = {}

function SetUnitStun(u, c)
local h = GetHandleId(u)

if dbUnits[h] == nil then
dbUnits[h] = 0
end

local step = c - dbUnits[h]
local isDelete = step < 0
dbUnits[h] = c

if isDelete then
step = (step * -1)
end

while step do
if isDelete then
BlzPauseUnitEx(u, false)
else
BlzPauseUnitEx(u, true)
end
step = step - 1
end


end

function GetUnitStun(unit)
return dbUnits[GetHandleId(unit)] or 0
end

вот и все 2 функция готов и спокойно знаете счетчик

итог спокойно можно
SetUnitStun(unit, 10)
то счетчик будет обновлять
Забыл добавить для обновление бд юнита счетчик

и можно проверку делать чтобы ниже 0 не ставилось а указал количество от 0 до 10
SetUnitStun(unit, 10)
10 раз установит паузу
SetUnitStun(unit, 4)
Снимает 6 раз паузу
15
Вероятно стоит хукнуть функцию UnitRemoveBuff, чтобы стан снимался ее вызовом, а так же добавить флаги positive/negative/neutral.
33
За замечания и предложения всем спасибо, буду развивать дальше
Bornikkeny, бафф в статусе пусть идёт лесом, в 1 карте я смог все эффекты повторить без ваших дамми кастов, поэтому нет смысла вообще поддерживать всякие яды и замедлялки сидите и дальше в своем РО.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.