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 | .
 

 [Zinc Random Tools] WaygateControl

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
io
Aprendiz
avatar


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

Mensajes Mensajes : 24
Reputación Reputación : 5
Monedas de oro : 314
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: [Zinc Random Tools] WaygateControl Miér Ago 08, 2018 11:50 pm

WaygateControl
(Incluye mapa de ejemplo)

Sobre la serie Zinc Random Tools ...
Voy a liberar algunas herramientas random que diseñé mientras trato de no olvidar la programación para warcraft , la mayoria son scripts sencillos escritos en zinc ... estos scripts son hechos por pura diversion y pueden servir de ejemplo de uso del lenguaje Very Happy

¿Que es?
WaygateControl es una pequeña librería que define un objeto waygate el cual nos permite crear un sistema de teletransportación automatico , solo necesita 2 rects y una funcion de filtro para permitir o evitar que alguna unidad pueda usar el portal.
Trato de hacer el script lo más modular posible para poder usar con facilidad.


Requerimientos :

  • newgen o wex (con jasshelper)
  • para warcraft 1.24+






[Jass]
//! zinc
library WaygateControl
{
   
   private string    FX_TRAVEL_PATH = "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl";
   private string    FX_LEAVING = "Abilities\\Spells\\Human\\DispelMagic\\DispelMagicTarget.mdl";
   
   private constant key WAYGATE_KEY;
   private hashtable WG_HASTABLE;
   
//=== pueden ser reemplazadas por la libreria textag...
   private constant integer MEAN_CHAR_WIDTH = 8;
   private constant integer MAX_TEXT_SHIFT = 32 ;  
   
   private constant real    FONT_SIZE = 0.025;
   private constant real    VELOCITY_X = 0;
   private constant real    VELOCITY_Y = 0.04;
   private constant real    LIFESPAN = 4;
   private constant real    HEIGHT = 16;
   private constant real    FADE_POINT = 2.5;

   private function TexTagXY (real x, real y, string text, string color)
   {
       texttag t = CreateTextTag();
       integer shift = IMinBJ(StringLength(text), MAX_TEXT_SHIFT) * MEAN_CHAR_WIDTH;

       SetTextTagText(t, color+text, FONT_SIZE);
       SetTextTagPos(t, x-shift, y, HEIGHT);
       SetTextTagVelocity(t, VELOCITY_X, VELOCITY_Y);
       SetTextTagVisibility(t, true);
       SetTextTagFadepoint(t, FADE_POINT);
       SetTextTagLifespan(t, LIFESPAN);
       SetTextTagPermanent(t, false);

       t = null;
   }
   
//===========================================================================
   
   public struct Waygate
   {
       //module Alloc;
       
       public rect entry;
       public rect dest;

       private trigger te;
       private trigger triggerEnterPre;
       private region regEntry;
       private region regDest;
       private region regPreEntry;
       private region regPreDest;
       private unit u;
       private unit prevU;
       
       private string inOriginText;
       private string inDestText;
       //kind of properties
       public rect  zoneEntry;
       public rect  zoneDest;
       
       public rect zoneEntryShowDest; //para texto flotante
       public rect zoneEntryShowOrigin; //para texto flotante
       
   
       
       public  boolean lockCamOnArrival;
       public  boolean enabled;
       public boolean onlyAllowEntry;
       
       public destructable modelA, modelB;
       
       public method model(integer destructableId , real scale ,real face , integer var)
       {
           real x = GetRectCenterX(this.entry);
           real y = GetRectCenterY(this.entry);

           this.modelA = CreateDestructable(destructableId , x , y , face , scale , var);
           
           x = GetRectCenterX(this.dest);
           y = GetRectCenterY(this.dest);
           this.modelB = CreateDestructable(destructableId , x , y , face , scale , var);
       }
       
       
       //muestra en un texto flotante la direccion de destino del teleport
       public method showDestinationNameConfig(rect rPreShowOrigin , rect rPreShowDest , string onOriginText , string onDestText , code filter)
       {
           this.triggerEnterPre = CreateTrigger();
           this.regPreEntry = CreateRegion();
           this.regPreDest = CreateRegion();
           this.zoneEntryShowDest = rPreShowDest;
           this.zoneEntryShowOrigin = rPreShowOrigin;
           
           RegionAddRect(this.regPreDest , rPreShowDest);
           RegionAddRect(this.regPreEntry , rPreShowOrigin);
           
           this.inOriginText = onOriginText;
           this.inDestText = onDestText;
           
           
           TriggerRegisterEnterRegion(this.triggerEnterPre , this.regPreEntry , Filter(filter));
           TriggerRegisterEnterRegion(this.triggerEnterPre, this.regPreDest , Filter(filter));
           
           SaveInteger( WG_HASTABLE , WAYGATE_KEY , GetHandleId(this.triggerEnterPre) , this);

           TriggerAddAction(this.triggerEnterPre , function()
           {
               real x =0.0;
               real y =0.0;
               integer key = GetHandleId(GetTriggeringTrigger());
               thistype instance = LoadInteger(WG_HASTABLE , WAYGATE_KEY , key);
               
               if(instance.enabled)
               {
                   //show Floating text
                   if(instance.isUnitInPreOriginRegion(GetTriggerUnit()))
                   {
                       //esta en preorigen
                       x = GetRectCenterX(instance.zoneEntryShowOrigin);
                       y = GetRectCenterY(instance.zoneEntryShowOrigin);
                       
                       TexTagXY(x,y,instance.inOriginText , "|cff0000ff");
                   }
                   else
                   {
                       //esta en preDestino
                       x = GetRectCenterX(instance.zoneEntryShowDest);
                       y = GetRectCenterY(instance.zoneEntryShowDest);
                       
                       TexTagXY(x,y,instance.inDestText , "|cff0000ff");
                   }

                   
               }
           });
       }
       
       private method isUnitInPreOriginRegion(unit whichunit)->boolean
       {
           return IsUnitInRegion(this.regPreEntry,whichunit);
       }
       
       //I like TO ...^2
       private method moveIt(real x , real y)
       {
           SetUnitPosition(this.u , x , y);
           DestroyEffect(AddSpecialEffectTarget(FX_TRAVEL_PATH, this.u , "origin"));

           if(GetOwningPlayer(this.u) == GetLocalPlayer())
           {
               CinematicFilterGenericBJ( 0.30, BLEND_MODE_BLEND, "ReplaceableTextures\\CameraMasks\\Black_mask.blp", 0.00, 0.00, 0.00, 0.00, 100.00, 100.00, 100.00, 100.00 );
               PanCameraToTimed(x , y,0.0);
           }
       }
       
       private method move()
       {
           real x = GetUnitX(this.u);
           real y = GetUnitY(this.u);
           
           
           if(IsPointInRegion(this.regEntry , x , y))
           {
               DestroyEffect(AddSpecialEffect(FX_LEAVING, x , y));
               x = GetRectCenterX(this.dest);
               y = GetRectCenterY(this.dest);
               this.moveIt(x,y);
           }
           else if(!this.onlyAllowEntry)
           {
               DestroyEffect(AddSpecialEffect(FX_LEAVING, x , y));
               x = GetRectCenterX(this.entry);
               y = GetRectCenterY(this.entry);
               this.moveIt(x,y);
           }
           
           
           
           
           this.prevU = this.u;
       }
       
       public static method create(rect pentry , rect pdestination , boolean enabledFlag , code filter)->thistype
       {
           thistype this = thistype.allocate();
           this.regEntry =  CreateRegion();
           this.regDest  = CreateRegion();
           this.te = CreateTrigger();
           this.entry = pentry;
           this.dest  = pdestination;
           this.enabled = enabledFlag;
           RegionAddRect(this.regEntry , pentry);
           
           RegionAddRect(this.regDest , pdestination);
           
           TriggerRegisterEnterRegion(this.te , this.regEntry , Filter(filter));
           TriggerRegisterEnterRegion(this.te , this.regDest , Filter(filter));
           
           SaveInteger( WG_HASTABLE , WAYGATE_KEY , GetHandleId(this.te) , this);

           TriggerAddAction(this.te , function()
           {
               integer key = GetHandleId(GetTriggeringTrigger());
               thistype instance = LoadInteger(WG_HASTABLE , WAYGATE_KEY , key);
               if(instance.enabled)
               {
                    instance.u = GetTriggerUnit();
                   if(instance.prevU != instance.u)
                       instance.move();
                   else
                       instance.prevU=null;
               }
           });
           
           return this;
       }
   }
   

   
   private function onInit()
   {
       WG_HASTABLE = InitHashtable();
   }

}
//! endzinc
[/jass]

Este sería el ejemplo de uso :
(leer los comentarios en el código)
[jass]
//! zinc
library WaygateDemo requires WaygateControl
{
   
   public
   {
       //declaramos tipo public o private segun necesitemos....
       Waygate wgCorner;
       
       //puedes declarar todos los que necesites...
       Waygate wgHill;
               
       //devuelve un valor verdadero para estos ids
       public function OnlyPaladin() -> boolean
       {
           return ( GetUnitTypeId(GetFilterUnit()) == 'Hpal' ); // solo el tipo de heroe paladin puede usar el teleport...
       }
       
       public function OnlyBloodMage() -> boolean
       {
           return ( GetUnitTypeId(GetFilterUnit()) == 'Hblm' ); // solo el tipo de heroe mago sanguinario puede usar el teleport...
       }
       

   }
   
   private function SetUpDemo()
   {
       //gg_rct_waygateCorner1 y gg_waygateCorner2 son los nombres de las regiones que hemos creado ... el prefijo gg_rct_ lo agrega el editor...
       //
       //                              rect origen             rect destino          esta activado?      funcion filtro...                    
       wgCorner =  Waygate.create(gg_rct_waygateCorner1 , gg_rct_waygateCorner2 ,true , function OnlyPaladin);
       //    (id de destructible , escala , angulo , variación
       wgCorner.model('B000' , 0.8 , 90.0 , 1);//asignamos el modelo que usara nuestro teleport... el model id debe ser tipo destructable ... ver en el editor->destructibles -> personalizado
       //esto configura si debe o no mostrar el destino al entrar en una zona cercana al punto de teletransporte
       wgCorner.showDestinationNameConfig(gg_rct_PreEntryCorner1,gg_rct_PreEntryCorner2, "Hacia la esquina" , "esquina arriba" , function OnlyPaladin);
   
       //ahora la del que solo admite mago sanguinario
       wgHill =  Waygate.create(gg_rct_waygatehill1 , gg_rct_waygatehill2 ,true , function OnlyBloodMage);
       wgHill.model('B000' , 0.8 , 90.0 , 1);
   }
   
private function onInit()
{//ya se que es leak ... pero es solo el demo Very Happy
       TimerStart(CreateTimer() , 1.0 , false , function SetUpDemo); //corremos el demo 1 segundo despues para asegurarnos que ya esta listo cuando lo llamamos...
       //cheats Very Happy
       Cheat("iseedeadpeople");
}
}
//! endzinc

[/jass]

Mapa de Ejemplo
Volver arriba Ir abajo
 

[Zinc Random Tools] WaygateControl

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

 Temas similares

-
» SIM RACING TOOLS - Guía de instalación y uso
» GPS TOMTOM COMO ACTUALIZARLOS

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