Пытался реализовать функцию стана в одну строчку на одной способности и получил интереснный результат. Если ставлю дленительность больше секунды - все ок, если ставлю меньше секунды - стана нет.
globals

        integer STUN_ID = 'stun'
        integer DUMMY_ID = 'dumy'

endglobals


function StunUnit takes unit Target, real stunDuration returns nothing
        local unit dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DUMMY_ID,GetUnitX(Target),GetUnitY(Target),0)
        local ability a = BlzGetUnitAbility(dummy, STUN_ID)
        call UnitAddAbility(dummy,STUN_ID)
        call BlzSetAbilityRealLevelField(a , ABILITY_RLF_DURATION_NORMAL, 0, stunDuration)
        call BlzSetAbilityRealLevelField(a , ABILITY_RLF_DURATION_HERO, 0, stunDuration)
        call UnitApplyTimedLife(dummy, 'BTLF', stunDuration)
        call IssueTargetOrder(dummy, "creepthunderbolt", Target)
        set dummy = null
endfunction

Ух я починил, теперь всё чётко работает
раскрыть
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
		--print(data.Time)
		if curdur>=dur then
			--print("Вышел из стана")
			BlzPauseUnitEx(hero,false)
			--BlzPauseUnitEx(hero,false)
			DestroyTimer(GetExpiredTimer())
			data.Time=0
			DestroyEffect(data.Eff)
			data.Timer=nil
		end
	end)
end
wetalq, просто я делал уже такой даммистан и это не очень, на последнем патче стоит двигаться дальше, и как раз таки даммистан это велосипед
`
ОЖИДАНИЕ РЕКЛАМЫ...
11
Такс, я убиваю дамика быстрее каста и он не успевает станить :С
7

wetalq:
Такс, я убиваю дамика быстрее каста и он не успевает станить :С
лучший ответ)
15
Такс, я убиваю дамика быстрее каста и он не успевает станить :С
Тебе его незачем убивать. Пусть живет себе на карте до конца игры, сэкономишь немного.
11
Ельнур, вот только дленительность стана теперь не меняется почему то

вообщем хороший пример того как плохо быть не внимательным.
globals

        integer STUN_ID = 'stun'
        integer DUMMY_ID = 'dumy'

endglobals


function StunUnit takes unit Target, real stunDuration returns nothing
        local unit dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DUMMY_ID,GetUnitX(Target),GetUnitY(Target),0)
        local ability a 
        call UnitAddAbility(dummy,STUN_ID)
	set a = BlzGetUnitAbility(dummy, STUN_ID)
        call BlzSetAbilityRealLevelField(a , ABILITY_RLF_DURATION_NORMAL, 0, stunDuration)
        call BlzSetAbilityRealLevelField(a , ABILITY_RLF_DURATION_HERO, 0, stunDuration)
        call UnitApplyTimedLife(dummy, 'BTLF', 1)
        call IssueTargetOrder(dummy, "creepthunderbolt", Target)
        set dummy = null
endfunction
Спасибо за моральную поддержку, нашел в чем проблема
7
wetalq:
Ельнур, вот только дленительность стана теперь не меняется почему то

вообщем хороший пример того как плохо быть не внимательным.
globals

        integer STUN_ID = 'stun'
        integer DUMMY_ID = 'dumy'

endglobals


function StunUnit takes unit Target, real stunDuration returns nothing
        local unit dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DUMMY_ID,GetUnitX(Target),GetUnitY(Target),0)
        local ability a 
        call UnitAddAbility(dummy,STUN_ID)
	set a = BlzGetUnitAbility(dummy, STUN_ID)
        call BlzSetAbilityRealLevelField(a , ABILITY_RLF_DURATION_NORMAL, 0, stunDuration)
        call BlzSetAbilityRealLevelField(a , ABILITY_RLF_DURATION_HERO, 0, stunDuration)
        call UnitApplyTimedLife(dummy, 'BTLF', 1)
        call IssueTargetOrder(dummy, "creepthunderbolt", Target)
        set dummy = null
endfunction
Спасибо за моральную поддержку, нашел в чем проблема
инициализируй переменную local ability a = null иногда неинициализрованные переемные обрывают поток
33
здрасте приехали
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
		}
	end
	local data=StunSystem[GetHandleId(hero)]
	if not data.eff then DestroyEffect(data.eff) end
	data.Eff=AddSpecialEffectTarget(stuneff,hero,"overhead")
	local curdur=0
	if data.Time<dur and data.Time==0 then
		--print("полное оглушение, обновляем")
		data.Time=dur
	else
		--print("Есть более долгое оглушение")
		return
	end
	BlzPauseUnitEx(hero,true)
	TimerStart(CreateTimer(), 0.1, true, function()
		curdur=curdur+0.1
		data.Time=data.Time-0.1
		if curdur>=dur then
			BlzPauseUnitEx(hero,false)
			DestroyTimer(GetExpiredTimer())
			data.Time=0
			DestroyEffect(data.Eff)
		end
	end)
end

Вызываем в строчку StunUnit(hero,dur)

Без даммикаста, работает из коробки
22
Bergi_Bear, таймер можно же сделать 1 раз и все чем плодить =)

если счетчик стунов равен =0 то запускаем таймер а если стан конччилось и таймер уменшил на 0 то останавливаем.

а если в карте мало юнитов то некритично с таймером

и структуру лучше делать не по времени а по количество счетчиков если у тя там всегда 0.1 в сек значит для 1 сек стана просто count = 10 и каждый срабатывание таймера уменшить до 0 и завершить
а если стан имеет больше count то есть 10 сек то накладывать слабый стан бесполезен

извини чет от скуки написал знаю что ты можеш получше написать
33
Да могу лучше, мне уже подсказали, что там лажа, и надо переделать=)
11
Bergi_Bear, догадывался что можно и так, но подумал что не стоит изобретать велосипед и использовал дамикаст. Позже к этому вернусь, а то вчера слишком много времени ушло на поики ошибки
33
Ух я починил, теперь всё чётко работает
раскрыть
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
		--print(data.Time)
		if curdur>=dur then
			--print("Вышел из стана")
			BlzPauseUnitEx(hero,false)
			--BlzPauseUnitEx(hero,false)
			DestroyTimer(GetExpiredTimer())
			data.Time=0
			DestroyEffect(data.Eff)
			data.Timer=nil
		end
	end)
end
wetalq, просто я делал уже такой даммистан и это не очень, на последнем патче стоит двигаться дальше, и как раз таки даммистан это велосипед
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.