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
 

 [Resubido] Status

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
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 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: [Resubido] Status [Resubido] Status Clock10Jue Mar 27, 2014 6:20 pm

Status
Con Status podrás agregar estados (stun, silence, invisibility, hex y muchos más) a las unidades muy fácilmente.

Mapa de prueba (cuidado tiene una versión vieja, actualizar el código)
http://www.epicwar.com/maps/241213/

Requerimientos

  • Jass New Gen Pack


Estados soportados
Spoiler:
 

IMPORTANTE
No olvides copiar las habilidades (25) del editor de objetos, ya que sin ellas el sistema no funciona.

¿Hace falta copiar todas las habilidades?
No, solo las que consideres que vallas a usar. Por ejemplo, si solo te interesa el estado de stun y silence, solo copia esas dos Wink.

¿Por qué no use un script en lua para generar las habilidades?
Bueno, en primera instancia lo utilizaba, pero me di cuenta de que generaba mal tres habilidades (STATUS_DISARM_x) por lo que decidí simplemente eliminarlo y utilizar simplemente un mapa de ejemplo  Laughing

¿Por qué re-escribí Status?
Porque cuando revisé el código de Jesus4Lyf tenía mucho código repetido, por lo tanto lo optimicé para que de 1500+ líneas fueran solo 200- Wink.
Claro que esta versión de Status no posee bonuses como para agregar ataque, velocidad de ataque, movimiento y demás a las unidades, y esto es porque no considero que esos sean estados, si no más bien "bonuses" como anteriormente mencioné.

Ejemplos

  • JASS
    Spoiler:
     
  • GUI
    Spoiler:
     


Código
[jass]library Status /* v1.2.1.0
*************************************************************************************
*
* Con Status podras agregar estados (stun, silence, invisibility, hex y muchos mas)
* a las unidades muy facilmente.
*
*************************************************************************************
*
* Estados
*
* STATUS_STUN
* - Stun a la unidad que se agregue este estado
*
* STATUS_SILENCE
* - La unidad que tenga este estado no podr? lanzar spells
*
* STATUS_DISARM_BOTH
* - Las unidades con este estado no podr?n atacar (melee ni rango)
*
* STATUS_DISARM_MELEE
* - Las unidades que ataquen melee no podr?n atacar
*
* STATUS_DISARM_RANGE
* - Las unidades que ataquen a distancia no podr?n atacar
*
* STATUS_ENTANGLE
* - Red, no se pueden mover pero si atacar y lanzar spells
*
* STATUS_INVISIBILITY
* - Vuelve invisible a la unidad que se le de este estado
*
* STATUS_GHOST
* - Similar a STATUS_INVISIBILITY
*
* STATUS_DOOM
* - Las unidades con este estado no pueden lanzar ni aprender spells
*
* STATUS_SPELL_IMMUNITY
* - Vuelve inmune a ataques m?gicos a la unidad que se le de este estado
*
* STATUS_HEX
* - Transforma en una oveja/rana/etc a la unidad que tenga este estado
* haciendo que la misma no pueda atacar ni lanzar habilidades
*
* STATUS_NEVER_MISS
* - La unidad a la que se le d? este estado nunca miss un golpe
*
* STATUS_ALWAYS_MISS
* - La unidad con este estado siempre har? miss en sus ataques
*
* STATUS_UNTOUCHABLE
* - La unidad que tenga este estado tendr? 100% de evasi?n
*
* STATUS_BANISH
* - Inmune a golpes f?sicos pero no m?gicos
*
* STATUS_PHASE
* - Mismo efecto que Windwalk solo que no hace invisible
*
* STATUS_RESISTANT_SKIN
* - Reduce la duraci?n de habilidades negativas y hace inmune
* a ciertas habilidades
*
* STATUS_REFLECT_PIERCING
* - Reduce el da?o de ataques tipo Piercing y de ataques m?gicos
*
* STATUS_DISABLE
* - Como pausear una unidad, solo que no esconde los iconos
*
* STATUS_INVULNERABLE
* - Vuelve invulnerable ante todos los ataques a la unidad
* que tenga este estado
*
* STATUS_PAUSE
* - Pausea la unidad que tenga este estado, haciendo que
* no se pueda mover ni atacar
*
* STATUS_HIDE
* - Esconde a la unidad que tenga este estado
*
* STATUS_UNPATH
* - Saca las colisiones a la unidad que posea este estado
*
*************************************************************************************
*
* Funciones
*
* function Status_Add takes integer status, unit u returns nothing
* - Agrega el estado a la unidad
*
* function Status_Remove takes integer status, unit u returns nothing
* - Remueve el estado a la unidad
*
* function Status_Has takes integer status, unit u returns boolean
* - Devuelve true si la unidad tiene el estado
*
*************************************************************************************
*
* Creditos
*
* Enteramente a Jesus4Lyf, yo solamente optimice su trabajo
* muZk
*
*************************************************************************************
*
* CONFIGURABLE
*
*/
globals
private constant integer DUMMY_ID = 'dumy'
private constant integer BUFF_ENTANGLE_AIR = 'B506'
endglobals
/**********************************************************************************/
globals
constant integer STATUS_STUN = 1
constant integer STATUS_SILENCE = 2
constant integer STATUS_DISARM_BOTH = 3
constant integer STATUS_DISARM_MELEE = 4
constant integer STATUS_DISARM_RANGE = 5
constant integer STATUS_ENTANGLE = 6
constant integer STATUS_INVISIBILITY = 7
constant integer STATUS_GHOST = 8
constant integer STATUS_DOOM = 9
constant integer STATUS_SPELL_IMMUNITY = 10
constant integer STATUS_HEX = 11
constant integer STATUS_NEVER_MISS = 12
constant integer STATUS_ALWAYS_MISS = 13
constant integer STATUS_UNTOUCHABLE = 14
constant integer STATUS_BANISH = 15
constant integer STATUS_PHASE = 16
constant integer STATUS_RESISTANT_SKIN = 17
constant integer STATUS_REFLECT_PIERCING = 18
constant integer STATUS_DISABLE = 19
constant integer STATUS_INVULNERABLE = 20
constant integer STATUS_PAUSE = 21
constant integer STATUS_HIDE = 22
constant integer STATUS_UNPATH = 23

private integer array ABILITY
private integer array BUFF
private integer array ORDER

private unit dummyCaster = null

private hashtable hashTable = InitHashtable()
endglobals

/************************************************************************************
*
* CONFIGURABLE
*
*/
private function Load takes nothing returns nothing
set ABILITY[STATUS_STUN] = 'A500'
set ABILITY[STATUS_SILENCE] = 'A501'
set ABILITY[STATUS_DISARM_BOTH] = 'A502'
set ABILITY[STATUS_DISARM_MELEE] = 'A503'
set ABILITY[STATUS_DISARM_RANGE] = 'A504'
set ABILITY[STATUS_ENTANGLE] = 'A505'
set ABILITY[STATUS_INVISIBILITY] = 'A507'
set ABILITY[STATUS_GHOST] = 'A508'
set ABILITY[STATUS_DOOM] = 'A509'
set ABILITY[STATUS_SPELL_IMMUNITY] = 'A50B'
set ABILITY[STATUS_HEX] = 'A50C'
set ABILITY[STATUS_NEVER_MISS] = 'A50F'
set ABILITY[STATUS_ALWAYS_MISS] = 'A50H'
set ABILITY[STATUS_UNTOUCHABLE] = 'A50J'
set ABILITY[STATUS_BANISH] = 'A50K'
set ABILITY[STATUS_PHASE] = 'A50L'
set ABILITY[STATUS_RESISTANT_SKIN] = 'A50Q'
set ABILITY[STATUS_REFLECT_PIERCING]= 'A50S'
set ABILITY[STATUS_DISABLE] = 'A50T'

set BUFF[STATUS_STUN] = 'B500'
set BUFF[STATUS_SILENCE] = 'B501'
set BUFF[STATUS_DOOM] = 'B509'
set BUFF[STATUS_DISARM_BOTH] = 'B502'
set BUFF[STATUS_DISARM_MELEE] = 'B503'
set BUFF[STATUS_DISARM_RANGE] = 'B504'
set BUFF[STATUS_ENTANGLE] = 'B505'
set BUFF[STATUS_HEX] = 'B50C'
set BUFF[STATUS_BANISH] = 'B50K'
set BUFF[STATUS_PHASE] = 'B50L'
set BUFF[STATUS_DISABLE] = 'B50T'

set ORDER[STATUS_STUN] = 852231
set ORDER[STATUS_SILENCE] = 852668
set ORDER[STATUS_DISARM_BOTH] = 852585
set ORDER[STATUS_DISARM_MELEE] = 852585
set ORDER[STATUS_DISARM_RANGE] = 852585
set ORDER[STATUS_ENTANGLE] = 852106
set ORDER[STATUS_DOOM] = 852583
set ORDER[STATUS_HEX] = 852502
set ORDER[STATUS_BANISH] = 852486
set ORDER[STATUS_PHASE] = 852129
set ORDER[STATUS_DISABLE] = 852252
endfunction
/**********************************************************************************/

/**
* Verificamos si unidad tiene un estado
*
* @param integer status Ver constantes (STATUS_HIDE, STATUS_UNPATH, etc.)
* @param unit u
* @returns boolean true si la unidad tiene el estado, false de lo contrario
*/
public function Has takes integer status, unit u returns boolean
return LoadInteger(hashTable, GetHandleId(u), status) > 0
endfunction

/**
* Agregamos estado a unidad
*
* @param integer status Ver constantes (STATUS_HIDE, STATUS_UNPATH, etc.)
* @param unit u
*/
public function Add takes integer status, unit u returns nothing
local integer id = GetHandleId(u)
local integer level = LoadInteger(hashTable, id, status) + 1

call SaveInteger(hashTable, id, status, level)

if (level > 0) then
if (status == STATUS_INVULNERABLE) then
call SetUnitInvulnerable(u, true)
elseif (status == STATUS_PAUSE) then
call PauseUnit(u, true)
elseif (status == STATUS_HIDE) then
call ShowUnit(u, false)
elseif (status == STATUS_UNPATH) then
call SetUnitPathing(u, false)
elseif (status == STATUS_PHASE) then
call SetPlayerAbilityAvailable(GetOwningPlayer(u), ABILITY[status], true)

if (UnitAddAbility(u, ABILITY[status])) then
call UnitMakeAbilityPermanent(u, true, ABILITY[status])
call IssueImmediateOrderById(u, ORDER[status])
endif

call SetPlayerAbilityAvailable(GetOwningPlayer(u), ABILITY[status], false)
else
if (ORDER[status] == 0) then
call UnitAddAbility(u, ABILITY[status])
call UnitMakeAbilityPermanent(u, true, ABILITY[status])
else
call UnitAddAbility(dummyCaster, ABILITY[status])
call IssueTargetOrderById(dummyCaster, ORDER[status], u)
call UnitRemoveAbility(dummyCaster, ABILITY[status])
endif
endif
endif
endfunction

/**
* Removemos estado a unidad
*
* @param integer status Ver constantes (STATUS_HIDE, STATUS_UNPATH, etc.)
* @param unit u
*/
public function Remove takes integer status, unit u returns nothing
local integer id = GetHandleId(u)
local integer level = LoadInteger(hashTable, id, status) - 1

call SaveInteger(hashTable, id, status, level)

if (level == 0) then
if (status == STATUS_INVULNERABLE) then
call SetUnitInvulnerable(u, false)
elseif (status == STATUS_PAUSE) then
call PauseUnit(u, false)
elseif (status == STATUS_HIDE) then
call ShowUnit(u, true)
elseif (status == STATUS_UNPATH) then
call SetUnitPathing(u, true)
elseif (status == STATUS_PHASE) then
call UnitRemoveAbility(u, BUFF[status])
else
if (ORDER[status] == 0) then
call UnitMakeAbilityPermanent(u, false, ABILITY[status])
call UnitRemoveAbility(u, ABILITY[status])
endif

if (BUFF[status] != 0) then
call UnitRemoveAbility(u, BUFF[status])

// we also have to remove the air tangle buff
if (status == STATUS_ENTANGLE) then
call UnitRemoveAbility(u, BUFF_ENTANGLE_AIR)
endif
endif
endif
endif
endfunction

/**
* Limpiamos todos los estados a una unidad
*
* @param unit whichUnit
*/
public function Clear takes unit whichUnit returns nothing
local integer status = STATUS_UNPATH // ultimo estado
local integer id = GetHandleId(whichUnit)

loop
exitwhen status == 0

call SaveInteger(hashTable, id, status, 1)
call Remove(status, whichUnit)

set status = status - 1
endloop

call FlushChildHashtable(hashTable, id)
endfunction

private function OnDeath takes nothing returns boolean
call Clear(GetTriggerUnit())
return false
endfunction

private module InitModule
private static method onInit takes nothing returns nothing
local trigger onDeath = CreateTrigger()
local integer i = 1
local integer n = 0

set dummyCaster = CreateUnit(Player(15), DUMMY_ID, 0, 0, 0)

call TriggerRegisterAnyUnitEventBJ(onDeath, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(onDeath, Condition(function OnDeath))

call Load()

loop
exitwhen ABILITY[i] == 0

call UnitAddAbility(dummyCaster, ABILITY[i])
call UnitRemoveAbility(dummyCaster, ABILITY[i])

if (ORDER[i] == 0) then
loop
exitwhen n > bj_MAX_PLAYERS
call SetPlayerAbilityAvailable(Player(n), ABILITY[i], false)
set n = n + 1
endloop
set n = 0
endif

set i = i + 1
endloop

set onDeath = null
endmethod
endmodule

private struct Init
implement InitModule
endstruct
endlibrary[/jass]

Changelog
v1.2.1.0

  • En Clear, ahora se lleva el nivel a 1 para asegurar que se remueve el estado (gracias muzk)

v1.2.0.0

  • Agregada funcionalidad para limpiar todos los estados a unidad (Clear)
  • Ahora se remueven todos los estados cuando una unidad muere (gracias muzk)
  • Agregado inicializador por módulo para evitar comportamientos indeseados (dios...)
  • Agregada un poco de documentación

v1.1.1.0

  • Modificado para no requerir de un unit indexer
  • Variable onDeath ahora es local

v1.1.0.0

  • Agregado trigger para detectar cuando una unidad muere y así limpiar el hashtable
  • Ahora funciona con hashtable
  • Arreglado bug en el almacenado de los niveles de los estados en las unidades

v1.0.0.0

  • Liberado


Comentarios/sugerencias son bienvenidos Wink

Saludos.


Última edición por Ruke el Sáb Dic 20, 2014 10:44 pm, editado 4 veces
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 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Jue Mar 27, 2014 7:14 pm

Si fusiono Status con Buffs Shocked

El cielo es el límite!
Volver arriba Ir abajo
muzk
Peón
muzk


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

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 9:27 pm

OJO:

Hero X muere con STATUS_UNPATH--->
Flush()
Hero X revive
Hero X sigue con UNPATH

(Me llegaron algunos bugs relacionadas con Status en NWU XD)
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 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 10:28 pm

@muzk escribió:
OJO:

Hero X muere con STATUS_UNPATH--->
Flush()
Hero X revive
Hero X sigue con UNPATH

(Me llegaron algunos bugs relacionadas con Status en NWU XD)

Gracias muzk, ahi lo corregí:

[jass]struct StateDeathReviveTest
private static method onInit takes nothing returns nothing
local unit hero = CreateUnit(GetLocalPlayer(), 'Hpal', 0, 0, 0)

call Status_Add(STATUS_UNPATH, hero)
call KillUnit(hero)
call ReviveHero(hero, 0, 0, false)

if (Status_Has(STATUS_UNPATH, hero)) then
call BJDebugMsg("ERROR BUG - El heroe no deberia tener estados cuando muere/revive")
else
call BJDebugMsg("El heroe murio/revivio sin estados, como deberia :)")
endif

set hero = null
endmethod
endstruct[/jass]
Volver arriba Ir abajo
muzk
Peón
muzk


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

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 10:37 pm

Adivina

[jass]
struct StateDeathReviveTest
private static method onInit takes nothing returns nothing
local unit hero = CreateUnit(GetLocalPlayer(), 'Hpal', 0, 0, 0)

call Status_Add(STATUS_UNPATH, hero)
call Status_Add(STATUS_UNPATH, hero)
call KillUnit(hero)
call ReviveHero(hero, 0, 0, false)

if (Status_Has(STATUS_UNPATH, hero)) then
call BJDebugMsg("ERROR BUG - El heroe no deberia tener estados cuando muere/revive")
else
call BJDebugMsg("El heroe murio/revivio sin estados, como deberia Smile")
endif

set hero = null
endmethod
endstruct
[/jass]
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 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 10:39 pm

^dat

ahi veo de corregirlo
Volver arriba Ir abajo
muzk
Peón
muzk


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

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 10:42 pm

Lo más fácil creo que es hacer un loop sobre el level del status e ir removiendo. Quizás crear una función tipo "RemoveAll(unit, STATUS_X)" que haga precisamente eso.

Edit:
O un while Status_Has(..) == true xD
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 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 10:46 pm

o llevar el nivel a 1. estaba pensando crear una funcion Reset(unidad, nivel) pero seria peligrosa y/o cag*ria el proposito de los niveles me parece...

edit: o Remove(status, unit, boolean force), si force == true se remueve del todo sin importar el nivel
Volver arriba Ir abajo
muzk
Peón
muzk


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

Mensajes Mensajes : 40
Reputación Reputación : 4
Monedas de oro : 188
Monedas de Platino : 0 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Sáb Dic 20, 2014 10:50 pm

Ya lo arreglaste?

No había visto esto [jass]call SaveInteger(hashTable, id, status, 1)[/jass] eso lo arregla perfecto.

Me parece que con eso basta.
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 [Resubido] Status Empty

Inventario :
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10
[Resubido] Status Empysl10 [Resubido] Status Empysl10 [Resubido] Status Empysl10

[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10Mar Feb 28, 2017 9:39 pm

Tomé este sistema, y lo convertí en esto:

[jass]//library Status
// v1.2.1.0
//************************************************************************************
//*
//* Con Status podras agregar estados (stun, silence, invisibility, hex y muchos mas)
//* a las unidades muy facilmente.
//*
//*************************************************************************************
//*
//* Estados
//*
//* STATUS_STUN
//* - Stun a la unidad que se agregue este estado
//*
////* STATUS_SILENCE
//* - La unidad que tenga este estado no podr? lanzar spells
//*
//* STATUS_DISARM_BOTH
//* - Las unidades con este estado no podr?n atacar (melee ni rango)
//*
//* STATUS_DISARM_MELEE
//* - Las unidades que ataquen melee no podr?n atacar
//*
//* STATUS_DISARM_RANGE
//* - Las unidades que ataquen a distancia no podr?n atacar
//*
//* STATUS_ENTANGLE
//* - Red, no se pueden mover pero si atacar y lanzar spells
//*
//* STATUS_INVISIBILITY
//* - Vuelve invisible a la unidad que se le de este estado
//*
//* STATUS_GHOST
//* - Similar a STATUS_INVISIBILITY
//*
//* STATUS_DOOM
//* - Las unidades con este estado no pueden lanzar ni aprender spells
//*
//* STATUS_SPELL_IMMUNITY
//* - Vuelve inmune a ataques m?gicos a la unidad que se le de este estado
//*
//* STATUS_HEX
//* - Transforma en una oveja/rana/etc a la unidad que tenga este estado
//* haciendo que la misma no pueda atacar ni lanzar habilidades
//*
//* STATUS_NEVER_MISS
//* - La unidad a la que se le d? este estado nunca miss un golpe
//*
//* STATUS_ALWAYS_MISS
//* - La unidad con este estado siempre har? miss en sus ataques
//*
//* STATUS_UNTOUCHABLE
//* - La unidad que tenga este estado tendr? 100% de evasi?n
//*
//* STATUS_BANISH
//* - Inmune a golpes f?sicos pero no m?gicos
//*
//* STATUS_PHASE
//* - Mismo efecto que Windwalk solo que no hace invisible
////*
//* STATUS_RESISTANT_SKIN
//* - Reduce la duraci?n de habilidades negativas y hace inmune
//* a ciertas habilidades
//*
//* STATUS_REFLECT_PIERCING
//* - Reduce el da?o de ataques tipo Piercing y de ataques m?gicos
//*
//* STATUS_DISABLE
//* - Como pausear una unidad, solo que no esconde los iconos
//*
//* STATUS_INVULNERABLE
//* - Vuelve invulnerable ante todos los ataques a la unidad
//* que tenga este estado
//*
//* STATUS_PAUSE
//* - Pausea la unidad que tenga este estado, haciendo que
////* no se pueda mover ni atacar
//*
//* STATUS_HIDE
//* - Esconde a la unidad que tenga este estado
//*
//* STATUS_UNPATH
//* - Saca las colisiones a la unidad que posea este estado
//*
////*************************************************************************************
//*
//* Funciones
//*
//* function Status_Add takes integer status, unit u returns nothing
//* - Agrega el estado a la unidad
//*
//* function Status_Remove takes integer status, unit u returns nothing
//* - Remueve el estado a la unidad
//*
//* function Status_Has takes integer status, unit u returns boolean
////* - Devuelve true si la unidad tiene el estado
//*
//*************************************************************************************
//*
//* Creditos
//*
//* Enteramente a Jesus4Lyf, yo solamente optimice su trabajo
//* muZk
//*
//*************************************************************************************
//*
//* CONFIGURABLE
//*
//*/
///**********************************************************************************/

///************************************************************************************
//*
//* CONFIGURABLE
//*
//*/
function Estados_Load takes nothing returns nothing
set udg_STATUS_STUN = 1
set udg_STATUS_SILENCE = 2
set udg_STATUS_DISARM_BOTH = 3
set udg_STATUS_DISARM_MELEE = 4
set udg_STATUS_DISARM_RANGE = 5
set udg_STATUS_ENTANGLE = 6
set udg_STATUS_INVISIBILITY = 7
set udg_STATUS_GHOST = 8
set udg_STATUS_DOOM = 9
set udg_STATUS_SPELL_IMMUNITY = 10
set udg_STATUS_HEX = 11
set udg_STATUS_NEVER_MISS = 12
set udg_STATUS_ALWAYS_MISS = 13
set udg_STATUS_UNTOUCHABLE = 14
set udg_STATUS_BANISH = 15
set udg_STATUS_PHASE = 16
set udg_STATUS_RESISTANT_SKIN = 17
set udg_STATUS_REFLECT_PIERCING = 18
set udg_STATUS_DISABLE = 19
set udg_STATUS_INVULNERABLE = 20
set udg_STATUS_PAUSE = 21
set udg_STATUS_HIDE = 22
set udg_STATUS_UNPATH = 23

set udg_STATUS_ORDER[udg_STATUS_STUN] = 852231
set udg_STATUS_ORDER[udg_STATUS_SILENCE] = 852668
set udg_STATUS_ORDER[udg_STATUS_DISARM_BOTH] = 852585
set udg_STATUS_ORDER[udg_STATUS_DISARM_MELEE] = 852585
set udg_STATUS_ORDER[udg_STATUS_DISARM_RANGE] = 852585
set udg_STATUS_ORDER[udg_STATUS_ENTANGLE] = 852106
set udg_STATUS_ORDER[udg_STATUS_DOOM] = 852583
set udg_STATUS_ORDER[udg_STATUS_HEX] = 852502
set udg_STATUS_ORDER[udg_STATUS_BANISH] = 852486
set udg_STATUS_ORDER[udg_STATUS_PHASE] = 852129
set udg_STATUS_ORDER[udg_STATUS_DISABLE] = 852252
endfunction
//**********************************************************************************/

// /**
// * Verificamos si unidad tiene un estado
// *
// * @param integer udg_STATUS Ver constantes (udg_STATUS_HIDE, udg_STATUS_UNPATH, etc.)
// * @param unit u
// * @returns boolean true si la unidad tiene el estado, false de lo contrario
// */
function Estados_Has takes integer status, unit u returns boolean
return LoadInteger(udg_STATUS_Hashtable, GetHandleId(u), status) > 0
endfunction

//**
// * Agregamos estado a unidad
// *
// * @param integer status Ver constantes (STATUS_HIDE, STATUS_UNPATH, etc.)
// * @param unit u
// */
function Estados_Add takes integer status, unit u returns nothing
local integer id = GetHandleId(u)
local integer level = LoadInteger(udg_STATUS_Hashtable, id, status) + 1

call SaveInteger(udg_STATUS_Hashtable, id, status, level)

if (level > 0) then
if (status == udg_STATUS_INVULNERABLE) then
call SetUnitInvulnerable(u, true)
elseif (status == udg_STATUS_PAUSE) then
call PauseUnit(u, true)
elseif (status == udg_STATUS_HIDE) then
call ShowUnit(u, false)
elseif (status == udg_STATUS_UNPATH) then
call SetUnitPathing(u, false)
elseif (status == udg_STATUS_PHASE) then
call SetPlayerAbilityAvailable(GetOwningPlayer(u), udg_STATUS_ABILITY[status], true)

if (UnitAddAbility(u, udg_STATUS_ABILITY[status])) then
call UnitMakeAbilityPermanent(u, true, udg_STATUS_ABILITY[status])
call IssueImmediateOrderById(u, udg_STATUS_ORDER[status])
endif

call SetPlayerAbilityAvailable(GetOwningPlayer(u), udg_STATUS_ABILITY[status], false)
else
if (udg_STATUS_ORDER[status] == 0) then
call UnitAddAbility(u, udg_STATUS_ABILITY[status])
call UnitMakeAbilityPermanent(u, true, udg_STATUS_ABILITY[status])
else
call UnitAddAbility(udg_STATUS_dummyCaster, udg_STATUS_ABILITY[status])
call IssueTargetOrderById(udg_STATUS_dummyCaster, udg_STATUS_ORDER[status], u)
call UnitRemoveAbility(udg_STATUS_dummyCaster, udg_STATUS_ABILITY[status])
endif
endif
endif
endfunction

///**
//* Removemos estado a unidad
//*
//* @param integer status Ver constantes (STATUS_HIDE, STATUS_UNPATH, etc.)
//* @param unit u
//*/
function Estados_Remove takes integer status, unit u returns nothing
local integer id = GetHandleId(u)
local integer level = LoadInteger(udg_STATUS_Hashtable, id, status) - 1

call SaveInteger(udg_STATUS_Hashtable, id, status, level)

if (level == 0) then
if (status == udg_STATUS_INVULNERABLE) then
call SetUnitInvulnerable(u, false)
elseif (status == udg_STATUS_PAUSE) then
call PauseUnit(u, false)
elseif (status == udg_STATUS_HIDE) then
call ShowUnit(u, true)
elseif (status == udg_STATUS_UNPATH) then
call SetUnitPathing(u, true)
elseif (status == udg_STATUS_PHASE) then
call UnitRemoveAbility(u, udg_STATUS_BUFF[status])
else
if (udg_STATUS_ORDER[status] == 0) then
call UnitMakeAbilityPermanent(u, false, udg_STATUS_ABILITY[status])
call UnitRemoveAbility(u, udg_STATUS_ABILITY[status])
endif

if (udg_STATUS_BUFF[status] != 0) then
call UnitRemoveAbility(u, udg_STATUS_BUFF[status])

// we also have to remove the air tangle buff
if (status == udg_STATUS_ENTANGLE) then
call UnitRemoveAbility(u, udg_STATUS_BUFF_ENTANGLE_AIR)
endif
endif
endif
endif
endfunction

///**
//* Limpiamos todos los estados a una unidad
//*
// * @param unit whichUnit
//*/
function Estados_Clear takes unit whichUnit returns nothing
local integer status = udg_STATUS_UNPATH // ultimo estado
local integer id = GetHandleId(whichUnit)

loop
exitwhen status == 0

call SaveInteger(udg_STATUS_Hashtable, id, status, 1)
call Estados_Remove(status, whichUnit)

set status = status - 1
endloop

call FlushChildHashtable(udg_STATUS_Hashtable, id)
endfunction

function Trig_Estados_onDeath takes nothing returns boolean
call Estados_Clear(GetTriggerUnit())
return false
endfunction


function InitTrig_Estados takes nothing returns nothing
local trigger onDeath = CreateTrigger()
local integer i = 1
local integer n = 0


set udg_STATUS_Hashtable = InitHashtable()

call TriggerRegisterAnyUnitEventBJ(onDeath, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(onDeath, Condition(function Trig_Estados_onDeath))

call Estados_Load()
call TriggerExecute(gg_trg_Estados_Config)
set udg_STATUS_dummyCaster = CreateUnit(Player(15), udg_STATUS_DUMMY_ID, 0, 0, 0)
loop
exitwhen udg_STATUS_ABILITY[i] == 0

call UnitAddAbility(udg_STATUS_dummyCaster, udg_STATUS_ABILITY[i])
call UnitRemoveAbility(udg_STATUS_dummyCaster, udg_STATUS_ABILITY[i])

if (udg_STATUS_ORDER[i] == 0) then
loop
exitwhen n > bj_MAX_PLAYERS
call SetPlayerAbilityAvailable(Player(n), udg_STATUS_ABILITY[i], false)
set n = n + 1
endloop
set n = 0
endif

set i = i + 1
endloop

set onDeath = null
endfunction
//endlibrary[/jass]

http://www.mediafire.com/file/228pdsbz563m2wb/Estados.w3x
http://www.mediafire.com/file/h4qooz1a3fuezi1/Estados.w3a
http://www.mediafire.com/file/7axhqjthu99ghda/Datos+de+Buff+Estados.w3h

El mapa está vacío, pero el sistema está testeado xD
Volver arriba Ir abajo
Contenido patrocinado




[Resubido] Status Empty
Mensaje(#) Tema: Re: [Resubido] Status [Resubido] Status Clock10

Volver arriba Ir abajo
 

[Resubido] Status

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

 Temas similares

-
» Burn Fireblaze (Continuando con la base de datos)
» Detector de Shiny

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