Добавлен Roflan
Я изучаю 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, там всё в разы проще))
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Roflan
Мне нужно перенести всех юнитов и точки через call GroupEnumUnitsInRange(), но функция к которой он ссылается реагирует только на GetEnumUnit()
в итоге получается ерунда
Качаешь VS code (инфа у меня в профиле)
Смотришь наработки NazarPunk, учишься по ним
Roflan, передаёшь глобалками просто. В фильтре делаешь проверки, наносишь урон и возвращаешь false, тогда и группу чистить не надо.
Отредактирован PT153
Вообще, я имел в виду, передачу значений в фильтр, то есть вот так.
Отредактирован prog
Я про перезапись глобалок t_Ball и t_Owner из твоего примера, если они еще где-то используются в месте, которое может быть вызвано через реакцию на нанесение урона. Случай довольно редкий, но случается рано или поздно, если не учитывать такую возможность и бездумно использовать одни и те же глобалки в нескольких системах.
Отредактирован Roflan
Roflan:
Записал кастера в глобалку и сохранил локально в F_damager. Все сработало, спасибо.