Enviar respuesta 
Utilización de macros
Autor Mensaje
CSAxel Sin conexión
Miembro Héroe


Plugin developer 1k
Mensajes: 1,837
Registro en: Dec 2013
Reputación: 40
Mensaje: #1
Utilización de macros
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.
(Este mensaje fue modificado por última vez en: 17/01/2015 12:45 AM por CSAxel.)
31/08/2014 08:37 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Side^^ Sin conexión
Miembro Sr.


Mensajes: 555
Registro en: Jul 2014
Reputación: 33
Mensaje: #2
RE: Utilización de macros
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.

Image
(Este mensaje fue modificado por última vez en: 31/08/2014 08:40 PM por Side^^.)
31/08/2014 08:38 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
CSAxel Sin conexión
Miembro Héroe


Plugin developer 1k
Mensajes: 1,837
Registro en: Dec 2013
Reputación: 40
Mensaje: #3
RE: Utilización de macros
Lo expliqué a eso. Sino lo detallo un poco más.
31/08/2014 08:43 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Side^^ Sin conexión
Miembro Sr.


Mensajes: 555
Registro en: Jul 2014
Reputación: 33
Mensaje: #4
RE: Utilización de macros
(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

Image
31/08/2014 08:45 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
CSAxel Sin conexión
Miembro Héroe


Plugin developer 1k
Mensajes: 1,837
Registro en: Dec 2013
Reputación: 40
Mensaje: #5
RE: Utilización de macros
Sisi ahí lo expliqué un poco. Es fácil igual como está redactado.
31/08/2014 08:54 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Kane Sin conexión
Miembro Sr.


Mensajes: 532
Registro en: Feb 2014
Reputación: 17
Mensaje: #6
RE: Utilización de macros
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í.

(19/06/2014 11:08 PM)01011001 escribió:  No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014 11:08 PM)[R]ak escribió:  Mis conocimientos aumentaron un 500% con este post
(Este mensaje fue modificado por última vez en: 31/08/2014 09:47 PM por Kane.)
31/08/2014 09:46 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
CSAxel Sin conexión
Miembro Héroe


Plugin developer 1k
Mensajes: 1,837
Registro en: Dec 2013
Reputación: 40
Mensaje: #7
RE: Utilización de macros
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
(Este mensaje fue modificado por última vez en: 01/09/2014 12:01 AM por CSAxel.)
31/08/2014 10:26 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
xPecie Sin conexión
Miembro Destacado


1k
Mensajes: 1,048
Registro en: Oct 2013
Reputación: 4
Mensaje: #8
RE: Utilización de macros
Gracias por el tutorial !
01/09/2014 10:40 AM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
kikizon2 Sin conexión
Miembro Héroe


Plugin developer Donador Regalo Beta Tester Trebol purpura 1k Plugin popular
Mensajes: 3,774
Registro en: Jan 2014
Reputación: 64
Mensaje: #9
RE: Utilización de macros
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


NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook

(23/09/2019 05:39 PM)Santax escribió:  Jjkajkjkaajk Nesecito Aiuda,Pinches Niños Ratas De Hoy En Dia Ya Ni Respetan.
01/09/2014 11:23 AM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
totopizza Sin conexión
http://www.MexicanServers.com


Donador Forum supporter Trebol verde Trebol de oro 1k
Mensajes: 2,094
Registro en: Mar 2014
Reputación: 40
Mensaje: #10
RE: Utilización de macros
Muy buen tutorial CSAxel

Image

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016 05:05 PM)meTaLiCroSS escribió:  Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019 05:32 PM)meTaLiCroSS escribió:  grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
01/09/2014 01:42 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)

Contáctanos | Allied Modders en español | Volver arriba | Volver al contenido | Archivo (Modo simple) | Sindicación RSS