При касте герой каким то способом отключает столкновение у юнита-таргета, как его убрать?
    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, данная функция отдаёт приказ "Стоп" юниту, что перемещается. Если же это не важно, то можно ей использовать.
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 раза, так как иногда при первом сохранении код не компилируется или что-то вроде того. Обычно сохраняю карту в корень диска, а потом переношу в папку с картами игры.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.