Добавлен JackFastGame
Как наиболее правильно (без багов) реализовать эффект страха, при котором вражеский герой замедляется и начинает идти в противоположную сторону, не имея возможности отдавать приказы?
Принятый ответ
Для вас это слишком сложно, много триггерной работы. Потребуется мемхак.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Absolute
создавал триггер отлавливающий приказы и отдающий вместо них приказ убегать с сохранением координат куда убегать (которые при этом менялись каждую секунду чтобы бег был в панике)
только нужно еще чтобы триггер не зацикливал себя
только та арена вроде запротекчена
У меня так сделано.
function FearRun takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local integer i = LoadInteger(udg_AssassinHash,id,1)
local integer N = LoadInteger(udg_AssassinHash,id,2)
local integer k = 1
local real r
local unit u
set i = i - 1
call SaveInteger(udg_AssassinHash,id,1,i)
if i > 0 then
if ModuloInteger(i,8) == 0 then
loop
exitwhen k > N
set u = LoadUnitHandle(udg_AssassinHash,id,30+k)
if GetUnitCurrentOrder(u) != 851986 then
set r = LoadReal(udg_AssassinHash,id,30+k)
call IssuePointOrder(u,"move",GetUnitX(u)+300.*Cos(r),GetUnitY(u)+300.*Sin(r))
endif
set k = k+1
endloop
endif
set k = 1
loop
exitwhen k > N
set u = LoadUnitHandle(udg_AssassinHash,id,30+k)
if IsUnitAlly(u,GetLocalPlayer()) and GetPlayerState(GetLocalPlayer(),PLAYER_STATE_OBSERVER) == 0 then
call SelectUnit(u,false)
endif
set k = k+1
endloop
else
set k = 1
loop
exitwhen k > N
set u = LoadUnitHandle(udg_AssassinHash,id,30+k)
if GetLocalPlayer() == GetOwningPlayer(u) then
call ClearSelection()
call SelectUnit(u,true)
endif
set k = k+1
endloop
call FlushChildHashtable(udg_AssassinHash,id)
call DestroyTimer(t)
endif
set t = null
set u = null
endfunction
local unit c = GetSpellAbilityUnit()
local unit d = GetSpellTargetUnit()
local unit u
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local timer t = CreateTimer()
local integer i = 0
local integer id = GetHandleId(t)
call GroupEnumUnitsInRange(udg_G,x,y,250,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) and IsUnitType(u,UNIT_TYPE_HERO) then
if IsUnitAlly(u,GetLocalPlayer()) and GetPlayerState(GetLocalPlayer(),PLAYER_STATE_OBSERVER) == 0 then
call SelectUnit(u,false)
endif
set i = i + 1
call SaveUnitHandle(udg_AssassinHash,id,30+i,u)
call SaveReal(udg_AssassinHash,id,30+i,ABU(u,c))
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
call GroupClear(udg_G)
call SaveInteger(udg_AssassinHash,id,2,i)
call SaveInteger(udg_AssassinHash,id,1,60+16*GetUnitAbilityLevel(c,'A0B0'))
call TimerStart(t,0.03,true,function FearRun)
set u = null
set c = null
set d = null
endfunction
set i = 0
loop
exitwhen i > 12
call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
set i = i + 1
endloop
call TriggerAddCondition(t,Condition( function FearCon) )
call TriggerAddAction(t,function Fear)
почему у тебя везде хэштейбл назван AssassinHash
откуда-то под таким именем взял с первого раза образец что ли?