Kod:
#include <amxmodx>
#include <reapi>
#pragma semicolon 1
new const AdminYetki = ADMIN_KICK;
new const serverTag[] = "ReckLesS";
new const sprite_icon[] = "sprites/saveme.spr";
enum (+= 100){
TASK_ORIGIN = 2708,
TASK_SLAY,
TASK_AFKMODE,
TASK_BILGI,
TASK_BLIND,
TASK_MANUAL_KICK // New task for manual AFK kick timer
};
new bool:isAfk[MAX_CLIENTS+1],AfkValue[MAX_CLIENTS+1],Float:iPlayerOrigin[MAX_CLIENTS+1][3],iCvars[4];
new g_iSpriteIcon; // Handle for the sprite
public plugin_init(){
register_plugin("Afk Menu","1.2","suriyelikene"); // Erra1881 update
register_clcmd("say /afkmenu","@afkmenusu");
register_clcmd("say /afk","@clcmd_afk");
register_clcmd("say","@Hook_Say");
register_clcmd("say_team","@Hook_Say");
RegisterHookChain(RG_CBasePlayer_Spawn, "@IsSpawn", .post = true);
RegisterHookChain(RG_CBasePlayer_Killed, "@PlayerKill", .post = true);
register_event("SpecHealth2","@Spectating","bd");
bind_pcvar_num(create_cvar("re_afkslaysure", "25"), iCvars[0]); // Changed default to 25
bind_pcvar_num(create_cvar("re_afkslayuyari", "7"), iCvars[1]); // Changed default usage to Kick Round Limit
bind_pcvar_num(create_cvar("re_afkmoduyari", "15"), iCvars[2]);
bind_pcvar_num(create_cvar("re_afk_manual_kick_time", "300"), iCvars[3]); // New cvar for manual AFK kick time
}
public plugin_precache() {
g_iSpriteIcon = precache_model(sprite_icon);
}
public plugin_natives(){
register_native("is_user_afk", "@NTV_GetAfk");
}
@NTV_GetAfk() {
new iPlayer = get_param(1);
return isAfk[iPlayer] ? 1:0;
}
public client_putinserver(iPlayer){
isAfk[iPlayer]=false;
AfkValue[iPlayer]=0;
}
public client_disconnected(iPlayer){
if(task_exists(iPlayer + TASK_ORIGIN)) remove_task(iPlayer+TASK_ORIGIN);
if(task_exists(iPlayer + TASK_SLAY)) remove_task(iPlayer+TASK_SLAY);
if(task_exists(iPlayer + TASK_AFKMODE)) remove_task(iPlayer+TASK_AFKMODE);
if(task_exists(iPlayer + TASK_BILGI)) remove_task(iPlayer+TASK_BILGI);
if(task_exists(iPlayer + TASK_BLIND)) remove_task(iPlayer+TASK_BLIND);
if(task_exists(iPlayer + TASK_MANUAL_KICK)) remove_task(iPlayer+TASK_MANUAL_KICK);
@RemoveIcon(iPlayer);
}
@clcmd_afk(const iPlayer){
if(isAfk[iPlayer]){
isAfk[iPlayer]=false;
AfkValue[iPlayer]=0;
@bBlindStop(iPlayer);
@AfkHudMesaggeOff(iPlayer);
remove_task(iPlayer+TASK_BILGI);
remove_task(iPlayer+TASK_BLIND);
remove_task(iPlayer+TASK_MANUAL_KICK);
@RemoveIcon(iPlayer);
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4An itibariyle ^1Afk modundan ciktin. ^4Bol fraglar dileriz.",serverTag);
}
else {
isAfk[iPlayer]=true;
@afk_oldur(iPlayer);
@bBlind(iPlayer,2.0);
@AfkHudMesagge(iPlayer);
@ShowIcon(iPlayer);
set_task(float(iCvars[2]), "@AfkModuBilgilendir", iPlayer+TASK_BILGI, .flags = "b");
// Start kick timer for manual AFK
if(iCvars[3] > 0) {
set_task(float(iCvars[3]), "@ManualAfkKick", iPlayer+TASK_MANUAL_KICK);
}
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4An itibariyle ^1Afk moduna gectin.",serverTag);
}
}
@ManualAfkKick(const iTaskim) {
new iPlayer = iTaskim - TASK_MANUAL_KICK;
if(!is_user_connected(iPlayer)) return;
server_cmd("kick #%d ^"AFK modunda cok uzun sure kaldigin icin kicklendin.^"", get_user_userid(iPlayer));
}
@Spectating(const iPlayer){
set_task(0.1,"@SpecChange",iPlayer+TASK_BLIND, .flags = "b");
}
@SpecChange(const iTaskim){
new iPlayer = iTaskim - TASK_BLIND;
if(isAfk[iPlayer]) @bBlind(iPlayer,2.0);
}
@PlayerKill(const pVictim, pAttacker, iGib){
if(!is_user_connected(pVictim)) return; // Removed pAttacker check as it might be worldspawn
@RemoveIcon(pVictim); // Remove icon when dead
if(isAfk[pVictim]) @bBlind(pVictim,2.0);
}
@IsSpawn(const iPlayer) {
if(get_member(iPlayer, m_bJustConnected)) return;
if(task_exists(iPlayer + TASK_ORIGIN)) remove_task(iPlayer+TASK_ORIGIN);
if(task_exists(iPlayer + TASK_SLAY)) remove_task(iPlayer+TASK_SLAY);
if(task_exists(iPlayer + TASK_AFKMODE)) remove_task(iPlayer+TASK_AFKMODE);
if(task_exists(iPlayer + TASK_BLIND)) remove_task(iPlayer+TASK_BLIND);
// Do NOT remove TASK_MANUAL_KICK here, as it should persist across rounds if manually AFK
if(isAfk[iPlayer]) {
@bBlind(iPlayer,2.0);
@ShowIcon(iPlayer);
set_task(5.0, "@isAfkOldur", iPlayer+TASK_AFKMODE);
}
set_task(2.0, "@get_origin", iPlayer+TASK_ORIGIN);
}
@get_origin(const iTaskim) {
new iPlayer = iTaskim - TASK_ORIGIN;
if(!is_user_alive(iPlayer)) return;
get_entvar(iPlayer, var_origin, iPlayerOrigin[iPlayer]);
set_task(float(iCvars[0]), "@AfkSlay", iPlayer+TASK_SLAY);
}
@AfkSlay(const iTaskim) {
new iPlayer = iTaskim - TASK_SLAY;
// If player is already manually AFK, do nothing (manual AFK logic handles itself)
if(!is_user_alive(iPlayer) || !same_origin(iPlayer) || isAfk[iPlayer]) return;
// Increment AFK counter
AfkValue[iPlayer]++;
// Check if they exceeded the kick limit
if(AfkValue[iPlayer] >= iCvars[1]){
server_cmd("kick #%d ^"AFK kaldigin icin kicklendin.^"", get_user_userid(iPlayer));
return;
}
// Slay the player
client_print_color(iPlayer, iPlayer, "^1[^4%s^1] ^3AFK Slay^1:^4 %d/%d",serverTag,AfkValue[iPlayer],iCvars[1]);
@afk_oldur(iPlayer);
}
@isAfkOldur(const iTaskim){
new iPlayer = iTaskim - TASK_AFKMODE;
if(!is_user_alive(iPlayer) || !isAfk[iPlayer]) return;
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Afk modun aktif. ^1Moddan cikmak icin ^3say /afk ^1yaziniz.",serverTag);
@afk_oldur(iPlayer);
}
@afk_oldur(const iPlayer){
if(!is_user_alive(iPlayer)) return;
@RemoveIcon(iPlayer); // Remove icon when killed
user_silentkill(iPlayer,1);
set_member(iPlayer,m_iDeaths, get_member(iPlayer, m_iDeaths) - 1);
message_begin(MSG_ALL,85);
write_byte(iPlayer);
write_short(floatround(get_entvar(iPlayer,var_frags)));write_short(get_member(iPlayer, m_iDeaths));write_short(0);write_short(0);
message_end();
}
@afkmenusu(const iPlayer){
if(~get_user_flags(iPlayer) & AdminYetki){
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Sayın saygıdeger ^1%n ^4buraya girmen icin yetkin yetersiz",serverTag,iPlayer);
return;
}
new iMenu = menu_create(fmt("\r%s \y--> \wAfk Menusu^n\dSayfa:", serverTag), "@afkmenusu_");
for(new i=1; i <= MaxClients; i++) {
if(is_user_connected(i)){
if(i == iPlayer) continue;
menu_additem(iMenu,fmt("\y%n %s",i,isAfk[i] ? "\wAktif":""),fmt("%i",i));
}
}
menu_setprop(iMenu, MPROP_BACKNAME,"Önceki Sayfa"),menu_setprop(iMenu, MPROP_NEXTNAME,"Sonraki Sayfa"),menu_setprop(iMenu, MPROP_EXITNAME,"\wKapat");
menu_display(iPlayer, iMenu);
}
@afkmenusu_(const iPlayer,const iMenu, const iItem) {
if(iItem == MENU_EXIT) { menu_destroy(iMenu);return PLUGIN_HANDLED;}
new iData[6], iKey;
menu_item_getinfo(iMenu, iItem, _, iData, 5);
iKey = str_to_num(iData);
if(is_user_connected(iKey)){
if(isAfk[iKey]){
isAfk[iKey]=false;
AfkValue[iKey]=0;
@bBlindStop(iKey);
@AfkHudMesaggeOff(iKey);
remove_task(iKey+TASK_BILGI);
remove_task(iKey+TASK_BLIND);
remove_task(iKey+TASK_MANUAL_KICK);
@RemoveIcon(iKey);
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4%n ^1isimli oyuncu afk modundan cikardin",serverTag,iKey);
client_print_color(iKey, iKey, "^1[^3%s^1] ^4%n ^1isimli admin tarafindan afk modun deaktif edildi",serverTag,iPlayer);
}
else {
isAfk[iKey]=true;
@afk_oldur(iKey);
@bBlind(iKey,2.0);
@AfkHudMesagge(iKey);
@ShowIcon(iKey);
set_task(float(iCvars[2]), "@AfkModuBilgilendir", iKey+TASK_BILGI, .flags = "b");
if(iCvars[3] > 0) {
set_task(float(iCvars[3]), "@ManualAfkKick", iKey+TASK_MANUAL_KICK);
}
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4%n ^1isimli oyuncu afk moduna gecirildi",serverTag,iKey);
client_print_color(iKey, iKey, "^1[^3%s^1] ^4%n ^1isimli admin tarafindan afk moduna gecirildin",serverTag,iPlayer);
}
}
else client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Oyuncu oyundan cikmis",serverTag);
menu_destroy(iMenu);return PLUGIN_HANDLED;
}
@AfkModuBilgilendir(const iTaskim){
new iPlayer = iTaskim - TASK_BILGI;
if(!is_user_connected(iPlayer)) return;
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Suanda afk modun aktif ^1yazi yazamazsiniz ^3ve ^1dogunca otomatik oldurulursunuz",serverTag);
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Afk modundan cikmak icin ^3say /afk ^1yaziniz.",serverTag);
}
@AfkHudMesagge(iPlayer){
set_dhudmessage(255, 255, 255, -1.0, 0.30, 0, 6.0, 5.0);
show_dhudmessage(iPlayer, "AFK MODUN AKTIF !");
}
@AfkHudMesaggeOff(iPlayer){
set_dhudmessage(255, 212, 0, -1.0, 0.30, 0, 6.0, 5.0);
show_dhudmessage(iPlayer, "ARTIK AFK DEGILSINIZ. IYI EGLENCELER!");
}
@Hook_Say(const iPlayer){
static message[192];
read_args(message, 191);
remove_quotes(message);
if(message[0] == '/')
return PLUGIN_CONTINUE;
if(isAfk[iPlayer])
{
client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Afk modun aktif oldugu icin ^3yazi yazamazsiniz.",serverTag);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
@bBlind(const iPlayer, Float:punishPercentage) {
new blindness = 128 + floatround(128.0 * punishPercentage);
if(is_user_connected(iPlayer) && 1 <= iPlayer <= MaxClients) {
message_begin(MSG_ONE,get_user_msgid("ScreenFade"), {0,0,0}, iPlayer);
write_short((1<<0));
write_short((1<<0));
write_short((1<<2));
write_byte(150);
write_byte(0);
write_byte(0);
write_byte(blindness);
message_end();
}
}
@bBlindStop(const iPlayer) {
if(is_user_connected(iPlayer) && 1 <= iPlayer <= MaxClients) {
message_begin(MSG_ONE,get_user_msgid("ScreenFade"), {0,0,0}, iPlayer);
write_short(1<<12);
write_short(1<<8);
write_short((1<<1));
write_byte(0);
write_byte(0);
write_byte(0);
write_byte(255);
message_end();
}
}
bool:same_origin(const iPlayer){
new Float:isOrigin[3];
get_entvar(iPlayer, var_origin, isOrigin);
for(new i; i < 3; i++){
if(isOrigin[i] != iPlayerOrigin[iPlayer][i]){
return false;
}
}
return true;
}
@ShowIcon(iPlayer) {
if(!is_user_alive(iPlayer)) return;
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_PLAYERATTACHMENT);
write_byte(iPlayer);
write_coord(50); // Vertical offset (approx 50 units above center)
write_short(g_iSpriteIcon);
write_short(999); // Life (long enough to last until killed/removed)
message_end();
}
@RemoveIcon(iPlayer) {
// TE_PLAYERATTACHMENT cannot be explicitly removed easily without killing the entity or overwriting it.
// However, since we kill the player shortly after showing it (in manual AFK) or they die naturally, it clears.
// To force clear, we can try overwriting with a short life or invisible sprite, but usually death handles it.
// For safety in case they toggle off quickly:
if(is_user_connected(iPlayer)) {
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_KILLPLAYERATTACHMENTS);
write_byte(iPlayer);
message_end();
}
}