#include #include #include #include #include #include #define VERSION "1.0" /* Settings */ #define PLUG_NATIVES // Закоментировать чтобы отключить регистрацию нативов (для интеграции в другие плагины) #define NATIVES_CHECK_CONNECT // Закоментировать чтобы отключить проверку is_user_connected в нативах #define LIFE_COST 25 // Стоимость жизни #define LIFE_SELL 5 // Стоимость продажи жизни #define LIFE_LIMIT 20 // Лимит жизней #define LIFE_LIMIT_SAVE 50 // Лимит сохранения жизней #define LIFE_LIMIT_USE 5 // Лимит использования жизней за карту *(обнулие происходит без участия плагина)* #define TRANSFER_COMMISSION_ENABLE // Закоментировать чтобы отключить комиссию при переводе жизней #define TRANSFER_COMMISSION 25 // Процент комиссии который уходит в черную дыру :D #define get_money(%1) zp_get_user_ammo_packs(%1) // Натив возвращает количество денег игрока #define set_money(%1,%2) zp_set_user_ammo_packs(%1,%2) // Натив устанавливает количество денег игроку #define PREFIX "[ZP]" // Префикс к сообщениям #define VAULT_FILE "Life_Save" // Имя .vault файла /* Settings */ /* Don't edit */ new gVault, g_Life[33], gSteamID[32], vKey[64], vData[64] //nVault new SelectedPlayerID[33], SelectedPlayerName[33][128], SelectedPlayerNum[33] //Transfer new Life_Used[33] = 0 /* Don't edit */ public plugin_init() { register_plugin("[ZP] Life System", VERSION, "Bos93 / Felix_Font") register_event("DeathMsg", "EV_DeathMsg", "a") RegisterHam(Ham_Killed,"player","Player_Killed") register_clcmd("life_menu", "Life_Shop") register_clcmd("life_system", "Life_Shop") register_clcmd("say /life", "Life_Shop") register_clcmd("transfer_life", "TransferMenu") register_clcmd("donate_life", "TransferMenu") register_clcmd("say /transfer_life", "TransferMenu") register_clcmd("say /donate_life", "TransferMenu") register_clcmd("TransferMenu_ChangeMode", "TransferMenu_Change") } public client_connect(id) { TransferMenu_Reset(id) load_client_Life(id) } public client_disconnect(id) { //TransferMenu_Reset(id) save_client_Life(id) } public EV_DeathMsg() if(is_user_connected(read_data(2))) Life_Shop(read_data(2)) public Player_Killed(victim, attacker, corpse) { if(!is_user_connected(attacker) || zp_get_user_zombie(attacker) || attacker == victim) return HAM_IGNORED; g_Life[attacker] += 1 return HAM_IGNORED; } #if defined PLUG_NATIVES public plugin_natives() { register_native("zp_get_user_lifes", "return_lifes") register_native("zp_set_user_lifes", "set_lifes") } public return_lifes(id) { #if defined NATIVES_CHECK_CONNECT if(!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "%s Invalid player id (%d)", PREFIX, id) return -1; } #endif return g_Life[id]; } public set_lifes(id, num) { #if defined NATIVES_CHECK_CONNECT if(!is_user_connected(id)) { log_error(AMX_ERR_NATIVE, "%s Invalid player id (%d)", PREFIX, id) return false; } #endif g_Life[id] = num; #if defined NATIVES_CHECK_CONNECT return true; #endif } #endif public Life_Shop(id) { new szText[512 char]; formatex(szText, charsmax(szText), "\yВаши паки\w: \r%d\y ^nВаши жизни\w: \r%d", get_money(id), g_Life[id]); new menu = menu_create(szText, "Life_handler"); formatex(szText, charsmax(szText), "Купить жизнь (\y-\r%d\y аммо)", LIFE_COST); menu_additem(menu, szText, "1"); formatex(szText, charsmax(szText), "Продать жизнь (\y+\r%d\y аммо)", LIFE_SELL); menu_additem(menu, szText, "2"); formatex(szText, charsmax(szText), "Использовать жизнь (\y-\r1\w \yжизнь)"); menu_additem(menu, szText, "3"); formatex(szText, charsmax(szText), "Перевод жизней \r(NEW)"); menu_additem(menu, szText, "4"); menu_setprop(menu, MPROP_EXITNAME, "Выход") menu_display(id, menu, 0) return PLUGIN_HANDLED; } public Life_handler(id , menu , item) { if (item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) new i_Key = str_to_num(s_Data) new money = get_money(id) switch(i_Key) { case 1: { if (money < LIFE_COST) { ColorChat(id, GREY, "^4%s ^3У вас недостаточно ^4аммо паков.", PREFIX) return PLUGIN_HANDLED } if (g_Life[id] >= LIFE_LIMIT) { ColorChat(id, GREY, "^4%s ^3У вас достигнут ^4лимит.", PREFIX) return PLUGIN_HANDLED } ColorChat(id, GREY, "^4%s ^3Вы купили ^4жизнь.", PREFIX) g_Life[id] += 1 set_money(id, money - LIFE_COST) Life_Shop(id) } case 2: { if(g_Life[id] == 0) { ColorChat(id, GREY, "^4%s ^3У вас нет ^4жизней.", PREFIX) return PLUGIN_HANDLED } ColorChat(id, GREY, "^4%s ^3Вы продали ^4жизнь.", PREFIX) g_Life[id] -= 1 set_money(id, money + LIFE_SELL) Life_Shop(id) } case 3: { if(is_user_alive(id)) { ColorChat(id, GREY, "^4%s ^3Вы должны быть ^4мертвы.", PREFIX) return PLUGIN_HANDLED } if(g_Life[id] == 0) { ColorChat(id, GREY, "^4%s ^3У вас нет ^4жизней.", PREFIX) return PLUGIN_HANDLED } if(Life_Used[id] >= LIFE_LIMIT_USE) { ColorChat(id, GREY, "^4%s ^3Превышен ^4лимит^3 использования возрождений.", PREFIX) return PLUGIN_HANDLED } g_Life[id] -= 1 Life_Used[id] += 1 ColorChat(id, GREY, "^4%s ^3Вы использовали ^4возрождение.", PREFIX) ExecuteHam(Ham_CS_RoundRespawn, id) } case 4: TransferMenu(id) } menu_destroy(menu) return PLUGIN_HANDLED } public TransferMenu(id) { if(!is_user_connected(id)) return PLUGIN_HANDLED; new szText[512 char]; formatex(szText, charsmax(szText), "\wМеню перевода ^n\yВыбранный игрок: \r%s ^n\yКоличество жизней: \r%d" ,SelectedPlayerName[id], SelectedPlayerNum[id]); new menu = menu_create(szText, "TransferMenu_handler"); formatex(szText, charsmax(szText), "\yВыбрать игрока"); menu_additem(menu, szText, "1"); formatex(szText, charsmax(szText), "\yСменить количество жизней"); menu_additem(menu, szText, "2"); menu_addblank(menu, 0) if(SelectedPlayerNum[id] > g_Life[id] || equal(SelectedPlayerName[id], "Не выбран")) { formatex(szText, charsmax(szText), "\d3. Выполнить перевод"); menu_addtext(menu, szText); } else { formatex(szText, charsmax(szText), "\rВыполнить перевод"); menu_additem(menu, szText, "3"); } formatex(szText, charsmax(szText), "\wОтменить перевод"); menu_additem(menu, szText, "4"); menu_setprop(menu, MPROP_EXITNAME, "Выход") menu_display(id, menu, 0) return PLUGIN_HANDLED; } public TransferMenu_handler(id, menu, item) { if (item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) new i_Key = str_to_num(s_Data) switch(i_Key) { case 1: TransferMenu_Select(id) case 2: client_cmd(id, "messagemode TransferMenu_ChangeMode") case 3: TransferMenu_Send(id) case 4: TransferMenu_Reset(id) } menu_destroy(menu) return PLUGIN_HANDLED; } public TransferMenu_Select(id) { new menu = menu_create("Выберите игрока:", "TransferMenu_Select_handler"); new s_Players[32], i_Num, i_Player new s_Name[32], s_Player[10] get_players(s_Players, i_Num) for (new i; i < i_Num; i++) { i_Player = s_Players[i] get_user_name(i_Player, s_Name, charsmax(s_Name)) num_to_str(i_Player, s_Player, charsmax(s_Player)) menu_additem(menu, s_Name, s_Player, 0) } menu_display(id, menu, 0) } public TransferMenu_Select_handler(id, menu, item) { if (item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) SelectedPlayerID[id] = str_to_num(s_Data) get_user_name(SelectedPlayerID[id], SelectedPlayerName[id], 127) menu_destroy(menu) TransferMenu(id) return PLUGIN_HANDLED; } public TransferMenu_Change(id) { new Args[12] read_args(Args,11) remove_quotes(Args) new num = str_to_num(Args) if(!num) { num = 0 ColorChat(id, GREY, "^4Warning 001:^3 Параметр должен быть числом") return PLUGIN_HANDLED; } if(num > g_Life[id]) { num = 0 ColorChat(id, GREY, "^4Warning 002:^3 Параметр введен неправильно.") return PLUGIN_HANDLED; } SelectedPlayerNum[id] = num TransferMenu(id) return PLUGIN_HANDLED; } public TransferMenu_Send(id) { if(SelectedPlayerNum[id] > g_Life[id]) { ColorChat(id, GREY, "^4Error 001:^3 Вы не можете отправить больше жизней чем у вас есть") SelectedPlayerNum[id] = 0 TransferMenu(id) return PLUGIN_HANDLED; } if(SelectedPlayerNum[id] <= 0) { ColorChat(id, GREY, "^4Error 002:^3 Количество отправляемых жизней должно быть больше 0") TransferMenu(id) return PLUGIN_HANDLED; } if(!is_user_connected(SelectedPlayerID[id])) { ColorChat(id, GREY, "^4Error 003:^3 Игрок не существует") TransferMenu(id) return PLUGIN_HANDLED; } if(SelectedPlayerID[id] == id) { ColorChat(id, GREY, "^4Error 004:^3 Вы не можете передать самому ") TransferMenu(id) return PLUGIN_HANDLED; } if(!check_name(id)) { ColorChat(id, GREY, "^4Error 005:^3 Имя игрока не соовпадает с выбраним. Повторите попытку еше раз.") TransferMenu_Reset(id) return PLUGIN_HANDLED; } g_Life[id] -= SelectedPlayerNum[id] #if defined TRANSFER_COMMISSION_ENABLE SelectedPlayerNum[id] = calculate_commission(SelectedPlayerNum[id]) g_Life[SelectedPlayerID[id]] += SelectedPlayerNum[id] new szName[128] get_user_name(id, szName, 127) ColorChat(id, GREY, "Перевод успешно выполнен. Удержана комиссия ^4%d процентов ^3для ^4администрации сервера^3.", TRANSFER_COMMISSION) ColorChat(0, GREY, "Игрок ^4%s^3 перевел ^4%d жизней (с учетом комиссии %d процентов)^3 игроку^4 %s", szName, SelectedPlayerNum[id], TRANSFER_COMMISSION, SelectedPlayerName[id]) #endif TransferMenu_Reset(id) return PLUGIN_HANDLED; } stock save_client_Life( index ) { gVault = nvault_open(VAULT_FILE) if(gVault == INVALID_HANDLE) set_fail_state("nValut ERROR: =-> Invalid-Handle") get_user_authid(index, gSteamID, charsmax(gSteamID)) formatex(vKey, charsmax(vKey), "%sLife", gSteamID ) formatex(vData, charsmax(vData), "%d", g_Life[index]) nvault_set(gVault, vKey, vData) nvault_close(gVault) } stock load_client_Life( index ) { gVault = nvault_open(VAULT_FILE) if(gVault == INVALID_HANDLE) set_fail_state("nValut ERROR: =-> Invalid-Handle") get_user_authid(index, gSteamID, charsmax(gSteamID)) formatex(vKey, charsmax(vKey), "%sLife", gSteamID) new life = nvault_get(gVault, vKey) if(life > LIFE_LIMIT_SAVE) life = LIFE_LIMIT_SAVE g_Life[index] = life nvault_close(gVault) } stock TransferMenu_Reset(id) { SelectedPlayerID[id] = -1 SelectedPlayerName[id] = "Не выбран" SelectedPlayerNum[id] = 0 } stock bool:check_name(id) { new szName[128] get_user_name(SelectedPlayerID[id], szName, 127) if(equal(SelectedPlayerName[id], szName)) return true; return false; } stock calculate_commission(num) { new Float:percentage = num_to_float(TRANSFER_COMMISSION) if(1.0 > percentage > 99.0) return num; new Float:fnum = num_to_float(num) new Float:commission = (percentage * (fnum / 100.0)) new result = floatround((fnum - commission),floatround_round) if(result < 1) return 1; return result; } stock Float:num_to_float(value) { new Float:value2 = Float:value; new string[32] num_to_str(value,string,31) value2=str_to_float(string) return value2; }