@ -2,6 +2,10 @@
#include <ripext>
#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, "<check_voteblock>","ДА");
else AddMenuItem(VoteBlockDisclaimer, "<no_use_voteblock>","НЕТ");
}
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, "<send_report>","ДА");
if(i == choice) AddMenuItem(Solution, "<send_report_from_reason_solution >","ДА");
else AddMenuItem(Solution, "<exit>","НЕТ");
}
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, "<show_players>") != -1){
@ -223,9 +270,29 @@ public int PreDisplayPlayers(Handle Disclaimer, MenuAction eAction, int cid, int
}
if (StrContains(cmd, "<kill_player>") != -1){
//SDKHooks_TakeDamage(cid, cid, cid, 99999999.0);
g_clients_cooldown[cid] = -1;
FakeClientCommand(cid, "explode");
return 0;
}
if (StrContains(cmd, "<send_report_from_reason_solution>") != -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, "<send_report>") != -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, "<check_voteblock>") != -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, "<no_use_voteblock>") != -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 R eason[512];
char r eason[512];
if(args == 1){
GetCmdArg(1, Reason, sizeof(R eason));
GetCmdArg(1, reason, sizeof(r eason));
} else {
GetCmdArgString(Reason, sizeof(R eason));
GetCmdArgString(reason, sizeof(r eason));
}
if (!strcmp(R eason, "!отмена")) {
PrintToChat(cid, "Твоя жалоба была откла нена!");
if (!strcmp(r eason, "!отмена")) {
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(R eason, "МЕНЮ")) {
if (!strcmp(reason, "!menu") || !strcmp(reason, "!MENU") || !strcmp(reason, "menu") || !strcmp(reason, "MENU") || !strcmp(reason, "!меню") || !strcmp(reason, "!МЕНЮ") || !strcmp(reason, "меню") || !strcmp(r eason, "МЕНЮ")) {
KickClient(cid, "МЕНЮ БЛЯТЬ ПОШЕЛ НАХУЙ");
return Plugin_Handled;
}
if (!strcmp(R eason, "!report")) {
if (!strcmp(r eason, "!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;