08/10/2013, 01:13 PM
original:https://forums.alliedmods.net/showthread.php?t=201872
autor: guipatinador
traductor: roccoxx
Antes de empezar, este tutorial es para todo el mundo que no sabe cómo utilizar las Tries .Voy a suponer que usted sabe lo basico sobre pawn
Básicamente, las Tries permiten almacenar los datos asociados a una clave (string). Los datos por lo general son números enteros(integer) o un string.
Algunas consideraciones sobre este tutorial:
- No voy a hacer comparaciones entre tries y arrays (https://forums.alliedmods.net/showthread.php?t=88396) (esta en ingles)
- Todos los ejemplos son generalmente simples. Sólo voy a mostrar como usar las tries
Por lo tanto, para el primer ejemplo voy a demostrar cómo detectar si un jugador tiene un Steam ID en la lista negra(ban).
Para el segundo ejemplo, vamos a asociar un Steam ID con un integer, y comprobamos/chekiamos si el jugador es un MOD, ADMIN, o VIP.
Si entendemos esto, sabemos cómo trabajar con TrieCreate, TrieDestroy, TrieGetCell, TrieSetCell y TrieKeyExists .
Ahora vamos a trabajar con algunas natives más.
En el tercer ejemplo, vamos a utilizar los comandos de administrador para bloquear algunos nicks(nombres).
Para el TrieGetString y TrieSetString vamos a asociar algunas fechas VIP a los Steam IDs.
Y por último ... vamos a trabajar con TrieSetArray y TrieGetArray.
Este plugin lee las estadísticas de un archivo y lo guarda por Steam ID.
Eso es todo chicas.
*Nota: google traductor traducía cualquier chota o las cosas por la mitad (casi siempre) y bueno tuve que poner aun mas de voluntad para ver que quede bien y se entienda y traducir yo tmb .
me fui a dormir bye
autor: guipatinador
traductor: roccoxx
Antes de empezar, este tutorial es para todo el mundo que no sabe cómo utilizar las Tries .Voy a suponer que usted sabe lo basico sobre pawn
Básicamente, las Tries permiten almacenar los datos asociados a una clave (string). Los datos por lo general son números enteros(integer) o un string.
Algunas consideraciones sobre este tutorial:
- No voy a hacer comparaciones entre tries y arrays (https://forums.alliedmods.net/showthread.php?t=88396) (esta en ingles)
- Todos los ejemplos son generalmente simples. Sólo voy a mostrar como usar las tries
Por lo tanto, para el primer ejemplo voy a demostrar cómo detectar si un jugador tiene un Steam ID en la lista negra(ban).
Código PHP:
#include < amxmodx >
new Trie:g_tAuthIdBlackList // g significa global; t significa trie
public plugin_init( )
{
register_plugin( "trie example", "1.0.1", "guipatinador" )
g_tAuthIdBlackList = TrieCreate( ) // Creamos la trie...
TrieSetCell( g_tAuthIdBlackList, "STEAM_2:3:123456", 1 )
TrieSetCell( g_tAuthIdBlackList, "STEAM_2:3:654321", 1 )
TrieSetCell( g_tAuthIdBlackList, "STEAM_2:3:123654", 1 )
TrieSetCell( g_tAuthIdBlackList, "STEAM_2:3:456123", 1 )
// primer parametro = nombre de la trie
// segundo parametro = string con el Steam ID baneado (debe ser único)
// Tercer parametro = es un integer(numero entero), no lo vamos a usar
}
public plugin_end( )
{
TrieDestroy( g_tAuthIdBlackList ) // Destruimos la trie cuando cambiamos de map o se cae el sv :P
}
public client_putinserver( id )
{
new szAuthID[ 32 ]; get_user_authid( id, szAuthID, charsmax( szAuthID ) )
if( TrieKeyExists( g_tAuthIdBlackList, szAuthID ) )
{
// El Steam ID existe en la trie
server_cmd( "kick #%i ^"Tu Steam ID esta baneado^"", get_user_userid( id ) )
}
else
{
// El Steam ID no está en la trie
// No vamos a hacer nada porque el Steam ID no esta baneado
}
}
Para el segundo ejemplo, vamos a asociar un Steam ID con un integer, y comprobamos/chekiamos si el jugador es un MOD, ADMIN, o VIP.
Código PHP:
#include < amxmodx >
new Trie:g_tAuthIdOfPeople
#define LOGFILE "steamidsofpeople.log"
// Sólo para ser más fácil ...
#define ADMIN 1
#define MOD 2
#define VIP 3
public plugin_init( )
{
register_plugin( "trie example", "1.0.2", "guipatinador" )
g_tAuthIdOfPeople = TrieCreate( )
TrieSetCell( g_tAuthIdOfPeople, "STEAM_2:3:123456", ADMIN ) // admin es 1
TrieSetCell( g_tAuthIdOfPeople, "STEAM_2:3:654321", ADMIN )
TrieSetCell( g_tAuthIdOfPeople, "STEAM_2:3:123654", MOD ) // mod es 2
TrieSetCell( g_tAuthIdOfPeople, "STEAM_2:3:456123", VIP ) // vip es 3
}
public plugin_end( )
{
TrieDestroy( g_tAuthIdOfPeople )
}
public client_authorized( id )
{
new szAuthID[ 32 ]; get_user_authid( id, szAuthID, charsmax( szAuthID ) )
new iNum
// esto almacena nuestro integer (ADMIN, MOD or VIP) en iNum, si el Steam ID está en la trie
if( TrieGetCell( g_tAuthIdOfPeople, szAuthID, iNum ) )
{
switch( iNum )
{
case ADMIN:
log_to_file( LOGFILE, "Un Admin entro en el server" )
case MOD:
log_to_file( LOGFILE, "Un Mod entro en el server" )
case VIP:
log_to_file( LOGFILE, "Un Vip entro en el server" )
}
}
else // el Steam ID no esta en la trie
{
log_to_file( LOGFILE, "Un user normal entro en el server" )
}
}
Si entendemos esto, sabemos cómo trabajar con TrieCreate, TrieDestroy, TrieGetCell, TrieSetCell y TrieKeyExists .
Ahora vamos a trabajar con algunas natives más.
En el tercer ejemplo, vamos a utilizar los comandos de administrador para bloquear algunos nicks(nombres).
Código PHP:
#include < amxmodx >
#include < amxmisc >
new Trie:g_tNicks
#define ADMIN_FLAG ADMIN_RCON
public plugin_init( )
{
register_plugin( "trie example", "1.0.3", "guipatinador" )
register_concmd( "amx_blocknick", "BlockNickCmd", ADMIN_FLAG, "<nombre a bloquear >" )
register_concmd( "amx_unblocknick", "UnBlockNickCmd", ADMIN_FLAG, "<nombre a desbloquear>" )
register_concmd( "amx_removenicks", "RemoveNicksCmd", ADMIN_FLAG )
g_tNicks = TrieCreate( )
}
public plugin_end( )
{
TrieDestroy( g_tNicks )
}
public BlockNickCmd( id, level, cid )
{
if( !cmd_access( id, level, cid, 2 ) )
return PLUGIN_HANDLED
new szName[ 32 ]
read_argv( 1, szName, charsmax( szName ) )
// Primero vamos a comprobar si el nombre de usuario está en el trie
// Si está, no vamos a hacer nada
// Si no está, vamos a añadir el nick.
// Voy a mostrar dos métodos
// método uno
if( TrieKeyExists( g_tNicks, szName ) )
{
client_print( id, print_console, "el Nombre de usuario ya se agrego antes" )
}
else
{
TrieSetCell( g_tNicks, szName, 1 )
client_print( id, print_console, "el Nombre de usuario se agrego con exito" ) // :P
}
/*
// método dos
new iNum
new bool:bNameAlreadyAdded = TrieGetCell( g_tNicks, szName, iNum )
if( bNameAlreadyAdded )
{
client_print( id, print_console, "el Nombre de usuario ya se agrego antes" )
}
else
{
TrieSetCell( g_tNicks, szName, 1 )
client_print( id, print_console, "el Nombre de usuario se agrego con exito" )
}
*/
return PLUGIN_HANDLED
}
public UnBlockNickCmd( id, level, cid )
{
if( !cmd_access( id, level, cid, 2 ) )
return PLUGIN_HANDLED
new szName[ 32 ]
read_argv( 1, szName, charsmax( szName ) )
if( TrieDeleteKey( g_tNicks, szName ) )
{
client_print( id, print_console, "Nombre de usuario eliminado con exito" )
}
else
{
client_print( id, print_console, "el Nombre de usuario ya se elimino antes" )
}
/*
// Si queremos borrar el nombre de usuario sin mostrar los fuckings prints hacemos esto:
TrieDeleteKey( g_tNicks, szName )
*/
return PLUGIN_HANDLED
}
public RemoveNicksCmd( id, level, cid )
{
if( !cmd_access( id, level, cid, 1 ) )
return PLUGIN_HANDLED
TrieClear( g_tNicks ) // Ésto borra todos los nicks de la trie y los datos
client_print( id, print_console, "todos los nicks bloqueados fueron eliminados" )
return PLUGIN_HANDLED
}
public client_putinserver( id )
{
new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
if( TrieKeyExists( g_tNicks, szName ) )
{
server_cmd( "kick #%i ^"Tu nick esta bloqueado^"", get_user_userid( id ) )
}
/*
// Tenga en cuenta que esto también funciona
new iNum
if( TrieGetCell( g_tNicks, szName, iNum ) )
{
server_cmd( "kick #%i ^"Tu nick esta bloqueado^"", get_user_userid( id ) )
}
*/
}
Para el TrieGetString y TrieSetString vamos a asociar algunas fechas VIP a los Steam IDs.
Código PHP:
#include < amxmodx >
#include < amxmisc >
new Trie:g_tVipDate
new const VIPDATE[ ][ ][ ] = {
{ "STEAM_2:3:123456", "01-04-2013" },
{ "STEAM_2:3:654321", "25-02-2013" },
{ "STEAM_2:3:123654", "13-03-2013" },
{ "STEAM_2:3:456123", "09-01-2013" }
}
public plugin_init( )
{
register_plugin( "trie example", "1.0.4", "guipatinador" )
register_clcmd( "say /vipdate", "VipDate" )
g_tVipDate = TrieCreate( )
new i
for( i = 0; i < sizeof VIPDATE; i++ )
{
TrieSetString( g_tVipDate, VIPDATE[ i ][ 0 ], VIPDATE[ i ][ 1 ] )
// primer parametro = nombre de la trie
// segundo parametro = Steam ID
// Tercer parametro = fecha cuando el vip termina (string)
}
}
public plugin_end( )
{
TrieDestroy( g_tVipDate )
}
public VipDate( id )
{
new szAuthID[ 32 ]; get_user_authid( id, szAuthID, charsmax( szAuthID ) )
// Primero vamos a comprobar si el Steam ID del jugador está en la trie
new szVipDate[ 12 ]
if( TrieGetString( g_tVipDate, szAuthID, szVipDate, charsmax( szVipDate ) ) )
{
// El usuario es vip porque el Steam ID esta en la trie
client_print( id, print_chat, "Tu privilegio VIP vence el: %s", szVipDate )
}
else
{
// el pibe no es vip
client_print( id, print_chat, "Vos no sos VIP" )
}
}
Y por último ... vamos a trabajar con TrieSetArray y TrieGetArray.
Este plugin lee las estadísticas de un archivo y lo guarda por Steam ID.
Código PHP:
#include < amxmodx >
#include < amxmisc >
new Trie:g_StatsOfPlayers
new g_szAuthID[ 33 ][ 35 ] // Esto guarda el Steam ID of de cualquier jugador
enum _:Stats {
SteamID[ 32 ],
Kills,
Deaths,
KillsKnife,
KillsHE
}
//Estas son las estadísticas que deseamos guardar. Tengamos en cuenta que el Steam ID es un string, el resto son números enteros(integers)
public plugin_init( )
{
register_plugin( "trie example", "1.0.5", "guipatinador" )
register_clcmd( "say /mystats", "PrintStats" ) // Vamos a utilizar este comando para ver las estadísticas :P
g_StatsOfPlayers = TrieCreate( )
ReadStatsFromFile( ) // Lee las estadísticas del archivo cuando se inicia el sv o se cambia de map
}
public plugin_end( )
{
TrieDestroy( g_StatsOfPlayers )
}
public ReadStatsFromFile( )
{
new szFilePath[ 128 ]
get_configsdir( szFilePath, charsmax( szFilePath ) )
add( szFilePath, charsmax( szFilePath ), "/stats_of_players.ini" ) // Archivo donde se guardan las estadísticas
new f = fopen( szFilePath, "rt" )
if( !f )
{
new szMessage[ 256 ]
formatex( szMessage, charsmax( szMessage ), "No se puede abrir: %s", szFilePath )
set_fail_state( szMessage )
}
new szDataFromFile[ 128 ]
new Data[ Stats ]
new szKills[ 5 ]
new szDeaths[ 5 ]
new szKnife[ 5 ]
new szHE[ 5 ]
while( !feof( f ) ) // Abrimos el archivo
{
fgets( f, szDataFromFile, charsmax( szDataFromFile ) )
if( !szDataFromFile[ 0 ] || szDataFromFile[ 0 ] == ';' || szDataFromFile[ 0 ] == '/' && szDataFromFile[ 1 ] == '/' )
continue
trim( szDataFromFile )
parse( szDataFromFile,
Data[ SteamID ], charsmax( Data[ SteamID ] )
szKills, charsmax( szKills ),
szDeaths, charsmax( szDeaths ),
szKnife, charsmax( szKnife ),
szHE, charsmax( szHE ) )
// Todas esas cosas son strings. Las Vamos a convertir en integers
Data[ Kills ] = str_to_num( szKills )
Data[ Deaths ] = str_to_num( szDeaths )
Data[ KillsKnife ] = str_to_num( szKnife )
Data[ KillsHE ] = str_to_num( szHE )
// Esto guarda el Steam ID y las estadísticas en la trie
TrieSetArray( g_StatsOfPlayers, Data[ SteamID ], Data, sizeof Data )
// primer parametro = nombre de la trie
// segundo parametro = string ( en este caso el Steam ID)
// Tercer parametro = array que contiene las estadísticas
// Cuarto parametro = tamaño del array (usar que 'sizeof Data - 1' no funciona)
}
fclose( f ) // Cierra el archivo
}
public client_authorized( id )
{
get_user_authid( id, g_szAuthID[ id ], charsmax( g_szAuthID[ ] ) )
}
public PrintStats( id )
{
new Data[ Stats ]
if( TrieGetArray( g_StatsOfPlayers, g_szAuthID[ id ], Data, sizeof Data ) )
{
// Los parametros son iguales a TrieSetString
// primero = nombre del array
// segundo = g_szAuthID[ id ] contiene el Steam ID del jugador que tipea(escribe) /mystats
// tercero = array para recuperar los datos
// cuarto = tamaño
client_print( id, print_chat, "Steam ID: %s | Kills: %i | Deaths: %i | Knife: %i | HE: %i", Data[ SteamID ], Data[ Kills ], Data[ Deaths ], Data[ KillsKnife ], Data[ KillsHE ] )
}
// Si el ID de Steam no existe en el archivo:
else
{
client_print( id, print_chat, "Tu Steam ID no tiene estadisticas guardadas" )
}
}
Eso es todo chicas.
*Nota: google traductor traducía cualquier chota o las cosas por la mitad (casi siempre) y bueno tuve que poner aun mas de voluntad para ver que quede bien y se entienda y traducir yo tmb .
me fui a dormir bye