Kod:
#include <amxmodx>
#include <amxmisc>
#define INITIAL_BAN_TIME 30 // dakika cinsinden
#define MAX_BAN_TIME 1440 // 24 saat (dakika cinsinden)
#define REPORT_COOLDOWN 300 // saniye cinsinden (5 dakika)
// Renk tanımlamaları
#define NORMAL "\x01"
#define RED "\x04"
#define BLUE "\x03"
// PLUGIN_TAG değiştirilmiş hali
#define PLUGIN_TAG "^x04[Report News]^x01"
#define SLASH_REPORT_TAG "^x04!t[/ReportMenu]^x01"
// Bilgilendirme mesajı
#define INFORMATIVE_MESSAGE "^x04[Report News]^x01 !tHaksız kullanımların ban sebebi olabileceğini lütfen unutmayın!"
new g_ReportCounts[33][33]; // [reporter][reported]
new g_LastBanTime[33];
new g_LastReportTime[33];
new g_LastReportMessageTime[33]; // Bilgilendirme mesajı için zaman kaydedici
new g_LogFile[128]; // Log dosyası için yeni değişken
public plugin_init() {
register_plugin("Report News", "1.0", "Your Name");
register_clcmd("say /reportmenu", "cmd_reportmenu");
register_clcmd("say_team /reportmenu", "cmd_reportmenu");
log_report_to_file_init(); // Log dosyasını başlat
}
public cmd_reportmenu(id) {
new current_time = get_systime();
new time_left = g_LastReportTime[id] + REPORT_COOLDOWN - current_time;
new message_time_left = g_LastReportMessageTime[id] + REPORT_COOLDOWN - current_time;
if (time_left <= 0) {
// Komutun yazıldığı herkes tarafından görülsün
new name[32];
get_user_name(id, name, charsmax(name));
ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);
// Bilgilendirme mesajını göster
ColorChat(id, INFORMATIVE_MESSAGE);
g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
} else if (message_time_left <= 0) {
// 300 saniye bekledikten sonra mesajı göster
new name[32];
get_user_name(id, name, charsmax(name));
ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);
ColorChat(id, INFORMATIVE_MESSAGE);
g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
} else {
new minutes = time_left / 60;
new seconds = time_left % 60;
ColorChat(id, "%s Şikayet için kalan süre: !g%d dakika %d saniye", PLUGIN_TAG, minutes, seconds);
}
if (time_left > 0) {
return PLUGIN_HANDLED;
}
new menu = menu_create("\yQuality | ReportMenu\w", "reportmenu_handler");
new players[32], pnum;
get_players(players, pnum, "ch"); // Sadece bağlı olan oyuncuları al
for (new i = 0; i < pnum; i++) {
new name[32], authid[32];
get_user_name(players[i], name, charsmax(name));
get_user_authid(players[i], authid, charsmax(authid));
// Oyuncu Spectator takımında değilse ve oyuncu kendisi değilse menüye ekle
if (get_user_team(players[i]) > 0 && players[i] != id && g_ReportCounts[id][players[i]] == 0) {
// Tüm takımların (CT/Terörist) isimleri menüde gözükecek
menu_additem(menu, name, authid);
}
}
menu_setprop(menu, MPROP_EXITNAME, "Çıkış");
menu_display(id, menu);
return PLUGIN_HANDLED;
}
public reportmenu_handler(id, menu, item) {
if (item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new authid[32], name[32];
menu_item_getinfo(menu, item, _, authid, charsmax(authid), name, charsmax(name));
new target = find_player("c", authid);
if (!target) {
ColorChat(id, "%s !g%s !yadlı oyuncu bulunamadı.", PLUGIN_TAG, name);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
// Kendini şikayet etme kontrolü
if (target == id) {
ColorChat(id, "%s !yKendinizi şikayet edemezsiniz!", PLUGIN_TAG);
menu_destroy(menu);
return PLUGIN_HANDLED;
}
// Şikayet sayısını kontrol et
if (g_ReportCounts[id][target] == 0) {
g_ReportCounts[id][target] = 1; // Oyuncu bir kez şikayet etti
g_LastReportTime[id] = get_systime();
g_LastReportMessageTime[id] = get_systime(); // Şikayet yapıldığında bilgilendirme mesajını göstermek için zamanı ayarla
new total_reports = 0;
for (new i = 1; i <= 32; i++) {
total_reports += g_ReportCounts[i][target];
}
new required_reports = get_required_reports();
// Şikayet eden ve edilenin sohbet ekranında görünmesi
new reporter_name[32], target_name[32];
get_user_name(id, reporter_name, charsmax(reporter_name));
get_user_name(target, target_name, charsmax(target_name));
// Şikayet edilen kişiye bildirim gönder
ColorChat(0, "%s !g%s !yadlı oyuncu !t%s !yadlı oyuncuyu şikayet etti. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, reporter_name, target_name, total_reports, required_reports);
log_report_to_file(g_LogFile, "Reporter: %s, Reported: %s, Total Reports: %d/%d", reporter_name, target_name, total_reports, required_reports);
if (total_reports >= required_reports) {
new ban_time = INITIAL_BAN_TIME;
if (g_LastBanTime[target] > 0) {
ban_time = min(g_LastBanTime[target] * 2, MAX_BAN_TIME);
}
new ban_reason[64];
formatex(ban_reason, charsmax(ban_reason), "Oyuncular tarafından şikayet edildi (%d/%d şikayet)", total_reports, required_reports);
server_cmd("banid %d #%s kick", ban_time, authid);
server_exec();
g_LastBanTime[target] = ban_time;
ColorChat(0, "%s !g%s !yadlı oyuncu !t%d dakika !ybanlandı. Sebep: !g%s", PLUGIN_TAG, target_name, ban_time, ban_reason);
log_report_to_file(g_LogFile, "Banned: %s, Ban Time: %d dakika, Reason: %s", target_name, ban_time, ban_reason);
} else {
ColorChat(id, "%s !g%s !yadlı oyuncuyu şikayet ettiniz. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, target_name, total_reports, required_reports);
}
} else {
ColorChat(id, "%s !yBu oyuncuya zaten şikayet ettiniz!", PLUGIN_TAG);
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
// Gerekli şikayet sayısını hesapla
stock get_required_reports() {
new players[32], pnum;
get_players(players, pnum, "ch"); // Sadece bağlı olan oyuncuları al
if (pnum <= 10) {
return 4;
} else if (pnum <= 25) {
return 7;
} else {
return 10;
}
}
// ColorChat fonksiyonu
stock ColorChat(const id, const input[], any:...) {
new count = 1, players[32];
static msg[191];
vformat(msg, 190, input, 3);
replace_all(msg, 190, "!g", "^x04"); // Green Color
replace_all(msg, 190, "!y", "^x01"); // Default Color (Yellow)
replace_all(msg, 190, "!t", "^x03"); // Team Color (Blue/Red)
if (id) {
players[0] = id;
} else {
get_players(players, count, "ch");
}
for (new i = 0; i < count; i++) {
if (is_user_connected(players[i])) {
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
// Log dosyasına yazan fonksiyon
stock log_report_to_file(const file[], const input[], any:...) {
new data[512];
vformat(data, 511, input, 3);
new logFile = fopen(file, "a");
if (logFile) {
fprintf(logFile, "%s", data);
fclose(logFile);
}
}
// Log dosyası başlatma fonksiyonu
stock log_report_to_file_init() {
new date[12];
get_time("%Y-%m-%d", date, charsmax(date)); // Günlük formatı değiştirildi (YYYY-MM-DD)
formatex(g_LogFile, charsmax(g_LogFile), "addons/amxmodx/logs/%s-ReportLog.txt", date); // Her gün için farklı bir dosya
}
her şey iyi hoş fakat banlama kısmında başarısız oldum örneğin 4 şikayete ulaştığında kişinin banlanması gerekiyor, hatta banlandı mesajı da cıkıyor plugin üzerinden fakat banlanmıyor oyuncu.
steam id ve ip ban olacak şekilde ban sistemi ekleyebilirseniz çok sevinirim.
bir de log tutuyor kimlerin komutu kullandığına dair ama diyelim map değiştiğinde veya sunucu yeniden başlatıldığında şikayet sayılarının sıfırlanmamasını istiyorum. (4/3) şikayeti var ise gene o şikayet sayısından devam etsin.
teşekkür ederim hayırlı forumlar dilerim.