BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarseGrupos de Usuarios
Eventos Actuales
¡ Bienvenido Invitado!

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte | .
 

 [Tutorial] Crear unidades No-Dummy •

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

avatar


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

Mensajes Mensajes : 15
Reputación Reputación : 3
Monedas de oro : 127


Inventario :



Mensaje(#) Tema: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 10:03 pm

Crear Unidades No-Dummy



Resumen:

Este tutorial es para aquellos que desean detectar una unidad dummy mediante detonadores, en si el manejo de una unidad dummy es algo limitado en ese ámbito, ya que al quererse realizar juegos de disparo como el choque de dos misiles no funcionara... Solo si es un unidad normal (Pero se perdería el sentido ya que pueden ser seleccionados en el juego, eso molestaría mucho en parte al usuario). Bueno comencemos con la explicación:

=====================================================================================

1.- ¿Que son Unidades Dummy?

Como veras las unidades dummys, por particularidad tienen el efecto de ser imperceptibles por conjuros, hechizos, etc (se puede usar detonadores que cuenten la cantidad de unidades dummys que hay,m pero eso seria una labor algo tediosos, ya que se requiere crear un sistema que lo haga)... Este acontecimiento se debe a que cada unidad dummy le damos la habilidad 'Aloc' mejor dicho langosta que hace que la unidad sea intocable.
Nota: La mayoría de los casos se usan un .mdx importado que represente el modelo de una unidad dummy.


Citación :
Ventajas de las unidades Dummy:
-Pueden recibir ordenes de atacar, moverse, lanzar spells, etc.
-Pueden llevar auras.
-Pueden cambiarse el color de estas unidades (mediante detonadores, también pueden ser transparentes).
-Pueden aumentar de tamaño o disminuirlo (mediante detonadores de escala).
-Pueden ser detectados cuando mueren (mediante eventos dead).
-Pueden cambiar su elevación en el mapa (Altura).
-Pueden simular animaciones. (Solo si es otro modelo, que contenga animaciones)

Desventajas de las unidades Dummy:
-No pueden ser fácilmente detectados por detonadores sencillos.
-No pueden recibir hechizos por otras unidades.
-Si no se remueven adecuadamente pueden ocasionar que se queden dentro del mapa aun.
2.- ¿Que son Unidades Muertas (No-Dummy)?

La unidad muerta en este caso lo llamaremos No-Dummy (En mi caso Unidad Misil Cool) . estas unidades simplemente como el nombre lo indica son unidades muertas -(corpose, unidad que muere y solo deja el rastro de su cadáver)- estas unidades tienen la particularidad de que ya no son unidades tocables para el jugador, pero siguen existiendo dentro del mapa hasta que pase el tiempo de descomposición puesta por el editor de objetos. Con unos cuantos cambios se puede hacer un unidad corpose, que no perezca en el juego hasta que nosotros lo deseemos.


Citación :
Ventajas de las unidades No-Dummy:
-Pueden aumentar de tamaño o disminuirlo (mediante detonadores de escala).
-Pueden cambiar su elevación en el mapa (Altura).
-Pueden ser fácilmente detectados por detonadores sencillos. En este caso group funciona adecuadamente.
-Pueden simular animaciones. (Solo si es otro modelo, que contenga animaciones)

Desventajas de las unidades No-Dummy:
-No pueden recibir ordenes de atacar, moverse, lanzar spells, etc, simplemente por estar muertas.
-Las unidades muertas no logran llevar auras (aun que esto no es del todo comprobado Rolling Eyes ).
-No se pueden cambiar su color (Esta es una particularidad de estas unidades).
-No pueden ser detectados cuando mueren (ya saben por que XD).
-No pueden recibir hechizos por otras unidades.
-Si no se remueven adecuadamente pueden ocasionar que se queden dentro del mapa aun.
3.- ¿Como creamos la unidad No-Dummy?

Spoiler:
 

Después de crear la unidad se necesitara una función para crearlas.
Nota: Copien el code en una hoja detonador pasado a texto.


[jass]library FunctionMisc
//p => Creo el corpose para el jugador asignado
//id=> El id de la unidad, pueden tener varias unidades muertas en su editor.
//x, y => las coordenadas donde aparecera la unidad.
//facing=> el angulo al mira cuando se crea la unidad.

function CreateCorpseEx takes player p, integer id, real x, real y, real facing returns unit
   local unit dum  = CreateCorpse(p, id, x, y, facing)
   call SetUnitAnimation(dum,"stand")//Elimina la animacion corpose por defecto
   call UnitSuspendDecay(dum,true)//Para sacarlo del mapa solo usamos RemoveUnit
   call SetUnitPathing(dum,false)//La unidad ignora obstáculos.
   call SetUnitPosition(dum,x,y)
   return dum
endfunction

endlibrary[/jass]

4.- Como usar unidades No-Dummy y eliminarlas mediante código:

En este código test, se vera la forma de como crear una unidad No-Dummy y como eliminarla.

- Test Versión vJass
[jass]scope TestMisilvJass initializer Init

globals
   private constant string EFFECT = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl"
   private constant string Effect_Position = "chest"
   private constant integer MisileID = 'e001'//El codigo de la unidad misile
endglobals

private function Unidad_Muerta takes nothing returns boolean
   local unit u = GetTriggerUnit()
   local unit dum
   local real x = GetUnitX(u)
   local real y = GetUnitY(u)

   set dum = CreateCorpseEx(GetOwningPlayer(u), MisileID, x, y, GetUnitFacing(u))
   call AddSpecialEffectTarget(EFFECT,dum,Effect_Position)
   call SetUnitScale(dum, 2.2,2.2,2.2)
   
   set u = null
   call TriggerSleepAction(5.0)
   call RemoveUnit(dum)
   set dum = null
   return false
endfunction

//===========================================================================
   private function Init takes nothing returns nothing
       local trigger t = CreateTrigger()
       call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT )
       call TriggerAddAction(t, function Unidad_Muerta)
       //Precargar los efectos
       call Preload(EFFECT)
       set t = null
   endfunction

endscope
[/jass]

- Test Versión GUI:
[gui]Test Misil GUI
   Acontecimientos
       Unidad - A unit Inicia el efecto de una habilidad
   Condiciones
       (Ability being cast) Igual a Fire Ball
   Acciones
       -------- Declariacion de una variable Local --------
       -------- La local sera unico y solo existira durante el transcurso del detonador --------
       Custom script:   local unit dum
       -------- Seteo de las variables Globales --------
       Set Player = (Owner of (Triggering unit))
       Set X = (X of (Position of (Triggering unit)))
       Set Y = (Y of (Position of (Triggering unit)))
       Set Ang = (Facing of (Triggering unit))
       -------- las locales no necesitan udg_ --------
       -------- udg_ Es la forma de llamar las variables Globales en jass --------
       -------- 'e001' => El Id de la unidad misil --------
       Custom script:   set dum = CreateCorpseEx(udg_Player, 'e001', udg_X, udg_Y, udg_Ang)
       -------- Pasamos lo que contiene la variable local dum a la variable global Dummy --------
       Custom script:   set udg_Dummy = dum
       Animación - Change Dummy's size to (200.00%, 200.00%, 200.00%) of its original size
       Efecto especial - Create a special effect attached to the chest of Dummy using Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
       -------- Tiempo de espera de 5s ( TriggerSleepAction parecido al wait en gui pero mas efectivo) --------
       Custom script:   call TriggerSleepAction(5.0)
       -------- Pasamos lo que contiene dum Dummy --------
       Custom script:   set udg_Dummy = dum
       -------- Removemos la unidad misil y nulleamos la variable local --------
       Unidad - Remove Dummy from the game
       Custom script:   set dum = null
[/gui]

Like a Star @ heaven Como verán en este ejemplo las unidades No-Dummy son creadas de forma normal, con la diferencia de que deben ser removidas para ser eliminadas del mapa.

5.- Hechizo ejemplo usando No-Dummy:

> FireBall Misil
Este spell simplemente hace daño a las unidades que están en su camino, pero puede colisionar con otro misil cercano.
Simplemente usamos un grupo para detectar todas las unidades, entre ellas se incluyen también las unidades No-Dummy, filtramos el grupo de unidades enemigas y otras opciones mas, sacamos la unidad misil que se usa en el spell del grupo por que también es una unidad No-Dummy y correspondemos hacer daño a las unidades enemigas, si se encuentra una unidad No-Dummy en el grupo, se la remueve y también el misil usado en el hechizo. Gracias a esto, cuando llegue a la condición que finaliza el spell lo dará por terminado, porque una de sus condiciones es que si la unidad No-Dummy utilizada es igual a null se cumplirá.
Nota: Este Spell esta hecho en vJass.


- Código del Hechizo:
[jass]scope EsferaFuegoMisil initializer Init

// |-------------|
// | Constants:  |
// |-------------|
   globals
       private constant string EFFECT = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl" //El misil
       private constant string EFFECT_POSITION = "chest" //La posicion para creacion del efecto.
       private constant integer ID = 'A000' //El ID del spell
       private constant integer MisilID = 'e001'//ID de la unidad dummy
       private constant attacktype attack_type = ATTACK_TYPE_NORMAL
       private constant damagetype damage_type = DAMAGE_TYPE_MAGIC
       private constant real Periodic = 0.04 //Periodo del timer
       private constant real TimeDefault = 10.00//Si este tiempo acaba, el hechizo se termina
       private constant real Speed = 25.00//La rapidez del misil
       private constant real AreaMisil = 150.00//Area que daña el misil
       private constant real DistDamage = 100.00//La distancia que debe recorrer para dañar la unidad
       
       private unit U = null
       private group G = CreateGroup()
   endglobals
   
   private function Condicion takes nothing returns boolean
       return GetSpellAbilityId() == ID //Si la habilidad lanzada es el FireBall
   endfunction
   
   private function Filt takes nothing returns boolean
       local boolean b = GetFilterUnit()!=U
       set b = b and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(U))
       set b = b and GetWidgetLife(GetFilterUnit())>.405
       set b = b and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)
       set b = (b) or GetUnitTypeId(GetFilterUnit()) == MisilID //Si la unidad es un No-dummy
       return b
   endfunction
   
// |------------------|
// | End of Constants |
// |------------------|

//Motor principal.
private function TimeLoop takes nothing returns nothing
   local timer t = GetExpiredTimer()//Obtengo el timer
   local unit u = GetHandleUnit(t,"unit")
   local unit a
   local real x  
   local real y
   local real ang = GetHandleReal(t,"ang")
   local real countmove = GetHandleReal(t,"countmove")
   local unit dummy = GetHandleUnit(t,"dummy")
   local real damage = GetHandleReal(t,"damage")
   set U = u
       
   call SetHandleReal(t,"distDamage",GetHandleReal(t,"distDamage")+Speed)
   call SetHandleReal(t,"ctime",GetHandleReal(t,"ctime")+Periodic)
   call SetHandleReal(t,"countmove",GetHandleReal(t,"countmove")+Speed)
   call SetHandleReal(t,"posX",GetHandleReal(t,"posX")+Speed*Cos(ang))
   call SetHandleReal(t,"posY",GetHandleReal(t,"posY")+Speed*Sin(ang))
   set x = GetHandleReal(t,"posX")
   set y = GetHandleReal(t,"posY")
   
   //Condiciones para Terminar el Spell:
   //- GetHandleReal(t,"ctime") >= TimeDefault
   //Contador que termina si este es mayor a TimeDefault, usado para acabar el
   //spell en un tiempo determinado, solo es para evitar fugaz.                      
   //- GetHandleReal(t,"countmove") >= GetHandleReal(t,"distance")
   //Contador para la distancia recorrida, si acaba termina el spell.
   //- dummy == null
   //Si el dummy es igual a null, se acaba el spell. Esto es para el caso
   //cuando se remueva la unidad No-Dummy antes de las anteriores condiciones,
   //esta condicion es el detector si el misil ah sido removido del mapa.
   //- u == null
   //Condicion para evitar fugaz si es que unidad que lanzo el spell no existe.
   if GetHandleReal(t,"ctime") >= TimeDefault or GetHandleReal(t,"countmove") >= GetHandleReal(t,"distance") or dummy == null or u == null then
       if dummy != null then
           call RemoveUnit(dummy)
       endif
       call DestroyEffect(AddSpecialEffect(EFFECT,x,y))
       call FlushHandleLocals(t)
       call PauseTimer(t) //Pausamos el timer
       call DestroyTimer(t) //Destruimos el timer
   else
       call SetUnitPosition(dummy,x,y)//Mueve la unidad de acuerdo a x y y
       
       if GetHandleReal(t,"distDamage") >= DistDamage then
           call SetHandleReal(t,"distDamage",0)
           call GroupEnumUnitsInRange(G,GetUnitX(dummy),GetUnitY(dummy),AreaMisil,Condition(function Filt))
           call GroupRemoveUnit(G,dummy)//Removemos la unidad dummy misile, atrapada por el filter
           loop
               set a = FirstOfGroup(G)
               exitwhen a == null
               call GroupRemoveUnit(G,a)
               if GetUnitTypeId(a) ==  MisilID then//Detector si el grupo encuentra
                                                   //una unidad No-Dummy
                   call RemoveUnit(a)//Removemos la unidad No-Dummy que choca
                   call RemoveUnit(dummy)//Removemos la unidad No-Dummy
                   set a = null//Liberamos la memoria de la varaible a
                   exitwhen true
               else
                   call UnitDamageTarget(u,a,damage,false,false,attack_type,damage_type,null)
                   call DestroyEffect(AddSpecialEffectTarget(EFFECT,a,EFFECT_POSITION))
               endif
           endloop
       endif
   endif
   
   set dummy = null
   set t = null
   set u = null
endfunction

private function Esfera_Fuego_Misil takes nothing returns nothing
   local unit u = GetTriggerUnit()//Unidad que lanza el spell
   local integer lvl = GetUnitAbilityLevel(u,ID)//Obtengo el Level del spell de la unidad
   local real x = GetUnitX(u)
   local real y = GetUnitY(u)
   local real xl = GetSpellTargetX()//Punto señalado en el mapa por el spell en X
   local real yl = GetSpellTargetY()//Punto señalado en el mapa por el spell en Y
   local real ang = Atan2(yl-y,xl-x) //Angulo de salida
   local real distance = 750 + 250*lvl //Distancia rcorrida para cada level
   local real countmove = 0 //Contador de distancia
   local real damage = 50 + 25*lvl//Damage que hace las explosiones
   local timer t = CreateTimer()//El reloj
   local unit dummy = CreateCorpseEx(GetOwningPlayer(u), MisilID, x, y, GetUnitFacing(u))//La unidad dummy
   call SetUnitPosition(dummy,x,y)
   
   call AddSpecialEffectTarget(EFFECT,dummy,EFFECT_POSITION)

   //Guardo mis valores dentro del timer
   call SetHandleUnit(t,"unit",u)
   call SetHandleInt(t,"lvl",lvl)
   call SetHandleReal(t,"posX",x)
   call SetHandleReal(t,"posY",y)
   call SetHandleReal(t,"ang",ang)
   call SetHandleReal(t,"ctime",0)//Este valor es el contador del tiempo default
   call SetHandleReal(t,"distance",distance)
   call SetHandleReal(t,"distDamage",DistDamage)
   call SetHandleReal(t,"damage",damage)
   call SetHandleReal(t,"countmove",countmove)
   call SetHandleUnit(t,"dummy",dummy)
   
   //Empiezo el Timer
   call TimerStart (t, Periodic, true, function TimeLoop)
   
   //Nulleo las variables que requieren ser nulleadas para evitar fugaz.
   set t = null
   set u = null
   set dummy = null
endfunction

//===========================================================================
   private function Init takes nothing returns nothing
       local trigger t = CreateTrigger()//El trigger
       call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
       call TriggerAddCondition(t,Condition(function Condicion))
       call TriggerAddAction(t, function Esfera_Fuego_Misil)
       
       //Precargar los efectos
       call UnitPreload(MisilID)
       call Preload(EFFECT)
       set t = null
   endfunction
endscope[/jass]

- Librerías:
Spoiler:
 

> Descarga el Mapa Test y Spell:
Preview:
Spoiler:
 
:descargar: 
http://www.epicwar.com/maps/231872/

Espero haber ayudado a contribuir con mas ideas para hechizos con este tutorial, sugerencias y correcciones pueden comentar. (Este tutorial puede ir modificándose con mas avances que pueda hacer.) Cool 
Saludos...


Última edición por angelos el Dom Ago 04, 2013 12:10 am, editado 5 veces
Volver arriba Ir abajo
Marcos_M

avatar


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

Mensajes Mensajes : 2621
Reputación Reputación : 407
Monedas de oro : 8075
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 10:42 pm

La ventaja es que puede ser tomada fácilmente en un grupo? ._.
Volver arriba Ir abajo
En línea
ILoGy
Caballero
avatar


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

Mensajes Mensajes : 405
Reputación Reputación : 69
Monedas de oro : 2430
Monedas de Platino : 2

Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 10:45 pm

:Shocked:  excelente angel, esto no lo había pensado y pues la verdad no es nada simple, creo que me servirá mucho, lastima tanto JASS, no entiendo un carajo en esas partes, intentare comprender(cuando lo requiera le votare cabeza) buen trabajo angel, +rep
Volver arriba Ir abajo
Uncharted

avatar


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

Mensajes Mensajes : 15
Reputación Reputación : 3
Monedas de oro : 127


Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 10:48 pm

Marcos_M escribió:
La ventaja es que puede ser tomada fácilmente en un grupo? ._.
Cool Es una ventaja enorme, los dummy con 'Aloc' no pueden tener esta opción y simplemente era algo que no me gustaba al generar mapas basados en juego de disparos tipo Warlock.
Saludos...


Última edición por angelos el Sáb Ago 03, 2013 10:56 pm, editado 1 vez
Volver arriba Ir abajo
Marcos_M

avatar


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

Mensajes Mensajes : 2621
Reputación Reputación : 407
Monedas de oro : 8075
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 10:56 pm

Esta bien. Pero en tu skill marca la accion o conjunto de acciones que detectan el choque y reaccionan
Volver arriba Ir abajo
En línea
Uncharted

avatar


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

Mensajes Mensajes : 15
Reputación Reputación : 3
Monedas de oro : 127


Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 11:51 pm

Marcos_M escribió:
Esta bien. Pero en tu skill marca la accion o conjunto de acciones que detectan el choque y reaccionan
Simplemente solo agrupo las unidades y en ellas están los No-Dummys, las remuevo y listo acaba el hechizo de cada unidad No-Dummy gracias a la condición que termina el Spell.
Saludos...(En fin esa es una forma de hacer el spell, cualquier duda men avisas Cool )
Volver arriba Ir abajo
MuSe

avatar


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

Mensajes Mensajes : 210
Reputación Reputación : 43
Monedas de oro : 2576
Monedas de Platino : 5

Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Sáb Ago 03, 2013 11:54 pm

cheers  Genial, buen tuto, muy bien explicado Wink 

Quien habría pensado usar corpses como dummys xDo debería decir (no-dummys)

La desventaja es que solo sirve para hacer misiles.

Saludos.
Volver arriba Ir abajo
Uncharted

avatar


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

Mensajes Mensajes : 15
Reputación Reputación : 3
Monedas de oro : 127


Inventario :



Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Dom Ago 04, 2013 12:24 am

MuSe escribió:
La desventaja es que solo sirve para hacer misiles.
Saludos.

Sep, estos tipos de unidades no realizan muchas cosas como lo harían los dummys por ejemplo, realizar ordenes, lanzar spells, ect. Pero podría ser oportuno en combinar dummys con no-dummys en hechizos especiales Cool , se explotaría muy bien las ventajas de ambos.
Saludos... (Me olvidaba que también que los No-Dummys pueden cambiar sus animaciones, study agregado al tuto)
Volver arriba Ir abajo
abadon456
Caballero
avatar


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

Mensajes Mensajes : 289
Reputación Reputación : 29
Monedas de oro : 675
Monedas de Platino : 0

Inventario :
Hacha de doble filo Daga Arrojadiza Libro de Conjuros


Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy • Jue Ene 01, 2015 10:03 pm

Muy buenos los Dummy, un buen tuto


[img][/img]
Volver arriba Ir abajo
Contenido patrocinado




Mensaje(#) Tema: Re: [Tutorial] Crear unidades No-Dummy •

Volver arriba Ir abajo
 

[Tutorial] Crear unidades No-Dummy •

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

 Temas similares

-
» [Tutorial] Crear unidades No-Dummy •
» [Tutorial] Crear una Cinemática
» [Tutorial] Crear Pantalla de Carga
» Tutorial Photoshop: Texto Tipo 'Grand Theft Auto V'
» [Tutorial] Crear Objetos Tipo Dota

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Academia :: Area JASS :: Tutoriales Varios-