Добавлен
Я изучаю jass и попробовал написать простой огненный шар, который летит и наносит всем на пути урон. Шар у меня летит нормально а с нанесением урона у меня возникают трудности. Конкретно с функцией GetEnumUnitsInRange(). Как правильно передавать через нее все локальные переменные?
globals
    group FGroup = CreateGroup()
    location array Point
    unit array temp
endglobals
  
function Trigger_SpellFireball_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()  
    local location point1 = GetUnitLoc(u)
    local location point2 = GetSpellTargetLoc()
    local unit fireball = CreateUnitAtLoc(GetTriggerPlayer(), 'h021', point1, 0)
    local integer cv = GetUnitUserData(fireball) // У меня стоит система Unit Indexer
  
    call SetUnitAnimationByIndex(u, 3)
    set Point[cv] = point2
    set temp[cv] = fireball
    call GroupAddUnit(FGroup, fireball)
  
    set u = null
    set point1 = null
    set point2 = null
    set fireball = null
endfunction

function Trigger_SpellFireball_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A02P'
endfunction
//===========================================================================
function InitTrig_SpellFireball takes nothing returns nothing
    set gg_trg_SpellFireball = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SpellFireball, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_SpellFireball , Condition(function Trigger_SpellFireball_Conditions))
    call TriggerAddAction( gg_trg_SpellFireball, function Trigger_SpellFireball_Actions )
endfunction
function F_damager takes nothing returns nothing

//call UnitDamageTarget(??, GetFilterUnit(), 50, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)

// как сюда передать кастера и цели? как не надамажить союзных юнитов?

endfunction

function F_Callback takes nothing returns nothing
    local integer cv = GetUnitUserData(GetEnumUnit())
    local group damagegroup = CreateGroup()
    local location point1 = GetUnitLoc(GetEnumUnit())
    local location point2 = Point[cv]
    local real facing = AngleBetweenPoints(point1, point2)
    local real x = GetLocationX(point1) + 20 * Cos(facing * bj_DEGTORAD)
    local real y = GetLocationY(point1) + 20 * Sin(facing * bj_DEGTORAD)
  
  
  
    if DistanceBetweenPoints(point1, point2) > 20 then
    call SetUnitPosition(GetEnumUnit(), x, y)
    call DestroyEffect(AddSpecialEffectLoc("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",point1))
    call GroupEnumUnitsInRange(damagegroup, x,y, 250, Filter(function F_damager))
    call GroupClear(damagegroup)
    else
    call KillUnit(GetEnumUnit())
    call GroupRemoveUnit(FGroup, GetEnumUnit())
    call GroupClear(damagegroup)
    endif
  
endfunction

function Trig_SpellFireballMover_Actions takes nothing returns nothing
    call ForGroup(FGroup, function F_Callback)
endfunction

//===========================================================================
function InitTrig_SpellFireballMover takes nothing returns nothing
    set gg_trg_SpellFireballMover = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_SpellFireballMover, 0.03 )
    call TriggerAddAction( gg_trg_SpellFireballMover, function Trig_SpellFireballMover_Actions )
endfunction
 
Как это заставить работать? Может нужно использовать struct'ы? если да то как это должно выглядеть

если да то как это должно выглядеть
Посмотрите в этой наработке, там структуры с хэштаблицами а таймерами.
Не используйте точки
local location point1 = GetUnitLoc(u)
local location point2 = GetSpellTargetLoc()
// Где RemoveLocation() ?
Лучше координаты
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()

Или переходите на lua, там всё в разы проще))
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
30
если да то как это должно выглядеть
Посмотрите в этой наработке, там структуры с хэштаблицами а таймерами.
Не используйте точки
local location point1 = GetUnitLoc(u)
local location point2 = GetSpellTargetLoc()
// Где RemoveLocation() ?
Лучше координаты
local real casterX = GetUnitX(caster)
local real casterY = GetUnitY(caster)
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()

Или переходите на lua, там всё в разы проще))
Принятый ответ
4
Не могу прочесть, сложный для меня код :(
Мне нужно перенести всех юнитов и точки через call GroupEnumUnitsInRange(), но функция к которой он ссылается реагирует только на GetEnumUnit()
в итоге получается ерунда
UnitDamageTarget(??, GetEnumUnit(), 50
30
Roflan, без хэштаблиц или структур у вас всёравно MUI не получится, а так можете через глобалки перебросить. Но лучше ненужно.
33
Roflan, переходи сразу на луа, пока ещё Jass не затуманил тебе мозг своей кривостью (как мне),
а как перейти?
Качаешь 131 PTR
Качаешь VS code (инфа у меня в профиле)
Смотришь наработки NazarPunk, учишься по ним
30
Смотришь наработки NazarPunk, учишься по ним
Фаербол на lua очень просто реализуется, если нужно могу вечером опубликовать.
4
Фаербол на lua очень просто реализуется, если нужно могу вечером опубликовать.
Было бы здорово, я посмотрю
28
Но лучше ненужно.
Можно, ведь код выполняется линейно, потому проблем не будет. На этом основан весь vJass.
Roflan, передаёшь глобалками просто. В фильтре делаешь проверки, наносишь урон и возвращаешь false, тогда и группу чистить не надо.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.