#include<sourcemod>
#include<sdktools>
#include<sdkhooks>
#include<csgo_colors>
#pragma semicolon 1
#pragma tabsize 0
#define TIME_READY 120 //Кол-во секунд до разрешения покупки
//Создаем массив названий, classname'ов и цен всех оружий (т.к. плагин для мода Hunger Games, я не стал добавлять сюда AWP, G3SG1 и SCAR-20, но вы можете добавить при желании)
new Time; //создаем глобальную переменную, отвечающую за время
new bool:IsReady = false; //Создаем bool переменную, отвечающую за готовность магазина к покупке.
new String:WeaponName[30][20] = {"Ak-47", "M4A1-S", "M4A4", "Famas", "Galil-AR", "SG-553", "Aug", "Scout", "Mac-10", "Mp9", "Mp7", "Ump45", "P90", "Bizon", "Nova", "XM1014", "MAG-7", "Sawed-Off", "Negev", "M249", "USP", "P2000", "Glock-18", "P250", "Tec9", "Deagle", "Dual Berettas", "Fiveseven", "Cz-75", "Revolver"};
new String:Weapon[30][40] = {"weapon_ak47", "weapon_m4a1_silencer", "weapon_m4a1", "weapon_famas", "weapon_galilar", "weapon_sg556", "weapon_aug", "weapon_ssg08", "weapon_mac10", "weapon_mp9", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_bizon", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_negev", "weapon_m249", "weapon_usp_silencer", "weapon_hkp2000", "weapon_glock", "weapon_p250", "weapon_tec9", "weapon_deagle", "weapon_elite", "weapon_fiveseven", "weapon_cz75a", "weapon_revolver"};
new Prise[30] = {10000, 11000, 10000, 8000, 8000, 9000, 9000, 16000, 5000, 5000, 6000, 8000, 8000, 7000, 6000, 8000, 7000, 6000, 14000, 14000, 6000, 4000, 4000, 4000, 6000, 7000, 6000, 8000, 7000, 7000};
public Plugin:myinfo =
{
name = "WarShop",
author = "GodlikE",
version = "1.1"
};
public OnPluginStart()
{
RegConsoleCmd("sm_warshop", WarShop);
RegConsoleCmd("sm_wshop", WarShop);
RegConsoleCmd("sm_war", WarShop);
HookEvent("round_start", round_start);
HookEvent("round_end", round_end);
}
public Action:round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
IsReady = false;
CreateTimer(1.0, Wait_Timer, TIMER_FLAG_NO_MAPCHANGE); //Создаем таймер, который вызывает сам себя, и отсчитываем по секундам время разрешения покупки в магазине
}
public Action:Wait_Timer(Handle:timer)
{
if(Time == TIME_READY)
{
if(!IsReady)
{
new flags;
for(new i = 1; i<=MaxClients; i++)
{
if(IsClientInGame(i) && IsPlayerAlive(i))
{
flags = GetUserFlagBits(i);
if((flags & ADMFLAG_ROOT) || (flags & ADMFLAG_CUSTOM5)) //проверяем флаги игрока (машазин доступен только випам и рут-админам). В данном плагине випка настроена на флаг CUSTOM5
{
CGOPrintToChat(i, "{LIGHTRED}[WarShop] {GREEN}Теперь вы можете использовать магазин!"); //Если вип или админ - оповещаем об "открытии" магазина
}
}
}
IsReady = true;
}
else IsReady = false;
}
else CreateTimer(1.0, Wait_Timer, TIMER_FLAG_NO_MAPCHANGE);
}
public Action:round_end(Handle:event, const String:name[], bool:dontBroadcast)
{
IsReady = true; //Ставим значение переменной Time = время_открытия-1, чтобы таймер не дублировался, когда раунд кончается до открытия магазина.
Time = TIME_READY-1; //Получится так, что таймер проработает еще одну итерацию и закроется, не выдав ничего в чат
}
public Action:WarShop(client, args)
{
if(IsClientInGame(client))
{
new flags = GetUserFlagBits(client);
if((client) && ((flags & ADMFLAG_CUSTOM5) || (flags & ADMFLAG_ROOT))) //Если у игрока есть випка или админка и магазин открыт, то создаем панель
{
if(IsReady)
{
WarMenu(client);
}
else CGOPrintToChat(client, "{LIGHTRED}[WarShop] {RED}Еще не время!");
}
}
}
public WarMenu(client) //Создаем главную панель
{
new Handle:panel = CreatePanel();
SetPanelTitle(panel, "War Shop\n \n");
DrawPanelItem(panel, "Купить\n");
DrawPanelItem(panel, "Выход");
SendPanelToClient(panel, client, Select_Main, 0);
CloseHandle(panel);
}
public Select_Main(Handle:mainmenu, MenuAction:action, client, option)
{
if (action == MenuAction_Select && IsClientInGame(client))
{
if(option == 1)
{
WarList(client); //Если тыкнули кнопку "Купить", то создаем меню
CloseHandle(mainmenu);
}
if(option == 2)
{
CloseHandle(mainmenu);
}
}
}
public WarList(client)
{
new Handle:menu = CreateMenu(Select_WarList); //Создаем меню, параметром функции является ответный блок
SetMenuTitle(menu, "War Shop\n");
for (new i = 0; i <= 29; i++) //Пробегаем в цикле по всем элементам наших массивов с оружиями
{
new String:buf[25], String:param[3];
Format(buf, 25, "%s [$%d]", WeaponName[i], Prise[i]); //Формируем строку типа "Название_оружия [цена_оружия]"
IntToString(i, param, 3);
AddMenuItem(menu, param, buf); //Создаем итем в меню, передаем в него индекс текущего оружия (индекс массива) и называем его нашей формированной строкой
}
DisplayMenu(menu, client, 0); //отправляем меню клиенту
}
public Select_WarList(Handle:menu, MenuAction:action, client, option)
{
if (action == MenuAction_End)
{
CloseHandle(menu); //Если нажата кнопка выхода, закрываем handle, чтобы не произошло утечки памяти
return;
}
if (action != MenuAction_Select) return;
new count, String:param[3];
GetMenuItem(menu, option, param, 30); //Получаем итем, на который тыкнули
count = StringToInt(param, 10); //Т.к. элемент (индекс нашего оружия), который передается вместе с итемом, является строкой, нужно перевести его в число
new cash = GetEntProp(client, Prop_Send, "m_iAccount"); //получаем количество денег игрока
if(cash >= Prise[count]) //Если у игрока достаточно денег, выдаем ему оружие по индексу массива
{
GivePlayerItem(client,Weapon[count]);
cash-=Prise[count]; // Отнимаем у игрока деньги
SetEntProp(client, Prop_Send, "m_iAccount", cash); //
new String:buf2[200];
Format(buf2, 200, "{LIGHTRED}[WarShop] {GREEN}Вы успешно купили оружие {LIGHTBLUE}%s{GREEN}!", WeaponName[count]);
CGOPrintToChat(client, buf2);
}
else
{
CGOPrintToChat(client, "{LIGHTRED}[WarShop] {RED}У вас недостаточно денег!");
}
}