01/04/2018, 05:09 PM
(Última modificación: 03/04/2018, 10:45 AM por JoNaThAnxD.)
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.
Comandos:
Código:
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[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90,
100, 120, 30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }
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(PLUGIN, VERSION, AUTHOR)
// Leemos el archivo
FileAE()
// Funcion para setear models de las armas del armamento epico
for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[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(id) reset_vars(id)
public fw_Item_Deploy(weapon_ent) {
if(!pev_valid(weapon_ent))
return HAM_IGNORED;
static id, weaponid
id = get_pdata_cbase(weapon_ent, 41, 4)
// 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(id, weaponid)
return HAM_IGNORED;
}
replace_weapon_models(id, weaponid)
{
// 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(armaxD, charsmax(armaxD), "models/EpicWeapons/%s.mdl", g_epic_model[g_arma_epic[id]])
// Seteamos model v_ del arma.
set_pev(id, pev_viewmodel2, armaxD)
// Si el model p_ del arma existe lo seteamos.
replace(armaxD, charsmax(armaxD), "v_", "p_")
if(file_exists(armaxD)) set_pev(id, pev_weaponmodel2, armaxD)
}
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_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(4, damage *= 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(id, 373, 5);
if (pev_valid(weapon_ent)) replace_weapon_models(id, cs_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(szDirFile, charsmax(szDirFile))
// Le damos formato a lo que sería el directorio del archivo a leer
format(szDirFile, charsmax(szDirFile), "%s/%s", szDirFile, AECONFIG_FILE)
// Si el archivo no existe...
if (!file_exists(szDirFile))
{
// Informamos que no se encontró y retornamos la función
new error[100]
formatex(error, charsmax(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(file, linedata, charsmax(linedata))
replace(linedata, charsmax(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(linedata, key, charsmax(key), value, charsmax(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 (file) fclose(file)
// BugFix de armas registradas.
iEpicWeapon++
// Si hay armas registradas...
if (iEpicWeapon)
{
// Precacheamos Models del Armamento Epico.
for(new i = 0; i < iEpicWeapon; i++)
{
// Le damos formato a lo que sería el directorio en donde estan los models de las armas
new prec_mdl[85]
formatex(prec_mdl, charsmax(prec_mdl), "models/EpicWeapons/%s.mdl", g_epic_model[i])
// Precacheamos model v_ del arma
engfunc(EngFunc_PrecacheModel, prec_mdl)
// Si el model p_ del arma existe lo precacheamos
replace(prec_mdl, charsmax(prec_mdl), "v_", "p_")
if(file_exists(prec_mdl)) engfunc(EngFunc_PrecacheModel, prec_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(id, page)
{
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 i = 0; i < iEpicWeapon; i++)
{
if (g_nivel[id] >= g_epic_nivel[i]) formatex(len, charsmax(len), "%s", g_epic_name[i])
else formatex(len, charsmax(len), "\d%s - (Nivel:\r %d\d)", g_epic_name[i], g_epic_nivel[i])
menu_additem(Menu_EpicWeapons, len, "", _, 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_EpicWeapons, MPROP_BACKNAME, "\yAtras")
menu_setprop(Menu_EpicWeapons, MPROP_NEXTNAME, "\ySiguiente")
}
// Le damos nombre al item para salir del menú.
menu_setprop(Menu_EpicWeapons, MPROP_EXITNAME, "\ySalir")
menu_display(id, Menu_EpicWeapons, page)
return PLUGIN_HANDLED
}
// Item seleccionado...
public Armamento_Epico_Cases(id, Menu_EpicWeapons, item)
{
// 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(id, 1)
// Le damos el arma elegida.
give_item(id, g_epic_weapon[item])
// Le damos cargadores...
ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weaponid], AMMOTYPE[weaponid], MAXBPAMMO[weaponid])
return PLUGIN_HANDLED
}
public AE_Callback(id, Menu_EpicWeapons, item)
{
if(g_nivel[id] < g_epic_nivel[item])
return ITEM_DISABLED;
return ITEM_ENABLED;
}
// Stocks
stock drop_weapons(id, dropwhat)
{
static weapons[32], num, i, weaponid
num = 0
get_user_weapons(id, weapons, num)
for (i = 0; i < num; i++)
{
weaponid = weapons[i]
if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
{
static wname[32], weapon_ent
get_weaponname(weaponid, wname, charsmax(wname))
weapon_ent = fm_find_ent_by_owner(-1, wname, id)
set_pev(weapon_ent, pev_iuser1, cs_get_user_bpammo(id, weaponid))
engclient_cmd(id, "drop", wname)
cs_set_user_bpammo(id, weaponid, 0)
}
}
}
stock fm_find_ent_by_owner(entity, const classname[], owner)
{
while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && pev(entity, pev_owner) != owner) { /* keep looping */ }
return entity;
}
stock chat_color(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, charsmax(msg), input, 3)
replace_all(msg, charsmax(msg), "!g", "^4")
replace_all(msg, charsmax(msg), "!n", "^1")
replace_all(msg, charsmax(msg), "!t", "^3")
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i])
write_string(msg)
message_end()
}
}
}
}