Есть функция, которая вытаскивает координаты точки, куда была применена способность, событием "приводит способность в действие" если тип цели у способности точка?
Или координаты можно вытащить только событием "отдал приказ цель точка" через GetOrderPointXY() ?

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

constant native GetSpellTargetLoc           takes nothing returns location
native GetLocationX             takes location whichLocation returns real
native GetLocationY             takes location whichLocation returns real
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
19
5 лет назад
2
Похожие вопросы:

ответ
8gabriel8, с манакостом, именно с манакостом.

0
17
5 лет назад
0
Ставите абикой вард, а через вард уже находите координаты.
Ну это самый тупенький способ.
3
22
5 лет назад
Отредактирован Zahanc
3
constant native GetSpellTargetLoc           takes nothing returns location
native GetLocationX             takes location whichLocation returns real
native GetLocationY             takes location whichLocation returns real
Принятый ответ
0
9
5 лет назад
0
Zahanc, GetSpellTargetXY() пробовал не работало, с локами тоже самое, проблема оказалась в событии, это работает не со всеми событиями типа "применил способность"
Все ровно спс всем
1
32
5 лет назад
1
HAMHAM, ну разумеется чаннелинги не работают а это дело, поэтому в триггер нужно добавить 2 события, с помощью одного ты получишь координаты каста, а с помощью второго узнаешь когда твой маг закончил кастовать спелл.
0
22
5 лет назад
0
Каков контекст у этого всего? Буквально вчера написал заклинание AoE на точке.
/* SpellContaminate.j 1.0 */
globals
  constant integer CONTAMINATE = 'A601'
  constant integer CONTAMINATE_SUMMON = 'nvdl'
  constant real CONTAMINATE_AOE = 200.0
  constant real CONTAMINATE_DURATION = 16.0
  constant real CONTAMINATE_SUMMON_DURATION = 60.0
  constant real CONTAMINATE_UPDATE_TIMER_TIMEOUT = 2.0
  constant string CONTAMINATE_EFFECT = "Abilities\\Spells\\Undead\\UnholyAura\\UnholyAura.mdl"

  integer SCQuantity = 0
  effect array SCEffect
  integer array SCLevel
  location array SCLoc
  player array SCOwner 
  timer array SCTimerExpiration
endglobals

function SCOnDeathFilter takes nothing returns boolean
  local boolean isConvertable = false
  local unit u = GetDyingUnit()
  set isConvertable = not IsUnitType(u, UNIT_TYPE_UNDEAD) and not IsUnitType(u, UNIT_TYPE_MECHANICAL)
  return isConvertable and (SCQuantity > 0)
endfunction

function SCOnDeathCallback takes nothing returns nothing
  local integer i = 0
  local unit f = null
  local unit u = GetTriggerUnit()
  local location loc = GetUnitLoc(u)

  /* In case there are overlaping Contamination zones,
  make sure only one summon is created.
  Moreover, make sure only the oldest zone takes effect.*/
  loop
    exitwhen i >= SCQuantity or (f != null) 
    if DistanceBetweenPoints(loc, SCLoc[i]) <= (CONTAMINATE_AOE / 2 + CONTAMINATE_AOE / 2 * I2R(SCLevel[i])) then
      set f = CreateUnitAtLoc(SCOwner[i], CONTAMINATE_SUMMON, loc, GetUnitFacing(u))
      call SetUnitUseFood(f, false)
      call UnitAddType(f, UNIT_TYPE_SUMMONED)
      call UnitAddType(f, UNIT_TYPE_UNDEAD)
      call UnitApplyTimedLife(f, 'BTLF', CONTAMINATE_SUMMON_DURATION)
      call SetUnitExploded(f, true)

      call DestroyEffect(AddSpecialEffectLoc(CONTAMINATE_EFFECT, loc))
    endif
    set i = i + 1
  endloop

  call RemoveLocation(loc)
  set f = null
  set loc = null
  set u = null
endfunction

function SCOnCastFilter takes nothing returns boolean
  return CONTAMINATE == GetSpellAbilityId() 
endfunction

function SCTimerExpirationCallback takes nothing returns nothing
  local integer i = 0
  local timer t = GetExpiredTimer()
  local integer j = 0
  loop
    exitwhen i >= SCQuantity
    if t == SCTimerExpiration[i] then
      call RemoveLocation(SCLoc[i])
      call DestroyTimer(SCTimerExpiration[i])
      call DestroyEffect(SCEffect[i])

      /* Pull other instances down the stack,
      to preserve the creation order,
      that is relevant in resolving application conflicts. */
      set j = i + 1
      loop
        exitwhen j >= SCQuantity
	set SCEffect[j - 1] = SCEffect[j]
	set SCLevel[j - 1] = SCLevel[j]
	set SCLoc[j - 1] = SCLoc[j]
	set SCOwner[j - 1] = SCOwner[j]
	set j = j + 1
      endloop
      /* Accessing out of array size elements terminates the game,
      instead of returning null,
      hence the ugly patch that follows. */
      set SCQuantity = SCQuantity - 1
      set SCEffect[SCQuantity] = null
      set SCLevel[SCQuantity] = 0
      set SCLoc[SCQuantity] = null
      set SCOwner[SCQuantity] = null

      set t = null
      /* Assume each timer in the array is unique. */
      return
    endif
    set i = i + 1
  endloop
endfunction

function SCOnCastCallback takes nothing returns nothing
  local unit c = GetSpellAbilityUnit()
  local integer i = SCQuantity
  local location loc = null

  if i >= JASS_MAX_ARRAY_SIZE then
    return
  endif

  set loc = GetSpellTargetLoc()
  set SCEffect[i] = AddSpecialEffectLoc(CONTAMINATE_EFFECT, loc)
  set SCLoc[i] = loc
  set SCOwner[i] = GetOwningPlayer(c)
  set SCLevel[i] = GetUnitAbilityLevel(c, CONTAMINATE)
  set SCTimerExpiration[i] = CreateTimer()
  call TimerStart(SCTimerExpiration[i], CONTAMINATE_DURATION, false, function SCTimerExpirationCallback)

  set SCQuantity = SCQuantity + 1

  set c = null
  set loc = null
endfunction

function initSpellContaminate takes nothing returns nothing
  local trigger t = CreateTrigger()
  local trigger t2 = CreateTrigger()

  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
  call TriggerAddCondition(t, Condition(function SCOnCastFilter))
  call TriggerAddAction(t, function SCOnCastCallback)

  call TriggerRegisterAnyUnitEventBJ(t2, EVENT_PLAYER_UNIT_DEATH)
  call TriggerAddCondition(t2, Condition(function SCOnDeathFilter))
  call TriggerAddAction(t2, function SCOnDeathCallback)

  set t = null
  set t2 = null
endfunction
/* end SpellContaminate.j */
  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
  call TriggerAddCondition(t, Condition(function SCOnCastFilter))
  call TriggerAddAction(t, function SCOnCastCallback)
...
  set loc = GetSpellTargetLoc()
Хотя мне казалось что заклинания которые юнит поддерживает (channeling) тоже запускают "EVENT_PLAYER_UNIT_SPELL_CAST".
0
28
5 лет назад
Отредактирован PT153
0
Хотя мне казалось что заклинания которые юнит поддерживает (channeling) тоже запускают "EVENT_PLAYER_UNIT_SPELL_CAST".
Я тестировал, EVENT_PLAYER_UNIT_SPELL_CAST и EVENT_PLAYER_UNIT_SPELL_CHANNEL абсолютно одинаковые события.
А что именно не работает?

constant native GetSpellTargetLoc           takes nothing returns location
Лучше это.
constant native GetSpellTargetX				takes nothing returns real
constant native GetSpellTargetY				takes nothing returns real

function SCOnDeathFilter takes nothing returns boolean
  local boolean isConvertable = false
  local unit u = GetDyingUnit()
  set isConvertable = not IsUnitType(u, UNIT_TYPE_UNDEAD) and not IsUnitType(u, UNIT_TYPE_MECHANICAL)
  return isConvertable and (SCQuantity > 0)
endfunction
Забыл про обнуление.
function SCOnDeathFilter takes nothing returns boolean
    return (SCQuantity > 0) and not (IsUnitType(GetDyingUnit(), UNIT_TYPE_UNDEAD) or IsUnitType(GetDyingUnit(), UNIT_TYPE_MECHANICAL))
endfunction
0
21
5 лет назад
0
PT153, ты уверен? точно одно не срабатывает раньше другого?
0
29
5 лет назад
Отредактирован nazarpunk
0
Лучше это.
constant native GetSpellTargetX takes nothing returns real
constant native GetSpellTargetY takes nothing returns real
Странно, Function List о них не знает
function SCOnCastCallback takes nothing returns nothing
// Забыли 
call RemoveLocation(loc)
И заклинание лучше всего в library обернуть.
Загруженные файлы
0
28
5 лет назад
Отредактирован PT153
0
ты уверен? точно одно не срабатывает раньше другого?
Может одно и срабатывает раньше на пару микро или наносекунд.
Нет, я ставил таймер, они срабатываю одновременно.
Я хотел статейку накатать о способностях вообще, но лень)
Вот тестовая карта.
Загруженные файлы
0
22
5 лет назад
0
Нет, не забыл. SCTimerExpirationCallback
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.