Veteran Member
Join Date: May 2008
Location: Brazil
|
03-02-2009
, 19:38
[TUTO] Dinamic Natives ( Update Stylo 0 )
|
#1
|
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
PHP Code:
/** * 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
PHP Code:
// 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® */
EDIT: Este Tuto se lo dedico al pibe que me esta tirando -karma.
__________________
Last edited by AntiBots; 03-03-2009 at 11:26.
|
|