Simplificar y optimizar natives
#1
Exclamación 
Hace tiempo quise hacer esto pero no supe como x.x en que consiste? evitar duplicar llamadas en diferentes plugins que tengan que verificar por ejemplo si es un bot, un admin ó simplemente si esta vivo!

como ya sabran llamar repetidas veces "is_user_alive" no es buena practica para ello se podria implementar el siguiente code pero hay un detalle... de la manera como lo se hacer es por separado:

Código PHP:
public plugin_natives()
{
 
register_native("getOpt_alive""getOpt_alive_native"1)
 
register_native("getOpt_admin""getOpt_admin_native"1)
}

public 
getOpt_alive_native(id
{
 return 
g_Opt[id][isAlive]
}

public 
getOpt_admin_native(id
{
 return 
g_Opt[id][isAdmin]


no solo quiero saber si esta vivo ademas si es admin! asi que estuve buscando un tipo stock y me encontre un code de un ruso псих q no logro entender como funciona :? algun experto en natives que me pueda explicar? gracias!

Esto es lo que quiero hacer, guardar varias natives en una sola No tbad

Código PHP:
#include <amxmodx>
#include <hamsandwich>

enum _:Datas
{
 
isBot
 
isHLTV,
 
isAlive,
 
isAdmin
}

new 
g_Opt[33][Datas]

public 
plugin_natives()
{
 
register_native("getOpt""getOpt_native"1)
}

public 
getOpt_native(id
{
 
//return g_Opt[id][Datas]
}

public 
plugin_init() 
{
 
register_plugin("Sample getOpt""1.x""??")
 
 
RegisterHam(Ham_Spawn"player""HamPlayer_Spawn"1)
 
RegisterHam(Ham_Killed"player""HamPlayer_Killed"1)
}

public 
HamPlayer_Spawn(const id
{
 if( !
is_user_connected(id) || !is_user_alive(id) ) 
 return 
HAM_IGNORED
 
 g_Opt
[id][isAlive] = 1
 
 
return HAM_IGNORED
}

public 
HamPlayer_Killed(const id
{
 
g_Opt[id][isAlive] = 0
}

public 
client_authorized(id)
{
 if(
is_user_bot(id))
 {
 
g_Opt[id][isBot] = 1
 
 
return
 }
 
 if(
is_user_hltv(id))
 {
 
g_Opt[id][isHLTV] = 1
 
 
return
 }
}

public 
client_putinserver(id
{
 
g_Opt[id][isAlive] = 0
 
 g_Opt
[id][isAdmin] = (get_user_flags(id) & ADMIN_MENU 0)


public 
client_disconnect(id

 if(
g_Opt[id][isBot] > 0)
 {
 
g_Opt[id][isBot] = 0
 
}
 
 if(
g_Opt[id][isHLTV] > 0)
 {
 
g_Opt[id][isHLTV] = 0
 
}

Responder
#2
Si queres optimizar te conviene usar bits. Los llamados de natives siempre consumen mas que una variable o bit hecho desde el código base.

Código PHP:
// - Bits -

#include <amxmodx>
#include <hamsandwich>

#if AMXX_VERSION_NUM < 183

#define MAX_PLAYERS 32
#define client_disconnected(%1) client_disconnect(%1)

#endif

#define JUGADOR_VALIDO(%0)                 (1 <= %0 <= MAX_PLAYERS)

#define OBTENER_BIT_DEL_JUGADOR(%0,%1)     (JUGADOR_VALIDO(%1) && (%0 & (1 << (%1 & 31))))
#define SETEAR_BIT_AL_JUGADOR(%0,%1)       (JUGADOR_VALIDO(%1) && (%0 |= (1 << (%1 & 31))))
#define ELIMINAR_BIT_DEL_JUGADOR(%0,%1)    (JUGADOR_VALIDO(%1) && (%0 &=~ (1 << (%1 & 31))))

new g_conectadog_vivog_bot;

public 
plugin_init()
{
    
register_plugin("bits - ""version""creador");

    
RegisterHam(Ham_Spawn"player""ham_jspawn_post", .Post true);
    
RegisterHam(Ham_Killed"player""ham_jasesinado", .Post false);
}

public 
client_putinserver(id)
{
    
SETEAR_BIT_AL_JUGADOR(g_conectadoid);

    if (
is_user_bot(id))
        
SETEAR_BIT_AL_JUGADOR(g_botid);
}

public 
client_disconnected(id)
{
    if (
OBTENER_BIT_DEL_JUGADOR(g_conectadoid))
        
ELIMINAR_BIT_DEL_JUGADOR(g_conectadoid);

    if (
OBTENER_BIT_DEL_JUGADOR(g_vivoid))
        
ELIMINAR_BIT_DEL_JUGADOR(g_vivoid);
        
    if (
OBTENER_BIT_DEL_JUGADOR(g_botid))
        
ELIMINAR_BIT_DEL_JUGADOR(g_botid);        
}

public 
ham_jspawn_post(id)
{
    if (!
is_user_alive(id)) return;

    
SETEAR_BIT_AL_JUGADOR(g_vivoid);
}

public 
ham_jasesinado(victimaasesino)
{
    if (!
OBTENER_BIT_DEL_JUGADOR(g_conectadoasesino))
        return;

    
ELIMINAR_BIT_DEL_JUGADOR(g_vivovictima);
}

// Ejemplos de uso
if (OBTENER_BIT_DEL_JUGADOR(g_conectadoid)) // Si esta conectado | igual a is_user_connected(id)
if (OBTENER_BIT_DEL_JUGADOR(g_vivoid)) // Si esta vivo | igual a is_user_alive(id)
if (OBTENER_BIT_DEL_JUGADOR(g_botid)) // Si es bot | igual a is_user_bot(id) 
___________________________________
SI NECESITAS UN PLUGIN TE LO HAGO $$$
COMUNICATE A MI DISCORD: emanuelitop15
Responder
#3
podrías probar así (?)
Código PHP:
register_native("getOpt""getOpt_native"1)

public 
getOpt_native(idvariable) return variable

uso: if(getOpt_native(id, variablevivo[id])

Responder
#4
(29/08/2022, 09:46 PM)[E]manuelitop15 escribió: Si queres optimizar te conviene usar bits. Los llamados de natives siempre consumen mas que una variable o bit hecho desde el código base.

tambien es util el uso de los bits a la hora de optimizar, pero quedamos en las mismas  Whatever quiero poder reducir la mayor cantidad de llamadas posibles! por eso uso las natives para definir las condiciones en vez de llamar x10 veces if(is_user_alive(id) == true) -> llamo if(isAlive(id) == true) una vez!

(30/08/2022, 03:33 AM)Skylar escribió: podrías probar así (?)
Código PHP:
register_native("getOpt""getOpt_native"1)

public 
getOpt_native(idvariable) return variable

uso: if(getOpt_native(id, variablevivo[id])

lo testeare a ver que takl
Responder
#5
(29/08/2022, 09:46 PM)[E]manuelitop15 escribió: Si queres optimizar te conviene usar bits. Los llamados de natives siempre consumen mas que una variable o bit hecho desde el código base.

Código PHP:
// - Bits -

#include <amxmodx>
#include <hamsandwich>

#if AMXX_VERSION_NUM < 183

#define MAX_PLAYERS 32
#define client_disconnected(%1) client_disconnect(%1)

#endif

#define JUGADOR_VALIDO(%0)                (1 <= %0 <= MAX_PLAYERS)

#define OBTENER_BIT_DEL_JUGADOR(%0,%1)    (JUGADOR_VALIDO(%1) && (%0 & (1 << (%1 & 31))))
#define SETEAR_BIT_AL_JUGADOR(%0,%1)      (JUGADOR_VALIDO(%1) && (%0 |= (1 << (%1 & 31))))
#define ELIMINAR_BIT_DEL_JUGADOR(%0,%1)    (JUGADOR_VALIDO(%1) && (%0 &=~ (1 << (%1 & 31))))

new g_conectadog_vivog_bot;

public 
plugin_init()
{
 
register_plugin("bits - ""version""creador");

 
RegisterHam(Ham_Spawn"player""ham_jspawn_post", .Post true);
 
RegisterHam(Ham_Killed"player""ham_jasesinado", .Post false);
}

public 
client_putinserver(id)
{
 
SETEAR_BIT_AL_JUGADOR(g_conectadoid);

 if (
is_user_bot(id))
 
SETEAR_BIT_AL_JUGADOR(g_botid);
}

public 
client_disconnected(id)
{
 if (
OBTENER_BIT_DEL_JUGADOR(g_conectadoid))
 
ELIMINAR_BIT_DEL_JUGADOR(g_conectadoid);

 if (
OBTENER_BIT_DEL_JUGADOR(g_vivoid))
 
ELIMINAR_BIT_DEL_JUGADOR(g_vivoid);
 
 if (
OBTENER_BIT_DEL_JUGADOR(g_botid))
 
ELIMINAR_BIT_DEL_JUGADOR(g_botid); 
}

public 
ham_jspawn_post(id)
{
 if (!
is_user_alive(id)) return;

 
SETEAR_BIT_AL_JUGADOR(g_vivoid);
}

public 
ham_jasesinado(victimaasesino)
{
 if (!
OBTENER_BIT_DEL_JUGADOR(g_conectadoasesino))
 return;

 
ELIMINAR_BIT_DEL_JUGADOR(g_vivovictima);
}

// Ejemplos de uso
if (OBTENER_BIT_DEL_JUGADOR(g_conectadoid)) // Si esta conectado | igual a is_user_connected(id)
if (OBTENER_BIT_DEL_JUGADOR(g_vivoid)) // Si esta vivo | igual a is_user_alive(id)
if (OBTENER_BIT_DEL_JUGADOR(g_botid)) // Si es bot | igual a is_user_bot(id) 

Buenas, de casualidad al bit se le puede otorgar un valor por separado de la misma manera?

Ejemplo:
Código PHP:
SETEAR_NUM_AL_JUGADOR(g_vivoidcantidad); 

Como seria el macro si es posible? y si uso eliminar bit del jugador automaticamente pasaria el valor a 0?
Responder
#6
La otra ve intenté algo similar y encontré dos formas de realizar lo que creo buscas.

La primera con natives y uso de set_array, usándolo
new name[32]
get_jugador_datos(id, tag, name, charsmax(name))

Y la otra que use una vez y no logro igualar el resultado es retornando el len sino mal recuerdo. Para usarlo directamente a si. colorchar(id, "%s se la come", get_jugador_datos(id, tag)

La segunda forma sinceramente no la veo eficiente y siento que ocurre por algún bug, pero se ve interesante... Apenas replique la forma lo paso para que lo veas.
Responder
#7
(30/08/2022, 04:16 PM)mlibre escribió: tambien es util el uso de los bits a la hora de optimizar, pero quedamos en las mismas  Whatever quiero poder reducir la mayor cantidad de llamadas posibles! por eso uso las natives para definir las condiciones en vez de llamar x10 veces if(is_user_alive(id) == true) -> llamo if(isAlive(id) == true) una vez!

lo testeare a ver que takl


Estoy desde el cell ahorita pero te lo resumo:

Asigna estados (flags) al jugador dependiendo de la naturaleza de los mismos, y luego los verificas con una "sola operación" (lo que tu llamas una llamada).

Básicamente = usa bits

Cualquier duda, posteala
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)