Код
/*===============================================================================
=
Идея: Jack Daniel`s | Полная Оптимизация кода: 17.04.2017
================================================================================
=*/
/*===============================================================================
=
Библиотеки
================================================================================
=*/
#pragma tabsize 0
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
/*===============================================================================
=
Данные о плагине
================================================================================
=*/
#define PLUGIN "ViP Menu"
#define VERSION "1.5"
#define AUTHOR "Jack Daniel`s"
/*===============================================================================
=
Константы/Массивы и остальное
================================================================================
=*/
native set_hg_auto_equip_status(id, new_status)
new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MEN
U_KEY_8|MENU_KEY_9|MENU_KEY_0
new bool:give_deagle[32], give_hpgrenade[32], total_rounds, can_usem[32], vip_menu_usage_count[33];
new g_icvars[8], g_ilcvars[8], g_iMaxPlayers;
/*===============================================================================
=
Загрузка кваров
================================================================================
=*/
public plugin_cfg()
{
new file[128]; get_localinfo("amxx_configsdir",file,63)
format(file, 127, "%s/vip_menu.cfg", file)
if(file_exists(file)) server_cmd("exec %s", file), server_exec()
}
/*===============================================================================
=
Гл. Функция
================================================================================
=*/
public plugin_init()
{
register_plugin(PLUGIN,VERSION,AUTHOR);
register_logevent("RoundStart", 2, "1=Round_Start");
register_event("TextMsg" , "event_restart", "a", "2=#Game_will_restart_in","2=#Game_Commencing");
RegisterHam(Ham_Spawn, "player", "player_Spawn_Post" , 1);
register_menu("Vip_Menu", keys, "Handle_Vip_Menu");
register_concmd("vipmenu", "OpenVipMenu");
register_logevent("vip_menu",2,"1=Round_Start")
register_clcmd( "vipmenu", "vip_menu" )
register_clcmd("say /vipmenu", "OpenVipMenu");
register_clcmd("say_team /vipmenu", "OpenVipMenu");
register_dictionary("vip_menu.txt");
//Квары
g_icvars[0] = register_cvar("vm_start_round","3") // Раунд с которого будет доступно вип меню
g_icvars[1] = register_cvar("vm_round_usage_limit","2") // Сколько раз за раунд можно использовать меню. Если 0, то неограниченное число раз
g_icvars[2] = register_cvar("vm_awp_start_round","4") // Номер раунда с которого будет доступно авп из вип меню
g_icvars[3] = register_cvar("vm_showscore_status","1") // Показывать или нет надпись VIP в таблице счета
g_icvars[4] = register_cvar("vm_connect_chat_announce","1") // Оповещать (1) или нет (0) всех сообщением в чате при коннекте вип игрока
g_icvars[5] = register_cvar("vm_connect_sound","1") // Проигрывать (1) или нет (0), звук при входе вип игрока на сервер
g_icvars[6] = register_cvar("vm_access_flags","t") // Флаги доступа игроков, которым будет доступно вип меню
g_icvars[7] = register_cvar("vm_give_money","5000")
//Отключение на картах
new sPref[][] = {"awp_", "aim_", "35hp_", "fy_"};
new map[32]; get_mapname(map, charsmax(map));
for(new i; i < sizeof sPref; i++)
{
if(containi(map, sPref[i]) != -1)
{
pause("ad");
return;
}
}
//Квары в массив..
g_ilcvars[0] = get_pcvar_num(g_icvars[0]);
g_ilcvars[1] = get_pcvar_num(g_icvars[1]);
g_ilcvars[2] = get_pcvar_num(g_icvars[2]);
g_ilcvars[3] = get_pcvar_num(g_icvars[3]);
g_ilcvars[4] = get_pcvar_num(g_icvars[4]);
g_ilcvars[5] = get_pcvar_num(g_icvars[5]);
cvar_to_flags(g_icvars[6], g_ilcvars[6]);
g_ilcvars[7] = get_pcvar_num(g_icvars[7]);
g_iMaxPlayers = get_maxplayers();
}
public plugin_precache()
{
if (g_ilcvars[5]) {
precache_sound("vip_menu/connect_vip.wav");
}
}
/*===============================================================================
=
Подключение игрока
================================================================================
=*/
public client_connect(id)
{
give_hpgrenade[id] = false
give_deagle[id] = false
set_hg_auto_equip_status(id, 0)
new name[32]
get_user_name(id, name, 31)
if (get_user_flags(id) & g_ilcvars[6]) {
if (g_ilcvars[4]) {
PrintInChat(0, "%L", LANG_PLAYER, "VM_CONNECT_CHAT_ANNOUNCE", name)
}
if(g_ilcvars[5]) {
emit_sound(0,CHAN_STATIC,"vip_menu/connect_vip.wav",1.0,ATTN_NORM,0,PITCH_NORM)
}
}
}
/*===============================================================================
=
Новый раунд
================================================================================
=*/
public RoundStart(){
total_rounds++
arrayset(vip_menu_usage_count, 0, charsmax(vip_menu_usage_count));
}
/*===============================================================================
=
Рестарт раунда или начало игры
================================================================================
=*/
public event_restart()
{
total_rounds = 0;
for(new id = 1; id <= g_iMaxPlayers; id++){
set_hg_auto_equip_status(id, 0)
}
arrayset(give_hpgrenade, false, charsmax(give_hpgrenade));
}
public player_Spawn_Post(id)
{
if (!is_user_alive(id) || !(get_user_flags(id) & g_ilcvars[6])) {
return;
}
can_usem[id] = 0;
if (total_rounds >= g_ilcvars[0]) {
give_vip_equip(id);
}
}
/*===============================================================================
=
Меню
================================================================================
=*/
public OpenVipMenu(id)
{
if(!is_user_alive(id)) {
PrintInChat(id, "%L", LANG_PLAYER, "VM_FOR_ALIVE_WARNING")
return PLUGIN_HANDLED;
}
if(!(get_user_flags(id) & g_ilcvars[6])) {
PrintInChat(id, "%L", LANG_PLAYER, "VM_NOT_ACCESS_WARNING")
return PLUGIN_HANDLED;
}
if(total_rounds < g_ilcvars[0]) {
PrintInChat(id, "%L", LANG_PLAYER, "VM_ROUND_LIMIT_WARNING", (g_ilcvars[0] == 2) ? "о" : "", g_ilcvars[0])
return PLUGIN_HANDLED;
}
if (g_ilcvars[1] && vip_menu_usage_count[id] >= g_ilcvars[1]) {
PrintInChat(id, "%L", LANG_PLAYER, "VM_MAX_USAGE_WARNING")
return PLUGIN_HANDLED;
}
new name[32]
get_user_name(id, name, 31)
static menu[650], iLen;
iLen = 0;
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "%L^n^n", LANG_PLAYER, "VM_TITLE_NAME", name);
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_ITEM_NAME1", g_ilcvars[7]);
keys |= MENU_KEY_1;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_ITEM_NAME2");
keys |= MENU_KEY_2;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_ITEM_NAME3");
keys |= MENU_KEY_3;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_ITEM_NAME4");
keys |= MENU_KEY_4;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_ITEM_NAME5");
keys |= MENU_KEY_5;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_ITEM_NAME6",give_hpgrenade[id]?"[\yВкл\w]":"[\yВыкл\w]");
keys |= MENU_KEY_6;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n^n", LANG_PLAYER, "VM_ITEM_NAME7",give_deagle[id]?"[\yВкл\w]":"[\yВыкл\w]");
keys |= MENU_KEY_7;
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L^n", LANG_PLAYER, "VM_EXIT");
keys |= MENU_KEY_0;
show_menu(id, keys, menu, -1, "Vip_Menu");
return PLUGIN_HANDLED;
}
public Handle_Vip_Menu(id, key)
{
switch(key)
{
case 0:
{
cs_set_user_money(id, cs_get_user_money(id) + g_ilcvars[7]);
vip_menu_usage_count[id]++
PrintInChat(id, "%L", LANG_PLAYER, "VM_MONEY", g_ilcvars[7])
}
case 1:
{
drop_user_weapons(id, 0)
give_item(id, "weapon_m4a1")
cs_set_user_bpammo(id, CSW_M4A1, 90);
vip_menu_usage_count[id]++
PrintInChat(id, "%L", LANG_PLAYER, "VM_M4A1")
}
case 2:
{
drop_user_weapons(id, 0)
give_item(id, "weapon_ak47")
cs_set_user_bpammo(id, CSW_AK47, 90);
vip_menu_usage_count[id]++
PrintInChat(id, "%L", LANG_PLAYER, "VM_AK47")
}
case 3:
{
if(total_rounds < g_ilcvars[2]){
PrintInChat(id, "%L", LANG_PLAYER, "VM_AWP_RESTRICT_MSG", g_ilcvars[2], total_rounds)
}else{
drop_user_weapons(id, 0)
give_item(id, "weapon_awp")
cs_set_user_bpammo(id, CSW_AWP, 30);
vip_menu_usage_count[id]++
PrintInChat(id, "%L", LANG_PLAYER, "VM_AWP")
}
}
case 4:
{
drop_user_weapons(id, 0)
give_item(id, "weapon_famas")
cs_set_user_bpammo(id, CSW_FAMAS, 90);
vip_menu_usage_count[id]++
PrintInChat(id, "%L", LANG_PLAYER, "VM_FAMAS")
}
case 5:
{
if(give_hpgrenade[id]){
give_hpgrenade[id] = false
set_hg_auto_equip_status(id, 0)
}else{
give_hpgrenade[id] = true
set_hg_auto_equip_status(id, 1)
}
OpenVipMenu(id)
PrintInChat(id, "%L", LANG_PLAYER, "VM_AUTO_GIVE_HPGRENADE", give_hpgrenade[id]?"!tвключена!":"!tвыключена!")
}
case 6:
{
if(give_deagle[id]){
give_deagle[id] = false
}else{
give_deagle[id] = true
}
OpenVipMenu(id)
PrintInChat(id, "%L", LANG_PLAYER, "VM_AUTO_GIVE_DEAGLE", give_deagle[id]?"!tвключена!":"!tвыключена!")
}
}
return PLUGIN_HANDLED;
}
/*===============================================================================
=
Стоки и Остальное
================================================================================
=*/
give_vip_equip(id)
{
give_item(id,"weapon_flashbang")
give_item(id,"weapon_flashbang")
give_item(id,"weapon_hegrenade")
give_item(id,"weapon_smokegrenade");
give_item(id, "item_assaultsuit");
if(give_deagle[id]){
drop_user_weapons(id, 1)
give_item(id, "weapon_deagle");
cs_set_user_bpammo(id, CSW_DEAGLE, 35);
}
}
stock drop_user_weapons(index, iType)
{
new iWeaponsId[32], iNum;
get_user_weapons(index, iWeaponsId, iNum);
if(iType) iType = (1<<CSW_GLOCK18|1<<CSW_USP|1<<CSW_P228|1<<CSW_DEAGLE|1<<CSW_ELITE|1<<CSW_FIVESEVEN);
else iType = (1<<CSW_M3|1<<CSW_XM1014|1<<CSW_MAC10|1<<CSW_TMP|1<<CSW_MP5NAVY|1<<CSW_UMP45|1<<CSW_P90|1<<CSW_GALIL|1<<CSW_FAMAS|1<<CSW_AK47|1<<CSW_M4A1|1<<CSW_SCOUT|1<<CSW_SG552|1<<CSW_AUG|1<<CSW_AWP|1<<CSW_G3SG1|1<<CSW_SG550|1<<CSW_M249);
for(new i; i < iNum; i++)
{
if(iType & (1<<iWeaponsId[i]))
{
new szWeaponName[24];
get_weaponname(iWeaponsId[i], szWeaponName, charsmax(szWeaponName));
engclient_cmd(index, "drop", szWeaponName);
}
}
}
stock cvar_to_flags(cvar_ptr, &var)
{
new cvar_value[32];
get_pcvar_string(cvar_ptr, cvar_value, charsmax(cvar_value));
var = read_flags(cvar_value);
if (var == 0) {
var = ADMIN_USER;
}
}
stock PrintInChat(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4") // Green Color
replace_all(msg, 190, "!n", "^1") // Default Color
replace_all(msg, 190, "!t", "^3") // Team Color
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();
}
}
}
}