[Menu de armas por niveles con models usando archivo externo (.ini)]
#1
Sonrisa 
Hola gente de AM bueno aquí les dejo un pequeño aporte se trata de un menú de armas por niveles que hice ya hace tiempo para un mod zp pero sirve para cualquier mod con niveles solo es de cambiar la variable g_nivel por la variable de nivel que tengas en tu mod el cual pueden modificar desde un archivo externo (.ini) cambiando así distintos valores como el nivel requerido de las armas, el model de dicha arma, daño del arma multiplicado por, el nombre, etc. Gran sonrisa

Comandos:
Código:
say /armas - Para abrir menú de armas

Código:
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <fun>

#define PLUGIN "Armamento Epico"
#define VERSION "1.1"
#define AUTHOR "JoNaThAnxD"
#define TAG "!g[A-E]!n"


// Variables, Arrays y Constantes del Armamento Epico.
new const AECONFIG_FILE[] = "epic_weapons.ini" // Archivo donde leeremos las armas.
new Menu_EpicWeapons // Índice del menú.
new iEpicWeapon // Cantidad de armas registradas.
const MAX_ARMAS 65 // Limite de armas que se pueden agregar al menu.
new g_epic_name[MAX_ARMAS][32// Nombre de arma.
new g_epic_weapon[MAX_ARMAS][32// weapon_*
new g_epic_nivel[MAX_ARMAS// Nivel de arma.
new Float:g_epic_damage[MAX_ARMAS// Daño de arma multiplicado por...
new g_epic_model[MAX_ARMAS][32// v_ p_ model.
new g_hasepic[33// Check si el jugador tiene un arma del Armamento Epico.
new g_arma_epic[33// Arma elegida.
new g_currentweapon[33// weapon del jugador.
new g_nivel[33// Variable de nivel que tengas en tu mod.

const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
const 
SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)

new const 
MAXBPAMMO[] = { -152, -1901321100901120100100909090,
100120301202003290120902359090, -1100 }

new const 
AMMOTYPE[][] = { """357sig""""762nato""""buckshot""""45acp""556nato""""9mm""57mm""45acp",
            
"556nato""556nato""556nato""45acp""9mm""338magnum""9mm""556natobox""buckshot",
            
"556nato""9mm""762nato""""50ae""556nato""762nato""""57mm" }

new const 
WEAPONENTNAMES[][] = { """weapon_p228""""weapon_scout""weapon_hegrenade""weapon_xm1014""weapon_c4""weapon_mac10",
            
"weapon_aug""weapon_smokegrenade""weapon_elite""weapon_fiveseven""weapon_ump45""weapon_sg550",
            
"weapon_galil""weapon_famas""weapon_usp""weapon_glock18""weapon_awp""weapon_mp5navy""weapon_m249",
            
"weapon_m3""weapon_m4a1""weapon_tmp""weapon_g3sg1""weapon_flashbang""weapon_deagle""weapon_sg552",
            
"weapon_ak47""weapon_knife""weapon_p90" }

public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
// Leemos el archivo
    
FileAE()
    
    
// Funcion para setear models de las armas del armamento epico
    
for (new 1sizeof WEAPONENTNAMESi++) 
        if (
WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_DeployWEAPONENTNAMES[i], "fw_Item_Deploy"1)
    
    
// Registramos algunos Hams
    
RegisterHam(Ham_TakeDamage"player""fw_TakeDamage")
    
RegisterHam(Ham_Spawn"player""fw_PlayerSpawn_Post"1)

    
// Comando para abrir el menú
    
register_clcmd("say /armas""Clcmd_Weapons")
}
public 
client_putinserver(idreset_vars(id)
public 
fw_Item_Deploy(weapon_ent) {
    if(!
pev_valid(weapon_ent)) 
        return 
HAM_IGNORED;
        
    static 
idweaponid
    
    id 
get_pdata_cbase(weapon_ent414)

    
// Obtenemos el índice del arma elegida.
    
weaponid cs_get_weapon_id(weapon_ent)
    
g_currentweapon[id] = weaponid
    
    
// Si no esta conectado o no tiene un arma del Armamento Epico...
    
if(!is_user_connected(id) || !g_hasepic[id]) 
        return 
HAM_IGNORED;
    
    
// Remplazamos models de armas
    
replace_weapon_models(idweaponid)
    return 
HAM_IGNORED;
}
replace_weapon_models(idweaponid)
{
    
// Si hay armas registradas y tiene un arma del Armamento Epico Seteamos models.
    
if (iEpicWeapon && g_hasepic[id] && weaponid == get_weaponid(g_epic_weapon[g_arma_epic[id]]))
    {
        
// Le damos formato a lo que sería el directorio en donde estan los models de las armas.
        
new armaxD[85]
        
formatex(armaxDcharsmax(armaxD), "models/EpicWeapons/%s.mdl"g_epic_model[g_arma_epic[id]])
        
        
// Seteamos model v_ del arma.
        
set_pev(idpev_viewmodel2armaxD)
        
        
// Si el model p_ del arma existe lo seteamos.
        
replace(armaxDcharsmax(armaxD), "v_""p_")
        if(
file_exists(armaxD)) set_pev(idpev_weaponmodel2armaxD)
    }
}
public 
fw_TakeDamage(victiminflictorattackerFloat:damagedamage_type
{
    if (
victim == attacker || !is_user_connected(attacker) || is_user_bot(attacker))
        return 
HAM_IGNORED;
        
    
// Si hay armas registradas y tiene un arma del Armamento Epico damos daño de el arma.
    
if (iEpicWeapon && g_hasepic[attacker])
    {
        static 
weaponid
        weaponid 
g_currentweapon[attacker]
        if(
weaponid == get_weaponid(g_epic_weapon[g_arma_epic[attacker]])) 
            
SetHamParamFloat(4damage *= g_epic_damage[g_arma_epic[attacker]])
    }
    return 
HAM_IGNORED;
}
public 
fw_PlayerSpawn_Post(id)
{
    
// No esta vivo o no tiene team
    
if (!is_user_alive(id) || !cs_get_user_team(id))
        return;
    
    
// Reset player vars
    
reset_vars(id)
    
    static 
weapon_ent
    weapon_ent 
get_pdata_cbase(id3735);
    if (
pev_valid(weapon_ent)) replace_weapon_models(idcs_get_weapon_id(weapon_ent))
}
reset_vars(id)
{
    
g_arma_epic[id] = -1
    g_hasepic
[id] = false
}
FileAE()
{
    
// Creamos un array para saber la direccion del archivo a leer
    
new szDirFile[64]
    
// Obtenemos el directorio de las configuraciones (Por defecto: addons/amxmodx/configs/)
    
get_configsdir(szDirFilecharsmax(szDirFile))
    
    
// Le damos formato a lo que sería el directorio del archivo a leer
    
format(szDirFilecharsmax(szDirFile), "%s/%s"szDirFileAECONFIG_FILE)
    
    
// Si el archivo no existe...
    
if (!file_exists(szDirFile))
    {
        
// Informamos que no se encontró y retornamos la función
        
new error[100]
        
formatex(errorcharsmax(error), "Error: Archivo %s No Encontrado!"szDirFile)
        
set_fail_state(error)
        return;
    }
    
    new 
linedata[1024], key[64], value[960]
    
    
// Abrimos el archivo para leer texto
    // 'r' - Read (Leer)
    // 't' - Text (Texto)
    
new file fopen(szDirFile"rt")
    
    
iEpicWeapon = -1;
    
    while (
file && !feof(file))
    {
        
// Obtenemos el texto de la línea
        
fgets(filelinedatacharsmax(linedata))
        
        
replace(linedatacharsmax(linedata), "^n""")
        
        
// Si no hay texto a leer o el texto empieza con ; (Punto y coma),
        // continuamos al paso en el bucle. En este caso, en la siguiente línea del archivo.
        
if (!linedata[0] || linedata[0] == ';') continue;
    
        
// Si el texto empieza con [...
        
if (linedata[0] == '[')
        {
            
// Incrementamos el valor de esta variable para saber
            // la cantidad de armas registradas.
            
iEpicWeapon++
            continue;
        }
        
        
strtok(linedatakeycharsmax(key), valuecharsmax(value), '=')
        
        
trim(key)
        
trim(value)
        
        if (
equal(key"EPIC_NAME"))
            
copy(g_epic_name[iEpicWeapon], charsmax(g_epic_name[]), value)
        else if (
equal(key"EPIC_WEAPON"))
            
copy(g_epic_weapon[iEpicWeapon], charsmax(g_epic_weapon[]), value)
        else if (
equal(key"EPIC_NIVEL"))
            
g_epic_nivel[iEpicWeapon] = str_to_num(value)
        else if (
equal(key"EPIC_DAMAGE"))
            
g_epic_damage[iEpicWeapon] = str_to_float(value)
        else if (
equal(key"EPIC_MODEL"))
            
copy(g_epic_model[iEpicWeapon], charsmax(g_epic_model[]), value)
    }
    if (
filefclose(file)
    
    
// BugFix de armas registradas.
    
iEpicWeapon++
    
    
// Si hay armas registradas... 
    
if (iEpicWeapon)
    {
        
// Precacheamos Models del Armamento Epico.
        
for(new 0iEpicWeaponi++)
        {
            
// Le damos formato a lo que sería el directorio en donde estan los models de las armas
            
new prec_mdl[85]
            
formatex(prec_mdlcharsmax(prec_mdl), "models/EpicWeapons/%s.mdl"g_epic_model[i])
            
            
// Precacheamos model v_ del arma
            
engfunc(EngFunc_PrecacheModelprec_mdl)
            
            
// Si el model p_ del arma existe lo precacheamos
            
replace(prec_mdlcharsmax(prec_mdl), "v_""p_")
            if(
file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModelprec_mdl)
        }
    }
}
// Check para abrir el menu
can_buy_ae(id)
{
    
// Si el usuario está muerto o no hay armas registradas...
    
if(!is_user_alive(id))
    {
        
chat_color(id "%s Debes estar vivo para elegir las !gArmas."TAG)
        return 
PLUGIN_HANDLED
    
}
    if(!
iEpicWeapon)
    {
        
chat_color(id "%s No hay armas en el !gArmamento Epico."TAG)
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_CONTINUE
}
// Comando ingresado...
public Clcmd_Weapons(id)
{
    
// Check para abrir el menu
    
if (can_buy_ae(id))
        return 
PLUGIN_HANDLED;
        
    
// Le mostramos el menú.
    
Menu_Armamento_Epico(id,  0)
    
    
// Para que no muestre que el usuario ingresó el comando...
    
return PLUGIN_HANDLED
}
// Menu del Armamento Epico
public Menu_Armamento_Epico(idpage)
{
    new 
len[250]
    
    
// Check para abrir el menu
    
if (can_buy_ae(id))
        return 
PLUGIN_HANDLED;
        
    
// Registramos el menú.
    
Menu_EpicWeapons menu_create("\r[ amxmodx-es.com ]\y Armamento Epico^n\d[Estas son las armas epicas del juego]""Armamento_Epico_Cases")
    
    
// Get weapon's name and nivel
    
for(new 0iEpicWeaponi++)
    {
        if (
g_nivel[id] >= g_epic_nivel[i]) formatex(lencharsmax(len), "%s"g_epic_name[i])
        else 
formatex(lencharsmax(len), "\d%s - (Nivel:\r %d\d)"g_epic_name[i], g_epic_nivel[i])
        
menu_additem(Menu_EpicWeaponslen""_menu_makecallback("AE_Callback"))
    }
            
    
// Si tenemos más de 7 armas registradas...
    
if(iEpicWeapon 7)
    {
        
// Le damos nombre a los items para avanzar/retroceder de página.
        
menu_setprop(Menu_EpicWeaponsMPROP_BACKNAME"\yAtras")
        
menu_setprop(Menu_EpicWeaponsMPROP_NEXTNAME"\ySiguiente")
    }
    
    
// Le damos nombre al item para salir del menú.
    
menu_setprop(Menu_EpicWeaponsMPROP_EXITNAME"\ySalir")
    
menu_display(idMenu_EpicWeaponspage)
    
    return 
PLUGIN_HANDLED
}
// Item seleccionado...
public Armamento_Epico_Cases(idMenu_EpicWeaponsitem)
{
    
// Si el usuario ha elegido salir del menú...
    
if(item == MENU_EXIT)
    {
        
// Terminamos la función
        
menu_destroy(Menu_EpicWeapons)
        return 
PLUGIN_HANDLED
    
}
    
    
// Check para abrir el menu
    
if (can_buy_ae(id))
        return 
PLUGIN_HANDLED;
    
    
/*
    // Solo si el item de las armas por nivel no esta en ITEM_DISABLED
    new page , armas_2
    player_menu_info(id , Menu_EpicWeapons , armas_2 , page)
    
    // Si el nivel del usuario es menor que el nivel del arma...
    if(g_nivel[id] < g_epic_nivel[item])
    {    
        // Le mostramos un mensaje diciendo el nivel que necesita para el arma.
        client_print(id, print_center, "Minimo Nivel: %d", g_epic_nivel[item])
        
        // le abrimos el menu en la pagina que estaba.
        Menu_Armamento_Epico(id, page)
        return PLUGIN_HANDLED
    }*/

    // Damos valor a algunas variables
    
g_hasepic[id] = true
    g_arma_epic
[id] = item
    
    
// Get weapon's id
    
static weaponid
    weaponid 
get_weaponid(g_epic_weapon[item])
    
    
// Drop previous weapons
    
drop_weapons(id1)
    
    
// Le damos el arma elegida.
    
give_item(idg_epic_weapon[item])
    
    
// Le damos cargadores...
    
ExecuteHamB(Ham_GiveAmmoidMAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
    
    return 
PLUGIN_HANDLED
}
public 
AE_Callback(idMenu_EpicWeaponsitem
{
    if(
g_nivel[id] < g_epic_nivel[item])
        return 
ITEM_DISABLED;
    
    return 
ITEM_ENABLED;
}
// Stocks
stock drop_weapons(iddropwhat)
{
    static 
weapons[32], numiweaponid
    num 

    get_user_weapons
(idweaponsnum)
    
    for (
0numi++)
    {
        
weaponid weapons[i]
        
        if ((
dropwhat == && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
        {
            static 
wname[32], weapon_ent
            get_weaponname
(weaponidwnamecharsmax(wname))
            
weapon_ent fm_find_ent_by_owner(-1wnameid)
            
            
set_pev(weapon_entpev_iuser1cs_get_user_bpammo(idweaponid))
            
            
engclient_cmd(id"drop"wname)
            
cs_set_user_bpammo(idweaponid0)
        }
    }
}
stock fm_find_ent_by_owner(entity, const classname[], owner)
{
    while ((
entity engfunc(EngFunc_FindEntityByStringentity"classname"classname)) && pev(entitypev_owner) != owner) { /* keep looping */ }
    return 
entity;
}
stock chat_color(const id, const input[], any:...)
{
    new 
count 1players[32]
    
    static 
msg[191]
    
    
vformat(msgcharsmax(msg), input3)
    
    
replace_all(msgcharsmax(msg), "!g""^4")
    
replace_all(msgcharsmax(msg), "!n""^1")
    
replace_all(msgcharsmax(msg), "!t""^3")
    
    if (
idplayers[0] = id; else get_players(playerscount"ch")
    {
        for (new 
0counti++)
        {
            if (
is_user_connected(players[i]))
            {
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i])
                
write_byte(players[i])
                
write_string(msg)
                
message_end()
            }
        }
    }



Archivos adjuntos
.rar   EpicWeapons.rar (Tamaño: 1.08 MB / Descargas: 38)
.sma   Descargar AMXX / epic_weapons_menu.sma (Tamaño: 12.5 KB / Descargas: 137)
.ini   epic_weapons.ini (Tamaño: 291 bytes / Descargas: 44)
Responder
#2
Utiliza Ham_Item_Deploy y no cur weapon

gracias por el aporte
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016, 05:05 PM)meTaLiCroSS escribió: Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019, 05:32 PM)meTaLiCroSS escribió: grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
Responder
#3
(01/04/2018, 05:56 PM)totopizza escribió: Utiliza Ham_Item_Deploy y no cur weapon

gracias por el aporte

Buena idea solo que como dije lo hice hace tiempo y esta me pareció una forma rápida de setear models, ahora lo edito para que sea con Ham_Item_Deploy Guiño

Listo plugin actualizado, remplazo de models con Ham_Item_Deploy Gran sonrisa
Responder
#4
Muy buen aporte me, viene de 10 =D, sigue asi

Saludos HK-416.
“Quien te quiere en su vida, volverá a buscarte”
Qué frase más estúpida
Porque quien te quiere en su vida, jamás se iría.
Responder
#5
(02/04/2018, 08:46 PM)HK-416 escribió: Muy buen aporte me, viene de 10 =D, sigue asi

Saludos HK-416.

Gracias bro Rainbow Gran sonrisa
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)