diff --git a/ext/sourcepawn-client/Facti13BackendIntegration.sp b/ext/sourcepawn-client/Facti13BackendIntegration.sp index 2fce762..ef6073f 100644 --- a/ext/sourcepawn-client/Facti13BackendIntegration.sp +++ b/ext/sourcepawn-client/Facti13BackendIntegration.sp @@ -2,6 +2,10 @@ //#define DEBUG #define REPLACE_HTTPS_TO_HTTP +#define REPLACE_DOMAIN_TO_IP +#if defined REPLACE_DOMAIN_TO_IP + #define REPLACED_IP "192.168.3.3:26272" +#endif #include @@ -49,6 +53,9 @@ HTTPRequest createRequest() { #if defined REPLACE_HTTPS_TO_HTTP ReplaceString(sURL, 128, "https://", "http://") + #if defined REPLACE_DOMAIN_TO_IP + ReplaceString(sURL, 128, "tf2.pblr-nyk.pro", REPLACED_IP) + #endif #endif client = new HTTPRequest(sURL); diff --git a/ext/sourcepawn-client/Facti13Reports.sp b/ext/sourcepawn-client/Facti13Reports.sp index 720f23e..0e50a81 100644 --- a/ext/sourcepawn-client/Facti13Reports.sp +++ b/ext/sourcepawn-client/Facti13Reports.sp @@ -2,6 +2,10 @@ #include #define REPLACE_HTTPS_TO_HTTP +#define REPLACE_DOMAIN_TO_IP +#if defined REPLACE_DOMAIN_TO_IP + #define REPLACED_IP "192.168.3.3:26272" +#endif #if defined REPLACE_HTTPS_TO_HTTP #define PLUGIN_VERSION "1.0 (RipExt) - HTTP ONLY" @@ -25,9 +29,12 @@ int g_clients_cooldown[MAXPLAYERS+1]; int g_clients_reported_uid[MAXPLAYERS+1]; bool g_clients_reasons_wait[MAXPLAYERS+1]; char g_clients_reason[MAXPLAYERS+1][REASON_TEXT_SIZE]; +int g_clients_last_voteblock_use[MAXPLAYERS+1]; // Plugin Vars int g_client_cooldown = 300; +char g_vip_words[2][8] = {"vip", "вип"}; +int g_voteblock_valid_time = 300; // Choices #define REASONS_SLOTS 32 @@ -39,10 +46,12 @@ public OnPluginStart() { fillReason(); SetupGlobalConVar(); SetupThis(); + AddCommandListener(CheckVoteblockUse, "sm_voteblock"); } public OnPluginEnd() { UnSetupGlobalConvar(); + RemoveCommandListener(CheckVoteblockUse, "sm_voteblock"); } stock fillReason() { @@ -50,8 +59,8 @@ stock fillReason() { Format(EMBEDED_REASONS[0], REASON_TEXT_SIZE, "Аdmin абуз :)|z"); Format(EMBEDED_REASONS[1], REASON_TEXT_SIZE, "Аdmin абуз|b"); Format(EMBEDED_REASONS[2], REASON_TEXT_SIZE, "Moder абуз|k"); - Format(EMBEDED_REASONS[3], REASON_TEXT_SIZE, "FreeVIP абуз|t|Ты можешь проголосовать за кик данного игрока из меню. Введи для этого в чат: меню, потом иди по пути: меню -> голосование -> кикнуть"); - Format(EMBEDED_REASONS[4], REASON_TEXT_SIZE, "VIP абуз|a|Ты можешь проголосовать за кик данного игрока из меню. Введи для этого в чат: меню, потом иди по пути: меню -> голосование -> кикнуть"); + Format(EMBEDED_REASONS[3], REASON_TEXT_SIZE, "FreeVIP абуз|t|Ты можешь проголосовать за кик данного игрока из меню. Введи для этого в чат: !voteblock"); + Format(EMBEDED_REASONS[4], REASON_TEXT_SIZE, "VIP абуз|a|Ты можешь проголосовать за кик данного игрока из меню. Введи для этого в чат: !voteblock"); Format(EMBEDED_REASONS[5], REASON_TEXT_SIZE, "Читы"); Format(EMBEDED_REASONS[6], REASON_TEXT_SIZE, "Микспам||Ты можешь проголосовать чтоб данного игрока заглушили. Введи для этого в чат: меню, потом иди по пути: меню -> голосование -> замьютить"); Format(EMBEDED_REASONS[7], REASON_TEXT_SIZE, "Трейдер"); @@ -103,6 +112,7 @@ public void OnClientPutInServer(int cid){ g_clients_cooldown[cid] = -1; g_clients_reasons_wait[cid] = false; g_clients_reported_uid[cid] = -1; + g_clients_last_voteblock_use[cid] = 0; } //RIPEXT START @@ -116,6 +126,9 @@ stock HTTPRequest createRequest() { #if defined REPLACE_HTTPS_TO_HTTP ReplaceString(url, 128, "https://", "http://"); + #if defined REPLACE_DOMAIN_TO_IP + ReplaceString(url, 128, "tf2.pblr-nyk.pro", REPLACED_IP) + #endif #endif client = new HTTPRequest(url); @@ -186,6 +199,7 @@ public Action COMMAND_ClientReport(int cid, int args){ return Plugin_Handled; } +//Показ дисклеймера что могут public int ShowDisclaimer(int cid){ Handle Disclaimer = CreateMenu(PreDisplayPlayers); SetMenuTitle(Disclaimer, "Ты согласен с тем что твой репорт на игрока оправдан и несет в себе ценную информацию, иначе тебе могут дать по жопе?"); @@ -196,14 +210,45 @@ public int ShowDisclaimer(int cid){ return 0; } -public void ShowReasonSolution(int cid, int reason_id, const char[] reason){ - strcopy(g_clients_reason[cid], sizeof(g_clients_reason[]), reason); +//check command exists stock +stock bool CheckCommand(int client, const char[] cmd){ + if (CommandExists(cmd) && CheckCommandAccess(client, cmd, GetCommandFlags(cmd))){ + return true; + } else { + return false; + } +} + +//Показ предупреждения что имеет voteblock +public int ShowVoteBlockExists(int cid) { + if (!CheckCommand(cid, "sm_voteblock")) { + //PrintToChat(cid, "voteblock не установлен"); + return 1; + } + + //PrintToChat(cid, "Не ври мне"); + Handle VoteBlockDisclaimer = CreateMenu(PreDisplayPlayers); + SetMenuTitle(VoteBlockDisclaimer, "Ты говоришь что у чел абузит ВИПом, ты голосовал за его блокировку через !voteblock?"); + int count = 4; + int choice = GetRandomInt(0, count); + for(int i = 0; i <= count; i++){ + if(i == choice) AddMenuItem(VoteBlockDisclaimer, "","ДА"); + else AddMenuItem(VoteBlockDisclaimer, "","НЕТ"); + } + DisplayMenu(VoteBlockDisclaimer, cid, MENU_TIME_FOREVER); + return 0; +} + + +//Меню алерт что использование репорт до добра не доведет +public void ShowReasonSolution(int cid, int reason_id){ + //strcopy(g_clients_reason[cid], sizeof(g_clients_reason[]), reason); Handle Solution = CreateMenu(PreDisplayPlayers); SetMenuTitle(Solution, "Смотри друг на твою проблему есть решение, без учатия модераторов: \n%s\nТы всеравно хочешь отправить репорт?", g_reasons_solution[reason_id]); int count = 4; int choice = GetRandomInt(0, count); for(int i = 0; i <= count; i++){ - if(i == choice) AddMenuItem(Solution, "","ДА"); + if(i == choice) AddMenuItem(Solution, "","ДА"); else AddMenuItem(Solution, "","НЕТ"); } SetMenuExitBackButton(Solution, false); @@ -211,11 +256,13 @@ public void ShowReasonSolution(int cid, int reason_id, const char[] reason){ DisplayMenu(Solution, cid, MENU_TIME_FOREVER); } + +//Калбек для меню public int PreDisplayPlayers(Handle Disclaimer, MenuAction eAction, int cid, int select){ switch(eAction){ case MenuAction_End:CloseHandle(Disclaimer); case MenuAction_Select:{ - char cmd[32]; + char cmd[64]; GetMenuItem(Disclaimer, select, cmd, sizeof(cmd)); ////////////////////////////////////////////////// if (StrContains(cmd, "") != -1){ @@ -223,9 +270,29 @@ public int PreDisplayPlayers(Handle Disclaimer, MenuAction eAction, int cid, int } if (StrContains(cmd, "") != -1){ //SDKHooks_TakeDamage(cid, cid, cid, 99999999.0); + g_clients_cooldown[cid] = -1; FakeClientCommand(cid, "explode"); return 0; } + if (StrContains(cmd, "") != -1){ + //PrintToChat(cid, "Ну давай проверим, твой репорт на вип"); + bool vip_reason = false; + //check vip in reason + for (int i = 0; i < 2; i++) { + if (StrContains(g_clients_reason[cid], g_vip_words[i], false)) { + vip_reason = true; + break; + } + } + + if (vip_reason) { + if (ShowVoteBlockExists(cid)) + ReportProcessing(cid, g_clients_reason[cid]); + } else + ReportProcessing(cid, g_clients_reason[cid]); + return 0; + } + //depricated if (StrContains(cmd, "") != -1){ ReportProcessing(cid, g_clients_reason[cid]); return 0; @@ -234,12 +301,33 @@ public int PreDisplayPlayers(Handle Disclaimer, MenuAction eAction, int cid, int g_clients_cooldown[cid] = -1; return 0; } + if (StrContains(cmd, "") != -1) { + if (GetTime() - g_clients_last_voteblock_use[cid] > g_voteblock_valid_time) { + g_clients_cooldown[cid] = -1; + FakeClientCommand(cid, "explode"); + if (g_clients_last_voteblock_use[cid] != 0) + PrintToChat(cid, "ЕЩЕ РАЗ ПРОГОЛОСУЙ, ТВОЙ ГОЛОС УЖЕ ПРОПАЛ ЗА НЕГО"); + else + PrintToChat(cid, "ПИЗДЕТЬ НЕ МЕШКИ ВОРОЧИТЬ, ПЛОГОСУЙ ЕБОБО"); + return 0; + } else { + ReportProcessing(cid, g_clients_reason[cid]); + return 0; + } + } + if (StrContains(cmd, "") != -1) { + g_clients_cooldown[cid] = -1; + FakeClientCommand(cid, "explode"); + PrintToChat(cid, "Сначала проголосуй, а потом репорти..."); + return 0; + } return 0; } } return 0; } +//Меню причины public int DisplayReasons(int cid){ if(strlen(g_reasons[0]) > 0){ bool HavePermitionReason = false; @@ -278,6 +366,7 @@ public int DisplayReasons(int cid){ } } +//Калбек вменю выбора причины public int SelectReasonsHandle(Handle ReasonMenu, MenuAction eAction, int cid, int select){ switch(eAction){ case MenuAction_End:CloseHandle(ReasonMenu); @@ -294,7 +383,8 @@ public int SelectReasonsHandle(Handle ReasonMenu, MenuAction eAction, int cid, i reason_id = StringToInt(reason_array[0]); if(strlen(g_reasons_solution[reason_id]) > 0){ - ShowReasonSolution(cid, reason_id, reason); + strcopy(g_clients_reason[cid], sizeof(g_clients_reason[]), reason); + ShowReasonSolution(cid, reason_id); return 0; } } else { @@ -308,13 +398,35 @@ public int SelectReasonsHandle(Handle ReasonMenu, MenuAction eAction, int cid, i return 0; } } - ReportProcessing(cid, reason); + + bool vip_reason = false; + //check vip in reason + for (int i = 0; i < 2; i++) { + if (StrContains(reason, g_vip_words[i], false)) { + vip_reason = true; + break; + } + } + + //Если это вип причина, попытаемся показать предупреждение про вотеблок + // если 1 возвращает значит плагин такой на сервере отсутствует + if (vip_reason) { + if (ShowVoteBlockExists(cid)) + ReportProcessing(cid, reason); + else + //Копируем исходную причину в буфер и показываем меню что тот знает про вотеблок + strcopy(g_clients_reason[cid], sizeof(g_clients_reason[]), reason); + } else + ReportProcessing(cid, reason); + return 0; } } return 0; } + +//Меню со списоком игроков на сервере public int DisplayPlayers(int cid){ Handle ReportMenu = CreateMenu(SelectPlayerHandle); for (int i; i++ <= MaxClients - 1;) { @@ -351,7 +463,7 @@ public int DisplayPlayers(int cid){ return 0; } -// Menu functions +// Menu functions \ калбек выбора игрока public void SelectPlayerHandle(Handle ReportMenu, MenuAction eAction, int cid, int select){ switch(eAction){ case MenuAction_End:CloseHandle(ReportMenu); @@ -379,10 +491,18 @@ static void SetWaitChatMessage(int cid){ PrintToChat(cid, "Напиши в чат, причину жалобы. Если ты не уверен, напиши в чат: !отмена") } +//хук который проверяет использовал ли чел команду voteblock +public Action CheckVoteblockUse(int client, const char[] command, int args) { + g_clients_last_voteblock_use[client] = GetTime(); + return Plugin_Continue; +} + +//хук который читает кастом причины введеные в чат public Action SayHook(cid, args){ if(!cid || !g_clients_reasons_wait[cid]) { return Plugin_Continue; } + g_clients_reasons_wait[cid] = false; if(!(GetClientOfUserId(g_clients_reported_uid[cid]))){ PrintToChat(cid, "Увы! К написанию жалобы, данный игрок стал недоступен.") @@ -390,36 +510,54 @@ public Action SayHook(cid, args){ return Plugin_Handled; } - char Reason[512]; + char reason[512]; if(args == 1){ - GetCmdArg(1, Reason, sizeof(Reason)); + GetCmdArg(1, reason, sizeof(reason)); } else { - GetCmdArgString(Reason, sizeof(Reason)); + GetCmdArgString(reason, sizeof(reason)); } - if (!strcmp(Reason, "!отмена")) { - PrintToChat(cid, "Твоя жалоба была откланена!"); + if (!strcmp(reason, "!отмена")) { + PrintToChat(cid, "Твоя жалоба была отклонена!"); OnClientPutInServer(cid); return Plugin_Handled; } - if (!strcmp(Reason, "!menu") || !strcmp(Reason, "!MENU") || !strcmp(Reason, "menu") || !strcmp(Reason, "MENU") || !strcmp(Reason, "!меню") || !strcmp(Reason, "!МЕНЮ") || !strcmp(Reason, "меню") || !strcmp(Reason, "МЕНЮ")) { + if (!strcmp(reason, "!menu") || !strcmp(reason, "!MENU") || !strcmp(reason, "menu") || !strcmp(reason, "MENU") || !strcmp(reason, "!меню") || !strcmp(reason, "!МЕНЮ") || !strcmp(reason, "меню") || !strcmp(reason, "МЕНЮ")) { KickClient(cid, "МЕНЮ БЛЯТЬ ПОШЕЛ НАХУЙ"); return Plugin_Handled; } - if (!strcmp(Reason, "!report")) { + if (!strcmp(reason, "!report")) { PrintToChat(cid, "Твоя жалоба была откланена, по причине долбаеб."); OnClientPutInServer(cid); return Plugin_Handled; } - ReportProcessing(cid, Reason); + bool vip_reason = false; + //check vip in reason + for (int i = 0; i < 2; i++) { + if (StrContains(reason, g_vip_words[i], false)) { + vip_reason = true; + break; + } + } + + if (vip_reason) { + if (ShowVoteBlockExists(cid)) + ReportProcessing(cid, reason); + else + //Копируем исходную причину в буфер и показываем меню что тот знает про вотеблок + strcopy(g_clients_reason[cid], sizeof(g_clients_reason[]), reason); + } else + ReportProcessing(cid, reason); return Plugin_Handled; } +//Последняя миля перед отправкой репорта на сервер +//PreDisplayPlayers калбек stock ReportProcessing(int cid, const char[] Reason){ if (cid == GetClientOfUserId(g_clients_reported_uid[cid])){ g_clients_reported_uid[cid] = 0;