Пытался реализовать функцию стана в одну строчку на одной способности и получил интереснный результат. Если ставлю дленительность больше секунды - все ок, если ставлю меньше секунды - стана нет.
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, просто я делал уже такой даммистан и это не очень, на последнем патче стоит двигаться дальше, и как раз таки даммистан это велосипед
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
11
4 года назад
0
Такс, я убиваю дамика быстрее каста и он не успевает станить :С
0
7
4 года назад
Отредактирован Ельнур
0

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

вообщем хороший пример того как плохо быть не внимательным.
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
Спасибо за моральную поддержку, нашел в чем проблема
0
7
4 года назад
Отредактирован Ельнур
0
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 иногда неинициализрованные переемные обрывают поток
2
32
4 года назад
2
здрасте приехали
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)

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

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

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

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

извини чет от скуки написал знаю что ты можеш получше написать
0
32
4 года назад
0
Да могу лучше, мне уже подсказали, что там лажа, и надо переделать=)
0
11
4 года назад
0
Bergi_Bear, догадывался что можно и так, но подумал что не стоит изобретать велосипед и использовал дамикаст. Позже к этому вернусь, а то вчера слишком много времени ушло на поики ошибки
4
32
4 года назад
4
Ух я починил, теперь всё чётко работает
раскрыть
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, просто я делал уже такой даммистан и это не очень, на последнем патче стоит двигаться дальше, и как раз таки даммистан это велосипед
Принятый ответ
0
23
4 года назад
0
Bergi_Bear, чет не вижу отличии =)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.