При касте герой каким то способом отключает столкновение у юнита-таргета, как его убрать?
    local timer t = GetExpiredTimer()
    local unit a = LoadUnitHandle(neji,GetHandleId(t),1)
    local unit b = LoadUnitHandle(neji,GetHandleId(t),2)
    call SetUnitX(b,GetUnitX(b) + 300 * Cos(GetUnitFacing(a) * bj_DEGTORAD))
    call SetUnitY(b,GetUnitY(b) + 300 * Sin(GetUnitFacing(a) * bj_DEGTORAD))
    call UnitApplyTimedLife(CreateUnit(GetOwningPlayer(a), 'h008',GetUnitX(b),GetUnitY(b),90),'BTLF',3)
    call UnitApplyTimedLife(CreateUnit(GetOwningPlayer(a), 'h009',GetUnitX(b),GetUnitY(b),90),'BTLF',3)
    call DestroyEffect((AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl",GetUnitX(b),GetUnitY(b))))
    set a = null
    set b = null
endfunction

function Hakke takes nothing returns nothing
    local unit a = GetSpellAbilityUnit()
    local unit b = GetSpellTargetUnit()
    local timer t = CreateTimer()
    call SaveUnitHandle(neji,GetHandleId(t),1,a)
    call SaveUnitHandle(neji,GetHandleId(t),2,b)
    call PauseUnit(a,true)
    call PauseUnit(b,true) 
    call SetUnitX(a,GetUnitX(b) - 150 * Cos(GetUnitFacing(a) * bj_DEGTORAD))
    call SetUnitY(a,GetUnitY(b) - 150 * Sin(GetUnitFacing(a) * bj_DEGTORAD))
    call SetUnitTimeScale(a, 50 * 0.01)
    call SetUnitAnimation(a,"Spell two")
    call StartSound(gg_snd_Hasangeki )
    call SetUnitTimeScale(a, 50 * 0.01)
    call TimerStart(t,0.20,true,function Hakke_Act)
    call UnitDamageTarget(a,b,2500,false,false,null,null,null)
    call UnitApplyTimedLife(CreateUnit(GetOwningPlayer(a), 'h007',GetUnitX(a) + 250 * Cos(GetUnitFacing(a) * bj_DEGTORAD),GetUnitY(a) + 250 * Sin(GetUnitFacing(a) * bj_DEGTORAD),GetUnitFacing(a)-180),'BTLF',3)
    call TriggerSleepAction(0.60)
    call PauseTimer(t)
    call FlushChildHashtable(neji,GetHandleId(t))
    call DestroyTimer(t)
    call SetUnitTimeScale(a, 100 * 0.01)
    call PauseUnit(b,false)
    call PauseUnit(a,false)
    set a = null
    set b = null
    set t = null
endfunction 

function Hakke_Cond takes nothing returns boolean
    return GetSpellAbilityId() == 'A003'
endfunction

//===========================================================================
function InitTrig_Hakke takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index
    set index = 0
    loop
    call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set index = index + 1
    exitwhen index == 14
    endloop
    call TriggerAddCondition( t, Condition( function Hakke_Cond ) )
    call TriggerAddAction( t, function Hakke )
    set t = null
endfunction
    return GetUnitTypeId(GetDyingUnit()) == 'h008' or GetUnitTypeId(GetDyingUnit()) == 'h009' or GetUnitTypeId(GetDyingUnit()) == 'h007'
endfunction

function Hakke_remove takes nothing returns nothing
  local unit a = GetDyingUnit()
  call TriggerSleepAction(2)
  call RemoveUnit(a)
  set a = null
endfunction

//===========================================================================
function InitTrig_Hakke_remove takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index
    set index = 0
    loop
    call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_DEATH, null)
    set index = index + 1
    exitwhen index == 14
    endloop
    call TriggerAddCondition(t, Condition( function Hakke_remove_Cond ))
    call TriggerAddAction(t, function Hakke_remove )
    set t = null
endfunction
   local integer i = 0
   local integer id
   local location array P
   local real result=0
   loop
      exitwhen i >= 50
      set i = i + 1
      set P[i] = Location(0,0)
      set id = GetHandleId(P[i])
      set result = result + (id-0x100000)
   endloop
   set result = result/i-i/2
   loop
      call RemoveLocation(P[i])
      set P[i] = null
      exitwhen i <= 1
      set i = i - 1
   endloop
   call LeaderboardSetItemValue(udg_HandleBoard,0,R2I(result))
endfunction

function HandleCounter_Actions takes nothing returns nothing
   set udg_HandleBoard = CreateLeaderboard()
   call LeaderboardSetLabel(udg_HandleBoard, "Handle Counter")
   call PlayerSetLeaderboard(GetLocalPlayer(),udg_HandleBoard)
   call LeaderboardDisplay(udg_HandleBoard,true)
   call LeaderboardAddItem(udg_HandleBoard,"Handles",0,Player(0))
   call LeaderboardSetSizeByItemCount(udg_HandleBoard,1)
   call HandleCounter_Update()
   call TimerStart(GetExpiredTimer(),0.05,true,function HandleCounter_Update)
endfunction

function InitTrig_HandleCounter takes nothing returns nothing
   call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction

Принятый ответ

Razor_dex:
Мне кажется проблема в этом, он не просто передвигает, он перемещает с одной дистанции на другую, т.е рывками
Криво реализовано движение. У тебя смещение происходит сразу на 300 единиц, поэтому пролетаешь декорации, и потому, что функция SetUnitXY перемещает в точку беспрепятственно, игнорируя занимаемое юнитом пространство. Попробуй сделать так:
поменяй это
call SetUnitX(b,GetUnitX(b) + 300 * Cos(GetUnitFacing(a) * bj_DEGTORAD))
call SetUnitY(b,GetUnitY(b) + 300 * Sin(GetUnitFacing(a) * bj_DEGTORAD))
на это
call SetUnitPosition(b,GetUnitX(b) + 40 * Cos(GetUnitFacing(a) * bj_DEGTORAD),GetUnitY(b) + 40* Sin(GetUnitFacing(a) * bj_DEGTORAD))
ну и установи таймеру период срабатывания в 0.05 где-то.
call TimerStart(t,0.20,true,function Hakke_Act)
Вообще, по-хорошему, надо бы переделать весь спел.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
28
5 лет назад
2
Не рекомендую использовать SetUnitPos, данная функция отдаёт приказ "Стоп" юниту, что перемещается. Если же это не важно, то можно ей использовать.
0
10
5 лет назад
Отредактирован LordDracula
0
а что с ним не так?
triggersleep не точно работает, его обычно обходят стороной.
PT153:
Не рекомендую использовать SetUnitPos, данная функция отдаёт приказ "Стоп" юниту, что перемещается. Если же это не важно, то можно ей использовать.
кстати, в свете этого можно убрать функции с паузой для цели способности, т.к. он и так ничего не сможет сделать. да и для кастера не нужно, наверн.
0
32
5 лет назад
Отредактирован Берги
0
0
26
5 лет назад
0
Последние тестирования развеяло многие мифы о triggersleepaction, а точнее, они есть лишь при определённых условиях. Если конкретизировать, то триггер создаёт поток своего выполнения, triggersleepaction иногда разрывает поток, тогда туда могут попасть иные данные. Хороший пример затрудняюсь привести, но помню, что в последний раз тестировали на значения переменных для юнитов в потоке, так значение (Dying unit) сохранится в триггере, где юнит умирает, потом triggersleepaction на 15 сек., потом воскресает. Но либо (Attacked unit), либо (Attacking unit) обнулится, когда во время triggersleepaction этот юнит умрёт.
0
13
5 лет назад
Отредактирован SoulRazor
0
Загруженные файлы
4
26
5 лет назад
4
Если работаешь в JNGP, то нужно сохранять карту без русских символов в пути 2 раза, так как иногда при первом сохранении код не компилируется или что-то вроде того. Обычно сохраняю карту в корень диска, а потом переношу в папку с картами игры.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.