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
 

 [Sistema] Unidad en Combate.

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
MuSe

MuSe


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

Mensajes Mensajes : 219
Reputación Reputación : 46
Monedas de oro : 2590
Monedas de Platino : 5 [Sistema] Unidad en Combate. Empty

Inventario :
[Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10
[Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10

[Sistema] Unidad en Combate. Empty
Mensaje(#) Tema: [Sistema] Unidad en Combate. [Sistema] Unidad en Combate. Clock10Jue Jul 25, 2013 11:53 pm

Hola.... alli andaba viendo las cosas que hice hace mucho en GUI y quise pasarlas a Jass, una de ellas es esta.

InCombat:
Es muy sencillo, simplemente pone en combate (como en WoW) a las unidades que reciben u ocasionan daño.
cuando una unidad está en combate sus habilidades/Items pueden alterarse, un claro ejemplo es la Daga del Dota, cuando un héroe te ocasiona daño, la Daga se te anula, y se vuelve a habilitar luego de X segundos. (no se cuanto es X).

[jass]library UnitInCombat initializer Init /* v1.0.0.0
*************************************************************************************
*
*   Librería para detectar cuando una unidad está en combate.
*   El estado de combate dura @CD (default: 4 seg.).
*   Si una unidad ya esta en combate su contador se reinicia.
*
*************************************************************************************
*  
*   */requires/*
*       */ Table /*     hiveworkshop.com/forums/jass-resources-412/snippet-new-table-188084/
*       */ CTL /*       hiveworkshop.com/forums/jass-resources-412/snippet-constant-timer-loop-32-a-201381/
*
*************************************************************************************
*
*   function AddCombatUnit takes unit u returns nothing
*       Agrega el estado de combate a la unidad "u"
*            
*   function SetUnitCombatTime takes unit u, real t returns nothing
*       Modifica el tiempo de combate de la unidad "u" a "t"
*        
*   function IsUnitInCombat takes unit u returns boolean
*       Devuelve true si la unidad "u" está en combate
*
*   function RemoveCombatUnit takes unit u returns nothing
*       Remueve el estado de combate a la unidad "u"
*  
*************************************************************************************
*
*   GUI globals
*       - udg_Combat_Event <-- Variable global tipo real usado para el evento Game - Value Of Real Variable, para realizar acciones cuando una unidad sale de combate.
*       - udg_Combat_LeavingUnit <-- Especifica a la ultima unidad que salio de combate.
*
**************************************************************************************/
   globals
       private constant real CD = 4.
       private constant real Prd = 0.031250000
       private Table TABLE
   endglobals
   
   private function OnLeave takes unit u returns nothing
       set udg_Combat_LeavingUnit = u
       set udg_Combat_Event = 1.
       set udg_Combat_Event = 0.
   endfunction
   
   private struct UnitInCombat extends array
       private unit u
       private integer i
       
       implement CTLExpire
           set TABLE.real[this.i] = TABLE.real[this.i] - Prd
           if (TABLE.real[this.i] <= 0) or (GetWidgetLife(this.u) <= .405) then
               call OnLeave(this.u)
           
               set this.u = null
               set this.i = 0
               
               call this.destroy()
           endif
       implement CTLEnd
       
       public static method new takes unit u returns nothing
           local thistype this = thistype.create()
           
           set this.u = u
           set this.i = GetHandleId(u)
       endmethod
   endstruct
   
   function IsUnitInCombat takes unit u returns boolean
       return TABLE.real[GetHandleId(u)] > 0
   endfunction
   
   function SetUnitCombatTime takes unit u, real t returns nothing
       set TABLE.real[GetHandleId(u)] = t
   endfunction
   
   function AddCombatUnit takes unit u returns nothing
       if (IsUnitInCombat(u) == false) then
           call UnitInCombat.new(u)
       endif
       
       call SetUnitCombatTime(u, CD)
   endfunction
   
   function RemoveUnitCombat takes unit u returns nothing
       if not IsUnitInCombat(u) then
           return
       endif  
       
       call SetUnitCombatTime(u,0)
   endfunction
   
   private function Init takes nothing returns nothing
       set TABLE = Table.create()
   endfunction
endlibrary[/jass]

Requiere: GUI-Friendly Damage Detection -- v1.2.0 -- by Weep (si es que requiere cambiar a Damage lo are)
CTL by Nestharus
Table by Bribe
Agradecimientos: Sauron Wink

En la carpeta Ex se encuentra el ejemplo de la Daga.
Cualquier duda/sugerencia/critica adelante. Wink

Comenta para descargar.



Saludos.
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 [Sistema] Unidad en Combate. Empty

Inventario :
[Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10
[Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10 [Sistema] Unidad en Combate. Empysl10

[Sistema] Unidad en Combate. Empty
Mensaje(#) Tema: Re: [Sistema] Unidad en Combate. [Sistema] Unidad en Combate. Clock10Miér Ago 21, 2013 10:01 pm

Che y algo como:

[jass]library UnitInCombat
globals
private constant real TIMEOUT = 0.03125
private constant real CD = 4.
endglobals

struct UnitInCombat extends array
private static hashtable hashtable = InitHashtable()
private static timer timer = CreateTimer()
private static group units = CreateGroup()
private static integer count = 0

private static method fireEvent takes unit which returns nothing
set udg_Combat_LeavingUnit = which
set udg_Combat_Event = 1.
set udg_Combat_Event = 0.
endmethod

static method hasState takes unit which returns boolean
return IsUnitInGroup(which, thistype.units)
endmethod

static method removeState takes unit which returns nothing
if ( thistype.hasState(which) ) then
call thistype.fireEvent(which)

call RemoveSavedInteger(thistype.hashtable, GetHandleId(which), 0)
call GroupRemoveUnit(thistype.units, which)

set thistype.count = thistype.count - 1
endif
endmethod

private static method iterateUnits takes nothing returns nothing
local unit enumUnit = GetEnumUnit()
local integer enumUnitId = GetHandleId(enumUnit)
local real newValue = LoadReal(thistype.hashtable, enumUnitId, 0) - TIMEOUT

if ( newValue > 0 and GetWidgetLife(enumUnit) > 0.405 ) then
call SaveReal(thistype.hashtable, enumUnitId, 0, newValue)
else
call thistype.removeState(enumUnit)
endif

set enumUnit = null
endmethod

private static method periodic takes nothing returns nothing
if ( thistype.count > 0 ) then
call ForGroup(thistype.units, function thistype.iterateUnits)
else
call PauseTimer(thistype.timer)
endif
endmethod

static method addState takes unit which returns nothing
if ( thistype.count == 0 ) then
call TimerStart(thistype.timer, TIMEOUT, true, function thistype.periodic)
endif

if ( thistype.hasState(which) == false ) then
set thistype.count = thistype.count + 1
call GroupAddUnit(thistype.units, which)
endif

call SaveReal(thistype.hashtable, GetHandleId(which), 0, CD)
endmethod
endstruct
endlibrary[/jass]

Para evitar el uso de Table (que a opinión personal, es una pésima librería).
Volver arriba Ir abajo
 

[Sistema] Unidad en Combate.

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Silhouette Core - Sistema de rol con d6
» EXPLICACION PARA JUGAR Y GANAR APOSTANDO A LA UNIDAD
» Unidad militar del estado
» Técnicas letales de combate
» Los catalanes que defenderan la unidad territorial de España

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