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

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte | .
 

 [Testeo]Libreria Misiles

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
FreeMadness
Iniciado


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

Mensajes Mensajes : 4
Reputación Reputación : 1
Monedas de oro : 119
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: [Testeo]Libreria Misiles Miér Feb 13, 2019 7:47 pm

Se trata de una libreria ENORME para el manejo mas sencillo de misiles en general, usa librerias como Event, Recycle y otras que puedes añadir.

Tiene soporte para misiles que son esquivados(disjoint), y para eventos de collision entre misiles (aun necesito verificar como hacer este evento mas ordenado).

SOLO PARA VERSION 1.30

Parte del Codigo:

[Jass] //la estructura donde todo empieza



   struct missile
       static thistype array movers
       static integer index = 0
       unit target
       unit maintarget
       unit source
       lightning chain
       integer hits
       integer spellid
       real distance
       real speed
       real range
       real angle
       integer f
       integer lvl
       string modelpath
       effect missile
       real hitbox
       real x
       real y
       real z
       real tx
       real ty
       real tz
       real time
       player owner
       boolean pause
       boolean intercept
       boolean end
       boolean disjoint
       boolean disjointed
       boolean runcollision
       boolean intercepted
       thistype collided
       group hitten
       static group collisiongroup
       static timer looptimer = CreateTimer()
       method search takes nothing returns integer
                 local integer i2 = 1
                 local integer i
                 local unit u
                 call GroupEnumUnitsInRange( collisiongroup, this.x, this.y, this.hitbox, null)
                 loop
                      set u = FirstOfGroup(collisiongroup)
                      set i = GetUnitUserData( u )
                      exitwhen u == null or this.hits == 0
                      call GroupRemoveUnit(collisiongroup, u)  
                      if IsUnitInGroup( u, this.hitten )  == false and IsUnitEnemy(u, this.owner) and GetWidgetLife(u) > 0.405 then
                              call GroupAddUnit ( this.hitten, u )
                              set this.target = u
                              //Evento de collision con unidades se dispara aqui.
                              set this.runcollision = true
                              call MissileEventHolder.register( this )
                              set this.hits = this.hits - 1
                      endif
                 endloop
                 if this.intercept then
                      loop
                            exitwhen i2 > index
                            if movers[i2] != this then
                                     if SquareRoot( ( movers[i2].x - this.x)*( movers[i2].x - this.x) + ( movers[i2].y - this.y)*( movers[i2].y - this.y) ) <= this.hitbox then
                                                set this.hits = this.hits - 1
                                                //Evento de collision con otros missiles se disparan aqui
                                                set this.intercepted = true
                                                set this.collided = movers[i2]
                                                call MissileEventHolder.register( this )
                                     endif
                            endif
                            set i2 = i2 + 1
                       endloop
                 endif
                 set u = null
                 call GroupClear(collisiongroup)
                 return this.hits
        endmethod
       static method missileloop takes nothing returns nothing
              local thistype data
              local real da
              local real dx
              local real dy
              local real dz
              local location p
              local real d
              local integer i = 1
              loop
                   set data = movers[i]
                   exitwhen i > index
                   if data.end then
                          call MissileEventHolder.register( data )
                          set movers[i] = movers[index]
                          set movers[index] = 0
                          set index = index - 1
                          set i = i - 1
                          call data.destroy()
                   else
                          if data.hits != 0 then
                                 set data.hits = data.search()
                   endif
                   if data.maintarget == null then
                         if (data.distance >= data.range)  then
                               set data.end = true
                         endif
                   else
                   set dx = GetUnitX(data.maintarget)
                   set dy = GetUnitY(data.maintarget)
                   if SquareRoot( (dx - data.tx)*(dx - data.tx) + (dy - data.ty)*(dy - data.ty) ) >= 18.75 and data.disjoint then
                         // Evento de esquivar misil se dispara aqui
                          set data.disjointed = true
                          call MissileEventHolder.register( data )
                          set d = SquareRoot( (data.tx - data.x)*(data.tx - data.x) + (data.ty - data.y)*(data.ty - data.y) )
                          set data.distance = 0.00
                          set data.range = d
                          set data.f = 0
                          set data.disjoint = false
                   else
                          set data.tx = dx
                          set data.ty = dy
                   endif
                   if (data.distance < data.range) and SquareRoot( (data.tx - data.x)*(data.tx - data.x) + (data.ty - data.y)*(data.ty - data.y) ) > data.hitbox then
                          set da = ( Atan2( data.ty - data.y, data.tx - data.x) - data.angle )*data.f
                          set data.angle = data.angle + da
                          call BlzSetSpecialEffectRoll (data.missile, data.angle)
                   else
                          if SquareRoot( (data.tx - data.x)*(data.tx - data.x) + (data.ty - data.y)*(data.ty - data.y) ) <= data.hitbox then
                                     //Evento de Collision de unidad objetivo se dispara aqui(solo para missiles con unidad para perseguir)
                               set data.target = data.maintarget
                               set data.runcollision = true
                               call MissileEventHolder.register( data )
                          endif
                          set data.end = true
                    endif
     
              endif
              if data.pause != true then
                      set data.x = data.x + data.speed*Cos( data.angle)
                      set data.y = data.y + data.speed*Sin( data.angle)
                      set data.distance = data.distance + data.speed
                      set p = Location( data.x, data.y )
                      set dz = GetLocationZ( p )
                      if dz <= data.z and IsPointInMap( data.x, data.y ) then
                              call BlzSetSpecialEffectPosition( data.missile, data.x, data.y, data.z)
                      else
                              set data.end = true
                      endif
                      if data.chain != null then      // simplemente un efecto de rayo por si se desea crear un efecto cadena
                             call MoveLightningEx( data.chain, true, GetUnitX( data.source ), GetUnitY( data.source ), data.z, data.x, data.y, data.z )
                      endif
                      call RemoveLocation( p )
                      set p = null
                endif
           endif
           set i = i + 1
         endloop
         if index == 0 then
                call PauseTimer( looptimer )
         endif
   endmethod
       static method create takes unit u, unit u2, real range, real x, real y, real z, real angle, string model returns thistype
            local thistype this = thistype.allocate()
    local player p = GetOwningPlayer(u)
    set this.modelpath = model
    set this.missile = AddSpecialEffect( model, x, y )
    call BlzSetSpecialEffectRoll( this.missile, angle )
    set this.pause = false
    set this.disjoint = false
    set this.speed = 0.00
    set this.angle = angle
    set this.z = z
    set this.x = x
    set this.y = y
    set this.range = range
    set this.distance = 0.00
    set this.maintarget = u2
    set this.target = null
    set this.source = u
    set this.chain = null
    set this.f = 1
    set this.hitbox = 100
    set this.end = false
    set this.intercept = false
    set this.disjointed = false
    set this.runcollision = false
    set this.intercepted = false
    set this.hitten = Group.New()
    set index = index + 1
    set movers[index] = this
    if u2 != null then
call GroupAddUnit( this.hitten, u2 )
    endif
    if index == 1 then
call TimerStart( missile.looptimer, 0.03125, true, function missile.missileloop )
    endif
    set p = null
            return movers[index]
       endmethod

       method destroy takes nothing returns nothing
    if this.chain != null then
call DestroyLightning( this.chain)
    endif
    call DestroyEffect( this.missile )
    call Group.Recycle( this.hitten )
    set this.target = null
    set this.end = false
            set this.source = null
    set this.maintarget = null
    set this.missile = null
    set this.modelpath = null
    set this.distance = 0.00
    set this.range = 0.00
    set this.spellid = 0
    set this.time = 0.00
    set this.f = 0
    set this.owner = null
    set this.chain = null
        call this.deallocate()
       endmethod

   endstruct
[/Jass]

El Mapa ya posee habilidades de ejemplo.

Descargar el mapa
Volver arriba Ir abajo
 

[Testeo]Libreria Misiles

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

 Temas similares

-
» HORARIO DE LIBRERIA ALEXANDRIA
» Moscú prueba con éxito un misil intercontinental que "ningún sistema americano" podrá detener
» 2º TORNEO ELL "EL BARBAS" 23/02/2013
» Testeo Medievo / Tornasol
» [FINALIZADA] Miércoles, 14 de Agosto. Los Diamantes del Rey Trueno (Testeo II)

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