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
 

 [System] FORCE FIELD

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
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 [System] FORCE FIELD Empty

Inventario :
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10

[System] FORCE FIELD Empty
Mensaje(#) Tema: [System] FORCE FIELD [System] FORCE FIELD Clock10Miér Ene 22, 2014 5:29 am

FORCEFIELD

Oh si esta vieja librería mía. No muchos cambios pero es lo que hay.
Esta librería permite crear un sistema físico basado en campos de potencial similares a los campos eléctricos. Dominándola se pueden hacer spells bastante impresionantes de forma sencilla.

Código:
[jass]library ForceField initializer OnInit
//[Library] (vJASS) ForceField 1.5 by WonderWoman
/*
ForceField es un sistema basado en fisica electrica y orientado a unidades. Las unidades sufriran
fuerzas del campo electrico segun su masa.
La fisica involucrada es completamente realista. Solo las unidades añadidas al sistema por medio
de una funcion especifica se veran afectadas por las fuerzas.
Las fuentes de campo electrico son siempre unidades, no se puede crear una carga puntual en una
posicion (X, Y), para hacerlo se puede crear un dummy invisible en dicha posicion y luego crear
una carga sobre el.

FUNCIONES PUBLICAS
------------------
    function ForceFieldSetup takes real frequency returns nothing
        >>> Es necesario llamar a esta funcion antes de activar el sistema. <frequency> es un valor
        real entre 10.0 y 100.0 (cualquier valor fuera del rango sera adaptado) que determina la
        frecuencia de operacion en Hertz. Sugiero como minimo una frecuencia de 32.0.
        
    function ForceFieldActivate takes nothing returns nothing
        >>> Activa el sistema de campo de fuerzas, antes de activarlo se debe configurar.
        
    function ForceFieldDeactivate takes nothing returns nothing
       >>> Desactiva el sistema de campo de fuerzas.
        
    function ForceFieldAddUnit takes unit u, real mass, boolean immune returns nothing
        >>> Agrega una unidad <u> al sistema.
        <mass> Es un valor real que indica la masa de la unidad. Las unidades con mayor masa son
        menos afectadas por las fuerzas. Para este sistema mass equivale a [Masa * Carga Electrica]
        es decir que mass puede ser negativo indicando que se trata de un objeto con carga negativa.
        <immune> Si es verdadero la unidad no es afectada por las fuerzas, en la mayoria de los
        casos este parametro sera 'false', a menos que se quiera mantener una unidad inactiva
        sin sacarla del sistema.
        
    function ForceFieldChangeUnit takes unit u, real mass, boolean immune returns nothing
        >>> Cambia los parametros <mass> e <immune> de una unidad que ya se encuentre en el sistema.
        
    function ForceFieldRemoveUnit takes unit u returns nothing
        >>> Remueve una unidad del sistema de fuerzas.
    
    function NewPointParticle takes unit u, real charge, boolean selectiveparticle returns nothing
        >>> Crea una carga puntual sobre una unidad <u> que no tenga una carga puntual asociada.
        La carga es asociada a la unidad hasta que se destruye dicho objeto de carga.
        No es necesario que la unidad se encuentre agregada al sistema de fuerzas para crear el
       objeto de carga.
        <charge> Es un valor real que indica la cantidad de carga del objeto de carga. Un valor
        positivo repele a las unidades con masa positiva, mientras que un valor negativo de carga
        las atrae. (Recordar que la masa para el sistema equivale a [Masa * Carga Electrica] de la
       vida real)
        <selectiveparticle> Si es verdadero solo unidades enemigas a la unidad asociada a la carga
        son afectadas por la fuerza provocada por este objeto de carga en particular. En caso
       contrario afectara a todas las unidades en el sistema.
        
    function ChangePointParticle takes unit u, real charge, boolean selectiveparticle returns nothing
        >>> Cambia los parametros <charge> y <selectiveparticle> de un objeto de carga puntual
        existente. Como la ID de los objetos es privada se debe hacer referencia a la unidad <u>
       asociada al objeto de carga puntual.
        
    function DestroyPointParticle takes unit u returns nothing
        >>> Destruye el objeto de carga puntual asociado a la unidad <u>
        
    function NewChargedLine takes unit u1, unit u2, real charge, boolean selectiveline returns nothing
        >>> Crea una linea de carga sobre una unidad <u1> que no tenga una linea de carga asociada.
        La carga es asociada a <u1> hasta que se destruye dicho objeto de carga.
        La linea de carga tiene como punto inicial <u1> y como punto final <u2>, la unidad <u2> es
        la unidad asociada secundaria y NO identifica a la linea de carga.
        No es necesario que la unidad se encuentre agregada al sistema de fuerzas para crear el
       objeto de carga.
        <charge> Es un valor real que indica la cantidad de carga del objeto de carga. Un valor
        positivo repele a las unidades con masa positiva, mientras que un valor negativo de carga
        las atrae. (Recordar que la masa para el sistema equivale a [Masa * Carga Electrica] de la
       vida real)
        <selectiveparticle> Si es verdadero solo unidades enemigas a la unidad asociada a la carga
        son afectadas por la fuerza provocada por este objeto de carga en particular. En caso
       contrario afectara a todas las unidades en el sistema.
        
    function ChangeChargedLine takes unit u, real charge, boolean selectiveline returns nothing
        >>> Cambia los parametros <charge> y <selectiveparticle> de un objeto de linea de carga
        existente. Como la ID de los objetos es privada se debe hacer referencia a la unidad <u>
       asociada al objeto de linea de carga.
        
    function DestroyChargedLine takes unit u returns nothing
        >>> Destruye el objeto de linea de carga asociado a la unidad <u>
        
    function ForceFieldPolarRadianAceleration takes unit u, real direction, real ac returns nothing
        >>> Aplica una aceleracion instantanea a una unidad <u> dentro del sistema de fuerzas.
        Esto es equivalente a una fuerza de dirac (Cambio de velocidad instantanea).
        La unidad es acelerada en direccion <direction> con una intensidad <ac>, estando la
       direccion expresada en radianes.        
        
    function ForceFieldPolarDegreeAceleration takes unit u, real direction, real ac returns nothing
        >>> Aplica una aceleracion instantanea a una unidad <u> dentro del sistema de fuerzas.
        Esto es equivalente a una fuerza de dirac (Cambio de velocidad instantanea).
        La unidad es acelerada en direccion <direction> con una intensidad <ac>, estando la
       direccion expresada en grados.
        
    function ForceFieldCartesianAceleration takes unit u, real acx, real acy returns nothing
        >>> Aplica una aceleracion instantanea a una unidad <u> dentro del sistema de fuerzas.
        Esto es equivalente a una fuerza de dirac (Cambio de velocidad instantanea).
        La unidad sufre un cambio de velocidad instantaneo <acx> en la direccion X, y un cambio
        de velocidad instantaneo <acy> en la direccion Y.

*/
globals
    private hashtable WWhp = InitHashtable()
    private hashtable WWhl = InitHashtable()
    private hashtable WWhu = InitHashtable()
    private real FFperiodo = 0.0
    private timer FFtimer = CreateTimer()
    private trigger TUnitDies
    private integer NParticles = 0
    private integer NLines = 0
    private integer NUnits = 0
    private boolean SistemaActivo = false
endglobals

private function wwModulo takes real r1, real r2 returns real
   return SquareRoot((r1 * r1) + (r2 * r2))
endfunction

function NewPointParticle takes unit u, real charge, boolean selectiveparticle returns nothing
   local integer UniHand
   set UniHand = GetHandleId(u)
   if (GetUnitState(u, UNIT_STATE_LIFE) > 0) then
      if (LoadBoolean(WWhp, (LoadInteger(WWhp, UniHand ,0)), 3) == false) then
         set NParticles = NParticles + 1
         //...........................................
        call SaveInteger(WWhp, UniHand, 0, NParticles)
         call SaveReal(WWhp, NParticles, 2, charge)
         call SaveBoolean(WWhp, NParticles, 3, true)
         call SaveUnitHandle(WWhp, NParticles, 4, u)
         call SaveBoolean(WWhp, NParticles, 6, selectiveparticle)
         //...........................................
      endif
   endif
endfunction

function ChangePointParticle takes unit u, real charge, boolean selectiveparticle returns nothing
   local integer UniHand
   local integer PoloN
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhp, (LoadInteger(WWhp, UniHand ,0)), 3) == true) then
      set PoloN = LoadInteger(WWhp, UniHand ,0)
      //...........................................
     call SaveReal(WWhp, PoloN, 2, charge)
      call SaveBoolean(WWhp, PoloN, 6, selectiveparticle)
   endif
endfunction

function DestroyPointParticle takes unit u returns nothing
   local integer UniHand
   local integer PoloN
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhp, (LoadInteger(WWhp, UniHand ,0)), 3) == true) then
      set PoloN = LoadInteger(WWhp, UniHand ,0)
      //...........................................
     call SaveInteger(WWhp, GetHandleId(LoadUnitHandle(WWhp, NParticles,4)), 0, PoloN)
      call SaveReal(WWhp, PoloN, 2, LoadReal(WWhp, NParticles,2))
      call SaveBoolean(WWhp, PoloN, 3, LoadBoolean(WWhp, NParticles,3))
      call SaveUnitHandle(WWhp, PoloN, 4, LoadUnitHandle(WWhp, NParticles,4))
      call SaveBoolean(WWhp, PoloN, 6, LoadBoolean(WWhp, NParticles,6))
      //...........................................
      call SaveInteger(WWhp, UniHand, 0, 0)
      call SaveReal(WWhp, NParticles, 2, 0.00)
      call SaveBoolean(WWhp, NParticles, 3, false)
      call SaveUnitHandle(WWhp, NParticles, 4, null)
      call SaveBoolean(WWhp, NParticles, 6, false)
      //...........................................
      set NParticles = NParticles - 1
   endif
endfunction

function NewChargedLine takes unit u1, unit u2, real charge, boolean selectiveline returns nothing
   local integer UniHand
   set UniHand = GetHandleId(u1)
   if ((GetUnitState(u1, UNIT_STATE_LIFE) > 0) and (GetUnitState(u2, UNIT_STATE_LIFE) > 0))then
      if (LoadBoolean(WWhl, (LoadInteger(WWhl, UniHand ,0)), 3) == false) then
         set NLines = NLines + 1
         //...........................................
        call SaveInteger(WWhl, UniHand, 0, NLines)
         call SaveReal(WWhl, NLines, 2, charge)
         call SaveBoolean(WWhl, NLines, 3, true)
         call SaveUnitHandle(WWhl, NLines, 4, u1)
         call SaveUnitHandle(WWhl, NLines, 5, u2)
         call SaveBoolean(WWhl, NLines, 6, selectiveline)
         //...........................................
      endif
   endif
endfunction

function ChangeChargedLine takes unit u, real charge, boolean selectiveline returns nothing
   local integer UniHand
   local integer LineaN
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhl, (LoadInteger(WWhl, UniHand ,0)), 3) == true) then
      set LineaN = LoadInteger(WWhl, UniHand ,0)
      //...........................................
     call SaveReal(WWhl, LineaN, 2, charge)
      call SaveBoolean(WWhl, LineaN, 6, selectiveline)
   endif
endfunction

function DestroyChargedLine takes unit u returns nothing
   local integer UniHand
   local integer LineaN
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhl, (LoadInteger(WWhl, UniHand ,0)), 3) == true) then
      set LineaN = LoadInteger(WWhl, UniHand ,0)
      //...........................................
     call SaveInteger(WWhl, GetHandleId(LoadUnitHandle(WWhl, NLines,4)), 0, LineaN)
      call SaveReal(WWhl, LineaN, 2, LoadReal(WWhl, NLines,2))
      call SaveBoolean(WWhl, LineaN, 3, LoadBoolean(WWhl, NLines,3))
      call SaveUnitHandle(WWhl, LineaN, 4, LoadUnitHandle(WWhl, NLines,4))
      call SaveUnitHandle(WWhl, LineaN, 5, LoadUnitHandle(WWhl, NLines,5))
      call SaveBoolean(WWhl, LineaN, 6, LoadBoolean(WWhl, NLines,6))
      //...........................................
      call SaveInteger(WWhl, UniHand, 0, 0)
      call SaveReal(WWhl, NLines, 2, 0.00)
      call SaveBoolean(WWhl, NLines, 3, false)
      call SaveUnitHandle(WWhl, NLines, 4, null)
      call SaveUnitHandle(WWhl, NLines, 5, null)
      call SaveBoolean(WWhl, NLines, 6, false)
      //...........................................
      set NLines = NLines - 1
   endif
endfunction

private function ForceFieldPhysics takes nothing returns nothing
   local integer i = 1
   local integer j
   local real DfX
   local real DfY
   local real X
   local real Y
   local real array Xp
   local real array Yp
   local real array X1
   local real array Y1
   local real array X2
   local real array Y2
   local real Xrel
   local real Yrel
   local real array Pendiente
   local real array PendInv
   local real array Seno
   local real array Coseno
   local real Ordenada
   local real Xcort
   local real Ycort
   local real array Xmax
   local real LimInicial
   local real LimFinal
   local real Calc1
   local real Calc2
   local real CamEx
   local real CamEy
   local real h
   local real Vx
   local real Vy
   local real Modu
   local real Modu2
   local real Fuerza
   local real Aux
   local real Peso
   local unit u
   local integer array JugPolo
   local integer array JugLinea
   local boolean control
   //Operations constants loops
   loop  
  exitwhen i > NParticles
      set JugPolo[i] = GetPlayerId(GetOwningPlayer(LoadUnitHandle(WWhp, i, 4)))
      set Xp[i] = GetUnitX(LoadUnitHandle(WWhp, i, 4))
      set Yp[i] = GetUnitY(LoadUnitHandle(WWhp, i, 4))
      set i = i + 1
   endloop
   set i = 1
   loop  
  exitwhen i > NLines
      set JugLinea[i] = GetPlayerId(GetOwningPlayer(LoadUnitHandle(WWhl, i, 4)))
      set X1[i] = GetUnitX(LoadUnitHandle(WWhl, i, 4))
      set Y1[i] = GetUnitY(LoadUnitHandle(WWhl, i, 4))
      set X2[i] = GetUnitX(LoadUnitHandle(WWhl, i, 5))
      set Y2[i] = GetUnitY(LoadUnitHandle(WWhl, i, 5))
      if X1[i] > X2[i] then
         set Aux = X1[i]
         set X1[i] = X2[i]
         set X2[i] = Aux
         set Aux = Y1[i]
         set Y1[i] = Y2[i]
         set Y2[i] = Aux      
     endif
      set DfX = X2[i] - X1[i]
      set DfY = Y2[i] - Y1[i]
      set control = false
      if DfX > 0 or DfX < 0 then
         set Pendiente[i] = (DfY / DfX)
         set control = true
      else
         set Pendiente[i] = 99999.99
      endif
      if DfY > 0 or DfY < 0 then
         set PendInv[i] = -(DfX / DfY)
         set control = true
      else
         set PendInv[i] = -99999.99
      endif
      set Xmax[i] = wwModulo(DfX, DfY)
      if control then
         set Coseno[i] = -DfX / Xmax[i]
         set Seno[i] = DfY / Xmax[i]
      else
         set Coseno[i] = 0.78
         set Seno[i] = 0.78
      endif
      set i = i + 1
   endloop
   set i = 1
   //Aceleration loops
   loop
   exitwhen i > NUnits
      set u = LoadUnitHandle(WWhu, i, 4)
      set Peso = LoadReal(WWhu, i, 2)
      set Vx = LoadReal(WWhu, i, 5)
      set Vy = LoadReal(WWhu, i, 6)
      set X = GetUnitX(u)
      set Y = GetUnitY(u)
      //Particle physics
      if not(LoadBoolean(WWhu, i, 7)) then
      set j = 1
      loop
      exitwhen j > NParticles        
         if ( not(LoadBoolean(WWhp, j, 6)) or (IsUnitEnemy(u, Player(JugPolo[j])) == true) ) then
         if (LoadUnitHandle(WWhp, j, 4) != u) then
            set DfX = (Xp[j] - X)
            set DfY = (Yp[j] - Y)
            set Modu2 = (DfX * DfX) + (DfY * DfY)
            set Aux = (LoadReal(WWhp, j, 2) * Peso)
            if Modu2 > 1600.00 and Modu2 < 0.05 *  Aux * Aux then
               set Modu = SquareRoot(Modu2)
               set Fuerza = (Aux / Modu2)
               set Aux = (Fuerza) / Modu
               set Vx = Vx - DfX * Aux
               set Vy = Vy - DfY * Aux
            endif
         endif
         endif
         set j = j + 1
      endloop
      //Line physics
      set j = 1
      loop
      exitwhen j > NLines
         if ( not(LoadBoolean(WWhl, j, 6)) or (IsUnitEnemy(u, Player(JugLinea[j])) == true) ) then
         if ((u != LoadUnitHandle(WWhl, j, 5)) and (u != LoadUnitHandle(WWhl, j, 4))) then
         if ( IsUnitInRangeXY(u, (X1[j] + X2[j])/2,(Y1[j] + Y2[j])/2,  0.04*(LoadReal(WWhl, j, 2) * Peso) + Xmax[j])) then
         //............................................
            set Xrel = (X - X1[j])
            set Yrel = (Y - Y1[j])
            set Ordenada = Yrel - (Xrel * PendInv[j])
         //............................................
            set Xcort = Ordenada / (Pendiente[j] - PendInv[j])
            set Ycort = Xcort * Pendiente[j]
            set h = wwModulo((Xrel-Xcort), (Yrel-Ycort))
         //............................................
            set Aux = (X2[j] - X1[j])
            if Aux > 0 then
               set LimInicial = -(Xcort * Xmax[j]) / Aux
            else
               set LimInicial = 99999.99
            endif
            set LimFinal = Xmax[j] + LimInicial
         //............................................
            set Calc1 = wwModulo(LimFinal, h)
            set Calc2 = wwModulo(LimInicial, h)      
           if h > 0.50 then
               set CamEy = ((LimFinal / (Calc1 * h)) - (LimInicial / (Calc2 * h)))
            else
               set CamEy = 999.00
            endif
            set CamEx = (1 / Calc1) - (1 / Calc2)
         //............................................
            if ((Pendiente[j] * Xrel)) > Yrel then
              set CamEy = -CamEy
            endif
          if ((CamEy < 0.20) and (CamEy > -0.20)) then
         //............................................
            set Aux = CamEx
            set CamEx = (Coseno[j] * CamEx) + (Seno[j] * CamEy)
            set CamEy = -(Seno[j] * Aux) + (Coseno[j] * CamEy)
         //............................................
            set Aux = (LoadReal(WWhl, j, 2) * Peso) / 1000.00
            set Vx = Vx - (CamEx * Aux)
            set Vy = Vy - (CamEy * Aux)
          endif
         endif
         endif
         endif
         set j = j + 1
      endloop
      endif
      set Modu = SquareRoot((Vx * Vx) + (Vy * Vy))
      set Aux = Modu - (20/Peso)
      if (Aux > 0 and Modu > 0) then
         set Modu = LoadReal(WWhu, 4, 1) * Aux / Modu
         set Vx = Vx  * Modu
         set Vy = Vy  * Modu
         set X = (X + Vx / LoadReal(WWhu, 3, 1))
         set Y = (Y + Vy / LoadReal(WWhu, 3, 1))
      else
         set Vx = 0
         set Vy = 0  
      endif
      call SaveReal(WWhu, i, 5, Vx)
      call SaveReal(WWhu, i, 6, Vy)
      if not(IsTerrainPathable(X, Y, PATHING_TYPE_FLYABILITY)) then
         call SetUnitX(u, X)
         call SetUnitY(u, Y)
      endif
      set i = i + 1
  endloop
   set u = null
endfunction

function ForceFieldAddUnit takes unit u, real mass, boolean immune returns nothing
   local integer UniHand
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhu, (LoadInteger(WWhu, UniHand ,0)), 3) == false) then
      if (GetUnitState(u, UNIT_STATE_LIFE) > 0) then
         set NUnits = NUnits + 1
         //...........................................
        call SaveInteger(WWhu, UniHand, 0, NUnits)
         if mass != 0.0 then
            call SaveReal(WWhu, NUnits, 2, 10000.0/mass)
         else
            call SaveReal(WWhu, NUnits, 2, 0.0)
         endif
         call SaveBoolean(WWhu, NUnits, 3, true)
         call SaveUnitHandle(WWhu, NUnits, 4, u)
         call SaveReal(WWhu, NUnits, 5, 0.00)
         call SaveReal(WWhu, NUnits, 6, 0.00)
         call SaveBoolean(WWhu, NUnits, 7, immune)
         //...........................................
      endif
   endif
endfunction

function ForceFieldChangeUnit takes unit u, real mass, boolean immune returns nothing
   local integer UniHand
   local integer UniNum
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhu, (LoadInteger(WWhu, UniHand ,0)), 3) == true) then
      set UniNum = LoadInteger(WWhu, UniHand ,0)
      //...........................................
     if mass != 0.0 then
         call SaveReal(WWhu, NUnits, 2, 10000.0/mass)
      else
         call SaveReal(WWhu, NUnits, 2, 0.0)
      endif
      call SaveBoolean(WWhu, UniNum, 7, immune)
   endif
endfunction

function ForceFieldRemoveUnit takes unit u returns nothing
   local integer UniHand
   local integer UniNum
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhu, (LoadInteger(WWhu, UniHand ,0)), 3) == true) then
      set UniNum = LoadInteger(WWhu, UniHand ,0)
      //...........................................
     call SaveInteger(WWhu, GetHandleId(LoadUnitHandle(WWhu, NUnits,4)), 0, UniNum)
      call SaveReal(WWhu, UniNum, 2, LoadReal(WWhu, NUnits,2))
      call SaveBoolean(WWhu, UniNum, 3, LoadBoolean(WWhu, NUnits,3))
      call SaveUnitHandle(WWhu, UniNum, 4, LoadUnitHandle(WWhu, NUnits,4))
      call SaveReal(WWhu, UniNum, 5, LoadReal(WWhu, NUnits,5))
      call SaveReal(WWhu, UniNum, 6, LoadReal(WWhu, NUnits,6))
      call SaveBoolean(WWhu, UniNum, 7, LoadBoolean(WWhu, NUnits,7))
      //...........................................
      call SaveInteger(WWhu, UniHand, 0, 0)
      call SaveReal(WWhu, NUnits, 2, 0.00)
      call SaveBoolean(WWhu, NUnits, 3, false)
      call SaveUnitHandle(WWhu, NUnits, 4, null)
      call SaveReal(WWhu, NUnits, 5, 0.00)
      call SaveReal(WWhu, NUnits, 6, 0.00)
      call SaveBoolean(WWhu, NUnits, 7, false)
      //...........................................
      set NUnits = NUnits - 1
   endif
endfunction

private function ForceFieldUnitDies takes nothing returns nothing
   local unit u
   set u = GetTriggerUnit()
   if (LoadBoolean(WWhu, GetHandleId(u),8) == false) then
      call ForceFieldRemoveUnit(u)
   endif
   set u = null
endfunction

function ForceFieldPolarRadianAceleration takes unit u, real direction, real ac returns nothing
   local integer UniHand
   local integer UniNum
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhu, (LoadInteger(WWhu, UniHand ,0)), 3) == true) then
      set UniNum = LoadInteger(WWhu, UniHand ,0)
      //...........................................
     call SaveReal(WWhu, UniNum, 5, (LoadReal(WWhu, UniNum,5) + (Cos(direction) * ac * LoadReal(WWhu, 3, 1))) )
      call SaveReal(WWhu, UniNum, 6, (LoadReal(WWhu, UniNum,6) + (Sin(direction) * ac * LoadReal(WWhu, 3, 1))) )
   endif  
endfunction

function ForceFieldPolarDegreeAceleration takes unit u, real direction, real ac returns nothing
    call ForceFieldPolarRadianAceleration(u, direction*bj_DEGTORAD, ac)
endfunction

function ForceFieldCartesianAceleration takes unit u, real acx, real acy returns nothing
   local integer UniHand
   local integer UniNum
   set UniHand = GetHandleId(u)
   if (LoadBoolean(WWhu, (LoadInteger(WWhu, UniHand ,0)), 3) == true) then
      set UniNum = LoadInteger(WWhu, UniHand ,0)
      //...........................................
     call SaveReal(WWhu, UniNum, 5, (LoadReal(WWhu, UniNum,5) + acx * LoadReal(WWhu, 3, 1)) )
      call SaveReal(WWhu, UniNum, 6, (LoadReal(WWhu, UniNum,6) + acy * LoadReal(WWhu, 3, 1)) )
   endif  
endfunction

function ForceFieldSetup takes real frequency returns nothing
   if frequency > 100.00 then
      set frequency = 100.00
   elseif frequency < 10.00 then
      set frequency = 10.00
   endif
   call SaveReal(WWhu, 3, 1, (frequency / 20.00))
   call SaveReal(WWhu, 4, 1, 1.00-(0.50 / frequency))
   set FFperiodo = 1.00 / frequency
endfunction

function ForceFieldActivate takes nothing returns nothing
   if SistemaActivo == false then
      call TimerStart(FFtimer, FFperiodo, true, function ForceFieldPhysics)
      set SistemaActivo = true
   endif
endfunction

function ForceFieldDeactivate takes nothing returns nothing
   if SistemaActivo then
      call FlushChildHashtable(WWhu, 5)  
     call FlushChildHashtable(WWhu, 6)  
     call PauseTimer(FFtimer)
      set SistemaActivo = false
   endif
endfunction

private function OnInit takes nothing returns nothing
   set TUnitDies = CreateTrigger()
  call TriggerRegisterAnyUnitEventBJ(TUnitDies, EVENT_PLAYER_UNIT_DEATH)
   call TriggerAddAction(TUnitDies, function ForceFieldUnitDies)
endfunction

//****************************************************************
//****************************************************************
endlibrary[/jass]

 Material oculto 
  

También puedes darle un vistazo a mi Boss Chispita, cuyos skills están hechos con esta librería como base.


and it makes me wonder...
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 [System] FORCE FIELD Empty

Inventario :
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10

[System] FORCE FIELD Empty
Mensaje(#) Tema: Re: [System] FORCE FIELD [System] FORCE FIELD Clock10Miér Ene 22, 2014 9:21 am

Recuerdo al condenado Chispita ¬¬

Bien, he visto esta utilidad en acción y arroja resultados muy buenos. Sin embargo, el código no me convence.

Si no queres usar structs, entonces usa wrappers:

En lugar de (ejemplo):

[jass]
// guardamos angulo de unidad
call SaveReal(hashtable, parent, key, value)
[/jass]

->

[jass]
function GuardarAnguloUnidad takes unit whichUnit, real angle returns nothing
   call SaveReal(hashtable, parent, key, value)
endfunction
[/jass]

De esta forma, en caso de que quieras cambiar alguna key lo vas a poder hacer fácilmente y lo mas importante, deja legible el código. Ahora tenes que estar buscando: ¿qué era el key 0?, ¿y el 3?, jesucristo, ¿y el n que bosta era?.

Sacando eso, excelente trabajo Wink. +rep.

Saludos.
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 [System] FORCE FIELD Empty

Inventario :
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10

[System] FORCE FIELD Empty
Mensaje(#) Tema: Re: [System] FORCE FIELD [System] FORCE FIELD Clock10Miér Ene 22, 2014 1:28 pm

Usar faux? naaaa jajaja.

No, mira te explico que pasa, la primera versión de este sistema estaba en jass puro, sino al menos hubiera usado constantes para las keys para hacérmelo mas legible. Lo que debería hacer es conservar la parte matemática y cambiar el método de administración (creación / destrucción) de objetos virtuales que tiene porque si, es bastante confuso...


and it makes me wonder...
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 [System] FORCE FIELD Empty

Inventario :
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10
[System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10 [System] FORCE FIELD Empysl10

[System] FORCE FIELD Empty
Mensaje(#) Tema: Re: [System] FORCE FIELD [System] FORCE FIELD Clock10Miér Ene 22, 2014 8:20 pm

No, no Faux (estarías en la misma xD).

Constantes también podrían ser, a elección tuya.
Volver arriba Ir abajo
Contenido patrocinado




[System] FORCE FIELD Empty
Mensaje(#) Tema: Re: [System] FORCE FIELD [System] FORCE FIELD Clock10

Volver arriba Ir abajo
 

[System] FORCE FIELD

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

 Temas similares

-
» Star Wars Episode VII: The Force Awakens (DIC 2015)
» Duda con el Snapcaster
» 4D system y Zero G

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