Dinamic Natives
#1
Post original

Autor: AntiBots



Bueno como quiero ayudar a todos. Voy a crear turoriales de todo.



Aca les vengo con Dinamic Natives estilo 1

Proximo: Forwards

Tiempo del Tutorial: 10 ~ 15 Minutos



Bueno como no lo explique adentro del php y ahi me lo pidieron las natives sirve para llamar a una funcion en otro plugin. Suponele para el zombie lo usan para agregar items y eso. Las funciones estan todas en el zombie_plgue. Pero son llamadas de otros plugins con sus condiciones.

Mas Informacion: http://es.wikipedia.org/wiki/Applica...ming_Interface



Código PHP:
/**

 * Primero que nada esto que voy a explicar es muy basico.

 * Capaz les combiene tirarme un par de ideas de plugins cortos

 * Donde seria bueno crear una natives y list

 * Bueno Empezemos.

 * PD: Les voy a explicar las natives con Stylo 1 que para mi es mas facil

 * Igualmente les voy a explicar el estilo mas viejo que tambien es usado para programar

 *

 */

 

// Primero que nada necesitamos las funciones basicas

#include <amxmodx>

 

// Un par de variables para contener el numero de Cvars

new kz_chattagsg_saytextg_maxplayers

 

// Que es el plugin_init? Bueno este forward es llamado antes que vos puedas entrar al juego.

// Aca esta recomendado registrar el plugin como tambien agarrar informacion del nombre del mapa y eso

// Tambien esto es llamado cuando el mapa que se va a jugar ya esta on

// Para hacer efectos sobre el mapa usen plugin_precache que se llama antes que se seteen las cosas del juegos

// Muy bueno para cargar los models y eso.

// Tambien otra funcion de estas categorias es plugin_cfg que es llamada despues de que todos los plugins_init son llamados

// Bueno concluimos con esto

public plugin_init() 

{

    
// Indispensable registrar el plugin.

    // Primer parametro el nombre del plugin, Constante, No puede ser cambiado

    // Version del plugin, No solo tienen que ser numeros. Letras tambien sirver y tambien es una constante

    // Por ultimo el autor del Plugin. Tambien una constante

    
register_plugin("Kz ColorChat""1.0""ReymonARG")

 

    
// una cvar nunca son numeros o decimales

    // En estos casos se las registras a todos por igual pero despues vamos a ver como conseguir cada resultado

    
kz_chattags register_cvar("kz_chattag""[Kz-Arg]")

 

    
// En la variable se almacenara el id del mensaje.

    
g_saytext get_user_msgid("SayText")

 

    
// Bueno otra cosa importante. Con esto nos dira la cantidad de Players que puede haber.

    // Esto lo vamos a usar para el loop a continuacion.

    // Para que hacer mas loops si con esto hacemos los necesarios y justos.

    
g_maxplayers get_maxplayers()

}

 

// Como lo mensionaba antes con plugins_init bueno estos si que es rapido.

// Esto se registra antes que plugin_precache

// Una buena advertencia es que no usen ninguna funcion casa solo registremos las natives

// Ya que al ser tan rapida su cargada no pueden estar otras funciones preparadas.

// Podes usar funciones que ya tengas en el plugin algun stock o eso. Pero nada que se relacione con otro plugin

public plugin_natives()

{

    
// Indispensable seleccion la libreria donde se van a alojar las funciones

    // No les recomiendo poner esto con espacios siempre una palabra completa

    // Despues vamos a ver como se usa

    
register_library("kzcolor")

 

    
// Importantisimo, cuando registremos una natives la funcion si o si tiene que ser un public

    // Nada de un stock o una funcion privada.

    // Primer Parametro: nombre de la native.

    // Segundo Parametro: funcion donde se dirigira la native. ATENCION: como ya lo dije tierne que ser un public

    // Tercer Parametro: El estilo. si no se pone nada se auto setea a 0, Cuales son las diferencias?

    // Las diferencias solo son el la funcion no efectara en la ejecucion en otros plugins

    // Con estilo 0 tenes que calcular los parametros y bueno despues se los explicare

    // Con estilo 1 armas las funcion como si fuera un public comun o un stock.

    // En este caso vamos a usar estilo 1 ya que como son varios string para la funcion es mejor

    // para no tener que hacer muchos arrays degusto.

    
register_native("kz_colorchat""native_colorchat"1)

}

 

// Bueno este es el famoso public xD

// Primero que nada es un public comun.

// #1: id, la usaremos para selecion a que player va el mensaje

// #2: const msg[], mensaje que se le inviara al player.

// #3: {Float,Sql,Result,_}:..., Y esto? Bueno esto es para que alla inlimitados parametros

// Pero como sabemos cual es cual? Bueno a continuacion los capturamos

public native_colorchat(id, const msg[], {Float,Sql,Result,_}:...)

{

    
// Como esto es una natives la informacion viaja todo en bits.

    // Entonces tenemos que convertir el mensaje para que funcione bien.

    // Sino solo saldran numeros que van a decir y esto que es.

    
param_convert(2)

 

    
// Creamos un Array para el mensaje.

    // Ya que como msg[] es constante no lo podemos modificar.

    // Como no le tengo mucha fe al formatex cuando editas un string con el mismo

    // Creamos un array nuevo con el nombre final.

    // Tambien Creamos un Array para capturar la cvar.

    
new message[180], final[192], cvarstring[64]

 

    
// Como les comente pueden haber mas parametros para el mensaje como ustes seguro

    // habran echo "este numero es %d" el numero lo pones como un parametro mas

    // Entonces tambien tenemos que convertir esos parametros

    // Como a j la vamos a usar devuelta creamos una y listo

    
new jcambiar[8]

 

    
// Argumentos Serian los parametros. numargs nos devuelve el numero de parametros

    // que contiene la funcion. Ya que aca pueden ser ilimitados

    
new argumentos numargs()

 

    
// Lopeamos todos los resultados y lo convertimos

    // Si no saben los que un loop no duden el preguntar.

    
for(3<= argumentosj++)

    {

        
param_convert(j)

 

    }

 

    
// Como el mensaje va a ser verde. final[0] es igual a un solo caracter del string

    
final[0] = 0x04// y bueno 0x04 es el verde.

 

    // ATENCION......

    // Como les dire anteriormente las cvars no siempre son numeros o digitos.

    // Tampoco les comente la diferencia entre cvar y pcvar.

    // Directamente son exactamente lo mismo. Pero las pcvar son mas comodas.

    // Pusiste mal el nombre de una cvar? Bueno con las pcvars solo cambias el register_cvar y listo

    // Y no necesiras ir cambiando en todos lados.

    // get_pcvar_num(pcvar) // bueno solo pones el numero de la cvar. Bueno importante tenes que Guardar los numeros en la variable sino no le vas a pegar nunca

    // get_pcvar_float(pcvar) // Como la pcvar anterior devuelve la informacion. new Float:decimal = get_pcvar_float(pcvar). Asi se devuelve la informacion

    // Pero Ya con String es ditinto ya que la informacion la devuelve distinto.

    // get_pcvar_string(pcvar, string[], len) // Bueno pcvar como ya saben, String un array, y len es lo maximo que el array puede guardar

    // Suponele que tenemos 14 letras seguidas pero el array es letras[11], bueno va a guardar las letras desde el 0 hasta el 10.

    // con este array lo usuarias asi get_pcvar_string(pcvar, letras, 10) // Porque 10 y no 11? Bueno el Array empiea desde 0. Pero lo que uno le setea son las dimenciones que puede tener.

    // Bueno no voy a ser muy extenso para no confundirlos.

    
get_pcvar_string(kz_chattagscvarstring63)

 

    
// Bueno como sabran id son numeros del 1 al 32, No son numeros raros.

    // el if trabaja con el true = 1 y el false = 0, Entocnes si id = 15 es true

    // en cambio si es 0, o -1,.... es false.

    // Entonces si un ponemos un id, Le mandamos ese mensaje a esa persona

    // Sino seguimos y le mandamos el mensaje a todos los jugadores.

    
if(id)

    {

        
// Checkeamos si el jugador esta conectado, Sino para que mandamos el mensaje??

        
if( is_user_connected(id) )

        {

            
// Bueno como abran usado format, es para darle texto a un string.

            // Pero esto es distinto, Lo que hace es Capturar todos los mensajes del argumento ;.... y los convierte como tenia el %s %d, %f

            
vformat(message179msg3)

 

            
// Como a mi me gusto agregarle un tag a los mensajes le puse la cvar.

            // Porque empezas con final[1], Bueno si pones final solo empieza a convertir desde la dimencion 0

            // Pero si pones suponele aca final[1] Empieza desde la dimencion 1 hacia delante.

            
formatex(final[1], 188"%s %s"cvarstringmessage)

 

            
// Un Stock muy Util. Teletrasportate para el Stock ahora -->

            
kz_remplace_colors(final, 191)

 

            
// Otro Stock muy interesante. Otra vez viajemos en el tiempo -->

            
kz_print_config(id, final)

        }

    } 

    else 
// Opa el mensaje es para todos.

    
{

        
// No me gusta el get_players ya que es una funcion igual a esta.

        
for( new 1<= g_maxplayersi++ )

        {

            
// Como dije antes.. Esta conectado??

            
if( is_user_connected(i) )

            {

                
// Simple contador.

                
new contador 0

 

                
// Esto es para remplazar el LANG_PLAYER que el vformat no lee.

                // No hace falta que lo explique porque nunca lo usaran.

                
for(2argumentosj++)

                {

                    if( 
getarg(j) == LANG_PLAYER )

                    {

                        
setarg(j0i);

                        
cambiar[contador++] = j;

                    }

                }

 

                
// Esto se repite. Ya saben como funciona esto.

                
vformat(message179msg3)

                
formatex(final[1], 188"%s %s"cvarstringmessage)

                
kz_remplace_colors(final, 191)

                
kz_print_config(i, final)

 

                
// Tambien para el LANG_PLAYER. No hace falta explicarlo.

                // Solo Restartea para evitar posible errores con el otro player.

                
for(0contadorj++)

                {

                    
setarg(cambiar[i], 0LANG_PLAYER)

                }

            }

        }

    }

 

    return 
1

}

 

// Aca si que no usamos :... ya que ya convertimos el mensaje a uno solo.

stock kz_print_config(id, const msg[])

{

    
// Esto Exactamente es como llamar a una funcion. Solo que esta asi.

    // Primero creamos el comienzo del mensaje.. Todo tiene un comienzo y final

    // Como el mensaje es a uno solo se usa MSG_ONE sino usamos MSG_ALL o MSG_BROADCAST

    // Como capturamos la id del mensaje antes solo introducimos la variable g_saytext

    // el primero id es el que recibe el mensaje

    // el segundo es el que lo manda. Usamos el mismo id por facilidad.

    
message_begin(MSG_ONE_UNRELIABLEg_saytext_id);

 

    
// Cual es la diferecia entre write_ & ewrite Bueno la segunda el mensaje es general.

    // Ya que la primera solo afecta solo a este plugin. No recomiendo la utilizacion de ewrite_ para avanzados.

    
write_byte(id);

 

    
// Finalmente el string.

    
write_string(msg);

 

    
// Terminamos el mensaje. Siempre cerrarlo. No importa lo que pase entre message_begin & message_end. 

    
message_end();

 

    
// Como una funcion esto seria print_chat(sender, reciver, mensaje[]) Por eso le comentaba. Antes. Que estos son como funciones

    // Pero de otro modo.

}

 

 

// Llegaste bien?? Bueno esto es para otrar lugar. Es como un macro.

// Si el stock no esta llamado en ningun momento el compilador lo pasara por alto y ni lo vera.

stock kz_remplace_colors(message[], len)

{

    
// replace & replace_all son usados para remplazar xD que otra cosa mas.

    // Pero la diferencia es que el primero solo remplaza una sola vez.

    // el replace_all va a remplazar todas las veces del texto

    // Ejemplo con replace solo.

    // el string es "texto" y remplazamos la t por la s

    // El string queda "sexto"

    
replace_all(messagelen"!g""^x04")

    
replace_all(messagelen"!t""^x03")

    
replace_all(messagelen"!y""^x01")

 

    
// Podemos usar un Return tambien. Pero en estos casos no se justifica.

    // return 1

 

    // Vuelve al lugar donde usaste el teletrasportador. <---

}

 

/**

 * Esto No va en este plugin sino en un includ o directamente en el plugin.

 * Como llamados a la natives... Bueno Primero Hay que llamar la libreria

 * #pragma library kzcolor // Llamamos a la libreria kzcolor. Sino no funciona nada.

 * Ahora tenemos que llamar a las natives alojadas en esta libreria.

 * Solo pon native(espacio)y aca el nombre con los parametros.

 * Bueno para llamar a nuestra native de color haceoms lo digiente.

 *

 * native kz_colorchat(id, const msg[], {Float,Sql,Result,_}:...)

 *

 */

 

 

/**

 * Tutorial 100% Creado por mi.

 * Saludos para todos los que me conoces.

 * www.kz-arg.com.ar

 * Create by ReymonARG®

 */ 



Estilo 0 // el mas viejito

Código PHP:
// Elemental

#include <amxmodx>



// Funcion ya vista

public plugin_init() 

{

    
// Esto mas que sabido

    
register_plugin("Name Plugin""1.0""ReymonARG")

}



public 
plugin_natives()

{

    
// Bueno esto ya lo saben xD Creo Que no hace falta Explicarlo.

    
register_library("plrname")

    

    
// Esto tambien se los explique. Ahora con estilo 0

    
register_native("amx_setname""_setname"// Como les dije antes si no ponen el estilo automaticamente es 0

    
register_native("amx_getname""_getname")

}



// Bueno aca solo van dos argumentos. Miren.

public _setname(iPluginiParams)

{

    
// Como aca los parametros son necesarios si o si. No nos queda otra

    // Que crekear si estan los parametros

    
if( iParams != // Como son 2 los parametros. Si no escribimos todos no nos sirve.

    
{

        
// El return 1# Devuelve resultado 2# Para la funcion en donde hace el return. Asi lo de bajo no se lee.

        
return log_error(AMX_ERR_NATIVE"Bad native parameters"// I terminamos aca

    
}    

    

    
// Como la native va a quedar algo asi amx_setname(id, name[])

    // Empezemos por agarrar el id del jugador xD

    
new id get_param(1// Estas son las diferencias del estilo 1. Aca creamos.

    

    // Ahora tenemos que verificar si la id es correcta. Sino para que nos sirve.

    
if( !( <= id <= 32 ) )

    {

        
// Seteamos un error de parametros asi podemos distingir el error

        
return log_error(AMX_ERR_NATIVE"Bad native id %d"id)

    }

    

    
// Bueno despues de verificar los errores seguimos.

    // Ahora el segundo parametro es el nombre nuevo.. Entonces

    
new name[32// y si tenemos que crear un array que en el casi del estilo 1 no.

    

    // Y ahora? Bueno ahora agarramos el parametro con lo siguiente

    
get_string(2name31// 1# Parametro 2# String 3# La capacidad.

    

    // Bueno ahora ya tenemos todo. Podemos usar set_user_info o client_cmd.

    // Entonces usamos client_cmd.  a Tambien podemos usar enclient_cmd que es mas rapida

    
client_cmd(id"name ^"%s^""name// Como en un string las "" habre y cierran ponemos el ^ para que sepa que esa " no cierra sino que es un caracter mas.

    

    // Bueno ya tenemos el nombre cambiado entonces Retornamos un valor positivo.

    
return 1;

}



// Esperen esto no termina aca. Ahora les voy a enseñar a devolver en nombre

// Para que si tenemos get_user_name ? Bueno pero para que sepan. Es un ejemplo xD

public _getname(iPluginiParams)

{

    
// Primero que nada hacemos el procedimiento de chekeo anterior

    
if( iParams != // Ahora son 3

    
{

        return 
log_error(AMX_ERR_NATIVE"Bad native parameters"

    }

    

    new 
id get_param(1

    

    if( !( 
<= id <= 32 ) )

    {

        return 
log_error(AMX_ERR_NATIVE"Bad native id %d"id)

    }

    

    
// Bueno ahora es ahora de retornar los valores. Aca no sirve el return para strings.

    // Va sirven pero no es para ustedes. xD Despues lo explicare.

    
new name[32// Almacenamos el nombre

    
get_user_name(idname31)

    
// Ahora solo necesitamos copiar el nombre.

    
set_string(2nameget_param(3)) // Si el parametro 3 va a ser lo maximo del otro array.

    

    // Podemos retornar asi: return set_string(2, name, get_param(3))

    // O directamente

    
return 1;

    
// Algo que no les comente. los log_error siempre devuelven falsos.

    // Tambien de return. Para no devolver nada pueden usar el abort.

}



// Otra cosa que no aclare en el otro turorial del estilo 1.

// Con respecto a las librerias. Como llamarlas en el otro plugin.

// Bueno capaz ustedes abran visto que otros inc las llaman. con #pragma reqlib

// Bueno esta mal. Porque desde el amxx 1.75 se cambio el reglib a librery.



/**

 * Las natives quedaria.

 *

 * amx_setname(id, name[])

 *

 * amx_getname(id, name[], len)

 */

 

/**

 * Con esto me despido y hasta el tutorial de Forwards.

 *

 * www.kz-arg.com.ar

 *

 * ReymonARG®

 */ 
Responder
#2
para cosas mas complejas pueden usar natives de estilo 0 las cuales te permiten hacer cosas como estas



a excepcion de get_string y get_array todos los int y floats que se pasen en "any:..." se tienen q obtener como si se pasara por ref



Código PHP:
// native rak_logros(type, any:...)



public native_logros(iPluginiParams) {

    

    new 
Type get_param(1)

    

    switch(
Type) {

        

        case 
CREAR_LOGRO: { // rak_logros (CREAR_LOGRO, Name[]="", Reward, RewardLVL, FuncCall[]="")

            

            
if(g_LocalDataNum == MAX_LOGROS) {

                

                
log_amx("Logros Max Num Error: Se alcanzo el numero maximo de logros para agregar")

                

                return -
1

                

            
}

            

            
g_LocalData[g_LocalDataNum][PluginID] = iPlugin

            

            get_string
(2g_LocalData[g_LocalDataNum][_Name], charsmax(g_LocalData[][_Name]))

            

            
g_LocalData[g_LocalDataNum][Reward] = get_param_byref(3)

            

            
g_LocalData[g_LocalDataNum][RewardLVL] = get_param_byref(4)

            

            if(
g_LocalData[g_LocalDataNum][Reward])

                
get_string(5g_LocalData[g_LocalDataNum][Func_Call], charsmax(g_LocalData[][Func_Call]))

            

            
g_LocalDataNum++

            

            return 
g_LocalDataNum-1

            

        
}

        

        case 
AGREGAR_PUNTO: { // rak_logros (AGREGAR_PUNTO, index, LogroID, ammount)

            

            
new LogroID get_param_byref(3), id get_param_byref(2)

            

            if(
LogroID >= g_LocalDataNum) {

                

                
log_amx("Logros ID ERROR: ID Not Found: %d"LogroID)

                

                return -
1

                

            
}

            else if(
id || id g_MaxPlayers) {

                

                
log_amx("Logros User ID ERROR: ID Not Valid: %d"id)

                

                return -
1

                

            
}

            

            
g_UserData[id][LogroID] += get_param_byref(4)

            

            

            

            return 
1

            

        
}

        

        case 
QUITAR_PUNTO: { // rak_logros (QUITAR_PUNTO, index, LogroID, ammount)

            

            
new LogroID get_param_byref(3), id get_param_byref(2)

            

            if(
LogroID >= g_LocalDataNum) {

                

                
log_amx("Logros ID ERROR: ID Not Found: %d"LogroID)

                

                return -
1

                

            
}

            else if(
id || id g_MaxPlayers) {

                

                
log_amx("Logros User ID ERROR: ID Not Valid: %d"id)

                

                return -
1

                

            
}

            

            
g_UserData[id][LogroID] -= get_param_byref(4)

            

            if(
g_UserData[id][LogroID] < 0)

                
g_UserData[id][LogroID] = 0

            

            
return 1

            

        
}

        

        case 
CREAR_MENSAJE: { // rak_logros(CREATE_MENSAJE, index, Text[]="", Float:time, color)

            

            
new Text[32], id get_param_byref(2)

            

            if(
id || id g_MaxPlayers) {

                

                
log_amx("Logros User ID ERROR: ID Not Valid: %d"id)

                

                return -
1

                

            
}

            

            
get_string(3Textcharsmax(Text))

            

            
show_msgtutor(idFloat:get_param_byref(4), get_param_byref(5), Text)

            

            return 
1

            

        
}

        

        default: 
log_amx("Logros Native ERROR: Type Not Found: %d"Type)

        

    }

    

    return -
1

    





lo cual te permite q con una sola native hacer distitas cosas y de esta forma evitar hacer varias natives distintas



cualquier cosa el q este interesado puede preguntarme
Hi Milashkasiya CrabCrab

Soy un #Panda.. Soy solo un tipo que parece #común pero soy todo lo contrario; alguien #atípico en esta sociedad actual

[Imagen: xl0jvd-5.png]
Link
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)