При касте герой каким то способом отключает столкновение у юнита-таргета, как его убрать?
    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)
Вообще, по-хорошему, надо бы переделать весь спел.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
28
5 лет назад
0
Что значит "отключает столкновение у юнита-таргета"?
Код хендл каунтера можно было и не вставлять.
В чём прикол создавать триггер в локальную переменную?

Может всё дело в паузе?
0
13
5 лет назад
0
Ну при касте на юнита, герой толкает юнита, а тот отлетает, но если использовать рядом с декорацией, он пролетает сквозь нее и даже за край карты, игнорируя препятствия, как это убрать?
PT153:
В чём прикол создавать триггер в локальную переменную?

Это наработка и не моя, я просто в джассе не очень шарю :(
0
32
5 лет назад
0
Razor_dex, Ну например я использую следующие самописные функции:
  • точка содержит юнита (чтобы упираться в юнита)
  • точка содержит декорацию
  • точка проходима (чтобы упереться в клиф)
  • точка в пределах игровой зоны (чтобы не вылететь за пределы карты)
  • точка не сильно выше чем предыдущая (чтоб упереться в слишком высокую неровность)
и возможно я ещё что-то забыл даже, но этого минимума должно быть достаточно, чтобы сделать нормальный кнокбек
чуть подробней
function Out takes real x, real y returns boolean
return ((GetRectMinX(bj_mapInitialPlayableArea)<=x)and(x<=GetRectMaxX(bj_mapInitialPlayableArea))and(GetRectMinY(bj_mapInitialPlayableArea)<=y) and (y<=GetRectMaxY(bj_mapInitialPlayableArea))) or IsTerrainPathable(x,y, PATHING_TYPE_WALKABILITY)==false
endfunction
В функцию Out передать координату следующую а не текущую, иначе застрянет и остановится, примеры смотри например в моих картах, в сларках или танчиках
0
28
5 лет назад
0
герой толкает юнита, а тот отлетает, но если использовать рядом с декорацией, он пролетает сквозь нее и даже за край карты, игнорируя препятствия, как это убрать?
А-аа, так вот в чём дело, при перемещении юнита нужно проверки пихать, что новая точка свободна и в пределах карты.
0
13
5 лет назад
Отредактирован SoulRazor
0
call SetUnitX(b,GetUnitX(b) + 300 * Cos(GetUnitFacing(a) * bj_DEGTORAD))
 call SetUnitY(b,GetUnitY(b) + 300 * Sin(GetUnitFacing(a) * bj_DEGTORAD))
Мне кажется проблема в этом, он не просто передвигает, он перемещает с одной дистанции на другую, т.е рывками
0
26
5 лет назад
0
Razor_dex, так да, об этом тебе и толкуют, что нужно делать проверку проходимости точки.
0
32
5 лет назад
0
Razor_dex, правильный ответ мой, даже с функцией готовой, воткни ее выше и используй как доп условие перед движением
1
10
5 лет назад
Отредактирован LordDracula
1
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)
Вообще, по-хорошему, надо бы переделать весь спел.
Принятый ответ
0
13
5 лет назад
0
Bergi_Bear:
Razor_dex, правильный ответ мой, даже с функцией готовой, воткни ее выше и используй как доп условие перед движением
Выдает ошибку, вместо х и у надо переменные подставлять? и тут библиотека нужна?
LordDracula:
Криво реализовано движение. У тебя смещение происходит сразу на 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)
Спасибо, вот сейчас отлично стало
LordDracula:
Вообще, по-хорошему, надо бы переделать весь спел.
а что с ним не так?
2
28
5 лет назад
2
Не рекомендую использовать SetUnitPos, данная функция отдаёт приказ "Стоп" юниту, что перемещается. Если же это не важно, то можно ей использовать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.