JAMPS En las redes sociales

JAMPS :) Ya pasamos mas de una década juntos, gracias por visitarnos! :D



Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[TUTORIAL] Introducción al AMXX
#1
Esta guía da un descripción general del scripting en AMXX Plugins.

•Descripción General
•Comienzo
•Construyendo comandos de admin
•Cvars
•Encontrando mas cosas

Descripción General

Así que querés crear un plugin? Debes entender bien acerca de como el Pawn trabaja. Debes leer esta porción del documento, sentado en una computadora, con un editor de Pawn y un compilador a mano. Haciendo esto interactivamente ayuda a aprender. No estarás creando plugins tales como el WC3, Matrix Mod, o CSDM, pero esto te va a dar una patada inicial al mundo del AMXX. Para un buen editor de texto que tenga Pawn, trata de usar el AMXX Studio, o el PawnStudio.
Hay que estar familiarizado con el tema de "compilar plugins". También hay que estar familiarizado con la instalación de plugins, así podemos testear nuestros plugins hechos.

Comienzo

Un plugin de AMXX puede tener 4 tipos distintos de funciones. La primera es una funcion pública, "public". Esto significa que es totalmente pública para el engine de AMXX. La segunda es una función nativa, "native", que es declarada en un módulo o en el AMXX Core. La tercera es una función inusual, que es declarda sin ningúna clase especial de palabra. La cuarta es una función "forward", que es llamada cuando un evento especial ocurre (una forward también es publica). Un plugin de AMXX debe iniciarse con una función que da comienzo al plugin:

Código PHP:
// Esto hace posible la utilización de los módulos del AMXX Core.
// Este include las funciones que se encuentran dentro del "amxmodx.inc"
#include <amxmodx>
 
// Esto declara 3 variables con strings.
new PLUGIN[]= "AMXX Demo"
new AUTHOR[]= "BAILOPAN"
new VERSION[]= "1.00"
 
// Esto es una función publica  
// Es necesaria para iniciar un script en el AMXX
// No posee parametros, y es llamada antes de que el mapa cargue.
public plugin_init()
{
     
// Esta es una función que toma 3 strings.
     // Registra tu función en AMXX, y asigna una información básica.
     
register_plugin(PLUGINVERSIONAUTHOR)


Si se trata de compilar el script, compilará sin errores, aunque este archivo sera muy pequeño (en cuanto a tamaño) y no hará ninguna acción. Si este script es instalado, al tipear "amxx plugins", se verá la nueva entrada de la lista.

Construyendo comandos de admin

AMXX Provee una manera de añadir fácilmente comandos de consola de admin. Cada comando es "registrado" como un comando de consola. Cuando se registra un comando, se deben definir 4 propiedades: El nombre del comando que es ejecutado en consola, La función que interpreta ese comando, El acceso requerido para usar el comando, y una breve descripción del comando.
Para esta demostración, vamos a construir un plugin que deje cambiar la vida de los jugadores en el servidor con el comando "amx_hp".
Vamos a necesitar dos cosas para empezar, primero, necesitamos registrar el comando de consola. Ya qué estamos registrando el comando con una función publica, necesitamos estar seguros de que esa función existe.

Código PHP:
#include <amxmodx>
#include <amxmisc>     // Este archivo contiene unas funciones que servirán luego.
#include <fun>            // Este archivo contiene la función para cambiar la vida de los jugadores.
 
new PLUGIN[]= "Change Health"
new AUTHOR[]= "BAILOPAN"
new VERSION[]= "1.00"
 
public plugin_init()
{
     
register_plugin(PLUGINVERSIONAUTHOR)
     
register_concmd("amx_hp""cmd_hp"ADMIN_SLAY"<target> ")
}
 
public 
cmd_hp(idlevelcid)
{
     return 
PLUGIN_HANDLED


La nueva función utilizada ahora es "register_concmd", la que posee 4 parámetros. El primer parámetro es el comando que el admin deberá tipear en su consola. El segundo es la función que será llamada por el comando. El tercero es el acceso que se necesita para poder ejecutar el comando, y el cuarto es una breve descripción acerca del comando (para el amx_help).
Luego, creamos una función pública para el comando "amx_hp". Al crearla le dimos 3 parámetros. Estos parametros van a contener información cuando el comando sea usado. ID* va a contener el id del jugador que ejecutó el comando, LEVEL* contendrá el acceso del comando (se debe checkear), y cid contendrá el ID* interno del comando.
También, notar el PLUGIN_HANDLED. Se encuentran dos funciones principales de "return" que se deberían conocer. PLUGIN_CONTINUE generalmente significa "continuar con la operación normalmente", y PLUGIN_HANDLED significa "bloquear la operación". Las diferencias son sutiles pero importantes. Por ejemplo, cuando registramos un comando, nunca se debería poner "PLUGIN_CONTINUE", pero, si ponemos "PLUGIN_HANDLED" cuando estamos registrando el comando "say", bloqueará que el texto de los jugadores aparezca. Se debe tener cuidado con lo que se elige en distintas situaciones. Sin embargo, muchas cosas no son afectadas (tasks, eventos, y otras cosas que se ejecutarán luego).
Entonces, primero lo primero. Como hacemos para estar seguros si el usuario tiene el acceso de "ADMIN_SLAY" para ejecutar el comando?

Código PHP:
public cmd_hp(idlevelcid)
{
         if (!
cmd_access(idlevelcid3))
            return 
PLUGIN_HANDLED
         
    
return PLUGIN_HANDLED


La función cmd_access() chequeará la información de un comando (jugador, acceso, id) y se asegurará de dos cosas: que el usuario que ejecuta el comando tendrá el acceso necesario para ejecutarlo, y que se dio un mínimo de parametros para esto. En este caso pasamos 3 parametros, porque el comando se verá así: "amx_hp <Jugador> <Monto de vida>", y el comando actual cuenta como un parámetro más. Si la función cmd_access() falla, el comando es inmediatamente terminado.
La siguiente porción a resolver es: Necesitamos tomar dos parametros y decodificarlos. El parametro "monto de vida" es fácil para decodificar, como se acaba de convertir de una palabra a un número. El segundo parametro será un poco mas difícil, ya que el jugador tendrá tres tipos diferentes de jugadores en si:

• @CT o @T - Equipo CT o Equipo TT
• @ALL o * - Todos los jugadores
• <Jugador> - Un jugador en especial.

Código PHP:
public cmd_hp(idlevelcid)
{
         if (!
cmd_access(idlevelcid3))
            return 
PLUGIN_HANDLED
 
         
new Arg1[24]
         new 
Arg2[4]
 
         
// Obtenemos los argumentos del comando ("jugador" y "monto")
         
read_argv(1Arg123)
         
read_argv(2Arg23)
 
         
// Convertimos un string a un número
         
new Health str_to_num(Arg2)
 
       
// Checkeamos si el primer caracter es un "@"
         
if (Arg1[0] == '@')
         {
                  new 
Team 0
          
                  
// Checkeamos el team que ha sido especificado
                  // Se comienza desde el [1]
                  // Solo significa que el @ no ha sido incluido    
          
                  
if (equali(Arg1[1], "CT"))
                  {
                           
Team 2
                  

                  else if (
equali(Arg1[1], "T")) 
                  {
                           
Team 1
                  
}
          
                  new 
players[32]
                  new 
num
                 
                  
// Esta función obtendrá los jugadores (maximos 32)
                  // Con player Id's validos, el num contendrá el numero
                  // de los jugadores que son válidos
                  
get_players(playersnum)
          
                  new 
i
                  
                  
for (i=0i<numi++)
                  {
                           if (!
Team)
                           {
                                
// Seteamos la vida a estos jugadores
                               
set_user_health(players[i], Health)
                           } 
                           else 
                           {
                               if (
get_user_team(players[i]) == Team)
                               {
                                         
set_user_health(players[i], Health)
                               }
                          }
                  }
         } 
         else 
         {
                  
// Encuentra un player con el mismo nombre o parecido
                  // El parametro "1" dira o no si el jugador
                  // sera un "target" si tiene inmunidad o no.
                  
new player cmd_target(idArg11)
                 
                  if (!
player)
                  {
                            
// Esto le dirá un mensaje al jugador que trato de usar el comando
                            // El formato usado en este comando sera llamado format(),
                            // Donde el primer string será un mensaje 
                            // a cualquier número de los siguientes parametros
                            //  %s significa un STRING
                            //  %d o %i son integers
                            //  %f significa una float
                            // Entonces "Hola %s, Tengo %d años"  
                            // Requerirá un string y un integer
                           
                           
console_print(id"Sorry, player %s could not be found or targetted!"Arg1)
                           return 
PLUGIN_HANDLED
                  

                  else 
                  {
                           
set_user_health(playerHealth)
                  }
         }
         return 
PLUGIN_HANDLED


Entonces, nuestro plugin quedará como:

Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <fun>

new PLUGIN[]= "Change Health"
new AUTHOR[]= "BAILOPAN"
new VERSION[]= "1.00"

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_concmd("amx_hp""cmd_hp"ADMIN_SLAY"<target> <hp>")
}

public 
cmd_hp(idlevelcid)
{
         if (!
cmd_access(idlevelcid3))
            return 
PLUGIN_HANDLED
 
         
new Arg1[24]
         new 
Arg2[4]
 
         
// Obtenemos los argumentos del comando ("jugador" y "monto")
         
read_argv(1Arg123)
         
read_argv(2Arg23)
 
         
// Convertimos un string a un número
         
new Health str_to_num(Arg2)
 
       
// Checkeamos si el primer caracter es un "@"
         
if (Arg1[0] == '@')
         {
                  new 
Team 0
          
                  
// Checkeamos el team que ha sido especificado
                  // Se comienza desde el [1]
                  // Solo significa que el @ no ha sido incluido    
          
                  
if (equali(Arg1[1], "CT"))
                  {
                           
Team 2
                  

                  else if (
equali(Arg1[1], "T")) 
                  {
                           
Team 1
                  
}
          
                  new 
players[32]
                  new 
num
                 
                  
// Esta función obtendrá los jugadores (maximos 32)
                  // Con player Id's validos, el num contendrá el numero
                  // de los jugadores que son válidos
                  
get_players(playersnum)
          
                  new 
i
                  
                  
for (i=0i<numi++)
                  {
                           if (!
Team)
                           {
                                
// Seteamos la vida a estos jugadores
                               
set_user_health(players[i], Health)
                           } 
                           else 
                           {
                               if (
get_user_team(players[i]) == Team)
                               {
                                         
set_user_health(players[i], Health)
                               }
                          }
                  }
         } 
         else 
         {
                  
// Encuentra un player con el mismo nombre o parecido
                  // El parametro "1" dira o no si el jugador
                  // sera un "target" si tiene inmunidad o no.
                  
new player cmd_target(idArg11)
                 
                  if (!
player)
                  {
                            
// Esto le dirá un mensaje al jugador que trato de usar el comando
                            // El formato usado en este comando sera llamado format(),
                            // Donde el primer string será un mensaje 
                            // a cualquier número de los siguientes parametros
                            //  %s significa un STRING
                            //  %d o %i son integers
                            //  %f significa una float
                            // Entonces "Hola %s, Tengo %d años"  
                            // Requerirá un string y un integer
                           
                           
console_print(id"Sorry, player %s could not be found or targetted!"Arg1)
                           return 
PLUGIN_HANDLED
                  

                  else 
                  {
                           
set_user_health(playerHealth)
                  }
         }
         return 
PLUGIN_HANDLED


Cvars

Las cvars son "comandos" del lado del servidor que almacenan valores. Por ejemplo, "mp_startmoney" es una CVAr del Counter-Strike que contiene el valor de la plata que los jugadores obtendrán cuando se conectan al servidor. Es posible crear tus propias CVARS registrandolas en el plugin_init(). Vamos a replicar el mp_startmoney:

Código PHP:
#include <amxmodx>
#include <cstrike>

public plugin_init()
{
    
register_plugin("CVAR Test""1.0""BAILOPAN")
    
// Seteamos el valor default a 500
    
register_cvar("amx_startmoney""500")
}

// Esto ocurre cuando un cliente entra en el juego
public client_putinserver(id)
{
    if (
get_cvar_num("amx_startmoney") > 0)
    {
        
cs_set_user_money(idget_cvar_num("amx_startmoney"))
    } 
    else 
    {
        
cs_set_user_money(idget_cvar_num("mp_startmoney"))
    }


Este plugin probablemente no funcione, es solo una demostración. Las Cvars se pueden setear como Floats, Números, o Strings, y se pueden modificar cualquier CVAR valida del HL engine.

Encontrando mas cosas

Para aprender más acerca del scripting de AMXX, deberías mirar a través de los nativos o los archivos .INC que son incluidos en cada plugin. Los INC generalmente siguen dos formatos. Son nombrados antes de un módulo o un propósito específico. _const se usa si contienen numeros pre-definidos o listas. _stocks se usan cuando contienen funciones de ayuda y útiles. Recordar que, los stocks son solo compilados si son usados, entonces, es más fácil incluir un .INC con varios stocks.
También pueden visitar los foros de AMXMODX para obtener mas información.







Responder
#2
Buena guía bastante clara para tener una idea de como iniciar con amxx pero falta la fuente, viendo el inicio del ejemplo es de Bailopan así que asumo que la fuente es alliedmods.net







Signing of XEDE

Necesitas ayuda? busca o consulta en esta sección Guias y Ayudas sonbre la web y su uso
www.JAMPS.Com.Ar
www.JAMPS.Org
www.JAMPS.Net
www.NunHost.Com
www.XEDE.Com.ar



Responder
#3
No, la encontré en un foro, la encontre util para los demás usuarios!






Responder
#4
si, lo choreaste es de otro foro ( es de ahi el tutorial traducido al español ) el original de alliedmods es en ingles, y del mismo foro choreaste el nickname iNyx ( q por cierto lo escribiste mal ) junto con avatar y firma.






Responder


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Plugin Fix bug adminchat.amxx (say_team %s) sonny_sql 1 1,057 06-07-2013, 10:37 PM
Último mensaje: XEDE
  [Descarga] Plugin AMXX VirusDestroyer sonny_sql 4 901 05-08-2012, 12:56 AM
Último mensaje: ListCS

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)