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(MiArray, charsmax(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(id, ADMIN_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], 0, g_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?
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_DEAGLE, name, charsmax(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(PLUGIN, VERSION, AUTHOR) 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(weapon, name, charsmax(name))
client_print(id, print_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(players, count, "ae", "CT")
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(PLUGIN, VERSION, AUTHOR) register_clcmd("say /comando", "Comando") }
public Comando(id) { if(g_UltimaEjecucion+20.0>get_gametime()) return PLUGIN_CONTINUE
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...
16/02/2015, 09:30 PM (Última modificación: 16/02/2015, 09:30 PM por sasske.)
(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
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
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
(17/02/2015, 12:15 AM)roccoxx escribió: aparte no son funciones sino natives.
+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.
17/02/2015, 12:22 AM (Última modificación: 17/02/2015, 12:22 AM por roccoxx.)
(17/02/2015, 12:19 AM)Treki escribió:
(17/02/2015, 12:15 AM)roccoxx escribió: aparte no son funciones sino natives.
+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.
17/02/2015, 12:31 AM (Última modificación: 17/02/2015, 12:33 AM por sasske.)
(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.
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
PD: Si realmente creen que esto es inutil o que confundirá a los usuarios (o los hará perder su tiempo leyendo) pueden borrarlo.
g_nivel[pl] = nivel_ g_experiencia[pl] = exp(g_nivel[pl]-1) Lucas(pl) client_print(id, print_chat, "Le estableciste el nivel en %d a %s", nivel_, g_nombre[pl]) }
if(g_experiencia[id] >= exp(g_nivel[id])) { g_nivel[id]++ clamp(g_nivel[id], 1, 100) client_print(id, print_chat, "Simple mod creado por LuKks. %s", g_nivel[id] > lvl ? "Subiste de nivel." : "Ya eres nivel cien.") }
client_print(id, print_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(id) client_print(id, print_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)
if(g_experiencia[id] >= exp(g_nivel[id])) { g_nivel[id]++ clamp(g_nivel[id], 1, 100) client_print(id, print_chat, "Simple mod creado por LuKks. %s", g_nivel[id] > lvl ? "Subiste de nivel." : "Ya eres nivel cien.") }
client_print(id, print_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(id) client_print(id, print_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(id, print_chat, "Solo puedes establecer el nivel de 1 a 100.") return }
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.
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.
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:
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.