vJass модуль list

Добавлен , опубликован
Модуль небольшой, который вывел из модуля дока, за что credits ему.
Использует interface теперь, и теперь можно запускать хоть методы, хоть функции вне него, короче как вам удобнее.
Также добавил пример использования функции.
Какие приемущества перед другими модулями?
  1. Невесомый, и может использоваться абсолютно в любой структуре, даже не в спеллах
  2. Можно использовать в структуре которая может инициилизировать несколько спеллов (грубо говоря у вас одна структура на все тригерные магии)
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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
29
YellowStar, во, годно. С функшн интерфейс я тоже хотел сделать, но чото было лень.
Только должно быть press.evaluate вроде.
19
да точно, лол, ну я тут наживую редактировал, без JNGP
38
А вот слабо написать такой класс MUISpell, чтобы данный код безо всяких добавлений начал работать (по логике названий функций из него):
struct spell extends MUISpell
    unit cast
    unit targ
    real time

function onSpellCastStart takes nothing returns nothing
    // ...
endfunction

function onSpellCastEnd takes nothing event returns nothing
    // ...
endfunction

function onCastTimerTick takes nothing event returns nothing
    // ...
endfunction

function onEffectTimerTick takes nothing event returns nothing
    // ...
endfunction

endstruct

//...
MUISpell.Initialize( spell.create(), 0.04 )
24
Неочем. Мои шаблоны более гибкие и дают большую производительность, ибо все формируется в единый код, без всяких лишних левых вызовов.
38
На самом деле у векса уже стопицот лет назад было решение, которое круче всех ваших, там были хуки на все эвенты и очень удобно.
38
Faion, ну сделай паб версию тогда своего творения. С описанием и примерами.
24
ScorpioT1000, это не система, это методика.
Пример я уже выкладывал давно тут. Подробно все расписывать смысла не вижу, ибо кто не понял кода, тот попросту не достоин.
38
Faion, #define TMoveDummyToCoord(spellDummy, xCoord, yCoord, speed, onPeriod, onEnd)
а где же интерполяции, безье, акселерации, деселерации, рикошеты и прочее? Нихрена там не универсально =(
24
ScorpioT1000, Блин, не тупи=) Это не мувинг система, не физика, или еще что то. Это шаблон конкретного назначения, который позволяет через аргумент шаблона передать любые инструкции, которые выполнятся на нужном этапе, которые в т.ч. могут даже повлиять на то что в шаблоне. К примеру можно передать код, в котором будет какое то условие + килл юнита и тд. Т.е. это скелет, а дальше навешивай что душе угодно и он позволяет сделать то, что нельзя сделать в любой другой системе без использования костылей.
И да подразумевается использование 1 шаблона под 1 конкретную проблему, офк с поддержкой расширения. Бтв в шаблон можно передавать другой шаблон, с другими параметрами, и прочие эпики творить.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.