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