Raised This Month: $51 Target: $400
 12% 

[TUTO] Dinamic Natives ( Update Stylo 0 )


  
 
 
Thread Tools Display Modes
Author Message
AntiBots
Veteran Member
Join Date: May 2008
Location: Brazil
Old 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_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
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(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®
 */ 
EDIT: Este Tuto se lo dedico al pibe que me esta tirando -karma.
Attached Files
File Type: sma Get Plugin or Get Source (kz_chatcolor.sma - 908 views - 11.6 KB)
File Type: sma Get Plugin or Get Source (amx_nativename.sma - 835 views - 3.9 KB)
__________________

Last edited by AntiBots; 03-03-2009 at 11:26.
AntiBots is offline
Send a message via ICQ to AntiBots Send a message via MSN to AntiBots Send a message via Skype™ to AntiBots
AlejandroSk
BANNED
Join Date: Nov 2008
Location: Aqui, en mi casa. Karma:
Old 03-02-2009 , 19:39   Re: [TUTO] Dinamic Natives
#2

Muchas gracias ahorita la leo =)
AlejandroSk is offline
Send a message via MSN to AlejandroSk
Starsailor
horrible hahah
Join Date: Aug 2008
Location: Buenos Aires
Old 03-02-2009 , 20:25   Re: [TUTO] Dinamic Natives
#3

buen tutorial
__________________
Find my plugins here..

Ex - Spanish Moderator.
Starsailor is offline
L//
Senior Member
Join Date: Aug 2008
Location: Not found
Old 03-02-2009 , 20:30   Re: [TUTO] Dinamic Natives
#4

No estoy de acuerdo con algunas definiciones, y creo que faltaria explicar para que se usan las natives, pero al fin y al cabo, es un buen tutorial para aquellos que nunca usaron natives. God job
__________________
L// is offline
Send a message via MSN to L//
AntiBots
Veteran Member
Join Date: May 2008
Location: Brazil
Old 03-02-2009 , 20:36   Re: [TUTO] Dinamic Natives
#5

Quote:
Originally Posted by L// View Post
No estoy de acuerdo con algunas definiciones, y creo que faltaria explicar para que se usan las natives, pero al fin y al cabo, es un buen tutorial para aquellos que nunca usaron natives. God job
Gracias. Ahi explique un poco para que se usan.
__________________
AntiBots is offline
Send a message via ICQ to AntiBots Send a message via MSN to AntiBots Send a message via Skype™ to AntiBots
AntiBots
Veteran Member
Join Date: May 2008
Location: Brazil
Old 03-03-2009 , 11:28   Re: [TUTO] Dinamic Natives ( Update Stylo 0 )
#6

Ahi actualize para mostrarles un poco el stylo 0.

A mi me resulta mas facil el 1. Pero bueno para que conoscan les presento tambien el mas viejito.
__________________
AntiBots is offline
Send a message via ICQ to AntiBots Send a message via MSN to AntiBots Send a message via Skype™ to AntiBots
meTaLiCroSS
Gaze Upon My Hat
Join Date: Feb 2009
Location: Viña del Mar, Chile
Old 03-03-2009 , 12:38   Re: [TUTO] Dinamic Natives ( Update Stylo 0 )
#7

Buen Tuto, ponelo aqui: http://escripting.webcindario.com/forumdisplay.php?f=26

__________________
Quote:
Originally Posted by joropito View Post
You're right Metalicross
meTaLiCroSS is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 16:34.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode