Foro especializado en Warcraft III y su editor
 
BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarse
Eventos Actuales
¡ Bienvenido Invitado !

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte
 

 And now... Buffs [EXTENSION GUI]

Ver el tema anterior Ver el tema siguiente Ir abajo 
Ir a la página : 1, 2  Siguiente
AutorMensaje
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Jue Oct 24, 2013 9:07 pm

Librería Buffs, espero les guste .3

Código:
[jass]library Buffs requires optional MS, optional AS, optional AM, optional AD, optional MP, optional Stun, optional Life, optional Mana, optional DR, optional DC, optional RM
// By Marcos_M
// Agradecimientos a MuSe por librería Slow que sirvió de base
// Y a Sauron por ser ayudador y aportar el sistema de daño

// Versión 1.2

///////////////////////////////////////////////////////////////////////////
// Changelog                                                             //
//                                                                       //
// 1.0  -Publicado                                                       //
// 1.1  -Agregado 2 variables booleanas al struct base                   //
//      negative(implica si es un buff negativo o positivo)              //
//      nonpurgable(si es true, este buff no puede removerse)            //
//      -Agregada la función RemoveBuffs takes unit u, boolean negatives //
//      Remueve los buffs positivos o negativos de la unidad indicada    //
//      -Agregado buff "RM"(Regeneración de maná en porcentaje)          //
//      -Bugs arreglados..                                               //
// 1.2  -Librerías RM, Life y Mana corregidas                            //
//      -Bugs arreglados..                                               //
///////////////////////////////////////////////////////////////////////////

/*  El funcionamiento de esta librería es peculiar, está hecha por y para mí(ya que yo la usaré :_ )
Así que hay cosas que DEBEN ser así.

    Los buffs que permite son los siguientes

        AS (Velocidad de ataque)
        MS (Velocidad de movimiento)
        AM (Modificador de ataque[es en base a porcentaje])
        AD (Modificador de ataque[en base a número entero])
        MP (Probabilidad de fallar)
        MR (Resistencia mágica)
        DR (Reducción de daño recibido)
        DC (Aumento de daño causado)
        RM (Regeneración de maná en porcentaje)
        Armor (Modificador de armadura[en base a número entero])
        Damage (Daño periódico[incluye curaciones si se coloca valor negativo])
        ManaBurn (Quemar maná)
        Life (Modificador de vida máxima)
        Mana (Modificador de maná máximo)
        
    Si se les ocurre algo más son libres de crearlo y agregarlo(animation speed o turn speed?)
        
*/

    globals
    
        private hashtable HashTable = InitHashtable()
        
    endglobals
    
    function GetBuffAbil takes integer buff1 returns integer
        return LoadInteger(HashTable, buff1, 0)
    endfunction
    
    //////////////////// Funciones del sistema y struct Base /////////////////////////
    
    function GetLoss takes unit u, string buffType returns integer
        return LoadInteger(HashTable, GetHandleId(u), StringHash(buffType))
    endfunction

///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
    
    function GetBonus takes unit u, string buffType returns integer
        return -LoadInteger(HashTable, GetHandleId(u), StringHash(buffType))
    endfunction
    
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

    struct Buff
        
        integer INS
        unit target
        integer buff1
        integer array percentage[14]
        real intervalo
        real duration
        string array BuffType[14]
        integer BuffUseds
        timer t
        boolean negative = true
        boolean nonpurgable
        integer abil
        
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////
        
        method GetABuff takes unit u returns integer
            local integer n
            local integer I = -8192
            local integer Id = GetHandleId(u)
            local integer i = LoadInteger(HashTable, Id, 0)
            local Buff b
        
            loop
            
                set b = LoadInteger(HashTable, Id, i)
                    
                if b.buff1 != I then
                
                    set n = I
                    exitwhen true
                    
                endif
            
                set i = i - 1
                set I = I + 1
                
            endloop
            
            return n
        endmethod
 
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////
 
        method ApplyDamage takes unit caster, unit target, real damage, boolean pureDamage returns nothing
            if damage >= 0 then
                                
                if pureDamage then
                    call UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, null)
                else
                    call UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
                endif
                            
            else
                            
                call SetWidgetLife(target, GetWidgetLife(target) - damage)
                        
            endif
        endmethod
        
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////
        
        method ApplyManaBurn takes unit u, real damage returns nothing
            
            call SetUnitState(u, UNIT_STATE_MANA, GetUnitState(u, UNIT_STATE_MANA) - damage)
            
        endmethod
        
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////
        
        method Apply takes unit u, integer percentage, string buffType returns nothing
            local integer n
            if .negative then
                set n = percentage
            else
                set n = percentage*-1
            endif
            
            /**/if buffType == "AS" then
                static if LIBRARY_AS then
                    call ApplyAS(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "MS" then                    
                static if LIBRARY_MS then
                    call ApplyMS(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "AM" then
                static if LIBRARY_AM then
                    call ApplyAM(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "AD" then
                static if LIBRARY_AD then
                    call ApplyAD(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "MP" then
                static if LIBRARY_MP then
                    call ApplyMP(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "MR" then
                static if LIBRARY_MR then
                    call ApplyMR(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            /*elseif buffType == "DR" then
                static if LIBRARY_DR then
                    call ApplyDR(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "DC" then
                static if LIBRARY_DC then
                    call ApplyDC(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif*/
            elseif buffType == "Armor" then
                static if LIBRARY_Armor then
                    call ApplyArmor(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "Life" then
                static if LIBRARY_Life then
                    call ApplyLife(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "Mana" then
                static if LIBRARY_Mana then
                    call ApplyMana(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            elseif buffType == "RM" then
                static if LIBRARY_RM then
                    call ApplyRM(u, n)
                else
                    call BJDebugMsg("BUFF_INEXISTENTE")
                endif
            else
                call BJDebugMsg("BUFF_INEXISTENTE")
            endif
            
        endmethod
        
        static method create takes integer buff1, boolean negative, boolean nonpurgable returns thistype
            local thistype this = thistype.allocate()
            
            set this.buff1 = buff1
            set this.negative = negative
            set this.nonpurgable = nonpurgable
            set this.abil = GetBuffAbil(buff1)
            
            return this
        endmethod
        
        stub method onApply takes nothing returns nothing
        
        endmethod
        
        stub method onPeriodic takes nothing returns nothing
            
        endmethod
        
        stub method onRemove takes nothing returns nothing
            
        endmethod
        
        stub method onRefresh takes nothing returns nothing
            
        endmethod
        
        method destroy takes nothing returns nothing
            local integer n = 0
            call UnitMakeAbilityPermanent(.target,false,.abil)
            call UnitRemoveAbility(.target,.abil)
            call UnitRemoveAbility(.target,.buff1)
            
            loop
                set n = n + 1
                
                set .BuffType[n] = ""
                set .percentage[n] = 0
            
                exitwhen n == .BuffUseds
            endloop
            
            set .BuffUseds = 0
            set .t = null
            set .target = null
            set .buff1 = 0
            set .abil = 0
            
            call this.deallocate()
        endmethod
        
    endstruct
    
    
    
    ///////////////////////////////////////////////////////////////////////////////////////
    //////////// CODIGO DEL SISTEMA. NO TOCAR SI NO SABES LO QUE HACES ////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////
    
    private function Timer takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local integer Id = GetHandleId(t)
        local Buff whichBuff = LoadInteger(HashTable, Id, 0)
        local integer n = 0
        local integer gL
        local integer int
        
        loop
            set n = n + 1
                
            call SaveInteger(HashTable, GetHandleId(whichBuff.target), StringHash(whichBuff.BuffType[n]), GetLoss(whichBuff.target, whichBuff.BuffType[n]) - whichBuff.percentage[n])
            
            exitwhen n == whichBuff.BuffUseds
        endloop
        
        set n = 0
        
        call whichBuff.onPeriodic()
        
        loop
            set n = n + 1
                
                if whichBuff.negative then
                    set gL = GetLoss(whichBuff.target,whichBuff.BuffType[n]) + whichBuff.percentage[n]
                else
                    set gL = GetLoss(whichBuff.target,whichBuff.BuffType[n]) - whichBuff.percentage[n]
                endif
                
                    call SaveInteger(HashTable, GetHandleId(whichBuff.target), StringHash(whichBuff.BuffType[n]), gL)
                    call whichBuff.Apply(whichBuff.target, gL, whichBuff.BuffType[n])
            
            exitwhen n >= whichBuff.BuffUseds
        endloop
        
        set n = 0
        
        if GetWidgetLife(whichBuff.target) <= 0.505 then
            set whichBuff.duration = 0.00
        else
            set whichBuff.duration = whichBuff.duration - whichBuff.intervalo
        endif
        
        if whichBuff.duration <= 0.00 then
            
            loop
                set n = n + 1
                
                if whichBuff.negative then
                    set int = GetLoss(whichBuff.target,whichBuff.BuffType[n]) - whichBuff.percentage[n]
                else
                    set int = GetLoss(whichBuff.target,whichBuff.BuffType[n]) + whichBuff.percentage[n]
                endif
                
                    call SaveInteger(HashTable, GetHandleId(whichBuff.target), StringHash(whichBuff.BuffType[n]), int)
                    call whichBuff.Apply(whichBuff.target, int, whichBuff.BuffType[n])
                
                exitwhen n >= whichBuff.BuffUseds
            endloop
            
            call whichBuff.onRemove()
            
            call RemoveSavedInteger(HashTable, GetHandleId(whichBuff.target), whichBuff.INS)
            
            call whichBuff.destroy()
            
            call FlushChildHashtable(HashTable, Id)
            
            
            call PauseTimer(t)
            call DestroyTimer(t)
        endif
        
            set t = null
    endfunction
    
    function HaveBuff takes unit u, integer whichBuff returns boolean
        local integer Id = GetHandleId(u)
        local integer i = LoadInteger(HashTable, Id, 0)
        local Buff b
        local boolean success = false
        
        loop
            
            set b = LoadInteger(HashTable, Id, i)
                
            if b.buff1 == whichBuff then
                
                set success = true
                
            endif
            
            set i = i - 1
            exitwhen i == 0 or success
        endloop
        
        return success
    endfunction
    
    function RemoveAllBuffs takes unit u returns nothing
        local integer Id = GetHandleId(u)
        local integer i = LoadInteger(HashTable, Id, 0)
        local Buff b
        
        loop
            
            set b = LoadInteger(HashTable, Id, i)
                
            if not(b.nonpurgable) then
                set b.duration = 0.00
                call TimerStart(b.t, 0.0,false, function Timer)
            endif
            set i = i - 1
            exitwhen i == 0
        endloop
        
    endfunction
    
    function RemoveBuffs takes unit u, boolean negatives returns nothing
        local integer Id = GetHandleId(u)
        local integer i = LoadInteger(HashTable, Id, 0)
        local Buff b
        
        loop
            
            set b = LoadInteger(HashTable, Id, i)
                
            if not(b.nonpurgable) and b.negative == negatives then
                set b.duration = 0.00
                call TimerStart(b.t, 0.0,false, function Timer)
            endif
            set i = i - 1
            exitwhen i == 0
        endloop
        
    
    endfunction
    
    function RemoveBuff takes unit u, integer whichBuff returns boolean
        local integer Id = GetHandleId(u)
        local integer i = LoadInteger(HashTable, Id, 0)
        local Buff b
        local boolean success = false
        
        loop
            
            set b = LoadInteger(HashTable, Id, i)
                
            if b.buff1 == whichBuff and not(b.nonpurgable) then
                
                set b.duration = 0.00
                call TimerStart(b.t, 0.0,false, function Timer)
                set success = true
                
            endif
            
            set i = i - 1
            exitwhen i == 0 or success
        endloop
                
        return success
    endfunction
    
    function AddBuff takes unit u, real intervalo, real duration, Buff whichBuff returns boolean
        local integer IdU = GetHandleId(u)
        local integer i = LoadInteger(HashTable, IdU, 0)
        local integer n = 0
        local timer t
        local integer Id
        local Buff b
        local integer int
        
        local boolean success = true
        
        loop
            exitwhen i == 0
            set b = LoadInteger(HashTable, IdU, i)
            if whichBuff.buff1 == b.buff1 then
                set success = false
                
                loop
                    set n = n + 1
                    
                    if b.negative then
                        call SaveInteger(HashTable, IdU, StringHash(b.BuffType[n]), GetLoss(u, b.BuffType[n]) - b.percentage[n])
                    else
                        call SaveInteger(HashTable, IdU, StringHash(b.BuffType[n]), GetLoss(u, b.BuffType[n]) + b.percentage[n])
                    endif
                    
                    exitwhen n >= b.BuffUseds
                endloop
                
                set n = 0
                call b.onRefresh()
                
                loop
                    set n = n + 1
                    
                    if b.negative then
                        set int = GetLoss(u, b.BuffType[n]) + b.percentage[n]
                    else
                        set int = GetLoss(u, b.BuffType[n]) - b.percentage[n]
                    endif
                    
                        call SaveInteger(HashTable, IdU, StringHash(b.BuffType[n]), int)
                        call b.Apply(b.target, int, b.BuffType[n])
                    
                    exitwhen n >= b.BuffUseds
                endloop
                
                if duration > b.duration then
                    set b.duration = duration
                endif
                
            endif
            
            set i = i - 1
            
        endloop    
        
        set i = LoadInteger(HashTable, IdU, 0) + 1
        
        if success then
            set t = CreateTimer()
            set Id = GetHandleId(t)
            
            call UnitAddAbility(u,whichBuff.abil)
            call UnitMakeAbilityPermanent(u,true,whichBuff.abil)
            set whichBuff.target = u
            set whichBuff.duration = duration
            set whichBuff.intervalo = intervalo
            set whichBuff.t = t
            set whichBuff.INS = i
            
            call SaveInteger(HashTable, Id, 0, whichBuff)
            
            call whichBuff.onApply()
            
            loop
                set n = n + 1
                
                if whichBuff.negative then
                    set int = GetLoss(u, whichBuff.BuffType[n]) + whichBuff.percentage[n]
                else
                    set int = GetLoss(u, whichBuff.BuffType[n]) - whichBuff.percentage[n]
                endif
                    call SaveInteger(HashTable, IdU, StringHash(whichBuff.BuffType[n]), int)
                    call whichBuff.Apply(whichBuff.target, int, whichBuff.BuffType[n])
                
                exitwhen n == whichBuff.BuffUseds
            endloop
            
            
            call SaveInteger(HashTable, IdU, i, whichBuff)
            call SaveInteger(HashTable, IdU, 0, i)
            
            call TimerStart(t, intervalo, true, function Timer)
            
            set t = null
        else
            
            call whichBuff.destroy()
            
        endif
        
        return success
    endfunction

    function RegisterBuff takes integer buff1, integer abil returns nothing
        call SaveInteger(HashTable,buff1,0,abil)
    endfunction
    
endlibrary[/jass]



Funciones que ofrece e instrucciones de uso:

Esta librería contiene las siguientes funciones
[jass]    function GetLoss takes unit u, string buffType returns integer
   
   Esto devuelve el porcentaje o cantidad(depende del buff) negativa que la unidad posee
   Devuelve valor negativo cuando el porcentaje o cantidad es positivo. Solo el otorgado por la librería
   
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   function GetBonus takes unit u, string buffType returns integer

   Esto devuelve el porcentaje o cantidad(depende del buff) positiva que la unidad posee
   Devuelve valor negativo cuando el porcentaje o cantidad es negativa. Solo el otorgado por la librería
   
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   function HaveBuff takes unit u, integer whichBuff returns boolean
   
   Colocamos la unidad y el ID del buff, y nos devolverá si la unidad contiene ese buff mediante la librería
   
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   function RemoveAllBuffs takes unit u returns nothing

   Remueve todos los buffs colocados por la librería de la unidad colocada
   
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   function RemoveBuff takes unit u, integer whichBuff returns boolean

   Colocas unidad y el ID del buff y lo remueve de la unidad. Devuelve verdadero si el buff le fue removido y falso si no tenía el buff
   
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   function RemoveBuffs takes unit u, boolean negatives returns nothing
   
   Remueve todos los buffs negativos o positivos, depende de la booleana, de una unidad.
   
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   function AddBuff takes unit u, real intervalo, real duration, Buff whichBuff returns boolean
   
   Esta es la función para agregar buffs. Toma una unidad, el tiempo entre intervalo, la duración total
   y el struct que otorga el buff
   [/jass]

Instrucciones de uso:
[jass]La librería viene con un struct base llamado Buff

Este usa las siguientes variables

   integer INS ==> Esta variable define la instancia de buff sobre la unidad
   unit target ==> Esta variable define a la unidad que recibe el buff(Se setea en AddBuff)
   integer buff1 ==> Esta variable es el ID del buff que colocaremos
   integer array percentage[14] ==> El porcentaje o cantidad del modificador de cada buff(el array se asocia con BuffType)
   real intervalo ==> Es el intervalo entre períodos(Se setea en AddBuff)
   real duration ==> La duración del buff hasta acabarse(Se setea en AddBuff)
   effect e ==> El efecto que se agrega a la unidad objetivo(Se crea solo al llamar a AddBuff y depende del ID del buff)
   string attachPoint ==> Punto de attachment a donde se agrega el efecto("origin", "chest", "overhead", etc.)
   string array BuffType[14] ==> El tipo de Buff(el array [0] no se utiliza, y las cadenas usadas son
                                   "MS", "AS", "AM", "MP", "AD", "MR", "Life", "Mana", "Armor", "DR", "DC"
                                   [Para DPS, ManaBurns y Stuns se crea otro struct, lo vemos más adelante])
   
   integer BuffUseds ==> La cantidad de modificadores usados por el struct
   timer t ==> Este es el timer que el buff usa(Se setea solo al llamar a AddBuff)
   boolean negative ==> True, y el  buff es negativo, false, y el buff es positivo
   boolean nonpurgable ==> True y el buff no podrá ser removido de la unidad
   
Y contiene los siguientes métodos

   method GetABuff takes unit u returns integer

   Este método es para cuando agregamos un buff pero no tenemos rawcode para el, crea un número y se lo otorgará a la unidad
   (No se crea efecto al usar esto)
   
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////

   method ApplyDamage takes unit caster, unit target, real damage, boolean pureDamage returns nothing
   
   Causa daño, toma una unidad que causará daño, la unidad que recibe el daño, el daño y una booleana para daña puro o daño mágico
   (Valores negativos curarán)
   
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
   
   method ApplyManaBurn takes unit u, real damage returns nothing
   
   Quita maná a la unidad colocada(Valor negativo aumenta el maná)
   
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
   
   method Apply takes unit u, integer percentage, string buffType returns nothing

   Este método no lo usarán, la librería lo llama solo. Aplica los modificadores de los buffs
   
   method destroy takes nothing returns nothing
   
   Destruye el efecto y nullea las variables.
   
Para agregar un buff utilizando el struct base es sencillo

   local Buff Nombre = Buff.create()
       
   set Nombre.attachPoint = attachpoint (como "origin")
   set Nombre.buff1 = El Rawcode del Buff (en Slow es 'Bslo')
   
   set Nombre.BuffType[1] = El buff que deseen (Por ejemplo: "DC")
   set Nombre.percentage[1] = Porcentaje (Por ejemplo: -120)
   set Nombre.BuffUseds = El numero que agregaron (Sería 1 en este caso)
   
   call AddBuff(Unidad, TiempoIntervalo, Duracion, Nombre)[/jass]

También pueden crear su propio struct para buffs(esa es la gracia de la librería) eso lo pueden hacer así:

[jass]Para crear un nuevo struct para Buffs es muy sencillo(siempre y cuando sepas algo de structs)

Se hace de la siguiente forma:

   struct Nombre extends Buff
       
       /* Pueden declarar variables extras (como Caster para buffs de daño, una variable real de daño, booleana de daño puro,
       también pueden usar efectos extras, stuns, etc.)*/
       unit caster
       real damage
       boolean pureDamage = false
       
       // Deben tener su método create, yo generalmente declaro los valores de mis BuffType[] aquí(Es más corto al usarlo).
       static method create takes nothing returns thistype
           local thistype this = thistype.allocate()
           
           set BuffType[1] = "MS"
           set BuffType[2] = "AS"
           set BuffUseds = 2
           
           return this
       endmethod
       
       // Luego crean sus stub method
       
       // onApply será llamado cuando se llame a AddBuff (al agregarse el buff)
       stub method onApply takes nothing returns nothing

           call .ApplyDamage(this.caster, this.target, this.damage, this.pureDamage)
                   
       endmethod
       
       // onPeriodic será llamado en cada intervalo
       stub method onPeriodic takes nothing returns nothing
           
           call .ApplyDamage(this.caster, this.target, this.damage, this.pureDamage)
           
       endmethod
       
       // onRemove será llamado cuando se termine la duración o el buff sea removido(aquí deben nullear sus variables)
       stub method onRemove takes nothing returns nothing
           set .caster = null
           
           
       endmethod
       
       // También tienen onRefresh, que será llamado cuando se le agregue el mismo buff a una unidad
       // cuando se refresca un buff, automáticamente se refresca la duración del mismo
       stub method onRefresh takes nothing returns nothing
           set .damage = .damage * 1.25
           
       endfunction
       
   endstruct[/jass]


Extensión GUI

[gui]Variables
   Acontecimientos
   Condiciones
   Acciones
       Set Buff_Buff = Aceite hirviendo
       Set Buff_Caster = Ninguna unidad
       Set Buff_Duration = 0.00
       Set Buff_Interval = 0.00
       Set Buff_Negative = False
       Set Buff_Purgable = False
       Set Buff_Percentage[0] = 0
       Set Buff_Type[0] =
       Set Buff_Target = Ninguna unidad
       Set Buff_Booleans[0] = False
       Set Buff_Effects[0] = (Last created special effect)
       Set Buff_Locations[0] = (Center of (Playable map area))
       Set Buff_OnApply = False
       Set Buff_OnPeriodic = False
       Set Buff_OnRefresh = False
       Set Buff_OnRemove = False
       Set Buff_Reals[0] = 0.00
       Set Buff_Strings[0] =
       Set Buff_Units[0] = Ninguna unidad
       Set Buff_Integers[0] = 0
       Set Buff_Trigger = (This trigger)
[/gui]

[gui]Ejemplo GUI Init
   Acontecimientos
       Map initialization
   Condiciones
   Acciones
       -------- La habilidad será el efecto, aparte de agregar el buff --------
       -------- (el efecto y el buff que otorga se configuran en editor de objetos) --------
       Set Register_Abil = Dummy Ability (Buffs example GUI)
       -------- El buff es para el tooltip --------
       Set Register_Buff = Quemar almas
       -------- Esta primera acción registra su buff con su habilidad --------
       Detonador - Run RegisterAbil (checking conditions)
       Detonador - Run Ejemplo GUI (checking conditions)
[/gui]

[gui]Ejemplo GUI
   Acontecimientos
   Condiciones
   Acciones
       -------- Espero esto sea autoexplicativo.. --------
       Set Buff_Buff = Quemar almas
       Set Buff_Caster = Mago sanguinario 0004
       Set Buff_Target = Maestro de las Espadas 0005
       Set Buff_Duration = 5.00
       Set Buff_Interval = 1.00
       -------- ----------------------------------------------------------------- --------
       -------- Detalle importante: Si Buff_Negative es "True", el porcentaje será un modificar negativo, esto quiere decir --------
       -------- si ponen 100 en MS, tendrá 100% de reducción de velocidad de movimiento --------
       Set Buff_Negative = True
       -------- ----------------------------------------------------------------- --------
       -------- Esto determina si pueden remover el buff o no. Purgable = True significa que puede removerse --------
       Set Buff_Purgable = False
       -------- ----------------------------------------------------------------- --------
       -------- El índice del porcentaje y del tipo del buff deben coincidir, no sea pabilo mi amigo --------
       -------- En el comentario "Tipos de buffs" pueden ver las cadenas de texto permitidas y lo que modifican .3 --------
       Set Buff_Percentage[1] = 60
       Set Buff_Type[1] = MS
       -------- ----------------------------------------------------------------- --------
       -------- Todas estas variables se pueden usar hasta el índice "10" --------
       -------- si quieren manejar más datos las utilizan --------
       Set Buff_Booleans[0] = False
       Set Buff_Effects[0] = (Last created special effect)
       Set Buff_Locations[0] = (Position of Buff_Target)
       Set Buff_Reals[0] = 0.00
       Set Buff_Strings[0] =
       Set Buff_Units[0] = Ninguna unidad
       Set Buff_Integers[0] = 0
       -------- ----------------------------------------------------------------- --------
       -------- Este detonador es el que correrá en cada instancia del buff e.e --------
       Set Buff_Trigger = Ejemplo GUI Buff
       -------- ----------------------------------------------------------------- --------
       -------- Esta función siempre al final, sin esa función todo lo que setean será para nada. NUNCA OLVIDAR --------
       Custom script:   call GUIAddBuff()
[/gui]

[gui]Ejemplo GUI Buff
   Acontecimientos
   Condiciones
   Acciones
       -------- Lo aconsejable es dividir todos sus detonadores de Buff así --------
       -------- de este modo, es mucho más ordenado y nunca deberían usar acciones fuera de los ifs --------
       -------- a menos que de verdad SEPAN que están haciendo --------
        Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
           Si: Condiciones
               Buff_OnApply Igual a (==) True
           Entonces: Acciones
               -------- Este primero correrá cada vez que el buff inicie, o sea aplicado --------
               Efecto especial - Create a special effect attached to the overhead of Buff_Target using Abilities\Weapons\AvengerMissile\AvengerMissile.mdl
               Set Buff_Integers[0] = 0
               Set Buff_Effects[Buff_Integers[0]] = (Last created special effect)
           Otros: Acciones
        Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
           Si: Condiciones
               Buff_OnPeriodic Igual a (==) True
           Entonces: Acciones
               -------- Este correrá en cada intervalo del buff --------
                Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
                   Si: Condiciones
                       Buff_Integers[0] Menor que (<) 10
                   Entonces: Acciones
                       Efecto especial - Create a special effect attached to the overhead of Buff_Target using Abilities\Weapons\AvengerMissile\AvengerMissile.mdl
                       Set Buff_Integers[0] = (Buff_Integers[0] + 1)
                       Set Buff_Effects[Buff_Integers[0]] = (Last created special effect)
                   Otros: Acciones
           Otros: Acciones
        Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
           Si: Condiciones
               Buff_OnRefresh Igual a (==) True
           Entonces: Acciones
               -------- Este es especial, correrá cuando quieran aplicar un buff, cuando la unidad objetivo ya es afectado por ese mismo buff --------
               -------- Generalmente es cuando quieren crear buffs con stacks y eso --------
           Otros: Acciones
        Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
           Si: Condiciones
               Buff_OnRemove Igual a (==) True
           Entonces: Acciones
               -------- Corre cuando el buff se termina --------
               -------- Recuerden destruir sus puntos y efectos especiales y demás leaks! --------
                Do Multiple ActionsFor each (Integer A) from 0 to Buff_Integers[0], do (Actions)
                   Bucle: Acciones
                       Efecto especial - Destroy Buff_Effects[(Integer A)]
           Otros: Acciones
[/gui]

En el mapa están las instrucciones y un par de ejemplos del sistema.


Última edición por Marcos_M el Sáb Nov 22, 2014 11:54 am, editado 6 veces
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Jue Oct 24, 2013 11:26 pm

Ok, te mandaste terrible librería xD.

Dividí los componentes. Manejalos por separados. Esto para que te sea mas fácil y cómodo de trabajar (aumenta mantenibilidad). Recuerda, "divide y conquista".

Tene en cuenta la relación también. Buff (la librería) no depende de los buffs en sí, pero éstos (los buffs) si que dependen de Buff. Por lo que Buff no debería tener variables como "REDUCCION_VELOCIDAD_MOVIMIENTO_ID".

Fijate si podes revisar eso así continúo la revisión.

off: damn, tengo que actualizar los tags jass :\
Volver arriba Ir abajo
KoleshyEngine

KoleshyEngine


Barra de Salud : Su salud está al 60% - Este usuario ha recibido dos infracciones

Mensajes Mensajes : 547
Reputación Reputación : 124
Monedas de oro : -222
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Oct 25, 2013 12:58 am

te lo dije marcos desperdiciaste tu vida e.e


Like a Star @ heaven .::Software de utilidad::. .::Click Aquí::.

Quieres hacer spell chulas e entre otras cosas de manera facil?
entra aqui pelotudo y no pierdas esta oportunidad:
http://www.worldofeditors.net/f72-funciones

And now... Buffs [EXTENSION GUI] RYbI7xV

And now... Buffs [EXTENSION GUI] Barras10
Volver arriba Ir abajo
http://koleshyengine.blogspot.com/
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Oct 25, 2013 6:26 pm

@Sauron escribió:
Ok, te mandaste terrible librería xD.

Dividí los componentes. Manejalos por separados. Esto para que te sea mas fácil y cómodo de trabajar (aumenta mantenibilidad). Recuerda, "divide y conquista".

Tene en cuenta la relación también. Buff (la librería) no depende de los buffs en sí, pero éstos (los buffs) si que dependen de Buff. Por lo que Buff no debería tener variables como "REDUCCION_VELOCIDAD_MOVIMIENTO_ID".

Fijate si podes revisar eso así continúo la revisión.

off: damn, tengo que actualizar los tags jass :\
Sí, soy muy malo entendiendo a la gente, así que, o lo dejamos ahí nomás o te esfuerzas en explicarme Razz
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Oct 25, 2013 9:13 pm

Ok mira. Trata de dividir la librería para que te queden 14 librerías (esto es un poco exagerado pero es para ver el punto).

Una librería, va a ser Buff.
Las otras 13 librerías, van a ser los buffs en sí, que van a depender de Buff ([ljass]requires Buff[/ljass]).

Pero ojo, si notas que estás re-escribiendo mucho código, es que en algo te estás equivocando. Cuando se hace mucho copy-paste hay que parar para analizar bien.

Hace de cuenta que la librería [ljass]Buff[/ljass] fue escrita por otra persona. Ahora, esa librería viene con un par de buffs (ponele movement speed y attack speed) pero vos necesitas otros en específico (por ejemplo, aumento de daño y regeneración de vida periódicamente). Así que te pones a escribirlos haciendo uso de la librería [ljass]Buff[/ljass].
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Dom Oct 27, 2013 12:01 am

Hago que cada Buff específico dependa de una librería madre??

Pero el funcionamiento de la librería no se vería afectado?
Yo para aplicar el buff uso un struct. Cada buff personalizado se crea escribiendo otro struct. Y es el struct padre el que da las funciones que aplican el buff. Si divido esas funciones en librería me complicaría la parte donde evito que 2 buffs iguales stackeen ( colocas el rawcode de tu buff y este se guarda en la unidad para evitar un stack del mismo buff)
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Dom Oct 27, 2013 12:03 am

Hago que cada Buff específico dependa de una librería madre??

Pero el funcionamiento de la librería no se vería afectado?
Yo para aplicar el buff uso un struct. Cada buff personalizado se crea escribiendo otro struct. Y es el struct padre el que da las funciones que aplican el buff. Si divido esas funciones en librería me complicaría la parte donde evito que 2 buffs iguales stackeen ( colocas el rawcode de tu buff y este se guarda en la unidad para evitar un stack del mismo buff)
Volver arriba Ir abajo
io
Aprendiz
io


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 24
Reputación Reputación : 5
Monedas de oro : 314
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Jue Ene 09, 2014 10:07 pm

a ver ....
Volver arriba Ir abajo
matchet
Capitán
matchet


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 124
Reputación Reputación : 19
Monedas de oro : 1830
Monedas de Platino : 3 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Jue Ene 09, 2014 11:33 pm

Suena demasiado interesante como para no ponerme a investigar el código :O
Esperaré a la versión definitiva, y daré mi opinión cuando me lea el texto.
Pero de previa he de decir que una utilidad como ésta, si sirve para lo que creo que sirve, va a ser indispensable para todo buen proyecto de dungeon ;D


... ¿Sabíais que un doble negativo o un cálculo dentro de las condiciones hará fallar el spell? ...:
 

Proyecto: Galerías Naga
"Hazlo o no lo hagas, pero no lo intentes"
- Maestro Yoda

Mi filosofía:
 
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Ene 10, 2014 12:32 am

Citación :
Hago que cada Buff específico dependa de una librería madre??

Pero el funcionamiento de la librería no se vería afectado?
Yo para aplicar el buff uso un struct. Cada buff personalizado se crea escribiendo otro struct. Y es el struct padre el que da las funciones que aplican el buff. Si divido esas funciones en librería me complicaría la parte donde evito que 2 buffs iguales stackeen ( colocas el rawcode de tu buff y este se guarda en la unidad para evitar un stack del mismo buff)

De eso se tiene que encargar [ljass]Buff[/ljass].

Ejemplo

[jass]library ArmorBuff requires Buff
...
function onApply takes ...
   if ( Buff.has(unit, armorbuff) ) then
       // si queres que el buff stackee, entonces ejecutar acciones aca
   endif
endfunction[/jass]

armorbuff = rawcode del buff.


Última edición por Sauron el Vie Ene 10, 2014 7:09 pm, editado 1 vez
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Ene 10, 2014 2:21 am

Para qué necesito una librería por Buff personalizado? Si creando un struct es más fácil?

Los stacks los colocas en el método onRefresh si quieres modificar algo aparte de la duración. Buff solo se encarga de aplicar los métodos del struct para el funcionamiento de los modificadores y llamar a los métodos onApply, onPeriodic, onRemove y onRefresh, cuando creas tu buff personalizado con un struct.

Debes crear tu instancia de struct para que la librería trabaje.

O no te entendí nada de nada

En respuesta a Matchet, está versión es bastante definitiva. Pensé en hacer una versión para ser usada con GUI, pero no se me ocurre como hacer que sea como mínimo, solo para gente avanzada en GUI. Sin conocimientos de vJASS no se puede explotar todo el potencial de la librería. Así que, si quieres aplicarla, aprendas vJASS xD

Como comentario final, en un dungeon no sería tan útil, porque la razón principal por la que se creó fue que yo usaba mucho habilidades como Slow, Shadow Strike, Cripple.. y los poderes no stackeaban correctamente. En un dungeon tienes más posibilidades de evitar esos problemas
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Ene 10, 2014 6:56 pm

Así te decía Marcos:

[jass]/**
* @author Sauron
* @see hiveworkshop.com/forums/jass-resources-412/snippet-linkedlistmodule-206552/
*/
library Buff requires LinkedListModule
   globals
       private hashtable hashTable = InitHashtable()
   endglobals
   
   struct BuffList extends array
       implement LinkedList
   
       readonly Buff buff
       
       static method getList takes integer buffId, unit whichUnit returns thistype
           return LoadInteger(hashTable, GetHandleId(whichUnit), buffId)
       endmethod
       
       static method create takes Buff whichBuff returns thistype
           local thistype this = thistype.allocate()
           set this.buff = whichBuff
           return this
       endmethod
       
       static method addToList takes thistype buffNode returns nothing
           local thistype list = getList(buffNode.buff.buffId, buffNode.buff.target)
           
           if ( list == 0 ) then
               set list = createNode()
               call SaveInteger(hashTable, GetHandleId(buffNode.buff.target), buffNode.buff.buffId, list)
           endif
           
           call list.insertNode(buffNode)
       endmethod
       
       static method removeFromList takes thistype buffNode returns nothing
           if ( buffNode.head ) then
               if ( buffNode.next != 0 ) then
                   call SaveInteger(hashTable, GetHandleId(buffNode.buff.target), buffNode.buff.buffId, buffNode.next)
               else
                   call FlushChildHashtable(hashTable, GetHandleId(buffNode.buff.target))
               endif
           endif
           
           call buffNode.removeNode()
           call buffNode.deallocate()
       endmethod
   endstruct

   struct Buff
       readonly unit caster
       readonly unit target
       readonly real duration
       readonly real timeout
       readonly integer buffId
       readonly BuffList buffNode
       private timer timer
       
       private static trigger onUnitGetsBuffTrigger = CreateTrigger()
       private static trigger onUnitLossesBuffTrigger = CreateTrigger()
       private static trigger onPeriodicTrigger = CreateTrigger()
       
       readonly static thistype triggeringBuff = 0
       
       static method getAllOfTypeFromUnit takes integer buffId, unit whichUnit returns BuffList
           return BuffList.getList(buffId, whichUnit).next
       endmethod
       
       static method has takes integer buffId, unit whichUnit returns boolean
           return BuffList.getList(buffId, whichUnit) != 0
       endmethod
       
       private static method fireEvent takes thistype whichBuff, trigger whichTrigger returns nothing
           local thistype prevBuff = triggeringBuff
           set triggeringBuff = whichBuff
           call TriggerExecute(whichTrigger)
           set triggeringBuff = prevBuff
       endmethod
       
       private method destroy takes nothing returns nothing
           call PauseTimer(this.timer)
           call FlushChildHashtable(hashTable, GetHandleId(this.timer))
           call BuffList.removeFromList(this.buffNode)
           call this.deallocate()
       endmethod
       
       method remove takes nothing returns nothing
           call fireEvent(this, onUnitLossesBuffTrigger)
           call this.destroy()
       endmethod
       
       private static method periodic takes nothing returns nothing
           local thistype b = LoadInteger(hashTable, GetHandleId(GetExpiredTimer()), 0)
           
           if ( b.timeout > 0 ) then
               set b.duration = b.duration - b.timeout
               
               if ( b.duration > 0 ) then
                   call fireEvent(b, onPeriodicTrigger)
               else
                   call b.remove()
               endif
           else
               call b.remove()
           endif
       endmethod
       
       // ESTE METODO SOLO DEBE SER LLAMADO POR LOS BUFFS
       static method apply takes integer buffId, unit caster, unit target, real duration, real timeout returns thistype
           local thistype this = thistype.allocate()
           
           set this.caster = caster
           set this.target = target
           set this.duration = duration
           set this.timeout = timeout
           set this.buffId = buffId
           set this.buffNode = BuffList.create(this)
           
           if ( this.timer == null ) then
               set this.timer = CreateTimer()
           endif
           
           call SaveInteger(hashTable, GetHandleId(this.timer), 0, this)
           
           if ( timeout > 0 ) then
               call TimerStart(this.timer, timeout, true, function thistype.periodic)
           else
               call TimerStart(this.timer, duration, false, function thistype.periodic)
           endif
           
           call BuffList.addToList(this.buffNode)
           
           call fireEvent(this, onUnitGetsBuffTrigger)
           
           return this
       endmethod
       
       static method RegisterUnitGetsBuff takes code c returns nothing
           call TriggerAddAction(onUnitGetsBuffTrigger, c)
       endmethod
       
       static method RegisterUnitLossesBuff takes code c returns nothing
           call TriggerAddAction(onUnitLossesBuffTrigger, c)
       endmethod
       
       static method RegisterPeriodic takes code c returns nothing
           call TriggerAddAction(onPeriodicTrigger, c)
       endmethod
   endstruct
endlibrary[/jass]

Con eso ya tenes lo básico, ahora los buffs en si:

[jass]library BurningBuff requires Buff
   struct BurningBuff extends array
       static constant integer ID = 'A000'
       
       static method apply takes unit caster, unit target returns Buff
           //if ( Buff.has(ID, target) ) then
           //    call BJDebugMsg("EL BUFF NO STACKEA")
           //    return 0
           //endif
           return Buff.apply(ID, caster, target, 20, 5)
       endmethod
       
       private static method periodic takes nothing returns nothing
           if ( Buff.triggeringBuff.buffId != ID ) then
               return
           endif
           
           call BJDebugMsg("PERIODIC ACTIONS!")
       endmethod
       
       private static method onInit takes nothing returns nothing        
           call Buff.RegisterPeriodic(function thistype.periodic)
       endmethod
   endstruct
endlibrary[/jass]

Con esto también podes iterar sobre los buffs que tiene una unidad:

[jass]local BuffList buffList = Buff.getAllOfTypeFromUnit(ID DEL BUFF, unit)

loop
   call BJDebugMsg("caster " + GetUnitName(buffList.buff.caster))

   set buffList = buffList.next
   exitwhen buffList.head
endloop[/jass]

Saludos.

edit: En el caso en que necesites guardar algo mas (como un efecto por ejemplo), podes usar hashtable o si no, agregar otra propiedad al struct Buff de tipo integer:

[jass]struct Buff
...
readonly integer data

static method apply takes ..., integer data returns ...
...
endmethod[/jass]

Lo que guardarias, sería una instancia:

[jass]struct InformacionAdicionalAGuardar
effect efecto
endstruct

function apply takes unit caster, unit target returns Buff
local InformacionAdicionalAGuardar data = InformacionAdicionalAGuardar.create()
set data.efecto = AddSpecialEffect(...)
call Buff.apply(id, caster, target, duration, timeout, data)
endfunction[/jass]
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Ene 10, 2014 9:02 pm

Bueno, necesito más conocimientos para eso xD

Dónde hay tutos avanzados? :I
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Vie Ene 10, 2014 10:00 pm

Es simple mira:

Spoiler:
 

Usamos linked list para mantener todos los buffs enlazados (y asi poder iterar sobre ellos).

El struct BuffList es el que se encarga de mantener los buffs enlazados (flecha next).
El struct Buff es el que se encarga de la logica de los buffs (disparar eventos, aplicar, etc.) (globo con información del buff).
Los buffs específicos (por ejemplo Burning) son los que se encargan de las acciones cuando se aplica dicho buff.

Ahora, para que practiques te dejo una tarea.

Como está ahora, se puede iterar sobre los buffs, pero solamente puedo iterar sobre 1 tipo de buff (debo especificarlo). Tenes que agregar la funcionalidad para que se pueda iterar por sobre todos los tipos. Algo así como [ljass]GetAllBuffsOfUnit(unit)[/ljass].
Volver arriba Ir abajo
matchet
Capitán
matchet


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 124
Reputación Reputación : 19
Monedas de oro : 1830
Monedas de Platino : 3 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Dom Ene 26, 2014 10:52 am

Sigo con mucho interés el desarrollo de este sistema, y esperare a la release final con el objetivo de intentar implementarlo en mi proyecto.
Avísame cuando lo veas terminado. También me gustaría saber que capacidades y limitaciones básicas tiene, y de qué debo hacer para implementarlo (nunca he "implementado/usado un sistema" de otro usuario)


... ¿Sabíais que un doble negativo o un cálculo dentro de las condiciones hará fallar el spell? ...:
 

Proyecto: Galerías Naga
"Hazlo o no lo hagas, pero no lo intentes"
- Maestro Yoda

Mi filosofía:
 
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Dom Ene 26, 2014 2:14 pm

@matchet escribió:
Sigo con mucho interés el desarrollo de este sistema, y esperare a la release final con el objetivo de intentar implementarlo en mi proyecto.
Avísame cuando lo veas terminado. También me gustaría saber que capacidades y limitaciones básicas tiene, y de qué debo hacer para implementarlo (nunca he "implementado/usado un sistema" de otro usuario)

Tengo la versión con buff positivo o negativo e purgable o impurgable. Sin embargo, para usarlo debes usar vJASS.

Tendrías que aprender algo primero xD
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Dom Feb 16, 2014 1:27 am

Versión 1.1 Publicada .3
Volver arriba Ir abajo
WonderWoman
Capitán
WonderWoman


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 129
Reputación Reputación : 28
Monedas de oro : 830
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Miér Mar 05, 2014 11:47 pm

Quiero ver, quiero entrar
nena nadie te va a hacer mal


and it makes me wonder...
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3307
Reputación Reputación : 588
Monedas de oro : 10302
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Miér Mar 12, 2014 6:09 pm

Versión 1.2 Publicada .3

Solucionado bugs con las librerías de vida, maná y regen de maná
Volver arriba Ir abajo
Ruke

Ruke


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 298
Reputación Reputación : 64
Monedas de oro : 1678
Monedas de Platino : 0 And now... Buffs [EXTENSION GUI] Empty

Inventario :
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10
And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10 And now... Buffs [EXTENSION GUI] Empysl10

And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10Dom Mar 16, 2014 3:18 am

Che marcos tarda un huevo en cargar el mapa xD.
Volver arriba Ir abajo
Contenido patrocinado




And now... Buffs [EXTENSION GUI] Empty
Mensaje(#) Tema: Re: And now... Buffs [EXTENSION GUI] And now... Buffs [EXTENSION GUI] Clock10

Volver arriba Ir abajo
 

And now... Buffs [EXTENSION GUI]

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 2.Ir a la página : 1, 2  Siguiente

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Aportes :: Librerías-