Allied Modders en español
Utilización de macros - Versión para impresión

+- Allied Modders en español (https://amxmodx-es.com)
+-- Foro: AMX Mod X - Scripting (https://amxmodx-es.com/Forum-AMX-Mod-X-Scripting)
+--- Foro: Tutoriales / Guias (https://amxmodx-es.com/Forum-Tutoriales-Guias)
+--- Tema: Utilización de macros (/Thread-Utilizaci%C3%B3n-de-macros)

Páginas: 1 2


Utilización de macros - CSAxel - 31/08/2014

Bueno más que nada buenas tardes a todos

Voy a enseñarles totalmente el uso de macros para que le demos uso y sepamos para que lo estamos usando

Aquí vamoooooos Gran sonrisa

Definición:
Un macro es un trozo de codigo que es leido en el preprocesado, el primer proceso de compilacion, y lo que hace simplemente es reemplazar un trozo de codigo con otro, no genera errores, dependiendo si eres negro codeando y no te imaginas el reemplazo, no interfiere directamente con la memoria, por el hecho que no son variables que guardan datos, son eliminados despues de ese proceso.

Cabe destacar que definir strings en un macro es una pesima idea si quieres que tu plugin pese menos, por que tal dicho, es un reemplazo por sobre todo el codigo, poniendo un string, pondras strings en todo el codigo, haciendo repetitivas veces un arbolito de memoria que quedaran en el archivo haciendolo mas pesado (cosa que no influye en el rendimiento, para los obsesionados).

Los macros son útiles para guardar valores, y trozos de codigos (pseudofunciones)

Fuente: meTaLiCroSS señores
Para que sirve:
Una macro sirve para guardar algún tipo de valor en una simple definición, o guardar un calculo matemático y que devuelva cierto valor, utilizar una variable para devolver "x" valor, etc.

Por ejemplo:
Código PHP:
#define MAX_NIVEL     500 
Acá definimos un valor a MAX_NIVEL que es 500. Y podemos utilizarlo para darle ese mismo valor a una variable, chequear el mismo, utilizarlo como máximo a una constante, así con los siguientes:
Código PHP:
g_variable[id] = MAX_NIVEL;
/** o **/
if (g_variable[id] >= MAX_NIVEL)
/** o **/
new const szConstante[MAX_NIVEL] = { 123... 500 }; 
Utilización:
Supongamos que tenemos un sistema de niveles. Y queremos hacer la experiencia que pida por nivel. Entonces usaremos la siguiente macro
Código PHP:
#define Costo(%1)    (%1 * 5) 
Esta macro es la que usaremos para chequear la experiencia por nivel.
Sería "Tu nivel actual * 5". Si tenemos nivel 2 entonces
Código:
(2 * 5) = 10

El %1 es para que usemos algún tipo de valor, como una variable, la id del cliente, una función, etc. Y es de la siguiente forma
Código PHP:
Costo(g_nivel[id]); 
Recordemos que nuestra macro contiene esto (%1 * 5), si nuestro nivel es 50. Entonces el cálculo es el siguiente
Código:
(50 * 5) = 250

El %1 de la macro lo reemplazamos por el valor de nuestro nivel (De la variable g_nivel)

Una macro un poco más compleja sería esta.
Código PHP:
#define Costo(%0, %1)    (%1 + 1) * 5 * (g_iRango[%0]+1) 
Los primeros 2 parámetros lo explicaré brevemente...
%0: En este parámetro guardaremos el ID del jugador
%1: En este parámetro guardaremos el valor de las variables

Supongamos que nuestro nivel es 76 y nuestro rango de forma entera es 4. Cuando lo utilizamos el plugin sería algo así:
Código PHP:
while (g_iXP[id] >= Costo(idg_iNivel[id])) 
El cálculo sería el siguiente:
Código:
(%1 + 1) * 5 * (g_rango[id]+1)
(76 + 1) * 5 * (4+1)
77 * 5 * 5
385 * 5
1925
Entonces el requerimiento para el nivel 76 del rango 4 es 1925
Ejemplo de plugin con una macro:
Código PHP:
#include <amxmodx>

new g_nivel[33];
new 
g_rango[33];

#define CostoNivel(%0,%1)        ((%1 + 1) * 150 * (g_rango[%0] + 5) * random_num(50 75))

public plugin_init()
    
register_clcmd("say /probar""Clcmd_Test");

public 
client_putinsever(id)
{
    
g_nivel[id] = random_num(1,250); // Le damos un valor a la variable entre 1 hasta 250
    
g_rango[id] = random_num(0,25); // Le damos un valor a la variable entre 0 a 25
}

public 
Clcmd_Test(id)
{
    
client_print(idprint_chat"[TEST] El valor de XP para el rango %d del nivel %d es: %d"g_rango[id], g_nivel[id], CostoNivel(idg_nivel[id]));
    return 
PLUGIN_HANDLED;

Calculamos:
- Supongamos que al conectarnos, nos sale el nivel 149 rango de forma entera 33 y el valor de la madro entre 50 y 75, sale 66
Código:
(%1 + 1) * 150 * (g_rangp[id] + 5) * 66

(149 + 1) * 150 * (33 + 5) * 66
150 * 150 * 38 * 66
22500 * 2508 = 56.430.000 (56 millones 430mil)

Y nuestro print diría esto:
Código:
[TEST] El valor de XP para el rango 33 del nivel 149 es: 56430000
Ejemplos con más complejidad:
- 1er ejemplo:
Un ejemplo complejo sería el siguiente:
Código PHP:
#define ObtenerNumero(%1, %2)        (%1 * %2) / (%1 * (random_num(%1, %2)) 
Como verán tiene 2 parámetros la macro, %1 y %2. Ya habíamos explicado del porque del %1 ahora agregamos otra asignación para agregar otro valor. En caso de querer agregar más parámetros a su macro, solo deben agregar el signo de porcentaje (%) y el número dependiendo de cuantas uses.

El cálculo matemático sería así:
- Supongamos que el valor para %1 es 21 y para %2 es 83, entonces:
Código:
(%1 * %2) / (%1 * (random_num(%1, %2))
(21 * 83) / (21 * (random_num(21, 83))
/** Donde dice random_num(21, 83) sería un número al azar entre 21 y 83. Supongamos que sale el número 62, entonces **/
(21 * 83) / (21 * 62)
1743 / 1302
1,338
Nos devolvería un número decimal. Obviamente que el valor va a variar porque hay un comando que hace que varíe (random_num()Guiño así que puede ser cualquier número que pueda devolver esa macro
- 2do ejemplo:
Otro ejemplo más complejo sería este (Cortesía de Kane):
Código PHP:
#define ObtenerNumero(%1, %2, %3, %4)     (%1 * power(%2, %4)) / %3 - %1 * random_num(%4, %1) 
El cálculo sería así:
- Supongamos que el valor para el primer parámetro es 50, para el segundo es 25, el tercero 100 y el cuarto 5, entonces
Código:
(%1 * power(%2, %4)) / %3 - %1 * random_num(%4, %1)
(50 * power(25, 5)) / 100 - 50 * random_num(5, 25)
/** el comando power sería la exponensiación de un número. Es decir, si el primer parámetro es 25, entonces el exponente de 25 sería el segundo parámetro, que es 5. Más preciso... 25 elevado a 5

Y supongamos que dentro del comando random_num sale 20 **/
(50 * 9765625) / 50 * 20
488281250 / 1000
488281,25
Otro número con decimales, como habíamos explicado en el primer ejemplo

Si quieren pueden hacer cualquier tipo de pregunta acerca del tema o cualquier duda y lo voy agregando al post para que se saquen las dudas y explicárselos de la mejor forma.

Eso es todo por el momento, lo que falta digan y agrego
Saludos.


RE: Utilización de macros - Side^^ - 31/08/2014

Como siempre grande ^^ esto le servira a mucha gente. Pero por ejemplo en
Código PHP:
#define Costo(%1)    (%1 * 5)// tu nivel por 5 
podrias explicar eso ya que hay gente que no lo entiende ^^
Buen tuto.


RE: Utilización de macros - CSAxel - 31/08/2014

Lo expliqué a eso. Sino lo detallo un poco más.


RE: Utilización de macros - Side^^ - 31/08/2014

(31/08/2014, 08:43 PM)CSAxel escribió: Lo expliqué a eso. Sino lo detallo un poco más.

Lo explicaste mediante la variable xD pero hay gente que no lo entiende... y tu bien lo sabes


RE: Utilización de macros - CSAxel - 31/08/2014

Sisi ahí lo expliqué un poco. Es fácil igual como está redactado.


RE: Utilización de macros - Kane - 31/08/2014

Dice definicion pero no lo definis, solo decís para que sirve.
Pordrias también agregar ejemplos mas complejos como:
Código PHP:
#define get_num(%0, %1, %2, %3)     (%0*power(%1,%3))/%2 - %0*random_num(%0, %3) 
Lo exajere para que me entiendas porque aveces no soy muy claro. A lo que voy es que no pongas solo las cosas mas simples, que también pongas algo un poco mas avanzado así el que la lee puede aprender primero lo básico y después algo un poco mas complejo.
Me gustaron algunas explicaciibes , bien ahí.


RE: Utilización de macros - CSAxel - 31/08/2014

Sisi después voy actualizando el tema. Así agregar la definición de Macros.
Y pones ejemplos más complejos. Voy a usar el tuyo ya que tengo un poco quemadas las ideas :_

EDIT: Actualicé eso. Y agregué ejemplos


RE: Utilización de macros - xPecie - 01/09/2014

Gracias por el tutorial !


RE: Utilización de macros - kikizon2 - 01/09/2014

Muy bueno axel :3 solo uno que otro error de, dedo :3

ej:

Para que sivre:
-->
Para que sirve:


en el spoiler Utilización

#define Costo(%1) (%1 + 1) * 5 + (g_rango[id](
-->
#define Costo(%1) (%1 + 1) * 5 + (g_rango[id])


en Ejemplo de Plugin con macro


#define CostoNivel(%1) (%1 + 1) * 150 * (g_rangp[id]+1) * 50
-->
#define CostoNivel(%1) (%1 + 1) * 150 * (g_rango[id]+1) * 50



Pero aparte de esos mínimos errorsirijillos esta perfecto Excitedeyes

Otro buen aporte

Gracias :3


RE: Utilización de macros - totopizza - 01/09/2014

Muy buen tutorial CSAxel


RE: Utilización de macros - CSAxel - 01/09/2014

Gracias ahí edité los mínimos errores e.e


RE: Utilización de macros - mongito100 - 01/09/2014

Una cosa saca esta parte
#define MAX_NIVEL....
Por q es mejor una constante q una macro para guardar un numero
Buen putorial Crab


RE: Utilización de macros - roccoxx - 01/09/2014

(01/09/2014, 07:37 PM)mongito100 escribió: Buen putorial Crab

idem


RE: Utilización de macros - CSAxel - 01/09/2014

Yo lo dejaría, pero lo aclaro. Es para que la gente que se inicia. Por ahí se pregunte al ver esto
Código PHP:
#define ADMIN_ACCESS    ADMIN_RCON 
Como ejemplo obvio. Y dejo aclaraciones de que es mejor una constante para que tenga en cuentan eso. Aunque nada que ver con el Tuto pero es algo para que bueno, lo piensen xD


RE: Utilización de macros - wicho - 02/09/2014

Muy bueno el tutorial..


RE: Utilización de macros - Evil Spiret - 04/09/2014

Yeah Axel , hay gente que reniega mucho para usar macros... ya con esto estarán felices.
Me gusto mucho tu tutorial , como siempre.
Saludos


RE: Utilización de macros - GokuX - 04/09/2014

Código PHP:
#define Costo(%1)    (%1 + 1) * 5 + (g_rango[id]) 

Cuando explicaste eso lo consideraste como multiplicación, y antes los habías definido como una suma, bueno es como algo obvio pero igual en esos casos hipotéticos.
-->
Código PHP:
#define Costo(%1)    (%1 + 1) * 5 * (g_rango[id]) 



RE: Utilización de macros - wicho - 05/09/2014

CSAxel talvez te podrias hacer un tutorial de arrays dinamicos con ejemplos..


RE: Utilización de macros - estantaya - 05/09/2014

en los define a veces veo cosas demasiadas extrañas como funciones, simbolos raros, llamadas a natives :S WhatdoneWhatdoneWhatdoneWhatdone


RE: Utilización de macros - meTaLiCroSS - 05/09/2014

La definicion creo que ni tu la entendiste.

Un macro es un trozo de codigo que es leido en el preprocesado, el primer proceso de compilacion, y lo que hace simplemente es reemplazar un trozo de codigo con otro, no genera errores, dependiendo si eres negro codeando y no te imaginas el reemplazo, no interfiere directamente con la memoria, por el hecho que no son variables que guardan datos, son eliminados despues de ese proceso.

Cabe destacar que definir strings en un macro es una pesima idea si quieres que tu plugin pese menos, por que tal dicho, es un reemplazo por sobre todo el codigo, poniendo un string, pondras strings en todo el codigo, haciendo repetitivas veces un arbolito de memoria que quedaran en el archivo haciendolo mas pesado (cosa que no influye en el rendimiento, para los obsesionados).

Los macros son útiles para guardar valores, y trozos de codigos (pseudofunciones)


RE: Utilización de macros - Mía - 07/09/2014

Estaría bueno que agregues la utilización de macros multilínea, son útiles para editar funciones sin tener que buscarlas en un código extenso.


RE: Utilización de macros - mongito100 - 07/09/2014

(07/09/2014, 09:47 PM)Mario AR. escribió: Estaría bueno que agregues la utilización de macros multilínea, son útiles para editar funciones sin tener que buscarlas en un código extenso.

Volviste mario ?

Ahora q lei un poco mas me fije en esto

#define Costo(%1) (%1 + 1) * 5 + (g_rango[id])

eso es un mal habito q pasa si no tengo "id" en mi funcion


RE: Utilización de macros - meTaLiCroSS - 07/09/2014

(07/09/2014, 09:47 PM)Mario AR. escribió: Estaría bueno que agregues la utilización de macros multilínea, son útiles para editar funciones sin tener que buscarlas en un código extenso.

Agregales un \ al final y saltas la linea, sencillo, el editor te lo tomara dentro del macro.


RE: Utilización de macros - Mía - 07/09/2014

(07/09/2014, 09:53 PM)meTaLiCroSS escribió:
(07/09/2014, 09:47 PM)Mario AR. escribió: Estaría bueno que agregues la utilización de macros multilínea, son útiles para editar funciones sin tener que buscarlas en un código extenso.

Agregales un \ al final y saltas la linea, sencillo, el editor te lo tomara dentro del macro.

Las llaves y el semicolon.. a veces es medio trucado eso de los macro multilínea.


RE: Utilización de macros - meTaLiCroSS - 07/09/2014

Mucho mejor que lo hagas función en vez de macro, cito la parte donde se explica que es un reemplazo de codigo. Solo terminas haciendo un codigo mas grande y menos reducido.