Модуль небольшой, который вывел из модуля дока, за что credits ему.
Использует interface теперь, и теперь можно запускать хоть методы, хоть функции вне него, короче как вам удобнее.
Также добавил пример использования функции.
Какие приемущества перед другими модулями?
- Невесомый, и может использоваться абсолютно в любой структуре, даже не в спеллах
- Можно использовать в структуре которая может инициилизировать несколько спеллов (грубо говоря у вас одна структура на все тригерные магии)
vJass
function interface push takes integer this returns nothing defaults nothing
//! nocjass
module list
readonly static thistype array data
readonly static integer count = 0
boolean flush = false
push press
method add takes nothing returns nothing
set thistype.data[thistype.count] = this
set thistype.count = thistype.count + 1
endmethod
method remove takes integer i returns nothing
set thistype.count = thistype.count - 1
set thistype.data[i] = thistype.data[thistype.count]
endmethod
static method update takes nothing returns nothing
local integer i = 0
loop
exitwhen i==thistype.count
if thistype.data[i].flush then
call thistype.data[i].destroy()
call thistype.data[i].remove(i)
set i = i - 1
else
call thistype.data[i].press(thistype.data[i]).evaluate()
endif
set i = i + 1
endloop
endmethod
endmodule
//! endnocjass
cJass
function interface push takes integer this returns nothing defaults nothing
define <implement list>={
readonly static thistype data[]
readonly static integer count = 0
boolean flush = false
push press
nothing add(){thistype.data[thistype.count++] = this}
nothing remove(integer i){thistype.data[i] = thistype.data[--thistype.count]}
static nothing update(){
integer i = 0
whilenot(i == thistype.count){
if (thistype.data[i].flush){
thistype.data[i].destroy()
thistype.data[i].remove(i--)
} else {thistype.data[i].press(thistype.data[i]).evaluate()}i++}}
}
}
Ну и собственно пример.
struct spell
static timer tt=CreateTimer()
unit cast
unit targ
real time
implement list
endstruct
function onTimer takes spell this returns nothing
set this.time = this.time - 0.04
if this.time < 0.04 then
if GetWidgetLife(this.targ)>.405 or GetWidgetLife(this.cast)>.405 then
call SetUnitX(this.targ,GetUnitX(this.cast))
call SetUnitY(this.targ,GetUnitY(this.cast))
endif
call this.remove(this)
call this.destroy()
if spell.count == 0 then
call PauseTimer(spell.tt)
endif
endif
endfunction
function Cast takes nothing returns nothing
local spell this = spell.create
set this.cast = GetTriggerUnit()
set this.targ = GetSpellTargetUnit()
set this.time = GetUnitAbilityLevel(this.cast,GetSpellAbilityId())
set this.push = onTimer
call this.add()
if spell.count==0 then
call TimerStart(spell.tt,0.04,true,function this.update)
endif
endfunction
Проще говоря, нет ты=)
Ред. Nerevar
ты так и не ответил, к чему ты будешь крепить UserData своей структуры при цикличном выполнении функции. Опять позоришься, я уже понял что ты [вырезано] и готов опозориться посредственными знаниями включая это.
Faion: Ты смотришь на байты, а я смотрю на общее количество запускаемого дерьма получаемого в итоге.
Ред. Nerevar
чувак, ты знал (а если не знал, то попроси кого нить разложить хештейбл на составные чтобы подтвердить что ты человек который не знает, что первый индекс таблицы лучше не ставить высоких значений)
Ред. Nerevar
ScorpioT1000: в вк3, создаются иначе они.
call savehashtable (hashtable,xxx,yyy,data)
xxx - сохранённая таблица в таблице, лол
ууу - ячейка, с сортировкой (первая не сортируется -__-)
data - данные, декодируются в индификатор (там в общем, все типы хендла декодируются в агент, потом в хендл, короче там тухлая рекодировка, быстрее чем cache медленее чем структуры и прямой доступ)
Ред. Nerevar
Ред. Nerevar
Ред. Nerevar
ой я тред перепутал сори
this to false if something else in your map already uses UnitUserData.
A hashtable will be used instead, but it is about 60% slower.
Also you can use struct data, but it is about 30% slower.
Ред. Doc