Добавлен map_maiker
Написал простенькую систему разброса урона, чисто jass без диалектов и мемхака.
Собственно, вопрос в том, оптимально ли это или есть какие-то неочевидные минусы, способные как-то навредить?
Собственно, вопрос в том, оптимально ли это или есть какие-то неочевидные минусы, способные как-то навредить?
//attack -> add damage event -> function
function damaging takes nothing returns nothing
local integer i = 0
local integer h = GetHandleId(GetExpiredTimer())
local unit damager = LoadUnitHandle(udg_data, h, 0)
local unit damaged = LoadUnitHandle(udg_data, h, 1)
local real radius = GetRandomReal(udg_minradius, udg_maxradius)
local location tmp = PolarProjectionBJ(GetUnitLoc(damaged), radius, GetRandomReal(0, 360))
local unit u = CreateUnit(GetOwningPlayer(damager), 'h000', GetLocationX(tmp), GetLocationY(tmp), 0 )
call SetUnitInvulnerable( damaged, false )
call DestroyEffect(AddSpecialEffectLoc( udg_effect_name, tmp ))
call UnitDamagePointLoc( u, 0, udg_damage_radius, tmp, udg_damage, ATTACK_TYPE_PIERCE, DAMAGE_TYPE_NORMAL )
call RemoveUnit(u)
set u = null
endfunction
function get_damage takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(GetTriggeringTrigger())
local unit damager = LoadUnitHandle(udg_data, h, 0)
local unit damaged = LoadUnitHandle(udg_data, h, 1)
local integer h = GetHandleId(t)
call SaveUnitHandle(udg_data, h, 0, damager)
call SaveUnitHandle(udg_data, h, 1, damaged)
call SetUnitInvulnerable( GetTriggerUnit(), true )
call TimerStart(t, 0.0, false, function damaging)
call DestroyTrigger(GetTriggeringTrigger())
endfunction
function Trig_attacking_Conditions takes nothing returns boolean
return GetUnitTypeId(GetAttacker()) == 'hrif'
endfunction
function Trig_attacking_Actions takes nothing returns nothing
local trigger t = CreateTrigger()
local integer h = GetHandleId(t)
call TriggerRegisterUnitEvent( t, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
call TriggerAddAction(t, function get_damage)
call SaveUnitHandle(udg_data, h, 0, GetAttacker())
call SaveUnitHandle(udg_data, h, 1, GetTriggerUnit())
endfunction
function InitTrig_attacking takes nothing returns nothing
set gg_trg_attacking = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_attacking, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_attacking, Condition( function Trig_attacking_Conditions ) )
call TriggerAddAction( gg_trg_attacking, function Trig_attacking_Actions )
endfunction
Принятый ответ
Нет, не оптимально, юзаешь точки вместо координат и даже не обнуляешь их, переменные юнитов тоже не обнулил, таймеры не обнуляешь, да и локальные триггеры тоже в null можно
local location tmp = PolarProjectionBJ(GetUnitLoc(damaged), radius, GetRandomReal(0, 360))
-->
local real x = GetUnitX(damaged)+radius*Cos(GetRandomReal(0,360)*bj_DEGTORAD))
local real y = GetUnitY(damaged)+radius*Sin(GetRandomReal(0,360)*bj_DEGTORAD))
local unit u = CreateUnit(GetOwningPlayer(damager), 'h000',x, y, 0 )
Координаты обнулять не нужно
call UnitDamagePointLoc( u, 0, udg_damage_radius, tmp, udg_damage, ATTACK_TYPE_PIERCE, DAMAGE_TYPE_NORMAL )
Функция дамажит всех без исключения если не ошибаюсь, лучше самим юнитом через цикл/группу дамажить юнитов
Функция дамажит всех без исключения если не ошибаюсь, лучше самим юнитом через цикл/группу дамажить юнитов
Ой посмотрел на это всё, вообще желательно всё переписать, зачем сохранять что-то в хэш-таблицу если ты уже создал триггер для этого
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован rsfghd
Функция дамажит всех без исключения если не ошибаюсь, лучше самим юнитом через цикл/группу дамажить юнитов
call TriggerAddCondition( gg_trg_attacking, function Trig_attacking_Actions )
и оно будет работать?
rsfghd:
Отредактирован rsfghd
rsfghd:
makkad: Хм, а что Filter делает?
Многое теряешь без джнгп, и скорее всего, мою версию не заценишь
На счёт твоей версии - мб и заценю...