Если конусная способность на подобии тёмной стаи, то можно использовать эту функцию из сайта:
// Возвращает true : Если угол находится между двумя углами
function IsAngleBetweenAngles takes real angle, real angle1, real angle2 returns boolean
local real x
set angle = ModuloReal(angle, 360)
set angle1 = ModuloReal(angle1, 360)
set angle2 = ModuloReal(angle2, 360)
if (angle1 > angle2) then
set x = angle1
set angle1 = angle2
set angle2 = x
endif
if (angle2 - angle1) > (angle1 - (angle2-360)) then
set angle2 = angle2 - 360
if angle > 180 then
set angle = angle-360
endif
return angle >= angle2 and angle <= angle1
endif
return (angle >= angle1) and (angle <= angle2)
endfunction
Можно проверить суммой площадей, если сумма 3-ех треугольников, образованных этой точкой равны площади изначального треугольника, то скорее всего точка принадлежит треугольнику. Вот еще.
// Convert a integer id value into a 4-letter id code.
function DebugIdInteger2IdString takes integer value returns string
local string charMap = ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."
local string result = ""
local integer remainingValue = value
local integer charValue
local integer byteno
set byteno = 0
loop
set charValue = ModuloInteger(remainingValue, 256)
set remainingValue = remainingValue / 256
set result = SubString(charMap, charValue, charValue + 1) + result
set byteno = byteno + 1
exitwhen byteno == 4
endloop
return result
endfunction
Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
function interface callback takes integer this returns nothing defaults nothing
struct linkedList
private static timer period = null
private real curTimeout
private real timeout
private thistype prev
private thistype next
private callback handlerFunc
static constant method operator listPeriod takes nothing returns real
return 0.01
endmethod
method destroy takes nothing returns nothing
set this.prev.next = this.next
set this.next.prev = this.prev
if (thistype(0).next == thistype(0)) then
call PauseTimer(this.period)
endif
call thistype.deallocate(this)
endmethod
private static method iterate takes nothing returns nothing
local thistype this = thistype(0).next
loop
exitwhen (this == thistype(0))
set this.curTimeout = this.curTimeout + thistype.listPeriod
if (this.curTimeout >= this.timeout) then
set this.curTimeout = 0.0
call this.handlerFunc.evaluate(integer(this))
endif
set this = this.next
endloop
endmethod
static method create takes real timeout, callback handlerFunc returns thistype
local thistype this = thistype.allocate()
set this.next = thistype(0)
set this.prev = thistype(0).prev
set this.next.prev = this
set this.prev.next = this
set this.timeout = timeout
set this.curTimeout = 0.0
set this.handlerFunc = handlerFunc
if (thistype.period == null) then
set thistype.period = CreateTimerEx()
endif
if (this.prev == thistype(0)) then
call TimerStart(thistype.period, thistype.listPeriod, true, function thistype.iterate)
endif
return this
endmethod
endstruct
Будет ли это создавать большую нагрузку на игру из-за низкого периода таймера, несмотря на то, что таймер хоть и работает с низкой частотой, он ничего толком то и не делает, кроме арифметических вычислений?
easypeasy, Cобытие "Юнит атакован" срабатывает в момент начала атаки, а не в момент получения удара. А будет ли удар критическим или нет, высчитывается еще до начала события "Юнит атакован". В вашем случае удар не критический потому что способность добавляется уже после того, как игра решит, будет ли удар критическим или нет. Поэтому я порекомендовал перезапустить атаку юниту, чтобы новый замах шёл с уже добавленной способностью.
Нет, не сложно. Всего лишь нужно сохранить копию куда-нибудь и отлавливать касты оригинала, после отлова отдавать такой же приказ на каст, но уже копие.
» WarCraft 3 / Сustomize Editor Categories
» WarCraft 3 / Сustomize Editor Categories
» WarCraft 3 / Скорость дамми юнита
Ред. scopterectus
» WarCraft 3 / Область с формой треугольника
Ред. scopterectus
» WarCraft 3 / Область с формой треугольника
» WarCraft 3 / Область с формой треугольника
Вот еще.
» WarCraft 3 / Как знать Id любой абилки которую применил?
Ред. scopterectus
» WarCraft 3 / Как знать Id любой абилки которую применил?
Custom Script: call BJDebugMsg("Ability Id: " + DebugIdInteger2IdString(GetSpellAbilityId()))
» WarCraft 3 / Моноширинный шрифт
» WarCraft 3 / Не перемещается область для события. Что делать?
» WarCraft 3 / Система -kill на GUI
» WarCraft 3 / Утечное событие?
» WarCraft 3 / Триггерное количество еды
» WarCraft 3 / GetRealId( )
Ред. scopterectus
» WarCraft 3 / GetRealId( )
» WarCraft 3 / Не воспроизводится музыка (SetMapMusic())
» WarCraft 3 / Как сделать первый удар с крита?
» WarCraft 3 / Как сделать первый удар с крита?
» WarCraft 3 / Как сделать первый удар с крита?
» WarCraft 3 / Как сделать первый удар с крита?
» WarCraft 3 / Как сделать первый удар с крита?
, когда триггер сработает.
Ред. scopterectus
» WarCraft 3 / Описание предмета
» WarCraft 3 / Описание предмета
Ctrl + Enter - тоже переход
Ред. scopterectus
» WarCraft 3 / Jass заклинание Комбо
» WarCraft 3 / Jass заклинание Комбо