[INC] Load Resource
#1
[INC] Load Resource

Descripción:
- Te ayuda a cargar recursos como por ejemplo mp3, mdl, entre otros desde un archivo .ini o .txt
- Puedes usar un archivo como si fuera una matriz hecha con new const
- A diferencia de otros includes similares, este no necesita instalar ningún plugin adicional

Código load_resource.inc:
Código PHP:
/*********************************
  *** Load Resource By [N]drs ***/

#if defined _load_resource
    #endinput
#endif
#define _load_resource

#include <amxmisc>

enum _:eLoad
{
    
FIELD1[512],
    
FIELD2[512],
    
FIELD3[512],
    
FIELD4[512],
    
FIELD5[512]
}

/**
 * Obtiene solo un campo por linea de tu archivo
 *
 * @parámetro szFile    Nombre de nuestro archivo qie debe estar dentro de la carpeta /configs
 * @parámetro szKey     Identificador que estará en nuestro archivo
 * @parámetro arrData     Handler de array inicializado
 *
 * @return                 0 en caso de fallo, 1 en caso de éxito
 * @nota                En caso de éxito en el array se devolverá la información
**/
stock get_resource_one(const szFile[], const szKey[], &Array:arrData)
{
    if(
arrData == Invalid_Array)
        return 
0

    
new szRoute[100]
    
get_configsdir(szRoutecharsmax(szRoute))
    
format(szRoutecharsmax(szRoute), "%s/%s"szRouteszFile)

    new 
iFile fopen(szRoute"rt")

    if(!
iFile)
        return 
0

    
new szLine[512]
    new 
bool:bfound

    
while(!feof(iFile))
    {
        
fgets(iFileszLinecharsmax(szLine))
        
trim(szLine)

        if(!
szLine[0] || szLine[0] == ';' || (szLine[0] == '/' && szLine[1] == '/'))
            continue

        if(
szLine[0] == '[')
        {
            if(
bfound)
                break

            
replace_all(szLinecharsmax(szLine), "[""")
            
replace_all(szLinecharsmax(szLine), "]""")

            if(
equal(szLineszKey))
                
bfound true

            
continue
        }

        if(
bfound)
            
ArrayPushString(arrDataszLine)
    }

    
fclose(iFile)

    return 
1
}

/**
 * Obtiene hasta un maximo de 5 campos por linea de tu archivo
 *
 * @parámetro szFile    Nombre de nuestro archivo qie debe estar dentro de la carpeta /configs
 * @parámetro szKey     Identificador que estará en nuestro archivo
 * @parámetro arrData     Handler de array inicializado con eLoad
 * @parámetro iLen        Tamaño máximo de uno de los campos en tu archivo
 *
 * @return                 0 en caso de fallo, 1 en caso de éxito
 * @nota                En caso de éxito en el array se devolverá la información
**/
stock get_resource_more(const szFile[], const szKey[], &Array:arrDataiLen)
{
    if(
arrData == Invalid_Array)
        return 
0

    
new szRoute[100]
    
get_configsdir(szRoutecharsmax(szRoute))
    
format(szRoutecharsmax(szRoute), "%s/%s"szRouteszFile)

    new 
iFile fopen(szRoute"rt")

    if(!
iFile)
        return 
0

    
new szLine[512]
    new 
bool:bfound
    
new dt[eLoad]

    while(!
feof(iFile))
    {
        
fgets(iFileszLinecharsmax(szLine))
        
trim(szLine)

        if(!
szLine[0] || szLine[0] == ';' || (szLine[0] == '/' && szLine[1] == '/'))
            continue

        if(
szLine[0] == '[')
        {
            if(
bfound)
                break

            
replace_all(szLinecharsmax(szLine), "[""")
            
replace_all(szLinecharsmax(szLine), "]""")

            if(
equal(szLineszKey))
                
bfound true

            
continue
        }

        if(
bfound)
        {
            
parse(szLinedt[FIELD1], iLendt[FIELD2], iLendt[FIELD3], iLendt[FIELD4], iLendt[FIELD5], iLen)
            
ArrayPushArray(arrDatadt)
        }
    }

    
fclose(iFile)

    return 
1


Ejemplo de uso:
get_resource_one(const szFile[], const szKey[], &Array:arrData, iLen)

Sin comentarios:
- mi_archivo.ini
Cita:[MUSICAS]
sound/mi_carpeta/mi_archivo1.mp3
sound/mi_carpeta/mi_archivo2.mp3
sound/mi_carpeta/mi_archivo3.mp3

- musicas_random.sma
Código PHP:
#include <amxmodx>
#include <load_resource>

#define PLUGIN  "Ejemplo de uso del INC load_resource (get_resource_one)"
#define VERSION "1.0"
#define AUTHOR  "[N]drs"

#define MAX_SOUND_LEN 52

new const szFile[] = "mi_archivo.ini"
new const szKey[] = "MUSICAS"

new Array:arrSounds
new g_szSound[MAX_SOUND_LEN]

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_clcmd("say /play""random_play")
}

public 
plugin_precache()
{
    
arrSounds ArrayCreate(MAX_SOUND_LEN)

    if(!
get_resource_one(szFileszKeyarrSounds))
        
set_fail_state("Error, no se pudo cargar los sonidos")

    for(new 
iArraySize(arrSounds); i++)
    {
        
ArrayGetString(arrSoundsig_szSoundcharsmax(g_szSound))
        
precache_generic(g_szSound)
    }
}

public 
random_play(id)
{
    new 
iRandom random(ArraySize(arrSounds) - 1)

    
ArrayGetString(arrSoundsiRandomg_szSoundcharsmax(g_szSound))

    
client_cmd(0"Mp3 play %s"g_szSound)

    return 
PLUGIN_HANDLED

Con comentarios:
- mi_archivo.ini
Cita:[MUSICAS]
sound/mi_carpeta/mi_archivo1.mp3
sound/mi_carpeta/mi_archivo2.mp3
sound/mi_carpeta/mi_archivo3.mp3

- musicas_random.sma
Código PHP:
#include <amxmodx>

// Incluimos load_resource
#include <load_resource>

#define PLUGIN  "Ejemplo comentado del uso del INC load_resource (get_resource_one)"
#define VERSION "1.0"
#define AUTHOR  "Author"

// Esto es para definir, cuan largo será la ruta de nuestro sonido
#define MAX_SOUND_LEN 52

// Creamos la variable que alamcenará el nombre de nuestro archivo
new const szFile[] = "mi_archivo.ini"

// Creamos la variable que alamcenará el identificador que estará en nuestro archivo
new const szKey[] = "MUSICAS"

// Creamos el array en donde se guardarán todas nuestras rutas
new Array:arrSounds

// Creamos una variable que almacenará una sola ruta temporalmente
new g_szSound[MAX_SOUND_LEN]

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)

    
// Cuando el usuario escriba /play en el chat, se llamará a la función random_play
    
register_clcmd("say /play""random_play")
}

public 
plugin_precache()
{
    
// Inicializamos el Array
    // Importante, para usar este include, los arrays siempre deben ser inicializados en plugin_precache()
    
arrSounds ArrayCreate(MAX_SOUND_LEN)

    
/**
     * Obtiene solo un campo por linea de tu archivo
     *
     * @parámetro szFile    Nombre de nuestro archivo qie debe estar dentro de la carpeta /configs
     * @parámetro szKey     Identificador que estará en nuestro archivo
     * @parámetro arrData     Handler de array inicializado
     *
     * @return                 0 en caso de fallo, 1 en caso de éxito
     * @nota                En caso de éxito en el array se devolverá la información
    **/

    // Puesto que el stock retorna 1 o 0, lo colocaremos dentro de un if
    // si get_media_string() retorna 0, detendremos el plugin y mostramos un mensaje
    
if(!get_resource_one(szFileszKeyarrSounds))
        
set_fail_state("Error, no se pudo cargar los sonidos")

    
// Hacemos un bucle
    // Mientras nuestra variable i sea menor a la cantidad de datos en el array
    // Realizaremos algo y al terminar aumentamos el valor de la variable i en uno
    
for(new iArraySize(arrSounds); i++)
    {
        
// Obtendremos las rutas que estan en nuestro array de uno en uno
        
ArrayGetString(arrSoundsig_szSoundcharsmax(g_szSound))
        
// Precacheamos la ruta obtenida
        
precache_generic(g_szSound)
    }
}

// Cuando nuestra función sea llamada
public random_play(id)
{
    
// Creamos una variable entera con cualquier nombre, le puse iRandom
    // Usamos la función random() y como párametro le pondremos cantidad de datos en el array menos uno
    // en iRandom se alamcenará un número aleatorio
    
new iRandom random(ArraySize(arrSounds) - 1)

    
// Usaremos ese número random para obtener una ruta al azar y guardarla en nuestra variable g_szSound
    
ArrayGetString(arrSoundsiRandomg_szSoundcharsmax(g_szSound))

    
// Por último hacemos reproducir el sonido para todos los usuarios
    
client_cmd(0"Mp3 play %s"g_szSound)

    
// Esto es para que no se muestre lo que se escribio (o sea /play)
    
return PLUGIN_HANDLED


get_resource_more(const szFile[], const szKey[], &Array:arrData, iLen)

Sin comentarios:
- mi_archivo.ini
Cita:[MENU MUSICAS]
"musica1" "sound/mi_carpeta/mi_archivo1.mp3"
"musica2" "sound/mi_carpeta/mi_archivo2.mp3"
"musica3" "sound/mi_carpeta/mi_archivo3.mp3"

- menu_musicas.sma
Código PHP:
#include <amxmodx>
#include <load_resource>

#define PLUGIN  "Ejemplo de uso del INC load_resource (get_resource_more)"
#define VERSION "1.0"
#define AUTHOR  "[N]drs"

#define MAX_LEN_STRING 50

#define NAME FIELD1
#define RUTA FIELD2

new const szFile[] = "mi_archivo.ini"
new const szKey[] = "MENU MUSICAS"

new Array:arrArray
new szSound[eLoad]

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_clcmd("say /mp""menu_play")
}

public 
plugin_precache()
{
    
arrArray ArrayCreate(eLoad)

    
get_resource_more(szFileszKeyarrArrayMAX_LEN_STRING)

    for(new 
iArraySize(arrArray); i++)
    {
        
ArrayGetArray(arrArrayiszSound)
        
precache_generic(szSound[RUTA])
    }
}

public 
menu_play(id)
{
    new 
iMenu menu_create("Menu de Musicas""handler_menu")

    for(new 
iArraySize(arrArray); i++)
    {
        
ArrayGetArray(arrArrayiszSound)
        
menu_additem(iMenuszSound[NAME])
    }

    
menu_display(idiMenu)
}

public 
handler_menu(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED
    
}

    
ArrayGetArray(arrArrayitemszSound)
    
client_cmd(0"Mp3 play %s"szSound[RUTA])

    
menu_destroy(menu)

    return 
PLUGIN_HANDLED

Con comentarios:
- mi_archivo.ini
Cita:[MENU MUSICAS]
"musica1" "sound/mi_carpeta/mi_archivo1.mp3"
"musica2" "sound/mi_carpeta/mi_archivo2.mp3"
"musica3" "sound/mi_carpeta/mi_archivo3.mp3"

- menu_musicas.sma
Código PHP:
#include <amxmodx>

// Incluimos load_resource
#include <load_resource>

/* Esto ya está dentro del include, no se debe agregar en el plugin a crear, 
 * pero para el ejemplo hangan de cuenta que está aqui

enum _:eLoad
{
    FIELD1[512],
    FIELD2[512],
    FIELD3[512],
    FIELD4[512],
    FIELD5[512]
}
*/

#define PLUGIN  "Ejemplo comentado del uso del INC load_resource (get_resource_more)"
#define VERSION "1.0"
#define AUTHOR  "[N]drs"

// Esto es para definir, cuan largo será el mayor campo
#define MAX_LEN_STRING 50

// Esto es para que en vez de usar FIELD1, usemos nuestro propio identificador de campo
#define NAME FIELD1
#define RUTA FIELD2

// Creamos la variable que alamcenará el nombre de nuestro archivo
new const szFile[] = "mi_archivo.ini"

// Creamos la variable que alamcenará el identificador que estará en nuestro archivo
new const szKey[] = "MENU MUSICAS"

// Creamos una variable de tipo array
new Array:arrArray

// Creamos una variable que almacenará nuestros campos
new szSound[eLoad]

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)

    
// Cuando el usuario escriba /mp en el chat, se llamará a la función menu_play
    
register_clcmd("say /mp""menu_play")
}

public 
plugin_precache()
{
    
// Inicializamos el Array con eLoad
    // Importante, para usar este include, los arrays siempre deben ser inicializados en plugin_precache()
    
arrArray ArrayCreate(eLoad)

    
/**
     * Obtiene hasta un maximo de 5 campos por linea de tu archivo
     *
     * @parámetro szFile    Nombre de nuestro archivo qie debe estar dentro de la carpeta /configs
     * @parámetro szKey     Identificador que estará en nuestro archivo
     * @parámetro arrData     Handler de array inicializado con eLoad
     * @parámetro iLen        Tamaño máximo de uno de los campos en tu archivo
     *
     * @return                 0 en caso de fallo, 1 en caso de éxito
     * @nota                En caso de éxito en el array se devolverá la información
    **/

    // Puesto que el stock retorna 1 o 0, lo colocaremos dentro de un if
    // si get_media_string() retorna 0, detendremos el plugin y mostramos un mensaje
    
if(!get_resource_more(szFileszKeyarrArrayMAX_LEN_STRING))
        
set_fail_state("Error, no se pudo cargar los sonidos")

    
// Hacemos un bucle
    // Mientras nuestra variable i sea menor a la cantidad de datos en el array
    // Realizaremos algo y al terminar aumentamos el valor de la variable i en uno
    
for(new iArraySize(arrArray); i++)
    {
        
// Obtendremos los campos que estan en nuestro array
        
ArrayGetArray(arrArrayiszSound)
        
// Precacheamos el campo que contiene la ruta
        
precache_generic(szSound[RUTA])
    }
}

public 
menu_play(id)
{
    
// Creamos un menu
    
new iMenu menu_create("Menu de Musicas""handler_menu")

    
// Hacemos un bucle para agregar los nombre de nuestras musicas al menu
    // Mientras nuestra variable i sea menor a la cantidad de datos en el array
    // Realizaremos algo y al terminar aumentamos el valor de la variable i en uno
    
for(new iArraySize(arrArray); i++)
    {
        
// Obtendremos los campos que estan en nuestro array
        
ArrayGetArray(arrArrayiszSound)
        
// Agregamos al menu el nombre de nuestra musica mediante el campo correspondiente
        
menu_additem(iMenuszSound[NAME])
    }

    
// Mostramos el menu al usuario
    
menu_display(idiMenu)
}

public 
handler_menu(idmenuitem)
{
    if(
item == MENU_EXIT)
    {
        
// Si el usuai dio a la opcion de salir, cerramos el menu
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED
    
}

    
// Obtendremos los campos que estan en nuestro array según el item que eligió el usuario
    
ArrayGetArray(arrArrayitemszSound)
    
// Reproducimos la musica con la ruta que contiene el campo correspondiente
    
client_cmd(0"Mp3 play %s"szSound[RUTA])

    
// Cerramos el menu
    
menu_destroy(menu)

    return 
PLUGIN_HANDLED



Archivos adjuntos
.inc   load_resource.inc (Tamaño: 2.96 KB / Descargas: 5)
Responder
#2
https://forums.alliedmods.net/showthread...2?t=243202
[Imagen: bvpq9q-6.png]

NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Responder
#3
(07/01/2021, 03:07 PM)kikizon2 escribió: https://forums.alliedmods.net/showthread...2?t=243202

Son de cierta forma diferentes, sé de la existencia de ese include, pero para las cosas que yo quería hacer no me servia, por eso hice este include
desconozco si con Settings API (load/save data to INI files) se pueda usar un archivo como si fuera una matriz hecha con new const, mi include solo es para cargar recursos usando la lógica de matriz hecha con new const, aparte de que mi include tiene poco código y no se necesita instalar ningún plugin adicional xd
Está codeado de cero por si las dudas
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)