12/10/2013, 09:14 PM
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
Estilo 0 // el mas viejito
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_chattags, g_saytext, g_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 j, cambiar[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(j = 3; j <= argumentos; j++)
{
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_chattags, cvarstring, 63)
// 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(message, 179, msg, 3)
// 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", cvarstring, message)
// 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 i = 1; i <= g_maxplayers; i++ )
{
// 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(j = 2; j < argumentos; j++)
{
if( getarg(j) == LANG_PLAYER )
{
setarg(j, 0, i);
cambiar[contador++] = j;
}
}
// Esto se repite. Ya saben como funciona esto.
vformat(message, 179, msg, 3)
formatex(final[1], 188, "%s %s", cvarstring, message)
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(j = 0; i < contador; j++)
{
setarg(cambiar[i], 0, LANG_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_UNRELIABLE, g_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(message, len, "!g", "^x04")
replace_all(message, len, "!t", "^x03")
replace_all(message, len, "!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(iPlugin, iParams)
{
// Como aca los parametros son necesarios si o si. No nos queda otra
// Que crekear si estan los parametros
if( iParams != 2 ) // 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( !( 1 <= 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(2, name, 31) // 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(iPlugin, iParams)
{
// Primero que nada hacemos el procedimiento de chekeo anterior
if( iParams != 3 ) // Ahora son 3
{
return log_error(AMX_ERR_NATIVE, "Bad native parameters")
}
new id = get_param(1)
if( !( 1 <= 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(id, name, 31)
// Ahora solo necesitamos copiar el nombre.
set_string(2, name, get_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®
*/