Funciones útiles para usar
#1
Estrella 
Voy a intentar mostrarles todas las funciones que conozco y resultan muy útiles y sirven para evitar cometer errores o ahorrar código.

Tome la idea de acá, pero no va a ser una traducción, como siempre, lo hago a mi modo y tomare algunas cosas.
https://forums.alliedmods.net/showthread.php?t=59939

Bueno, a modo de anticipación dejare una lista con las funciones que trataremos:
Código:
charsmax
access
clamp
arrayset
get_weaponid - get_weaponname
get_playersnum
get_players
get_gametime

Empecemos!

charsmax:
Esto sirve muchísimo para evitar cometer errores al pasar parámetros, y para cambiar el tamaño de un array sin tener que cambiarlo en todos los lugares del código (por ejemplo una array global que se usa en muchas secciones). Sobre todo sirve para evitar cometer errores.
Código PHP:
new MiArray[32]
copy(MiArraycharsmax(MiArray), "Charsmax :D")

// Nota: charsmax es lo mismo que sizeof -1, ya que si tenemos 32 celdas,
// podremos usar 31 celdas para guardar datos ya que la otra debe contener ^0 

access:
Muchas veces se usa has_flag | get_user_flags con el fin de saber si un usuario, por ejemplo, tiene la flag "ADMIN_BAN", siendo que con una simple función se puede hacer lo mismo.
Código PHP:
if(access(idADMIN_BAN)) // tiene la flag para banear 

clamp
Esta función nos sirve para setear una variable entre un máximo y un mínimo. Quiere decir que si la variable que pasamos sobrepasa el máximo, se seteara al máximo, y si es menor que el mínimo, se seteara al mínimo.
Muy útil para mods de experiencia en donde hay un numero máximo de niveles o experiencia.
Código PHP:
clamp(g_exp[id], 0g_MaxExp

arrayset
Esta definitivamente es una de las funciones mas útiles que no veo que nadie use, sirve muchísimo cuando por ejemplo empieza una ronda y queremos setear todas las variables de un array a 0 o a falso, por ejemplo, supongamos que tenemos un array(bool) de 33 celdas que indica si un player salto en esa ronda, cada vez que inicie una nueva ronda deberíamos serear todas las celdas a falso, pero, por que hacer un loop si lo podemos hacer con esta función?
Código PHP:
arrayset(g_PlayerJumpedfalsecharsmax(g_PlayerJumped)) 

get_weaponid - get_weaponname
Esta función sirve para pasar de "weapon_deagle" a CSW_DEAGLE y viceversa (o cualquier otra arma...)
Código PHP:
new deagle get_weaponid("weapon_deagle"// CSW_DEAGLE

new name[20]
get_weaponname(CSW_DEAGLEnamecharsmax(name)) //weapon_deagle

// NOTA: Si queremos hacer un print del nombre, y queremos que no salga "weapon_"
// podemos printear desde la celda 7, así:
server_print("Deagle name: %s"name[7]) 

Ejemplo de su utilidad:
Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "Plugin"
#define VERSION "1.0.0"
#define AUTHOR "autor"


public plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_clcmd("say /arma""WeaponCmd")
}

public 
WeaponCmd(id)
{
    if(!
is_user_alive(id))
        return 
PLUGIN_HANDLED

    
new name[20]
    new 
weapon get_user_weapon(id)
    
get_weaponname(weaponnamecharsmax(name))
    
    
client_print(idprint_chat"Llevas el arma %s"name[7])


get_playersnum
Esta función nos devuelve la cantidad de players online en el servidor.
Código PHP:
new players get_playersnum() 
Puede resultar útil para ejecutar ciertas funciones cuando hay mas o menos de cierta cantidad de players.

get_players
La anterior funcion fue mas que todo para que no se confundan con esta o no la usen cuando no es necesario. Con esta podemos recolectar ciertos players y acceder a ellos (saber cuales son) con flags y condiciones, no hay necesidad de hacer un for con las condiciones ya que ya existe una función que haga eso, ejemplo si queremos agarrar a todos los players vivos que sean CT:
Código PHP:
new players[32], count
get_players
(playerscount"ae""CT"
Nota: acá hay info sobre esta función (los flags).
http://www.amxmodx.org/api/amxmodx/get_players

get_gametime
Aveces se usa la función set_task y variables sin necesidad, la función get_gametime puede ser muy útil para ciertos casos. Esta función devuelve la cantidad de segundos pasados desde el inicio del mapa (en tipo de float). Veamos un ejemplo bloqueando un comando (permitiendo usarlo cada 10 segundos)
Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "Plugin"
#define VERSION "1.0.0"
#define AUTHOR "autor"

new Float:g_UltimaEjecucion

public plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_clcmd("say /comando""Comando")
}

public 
Comando(id)
{
    if(
g_UltimaEjecucion+20.0>get_gametime())
        return 
PLUGIN_CONTINUE
    
    client_print
(idprint_chat"Hola!")
    return 
PLUGIN_HANDLED


#Fin

Acepto criticas constructivas.

Ejercicio opcional: Intenta hacer un plugin que utilice la mayoría de estas funciones (y tenga una utilidad razonable)
Responder
#2
yo haría un solo thread con todas las funciones que vas explicando y reservar los comentarios para próximas explicaciones de natives, así cuando busco algo lo tengo todo en 1 y no en 40 thread's diferentes...

Se entiende?
Responder
#3
charsmax es sizeof()-1

Código PHP:
#define charsmax(%1)      (sizeof(%1)-1) 

si no me equivoco asi está definido en el .inc

edit: deberias dejar las native default tambien asi entienden ejemplo

Código PHP:
/* Returns weapon name. */
native get_weaponname(id,weapon[],len); 
Responder
#4
(16/02/2015, 09:27 PM)ErikMav94 escribió: yo haría un solo thread con todas las funciones que vas explicando y reservar los comentarios para próximas explicaciones de natives, así cuando busco algo lo tengo todo en 1 y no en 40 thread's diferentes...

Se entiende?

Es que hablo de cosas distintas, en uno diferencie funciones, en este hable específicamente de funciones que mucho no se usan y son muy útiles, y en el otro explique como armar un código bien estructurado.

(16/02/2015, 09:27 PM)matrix123 escribió: charsmax es sizeof()-1

Código PHP:
#define charsmax(%1)      (sizeof(%1)-1) 

si no me equivoco asi está definido en el .inc

Si, es así, lo dije ahí
Responder
#5
Buen Tutorial/Guia (y) Excitedeyes

Lo que una ves quise hacer fue
Código PHP:
arrayset(g_VarFloat,0.0charsmax(gVarFloat)) 
WhatdoneWhatdoneWhatdone

PD: Si es que la puedo pasar a float DIGAMEN D:: D::

Nice CrabCrab
Arroba
Responder
#6
fijate mi edit
Responder
#7
me refiero a este thread

a este Funciones con un numero de argumentos dinamicos

y a este Explicación sobre funciones "parecidas" y como usarlas correctamente

porque si un día quiero buscar alguna de las funciones que están dentro de uno de esos thread's me voy a volver loco , en vez si pones todo en uno solo va a ser mas fácil e.e
Responder
#8
(16/02/2015, 09:31 PM)jollero escribió: Buen Tutorial/Guia (y) Excitedeyes

Lo que una ves quise hacer fue
Código PHP:
arrayset(g_VarFloat,0.0charsmax(gVarFloat)) 
WhatdoneWhatdoneWhatdone

PD: Si es que la puedo pasar a float DIGAMEN D:: D::

Nice CrabCrab

De hecho ahora que testeo, copia bien el valor, pero tira warnings (con floats)

(16/02/2015, 09:33 PM)matrix123 escribió: fijate mi edit

No me parece necesario ya que yo explique todo

(16/02/2015, 09:38 PM)ErikMav94 escribió: me refiero a este thread

a este Funciones con un numero de argumentos dinamicos

y a este Explicación sobre funciones "parecidas" y como usarlas correctamente

porque si un día quiero buscar alguna de las funciones que están dentro de uno de esos thread's me voy a volver loco , en vez si pones todo en uno solo va a ser mas fácil e.e

No creo, no quiero un theard de 10 paginas Oh god why
Responder
#9
este tema si que lo veo al pedo, porque si hablamos de funciones útiles todas lo son en su sentido y depende para que uso se le quiera dar.

aparte no son funciones sino natives. Oh god why
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#10
(17/02/2015, 12:15 AM)roccoxx escribió: aparte no son funciones sino natives. Oh god why

+10

A mi me gusta para quienes recién empiezan, o para algunos que no saben sobre arrayset ( la única que realmente alguien de nivel medio podría no conocer y ser útil ). Saludos.
No hago trabajos privados. Si necesitás ayuda, abrí un nuevo tema.
¿Buscás un ejemplo o algún modo de juego? Podés echarle un vistazo a mis aportes
.
Responder
#11
(17/02/2015, 12:19 AM)Treki escribió:
(17/02/2015, 12:15 AM)roccoxx escribió: aparte no son funciones sino natives. Oh god why

+10

A mi me gusta para quienes recién empiezan, o para algunos que no saben sobre arrayset ( la única que realmente alguien de nivel medio podría no conocer y ser útil ). Saludos.

aparte si revisas el hlsdk el arrayset seria lo mismo que hacerlo con un loop según me dijo raulitop y que es mas lento.
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#12
(17/02/2015, 12:15 AM)roccoxx escribió: este tema si que lo veo al pedo, porque si hablamos de funciones útiles todas lo son en su sentido y depende para que uso se le quiera dar.

aparte no son funciones sino natives. Oh god why

Según entiendo las natives son mas rápidas que los codes de pawn.

De todos modos, ya se que son todas funciones útiles, pero mas me refiero a las que son útiles y mucho no se usan, es mas para principiantes.

Por ejemplo, en casi ningún mod de XP veo clamp, siendo que es muy útil para evitar que se bugee la xp sin tener que andar haciendo checkeos inútiles.

Lo mismo los task y variables que hacen pudiendo usar get_gametime o los loops pudiendo usar get_players.

Yo lo vi interesante e importante y por eso lo postie, pero no se que piensen los demás Confundido

PD: Si realmente creen que esto es inutil o que confundirá a los usuarios (o los hará perder su tiempo leyendo) pueden borrarlo.
Responder
#13
Ejercicio opcional, no lo probé, me falto usar get_players y arrayset;

Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include hamsandwich

new g_nivel[33], g_experiencia[33], g_nombre[33][32], g_predeterminado[33], bool:g_conectado[33]
#define exp(%1) power(%1, 3)

public plugin_init()
{
    
register_plugin("Ejercicio opcional""1.0"";LuKks.-'")
    
    
RegisterHam(Ham_Killed"player""se_murio")
    
register_concmd("amx_nivel""concmd_nivel"ADMIN_RCON"<Nombre> <Nivel a establecer>")
    
register_clcmd("say /nivel""mi_info"), register_clcmd("say /lvl""mi_info")
    
register_clcmd("say /exp""mi_info"), register_clcmd("say /xp""mi_info")
}

public 
concmd_nivel(id)
{
    if(!
access(idADMIN_RCON)) return
    
    new 
nombre_[32], lvl[4], plnivel_read_argv(1nombre_charsmax(nombre_)), read_argv(2lvlcharsmax(lvl))
    
pl cmd_target(idnombre_CMDTARGET_NO_BOTS CMDTARGET_ALLOW_SELF); if(!pl) return
    
nivel_ str_to_num(lvl)
    
    if(
nivel_ 100 || nivel_ 2clamp(nivel_2100)
    
    
g_nivel[pl] = nivel_
    g_experiencia
[pl] = exp(g_nivel[pl]-1)
    
Lucas(pl)
    
client_print(idprint_chat"Le estableciste el nivel en %d a %s"nivel_g_nombre[pl])
}

public 
client_putinserver(id)
{
    
g_conectado[id] = true
    get_user_name
(idg_nombre[id], charsmax(g_nombre))
    
g_predeterminado[id] = g_nivel[id] = g_experiencia[id] = 1
    
    
if(access(idADMIN_LEVEL_A)) g_predeterminado[id] = 2
    
else if(access(idADMIN_RCON)) g_predeterminado[id] = 3
}

public 
client_disconnect(id)
{
    
g_conectado[id] = false
}

public 
se_murio(victimattacker)
{
    if(
g_conectado[attacker] && g_conectado[victim] && attacker != victim)
    {
        
client_print(victimprint_chat"El jugador %s te mato."g_nombre[attacker])
        
Lucas(attacker)
    }
}

public 
Lucas(id)
{
    static 
nombre_arma[20], armaexplvlconectadosconectados get_playersnum()
    
    if(
conectados 3)
    {
        
client_print(idprint_chat"Debe haber 4 personas jugando para aumentar de experiencia.")
        return
    }
    
    
arma get_user_weapon(id), get_weaponname(armanombre_armacharsmax(nombre_arma)), exp g_experiencia[id], lvl g_nivel[id]
    
    
g_experiencia[id] += g_predeterminado[id]
    
clamp(g_experiencia[id], 11000000)
    
    if(
g_experiencia[id] >= exp(g_nivel[id]))
    {
        
g_nivel[id]++
        
clamp(g_nivel[id], 1100)
        
client_print(idprint_chat"Simple mod creado por LuKks. %s"g_nivel[id] > lvl "Subiste de nivel." "Ya eres nivel cien.")
    }
    
    
client_print(idprint_center"Lo mataste con %s%s"nombre_arma[7], g_experiencia[id] > exp " y ganaste %d de exp" "y no ganaste exp")
}

public 
mi_info(idclient_print(idprint_chat"Vas por el nivel %d. Experiencia %d/%d. Te faltan %d de exp y subis al level %d"g_nivel[id], g_experiencia[id], exp(g_nivel[id]), exp(g_nivel[id]) - g_experiencia[id], g_nivel[id] + 1
Responder
#14
(25/02/2015, 05:32 PM)LuKks escribió: Ejercicio opcional, no lo probé, me falto usar get_players;

Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include hamsandwich

new g_nivel[33], g_experiencia[33], g_nombre[33][32], g_predeterminado[33], bool:g_conectado[33]
#define exp(%1) power(%1, 3)

public plugin_init()
{
    
register_plugin("Ejercicio opcional""1.0"";LuKks.-'")
    
    
RegisterHam(Ham_Killed"player""se_murio")
    
register_concmd("amx_nivel""concmd_nivel"ADMIN_RCON"<Nombre> <Nivel a establecer>")
    
register_clcmd("say /nivel""mi_info"), register_clcmd("say /lvl""mi_info")
    
register_clcmd("say /exp""mi_info"), register_clcmd("say /xp""mi_info")
}

public 
concmd_nivel(id)
{
    if(
access(idADMIN_RCON)) return
    
    new 
nombre_[32], lvl[4], plnivel_read_argv(1nombre_charsmax(nombre_)), read_argv(2lvlcharsmax(lvl))
    
pl cmd_target(idnombre_CMDTARGET_NO_BOTS CMDTARGET_ALLOW_SELF); if(!pl) return
    
nivel_ str_to_num(lvl)
    
    if(
nivel_ 100 && nivel_ 1)
    {
        
client_print(idprint_chat"Solo puedes establecer el nivel de 1 a 100.")
        return
    }
    
    
g_nivel[pl] = nivel_
    client_print
(idprint_chat"Le estableciste el nivel en %d a %s"nivel_g_nombre[pl])
}

public 
client_putinserver(id)
{
    
arrayset(g_conectado[id], truecharsmax(g_conectado))
    
get_user_name(idg_nombre[id], charsmax(g_nombre))
    
g_predeterminado[id] = g_nivel[id] = g_experiencia[id] = 1
    
    
if(access(idADMIN_LEVEL_A)) g_predeterminado[id] = 2
    
else if(access(idADMIN_RCON)) g_predeterminado[id] = 3
}

public 
client_disconnect(id)
{
    
arrayset(g_conectado[id], falsecharsmax(g_conectado))
}

public 
se_murio(victimattacker)
{
    if(
g_conectado[attacker] && g_conectado[victim] && attacker != victim)
        
Lucas(attackervictim)
}

public 
Lucas(idid2)
{
    static 
nombre_arma[20], armaexplvlconectadosconectados get_playersnum()
    
    
client_print(id2print_chat"El jugador %s te mato."g_nombre[id])
    
    if(
conectados 3)
    {
        
client_print(idprint_chat"Debe haber 4 personas jugando para aumentar de experiencia.")
        return
    }
    
    
arma get_user_weapon(id), get_weaponname(armanombre_armacharsmax(nombre_arma)), exp g_experiencia[id], lvl g_nivel[id]
    
    
g_experiencia[id] += g_predeterminado[id]
    
clamp(g_experiencia[id], 11000000)
    
    if(
g_experiencia[id] >= exp(g_nivel[id]))
    {
        
g_nivel[id]++
        
clamp(g_nivel[id], 1100)
        
client_print(idprint_chat"Simple mod creado por LuKks. %s"g_nivel[id] > lvl "Subiste de nivel." "Ya eres nivel cien.")
    }
    
    
client_print(idprint_center"Lo mataste con %s%s"nombre_arma[7], g_experiencia[id] > exp " y ganaste %d de exp" "y no ganaste exp")
}

public 
mi_info(idclient_print(idprint_chat"Vas por el nivel %d. Experiencia %d/%d. Te faltan %d de exp y subis al level %d"g_nivel[id], g_experiencia[id], exp(g_nivel[id]), exp(g_nivel[id]) - g_experiencia[id], g_nivel[id] + 1

Mmm, tiene algunas cosas mal, acá:
Código PHP:
    if(nivel_ 100 && nivel_ 1)
    {
        
client_print(idprint_chat"Solo puedes establecer el nivel de 1 a 100.")
        return
    } 

yo usaría clamp.

Después acá:
Código PHP:
arrayset(g_conectado[id], truecharsmax(g_conectado)) 

No tiene sentido, ya que es para setear todos, como dije en el tuto, puede servir por ejemplo para en el pre-inicio de la ronda setear que todos están vivos o que no tienen cierto item.

Después la forma de separar el código me jodió pero bueno así codeas vos así que no me puedo quejar xD

Por otro lado, bien que te interesaste en hacer el ejercicio, me gustaría que en los tutos empiecen a dejar ejercicios que uno pueda hacer para saber si realmente entendió el tema, y ayudar a ponerlo en practica para no olvidarlo.
Responder
#15
(25/02/2015, 06:55 PM)sasske escribió: Mmm, tiene algunas cosas mal, acá:
Código PHP:
    if(nivel_ 100 && nivel_ 1)
    {
        
client_print(idprint_chat"Solo puedes establecer el nivel de 1 a 100.")
        return
    } 

yo usaría clamp.

Después acá:
Código PHP:
arrayset(g_conectado[id], truecharsmax(g_conectado)) 

No tiene sentido, ya que es para setear todos, como dije en el tuto, puede servir por ejemplo para en el pre-inicio de la ronda setear que todos están vivos o que no tienen cierto item.

Después la forma de separar el código me jodió pero bueno así codeas vos así que no me puedo quejar xD

Por otro lado, bien que te interesaste en hacer el ejercicio, me gustaría que en los tutos empiecen a dejar ejercicios que uno pueda hacer para saber si realmente entendió el tema, y ayudar a ponerlo en practica para no olvidarlo.

Sobre el chequeo de max y min, tenes razon, jajaja, no se me ocurrio.

Lo del arrayset al parecer no lo entendi bien, interprete que era para cualquier variable tipo bool tambien.
Veo que es para variables bidimensionales/tridimensionales o algo parecido (g_var[33][32][6]).

Estoy probandolo y encontre otro errores, voy a ir editando. Cualquier cosa te aviso.
Responder
#16
(25/02/2015, 07:14 PM)LuKks escribió:
(25/02/2015, 06:55 PM)sasske escribió: Mmm, tiene algunas cosas mal, acá:
Código PHP:
    if(nivel_ 100 && nivel_ 1)
    {
        
client_print(idprint_chat"Solo puedes establecer el nivel de 1 a 100.")
        return
    } 

yo usaría clamp.

Después acá:
Código PHP:
arrayset(g_conectado[id], truecharsmax(g_conectado)) 

No tiene sentido, ya que es para setear todos, como dije en el tuto, puede servir por ejemplo para en el pre-inicio de la ronda setear que todos están vivos o que no tienen cierto item.

Después la forma de separar el código me jodió pero bueno así codeas vos así que no me puedo quejar xD

Por otro lado, bien que te interesaste en hacer el ejercicio, me gustaría que en los tutos empiecen a dejar ejercicios que uno pueda hacer para saber si realmente entendió el tema, y ayudar a ponerlo en practica para no olvidarlo.

Sobre el chequeo de max y min, tenes razon, jajaja, no se me ocurrio.

Lo del arrayset al parecer no lo entendi bien, interprete que era para cualquier variable tipo bool tambien.
Veo que es para variables bidimensionales/tridimensionales o algo parecido (g_var[33][32][6]).

Estoy probandolo y encontre otro errores, voy a ir editando. Cualquier cosa te aviso.

arrayset se usa para setear TODAS las celdas de un array a cierto valor, por ejemplo, para setear que todos están desconectados:

Código PHP:
arrayset(g_conectadofalsecharsmax(g_conectado)) 
Responder
#17
Estaria bueno que sigas agregando mas natives/funciones o como lo quieran llamar;
Código PHP:
// Ejemplo uno de potencia.
power(%12)

%
1 a la potencia de 2.
%2
Entonces 
--->
2 a la potencia de 2.

4

// Ejemplo dos de potencia.
power(%14)

%
1 a la potencia de 4.
%2
Entonces 
--->
2 a la potencia de 4.

16

// Ejemplo uno de set_task.
set_task(5.0"funcion"id// solo se ejecutara una vez dentro de 5 segundos.

// Ejemplo dos de set_task.
set_task(5.0"funcion"id__"a"10// se ejecutara 10 veces cada 5 segundos.

// Ejemplo tres de set_task.
set_task(5.0"funcion"id__"b"// Indefinidamente, se ejecutara cada 5 segundos. 


Estas tambien son buenas;
Código PHP:
formatex(g_szVariable[id], charsmax(g_szVariable), "www.amxmodx-es.com")
add(g_szListadocharsmax(g_szListado), g_szVariable[id])
replace_all(g_szSaycharsmax(g_szSay), "%""*"
Estaba poniendo natives/funciones pero seria mucho mas facil que cada uno lea el include necesario y ya.
En cada include hay muchas funciones/natives que esperan ser leidas.

Por cierto, ahi edite un poco el ejercicio opcional ya que encontre unas fallas por que me habia apurado en publicarlo, queria ser el primero, jaja.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)