Добавлен 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 )
Функция дамажит всех без исключения если не ошибаюсь, лучше самим юнитом через цикл/группу дамажить юнитов
Функция дамажит всех без исключения если не ошибаюсь, лучше самим юнитом через цикл/группу дамажить юнитов
Ой посмотрел на это всё, вообще желательно всё переписать, зачем сохранять что-то в хэш-таблицу если ты уже создал триггер для этого
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован makkad
Отредактирован PT153
Filter() и Condition() одно и то же
Отредактирован quq_CCCP
Про кондишены правильно написал лич, ибо триггер акшин это объект, который сам по себе не удаляется.
PT153:
quq_CCCP:
quq_CCCP: К мемхаку я только присматриваюсь. Издалека. Мб и до него руки дойдут.
Ну и естественно компенсировать лечение от отрицательного маг урона, забирать пассивку браслетов и еще раз наносить урон от лица того кто до этого нанес урон, при этом отключив триггеры реагирующие на урон, после вернуть все наместо. Вот такая реализация кроме ресурсоемкости уже почти идеальна и как то заобузить или забаговать её не получится.