- Şikayet sayıları her oyuncuda farklı hesaplanması lazım şu anki haliyle aynı değerden hesaplanıyor.
- 30 dakika'dan sonra maksimum 24 saat banlama eklenmesi.
- Pluginin sadece steam oyuncularına açık olması. gsclient veya nonsteam kişilerin kullanamaması. komutu kullanması halinde uyarı mesajı alması.
Yapabilecek hocalarım varsa ellerine emeğine sağlık. İyi forumlar.
Kod:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#define INITIAL_BAN_TIME 30 // dakika cinsinden
#define MAX_BAN_TIME 1440 // 24 saat (dakika cinsinden)
#define REPORT_COOLDOWN 300 // saniye cinsinden (5 dakika)
#define REPORT_MESSAGE_INTERVAL 450.0 // 7 dakikada bir mesaj göster
// 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
new Vault; //Vault için 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
// Periyodik mesaj için timer'ı başlat
set_task(REPORT_MESSAGE_INTERVAL, "show_report_message", .flags = "b");
}
public show_report_message() {
ColorChat(0, "%s !yOyun huzurunu bozduğunu düşündüğünüz bir oyuncu varsa, !g/reportmenu !yyazıp oy verebilirsiniz.", PLUGIN_TAG);
}
public plugin_cfg()
{
Vault = nvault_open("report"); //report nvaultunu açıyoruz
if(Vault == INVALID_HANDLE) {
set_fail_state("report: unknown vault.");
}
}
public plugin_end()
{
nvault_close(Vault); //plugin kapandığında nvaultu kapatıyoruz
}
public client_putinserver(id)
{
new authid[MAX_AUTHID_LENGTH];
get_user_authid(id, authid, charsmax(authid));
g_ReportCounts[0][id] = nvault_get(Vault, fmt("Reports-%s", authid)); //Kullanıcı giriş yaptığında Report sayısını nvaulttan çektiriyoruz, baştaki kısma 0 girmemin sebebi 0 idsi olmuyor bildiğim kadarıyla, o yüzden boş bir satıra çekiyormuş gibi düşünün.
}
public client_disconnected(id)
{
new authid[MAX_AUTHID_LENGTH], data[MAX_AUTHID_LENGTH+10];
get_user_authid(id, authid, charsmax(authid));
new total_reports = 0;
for (new i = 0; i <= 32; i++) { // for döngüsünü 0dan başlatıyoruz çünkü g_ReportCounts[0] 0'a kaydettiğimiz reportları çekmeli.
total_reports += g_ReportCounts[i][id];
}
num_to_str(total_reports, data, charsmax(data));
nvault_pset(Vault, fmt("Reports-%s", authid), data); // for döngüsüyle çektiğimiz reportları nvaulta kaydediyoruz.
}
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 = 0; 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");
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);
}
}
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
})

