#define USE_REAPI 1
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#if USE_REAPI
#include <reapi>
#else
#include <hamsandwich>
#include <cstrike>
#include <fun>
#endif
#define PLUGIN_NAME "FB-SG Bomba Sorumlusu"
#define PLUGIN_VER "1.0.5"
#define PLUGIN_AUTH "fernpasha"
//#define ADMIN_FLAG ADMIN_RESERVATION
#define ADMIN_FORCE ADMIN_CVAR
#define CHAT_TAG "^4[Evlad-i Osmanli]^1"
#define NVAULT_NAME "fbsg_ayar"
#define NVAULT_PREFIX "fbsg"
new g_iMaxPlayers;
new g_iSorumlu;
new bool:g_bSorumluAktif;
new g_szMap[32];
new g_hVault;
new g_szSavedTAuth[35];
new g_szSavedCTAuth[35];
new g_iSavedSG;
new g_iSavedFB;
new g_szDraftTAuth[35];
new g_szDraftCTAuth[35];
new g_iDraftSG;
new g_iDraftFB;
#if !defined client_print_color
enum { print_team_default = 0 };
stock client_print_color(const id, const dummy, const fmt[], any:...)
{
static msg[191];
vformat(msg, charsmax(msg), fmt, 4);
static g_msgSayText;
if (!g_msgSayText) g_msgSayText = get_user_msgid("SayText");
if (id > 0 && is_user_connected(id))
{
message_begin(MSG_ONE, g_msgSayText, _, id);
write_byte(id);
write_string(msg);
message_end();
}
else
{
new i, maxp = get_maxplayers();
for (i = 1; i <= maxp; i++)
{
if (!is_user_connected(i)) continue;
message_begin(MSG_ONE, g_msgSayText, _, i);
write_byte(i);
write_string(msg);
message_end();
}
}
}
#endif
stock cprint(const id, const fmt[], any:...)
{
static msg[191];
vformat(msg, charsmax(msg), fmt, 3);
static out[191];
formatex(out, charsmax(out), "%s %s", CHAT_TAG, msg);
static g_msgSayText;
if (!g_msgSayText) g_msgSayText = get_user_msgid("SayText");
if (id > 0 && is_user_connected(id))
{
message_begin(MSG_ONE, g_msgSayText, _, id);
write_byte(id);
write_string(out);
message_end();
}
else
{
new i, maxp = get_maxplayers();
for (i = 1; i <= maxp; i++)
{
if (!is_user_connected(i)) continue;
message_begin(MSG_ONE, g_msgSayText, _, i);
write_byte(i);
write_string(out);
message_end();
}
}
}
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VER, PLUGIN_AUTH);
g_iMaxPlayers = get_maxplayers();
get_mapname(g_szMap, charsmax(g_szMap));
register_clcmd("say /fbsg", "cmd_fbsg");
register_clcmd("say_team /fbsg", "cmd_fbsg");
register_clcmd("say /fbsg0", "cmd_fbsg0");
register_clcmd("say_team /fbsg0", "cmd_fbsg0");
register_event("HLTV", "evt_round_start", "a", "1=0", "2=0");
register_event("ResetHUD", "evt_spawned", "be");
g_hVault = nvault_open(NVAULT_NAME);
g_iSorumlu = 0;
g_bSorumluAktif = false;
nv_ayar_yukle();
kopyala_kayitli_to_draft();
}
public plugin_end()
{
if (g_hVault != INVALID_HANDLE)
nvault_close(g_hVault);
}
stock nv_key(const keyName[], dest[], const len)
{
formatex(dest, len, "%s|%s|%s", NVAULT_PREFIX, g_szMap, keyName);
}
stock nv_ayar_yukle()
{
new key[64], val[64];
nv_key("SG", key, charsmax(key));
if (nvault_get(g_hVault, key, val, charsmax(val)))
g_iSavedSG = clamp(str_to_num(val), 0, 1);
else
g_iSavedSG = 0;
nv_key("FB", key, charsmax(key));
if (nvault_get(g_hVault, key, val, charsmax(val)))
g_iSavedFB = clamp(str_to_num(val), 0, 2);
else
g_iSavedFB = 0;
nv_key("T_AUTH", key, charsmax(key));
if (!nvault_get(g_hVault, key, g_szSavedTAuth, charsmax(g_szSavedTAuth)))
g_szSavedTAuth[0] = '^0';
nv_key("CT_AUTH", key, charsmax(key));
if (!nvault_get(g_hVault, key, g_szSavedCTAuth, charsmax(g_szSavedCTAuth)))
g_szSavedCTAuth[0] = '^0';
}
stock nv_ayar_kaydet()
{
new key[64], val[64];
nv_key("SG", key, charsmax(key));
num_to_str(g_iSavedSG, val, charsmax(val));
nvault_set(g_hVault, key, val);
nv_key("FB", key, charsmax(key));
num_to_str(g_iSavedFB, val, charsmax(val));
nvault_set(g_hVault, key, val);
nv_key("T_AUTH", key, charsmax(key));
nvault_set(g_hVault, key, g_szSavedTAuth);
nv_key("CT_AUTH", key, charsmax(key));
nvault_set(g_hVault, key, g_szSavedCTAuth);
}
stock kopyala_kayitli_to_draft()
{
copy(g_szDraftTAuth, charsmax(g_szDraftTAuth), g_szSavedTAuth);
copy(g_szDraftCTAuth, charsmax(g_szDraftCTAuth), g_szSavedCTAuth);
g_iDraftSG = g_iSavedSG;
g_iDraftFB = g_iSavedFB;
}
stock draft_sifirla()
{
g_szDraftTAuth[0] = '^0';
g_szDraftCTAuth[0] = '^0';
g_iDraftSG = 0;
g_iDraftFB = 0;
}
stock oyuncu_authid_al(const id, szAuth[], const len)
{
if (!is_user_connected(id))
{
szAuth[0] = '^0';
return 0;
}
get_user_authid(id, szAuth, len);
return 1;
}
stock oyuncu_id_by_auth(const szAuth[])
{
if (!szAuth[0]) return 0;
new auth[35];
for (new i = 1; i <= g_iMaxPlayers; i++)
{
if (!is_user_connected(i)) continue;
get_user_authid(i, auth, charsmax(auth));
if (equal(auth, szAuth))
return i;
}
return 0;
}
stock takim_ismini_al(const id, szTeam[], const len)
{
#if USE_REAPI
new TeamName:t = get_member(id, m_iTeam);
switch (t)
{
case TEAM_TERRORIST: copy(szTeam, len, "T");
case TEAM_CT: copy(szTeam, len, "CT");
default: copy(szTeam, len, "SPEC");
}
#else
new CsTeams:t = cs_get_user_team(id);
switch (t)
{
case CS_TEAM_T: copy(szTeam, len, "T");
case CS_TEAM_CT: copy(szTeam, len, "CT");
default: copy(szTeam, len, "SPEC");
}
#endif
}
public cmd_fbsg(const id)
{
/*if (!(get_user_flags(id) & ADMIN_FLAG))
{
cprint(id, "^1Bu komutu kullanmak icin yetkin yok.");
return PLUGIN_HANDLED;
}*/
if (g_bSorumluAktif && is_user_connected(g_iSorumlu))
{
if (g_iSorumlu == id)
{
cprint(id, "^1Zaten bomba sorumlususun. Menu aciliyor...");
menuyu_ac(id);
}
else
{
cprint(id, "^1Bomba sorumlusu zaten var (^3#%d^1).", g_iSorumlu);
}
return PLUGIN_HANDLED;
}
g_iSorumlu = id;
g_bSorumluAktif = true;
kopyala_kayitli_to_draft();
new team[8]; takim_ismini_al(id, team, charsmax(team));
cprint(0, "^3%N ^1bomba sorumlusu oldu. (^3Team: %s^1)", id, team);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
public cmd_fbsg0(const id)
{
if (!(get_user_flags(id) & ADMIN_FORCE))
{
cprint(id, "^1Bu komutu kullanmak icin %s gerekiyor.", ADMIN_FORCE);
return PLUGIN_HANDLED;
}
if (!g_bSorumluAktif || !is_user_connected(g_iSorumlu))
{
cprint(id, "^1Aktif bomba sorumlusu yok.");
return PLUGIN_HANDLED;
}
cprint(0, "^3%N ^1mevcut bomba sorumlusunu (^3%N^1) gorevden aldi.", id, g_iSorumlu);
sorumlulugu_birak_internal(true);
return PLUGIN_HANDLED;
}
public evt_round_start()
{
if (g_bSorumluAktif && is_user_connected(g_iSorumlu))
{
cprint(g_iSorumlu, "^1Yeni raund basladi. Ayarlari kontrol etmen icin menu aciliyor.");
menuyu_ac(g_iSorumlu);
}
}
public evt_spawned(const id) {}
stock auth_to_name(const szAuth[], outName[], const outLen)
{
outName[0] = '^0';
if (!szAuth[0]) return 0;
new id = oyuncu_id_by_auth(szAuth);
if (id && is_user_connected(id))
{
get_user_name(id, outName, outLen);
return 1;
}
return 0;
}
stock menuyu_ac(const id)
{
if (!is_user_connected(id)) return;
if (id != g_iSorumlu || !g_bSorumluAktif) return;
new selT[32] = "Secilmedi";
new selCT[32] = "Secilmedi";
if (g_szDraftTAuth[0]) auth_to_name(g_szDraftTAuth, selT, charsmax(selT));
if (g_szDraftCTAuth[0]) auth_to_name(g_szDraftCTAuth, selCT, charsmax(selCT));
new title[64];
formatex(title, charsmax(title), "Bomba Sorumlusu Menusu");
new menu = menu_create(title, "menu_handler");
new line[96];
formatex(line, charsmax(line), "\rAyarlari kaydet");
menu_additem(menu, line, "1");
formatex(line, charsmax(line), "\yT Takimindan oyuncu sec: \r%s", selT);
menu_additem(menu, line, "2");
formatex(line, charsmax(line), "\yCT Takimindan oyuncu sec: \r%s", selCT);
menu_additem(menu, line, "3");
formatex(line, charsmax(line), "\ySG sayisi sec: \r%d", g_iDraftSG);
menu_additem(menu, line, "4");
formatex(line, charsmax(line), "\yFB sayisi sec: \r%d", g_iDraftFB);
menu_additem(menu, line, "5");
formatex(line, charsmax(line), "\yAyarlari sifirla");
menu_additem(menu, line, "6");
formatex(line, charsmax(line), "\ySorumlulugu birak");
menu_additem(menu, line, "7");
formatex(line, charsmax(line), "\rCikis");
menu_additem(menu, line, "8");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
menu_display(id, menu);
}
public menu_handler(const id, const menu, const item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new info[3], name[64], access, callback;
menu_item_getinfo(menu, item, access, info, charsmax(info), name, charsmax(name), callback);
new key = str_to_num(info);
switch (key)
{
case 1:
{
ayarlari_kaydet_ve_uygula();
cprint(id, "^1Ayarlar kaydedildi ve uygulandi.");
}
case 2:
{
menu_destroy(menu);
oyuncu_menu_ac(id, 1);
return PLUGIN_HANDLED;
}
case 3:
{
menu_destroy(menu);
oyuncu_menu_ac(id, 2);
return PLUGIN_HANDLED;
}
case 4:
{
menu_destroy(menu);
sg_menu_ac(id);
return PLUGIN_HANDLED;
}
case 5:
{
menu_destroy(menu);
fb_menu_ac(id);
return PLUGIN_HANDLED;
}
case 6:
{
draft_sifirla();
cprint(id, "^1Taslak ayarlar sifirlandi.");
menuyu_ac(id);
}
case 7:
{
menu_destroy(menu);
sorumlulugu_birak_internal(false);
return PLUGIN_HANDLED;
}
case 8:
{
cprint(id, "^1Menuden cikis yaptin.");
}
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
stock oyuncu_menu_ac(const id, const teamPick)
{
if (!is_user_connected(id)) return;
new title[64];
if (teamPick == 1) formatex(title, charsmax(title), "T Takimindan oyuncu sec");
else formatex(title, charsmax(title), "CT Takimindan oyuncu sec");
new menu = menu_create(title, "oyuncu_menu_handler");
new players[32], pnum, pid;
if (teamPick == 1)
get_players(players, pnum, "e", "TERRORIST");
else
get_players(players, pnum, "e", "CT");
new line[96], szAuth[35], info[40];
for (new i = 0; i < pnum; i++)
{
pid = players[i];
if (!is_user_connected(pid)) continue;
get_user_authid(pid, szAuth, charsmax(szAuth));
new pname[32]; get_user_name(pid, pname, charsmax(pname));
formatex(line, charsmax(line), "%s", pname);
if (teamPick == 1)
formatex(info, charsmax(info), "T %s", szAuth);
else
formatex(info, charsmax(info), "CT %s", szAuth);
menu_additem(menu, line, info);
}
if (pnum == 0)
menu_additem(menu, "\dSu anda uygun oyuncu yok", "N 0");
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu);
}
public oyuncu_menu_handler(const id, const menu, const item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
new info[40], name[64], access, callback;
menu_item_getinfo(menu, item, access, info, charsmax(info), name, charsmax(name), callback);
if (info[0] == 'N')
{
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
new tokenTeam[4], tokenAuth[35];
parse(info, tokenTeam, charsmax(tokenTeam), tokenAuth, charsmax(tokenAuth));
new secilenIsim[32] = "-";
new pid = oyuncu_id_by_auth(tokenAuth);
if (pid) get_user_name(pid, secilenIsim, charsmax(secilenIsim));
if (tokenTeam[0] == 'T')
{
copy(g_szDraftTAuth, charsmax(g_szDraftTAuth), tokenAuth);
cprint(id, "^1T icin secilen: ^3%s", secilenIsim);
}
else
{
copy(g_szDraftCTAuth, charsmax(g_szDraftCTAuth), tokenAuth);
cprint(id, "^1CT icin secilen: ^3%s", secilenIsim);
}
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
stock sg_menu_ac(const id)
{
new menu = menu_create("SG sayisi sec (0-1)", "sg_menu_handler");
menu_additem(menu, "0", "0");
menu_additem(menu, "1", "1");
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu);
}
public sg_menu_handler(const id, const menu, const item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
new info[4], n[32], access, callback;
menu_item_getinfo(menu, item, access, info, charsmax(info), n, charsmax(n), callback);
g_iDraftSG = clamp(str_to_num(info), 0, 1);
cprint(id, "^1SG sayisi taslak: ^3%d", g_iDraftSG);
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
stock fb_menu_ac(const id)
{
new menu = menu_create("FB sayisi sec (0-2)", "fb_menu_handler");
menu_additem(menu, "0", "0");
menu_additem(menu, "1", "1");
menu_additem(menu, "2", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu);
}
public fb_menu_handler(const id, const menu, const item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
new info[4], n[32], access, callback;
menu_item_getinfo(menu, item, access, info, charsmax(info), n, charsmax(n), callback);
g_iDraftFB = clamp(str_to_num(info), 0, 2);
cprint(id, "^1FB sayisi taslak: ^3%d", g_iDraftFB);
menu_destroy(menu);
menuyu_ac(id);
return PLUGIN_HANDLED;
}
stock ayarlari_kaydet_ve_uygula()
{
copy(g_szSavedTAuth, charsmax(g_szSavedTAuth), g_szDraftTAuth);
copy(g_szSavedCTAuth, charsmax(g_szSavedCTAuth), g_szDraftCTAuth);
g_iSavedSG = g_iDraftSG;
g_iSavedFB = g_iDraftFB;
nv_ayar_kaydet();
bombalari_uygula_kayitli();
new nameT[32] = "-", nameCT[32] = "-";
new idT = oyuncu_id_by_auth(g_szSavedTAuth);
new idC = oyuncu_id_by_auth(g_szSavedCTAuth);
if (idT) get_user_name(idT, nameT, charsmax(nameT));
if (idC) get_user_name(idC, nameCT, charsmax(nameCT));
cprint(0, "^1Ayarlar kaydedildi: ^3T=%s CT=%s SG=%d FB=%d", nameT, nameCT, g_iSavedSG, g_iSavedFB);
}
stock sorumlulugu_birak_internal(const bool:forced)
{
if (g_bSorumluAktif && is_user_connected(g_iSorumlu))
{
if (forced) cprint(g_iSorumlu, "^1Yonetici tarafindan gorevden alindin.");
else cprint(g_iSorumlu, "^1Sorumlulugu biraktin.");
}
g_iSorumlu = 0;
g_bSorumluAktif = false;
kopyala_kayitli_to_draft();
}
stock bombalari_uygula_kayitli()
{
if (g_szSavedTAuth[0])
{
new tid = oyuncu_id_by_auth(g_szSavedTAuth);
if (tid) oyn_grenade_set_exact(tid, g_iSavedSG, g_iSavedFB);
}
if (g_szSavedCTAuth[0])
{
new cid = oyuncu_id_by_auth(g_szSavedCTAuth);
if (cid) oyn_grenade_set_exact(cid, g_iSavedSG, g_iSavedFB);
}
}
stock oyn_grenade_set_exact(const id, const sgCount, const fbCount)
{
if (!is_user_connected(id)) return;
new sg = clamp(sgCount, 0, 1);
new fb = clamp(fbCount, 0, 2);
#if USE_REAPI
if (sg > 0) rg_give_item(id, "weapon_smokegrenade");
rg_set_user_bpammo(id, WeaponIdType:CSW_SMOKEGRENADE, _:sg);
if (fb > 0) rg_give_item(id, "weapon_flashbang");
rg_set_user_bpammo(id, WeaponIdType:CSW_FLASHBANG, _:fb);
#else
if (sg > 0 && !user_has_weapon(id, CSW_SMOKEGRENADE))
give_item(id, "weapon_smokegrenade");
cs_set_user_bpammo(id, CSW_SMOKEGRENADE, sg);
if (fb > 0 && !user_has_weapon(id, CSW_FLASHBANG))
give_item(id, "weapon_flashbang");
cs_set_user_bpammo(id, CSW_FLASHBANG, fb);
#endif
cprint(id, "^1SG=%d, FB=%d ayarlandi.", sg, fb);
}
public client_disconnected(id)
{
if (g_bSorumluAktif && id == g_iSorumlu)
{
cprint(0, "^3%N ^1sunucudan ayrildi. Bomba sorumlulugu bosaldi.", id);
sorumlulugu_birak_internal(false);
}
}