📄
در حال بارگذاری...
در حال بارگذاری محتوا...
0%
back
💻

Full Admin System

category: اسکریپت هاب نویسنده: Moha تاریخ: 2026-07-22 21:01:53 نوع: 💻 اسکریپت نسخه: v0.1 file: admin_system.pwn
8
👁️ بازدید
0
📥 دانلودها
💻
script
2026/07/24
📅 today
Full Admin System
این یک اسکریپت مدیریتی با ۶ سطح ادمینی برای سرورهای SA-MP است.

سطوح ادمینی:
Level 1: Moderator - دستورات پایه
Level 2: Senior Mod - دستورات متوسط
Level 3: Manager - دستورات پیشرفته
Level 4: Admin - دستورات کامل
Level 5: Head Admin - ریستارت سرور
Level 6: Owner - دسترسی کامل

دستورات مهم:
/adminlogin admin123 - ورود به پنل
/kick [id] [دلیل] - اخراج
/ban [id] [دلیل] - بن
/mute [id] [دقیقه] - میوت
/jail [id] [دقیقه] - زندان
/givemoney [id] [مقدار] - دادن پول
/setweather [id] - تغییر آب و هوا
/godmode - جاودانگی
/restart - ریستارت
/shutdown - خاموش کردن

سیستم‌های داخلی:
- Warn: ۳ اخطار = کیک خودکار
- Jail: زندان با شمارش معکوس
- Report: گزارش به ادمین‌ها
- Spectate: تماشای مخفیانه
- Ban: ذخیره در پوشه Bans/

نصب:
۱. فایل .pwn را کامپایل کنید
۲. در server.cfg: gamemode0 admin_system
۳. سرور را اجرا کنید
۴. با /adminlogin admin123 وارد شوید

مشکلات احتمالی:
- ذخیره‌سازی INI ممکن است باگ داشته باشد
- پسوردها به صورت متن ساده هستند
- بن فقط برای بازیکنان آنلاین است
- ممکن است باگ‌های دیگری وجود داشته باشد

پیشنهادات:
- استفاده از MySQL به جای INI
- هش کردن پسوردها
- تست کامل قبل از استفاده در سرور اصلی

نیازمندی‌ها:
- SA-MP 0.3.7+
- پلاگین sscanf2
- پلاگین zcmd

توجه: این اسکریپت نمونه است و ممکن است دارای باگ باشد.

اشتراک‌گذاری

🔒 برای دانلود این فایل باید وارد شوید
لطفاً ابتدا
یا اگر حساب ندارید، ثبت‌نام کنید
pawn
// ===================================================
//  ADMIN SYSTEM - Full Admin Script
//  Version: 0.1
//  For: SA-MP 0.3.7+
//  Author: Moha
// ===================================================

#include <a_samp>
#include <sscanf2>
#include <zcmd>

// ===================================================
//  DEFINES & ENUMS
// ===================================================

#define MAX_ADMIN_LEVEL 6
#define DIALOG_ADMIN_PANEL 5000
#define DIALOG_REPORT_PANEL 5001

// Colors
#define COLOR_RED       0xFF0000FF
#define COLOR_GREEN     0x00FF00FF
#define COLOR_YELLOW    0xFFFF00FF
#define COLOR_WHITE     0xFFFFFFFF
#define COLOR_BLUE      0x0066FFFF
#define COLOR_ORANGE    0xFF8C00FF
#define COLOR_PINK      0xFF69B4FF
#define COLOR_LIME      0x00FF80FF
#define COLOR_GREY      0x808080FF
#define COLOR_ADMIN     0x00FF80FF
#define COLOR_ADMIN_CMD 0xFFAA00FF

enum AdminLevels {
    LEVEL_PLAYER = 0,
    LEVEL_MODERATOR = 1,
    LEVEL_SENIOR_MOD = 2,
    LEVEL_MANAGER = 3,
    LEVEL_ADMIN = 4,
    LEVEL_HEAD_ADMIN = 5,
    LEVEL_OWNER = 6
}

enum PlayerData {
    AdminLevel,
    bool:LoggedIn,
    bool:Muted,
    bool:Frozen,
    bool:GodMode,
    bool:Invisible,
    bool:IsJailed,
    WarnCount,
    JailTime,
    Float:JailX,
    Float:JailY,
    Float:JailZ,
    bool:IsSpectating,
    SpectateTarget,
    bool:IsInAdminMode
}

// ===================================================
//  VARIABLES
// ===================================================

new PlayerInfo[MAX_PLAYERS][PlayerData];
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
new bool:IsAdminLogged[MAX_PLAYERS];

// ===================================================
//  STOCKS & FUNCTIONS
// ===================================================

stock GetAdminLevelName(level) {
    new names[][] = {
        "Player",
        "Moderator",
        "Senior Moderator",
        "Manager",
        "Administrator",
        "Head Administrator",
        "Owner"
    };
    return (level >= 0 && level <= 6) ? names[level] : "Unknown";
}

stock IsAdmin(playerid, level = 1) {
    if(!IsPlayerConnected(playerid)) return 0;
    return (PlayerInfo[playerid][AdminLevel] >= level);
}

stock IsPlayerLogged(playerid) {
    return PlayerInfo[playerid][LoggedIn];
}

stock GetPlayerNameEx(playerid) {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    return name;
}

stock SendAdminMessage(color, const message[], level = 1) {
    for(new i = 0; i < MAX_PLAYERS; i++) {
        if(IsPlayerConnected(i) && IsAdmin(i, level)) {
            SendClientMessage(i, color, message);
        }
    }
}

// ===================================================
//  ON PLAYER CONNECT
// ===================================================

public OnPlayerConnect(playerid) {
    // Reset all player data
    PlayerInfo[playerid][AdminLevel] = 0;
    PlayerInfo[playerid][LoggedIn] = false;
    PlayerInfo[playerid][Muted] = false;
    PlayerInfo[playerid][Frozen] = false;
    PlayerInfo[playerid][GodMode] = false;
    PlayerInfo[playerid][Invisible] = false;
    PlayerInfo[playerid][IsJailed] = false;
    PlayerInfo[playerid][WarnCount] = 0;
    PlayerInfo[playerid][JailTime] = 0;
    PlayerInfo[playerid][IsSpectating] = false;
    PlayerInfo[playerid][IsInAdminMode] = false;
    
    GetPlayerName(playerid, PlayerName[playerid], MAX_PLAYER_NAME);
    
    new msg[128];
    format(msg, sizeof(msg), "📥 %s has joined the server.", PlayerName[playerid]);
    SendAdminMessage(COLOR_GREY, msg, 0);
    
    return 1;
}

// ===================================================
//  ON PLAYER DISCONNECT
// ===================================================

public OnPlayerDisconnect(playerid, reason) {
    new msg[128];
    format(msg, sizeof(msg), "📤 %s has left the server.", PlayerName[playerid]);
    SendAdminMessage(COLOR_GREY, msg, 0);
    return 1;
}

// ===================================================
//  ON PLAYER TEXT (Anti-Spam & Mute)
// ===================================================

public OnPlayerText(playerid, text[]) {
    if(PlayerInfo[playerid][Muted]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You are muted! You cannot speak.");
        return 0;
    }
    return 1;
}

// ===================================================
//  ON PLAYER COMMAND (Admin Check)
// ===================================================

public OnPlayerCommandPerformed(playerid, cmdtext[], success) {
    if(!success) {
        SendClientMessage(playerid, COLOR_RED, "✖ Unknown command. Type /help for commands.");
        return 0;
    }
    return 1;
}

// ===================================================
//  ADMIN LOGIN SYSTEM
// ===================================================

CMD:adminlogin(playerid, params[]) {
    if(PlayerInfo[playerid][LoggedIn]) {
        SendClientMessage(playerid, COLOR_YELLOW, "⚠ You are already logged in as admin.");
        return 1;
    }
    
    new password[64];
    if(sscanf(params, "s[64]", password)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /adminlogin [password]");
        return 1;
    }
    
    // Simple password check (in real script, use hashed passwords)
    if(strcmp(password, "admin123", false) == 0) {
        PlayerInfo[playerid][LoggedIn] = true;
        PlayerInfo[playerid][AdminLevel] = 6; // Owner level
        IsAdminLogged[playerid] = true;
        
        SendClientMessage(playerid, COLOR_GREEN, "✔ You have been logged in as Admin!");
        SendClientMessage(playerid, COLOR_ADMIN, "🔰 Welcome to Admin Panel!");
        
        new msg[128];
        format(msg, sizeof(msg), "🔰 %s logged in as Admin (Level: %d)", PlayerName[playerid], PlayerInfo[playerid][AdminLevel]);
        SendAdminMessage(COLOR_ADMIN, msg, 1);
    } else {
        SendClientMessage(playerid, COLOR_RED, "✖ Wrong password!");
    }
    return 1;
}

CMD:adminlogout(playerid, params[]) {
    if(!PlayerInfo[playerid][LoggedIn]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You are not logged in as admin.");
        return 1;
    }
    
    PlayerInfo[playerid][LoggedIn] = false;
    IsAdminLogged[playerid] = false;
    SendClientMessage(playerid, COLOR_YELLOW, "⚠ You have been logged out from admin.");
    return 1;
}

// ===================================================
//  ADMIN LEVEL SYSTEM
// ===================================================

CMD:setadmin(playerid, params[]) {
    if(!IsAdmin(playerid, 3)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 3+ to use this command.");
        return 1;
    }
    
    new targetid, level;
    if(sscanf(params, "ud", targetid, level)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /setadmin [playerid] [level (1-6)]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(level < 0 || level > 6) {
        SendClientMessage(playerid, COLOR_RED, "✖ Invalid admin level. Must be between 1-6.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] == level) {
        SendClientMessage(playerid, COLOR_YELLOW, "⚠ Player already has this admin level.");
        return 1;
    }
    
    PlayerInfo[targetid][AdminLevel] = level;
    new msg[128];
    format(msg, sizeof(msg), "✔ %s has been promoted to %s (Level: %d)", 
        PlayerName[targetid], GetAdminLevelName(level), level);
    SendClientMessage(playerid, COLOR_GREEN, msg);
    
    format(msg, sizeof(msg), "🔰 %s assigned you to %s (Level: %d)", 
        PlayerName[playerid], GetAdminLevelName(level), level);
    SendClientMessage(targetid, COLOR_ADMIN, msg);
    
    format(msg, sizeof(msg), "🔰 %s set admin level of %s to %d", 
        PlayerName[playerid], PlayerName[targetid], level);
    SendAdminMessage(COLOR_ADMIN, msg, 1);
    
    return 1;
}

// ===================================================
//  KICK COMMAND
// ===================================================

CMD:kick(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 1+ to use this command.");
        return 1;
    }
    
    if(!IsPlayerLogged(playerid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Please login first: /adminlogin [password]");
        return 1;
    }
    
    new targetid, reason[64];
    if(sscanf(params, "us[64]", targetid, reason)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /kick [playerid] [reason]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(targetid == playerid) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot kick yourself.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] >= PlayerInfo[playerid][AdminLevel]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot kick higher or equal level admins.");
        return 1;
    }
    
    new msg[256];
    format(msg, sizeof(msg), "⛔ %s has been kicked by %s. Reason: %s", 
        PlayerName[targetid], PlayerName[playerid], reason);
    SendClientMessageToAll(COLOR_RED, msg);
    
    format(msg, sizeof(msg), "⛔ Admin %s kicked %s. Reason: %s", 
        PlayerName[playerid], PlayerName[targetid], reason);
    SendAdminMessage(COLOR_ADMIN, msg, 1);
    
    Kick(targetid);
    return 1;
}

// ===================================================
//  BAN COMMAND
// ===================================================

CMD:ban(playerid, params[]) {
    if(!IsAdmin(playerid, 2)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 2+ to use this command.");
        return 1;
    }
    
    if(!IsPlayerLogged(playerid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Please login first: /adminlogin [password]");
        return 1;
    }
    
    new targetid, reason[64];
    if(sscanf(params, "us[64]", targetid, reason)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /ban [playerid] [reason]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(targetid == playerid) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot ban yourself.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] >= PlayerInfo[playerid][AdminLevel]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot ban higher or equal level admins.");
        return 1;
    }
    
    // Save banned player info
    new file[64], ip[16], name[MAX_PLAYER_NAME];
    GetPlayerName(targetid, name, sizeof(name));
    GetPlayerIp(targetid, ip, sizeof(ip));
    format(file, sizeof(file), "Bans/%s.ini", name);
    
    new INI:banFile = INI_Open(file);
    INI_WriteString(banFile, "BannedBy", PlayerName[playerid]);
    INI_WriteString(banFile, "Reason", reason);
    INI_WriteString(banFile, "IP", ip);
    INI_WriteInt(banFile, "AdminLevel", PlayerInfo[targetid][AdminLevel]);
    INI_Close(banFile);
    
    new msg[256];
    format(msg, sizeof(msg), "🚫 %s has been banned by %s. Reason: %s", 
        PlayerName[targetid], PlayerName[playerid], reason);
    SendClientMessageToAll(COLOR_RED, msg);
    
    format(msg, sizeof(msg), "🚫 Admin %s banned %s. Reason: %s", 
        PlayerName[playerid], PlayerName[targetid], reason);
    SendAdminMessage(COLOR_ADMIN, msg, 1);
    
    Ban(targetid);
    return 1;
}

// ===================================================
//  UNBAN COMMAND
// ===================================================

CMD:unban(playerid, params[]) {
    if(!IsAdmin(playerid, 2)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 2+ to use this command.");
        return 1;
    }
    
    new name[64];
    if(sscanf(params, "s[64]", name)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /unban [playername]");
        return 1;
    }
    
    new file[64];
    format(file, sizeof(file), "Bans/%s.ini", name);
    
    if(!fexist(file)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not found in ban list.");
        return 1;
    }
    
    fremove(file);
    new msg[128];
    format(msg, sizeof(msg), "✔ %s has been unbanned.", name);
    SendClientMessage(playerid, COLOR_GREEN, msg);
    SendAdminMessage(COLOR_ADMIN, msg, 1);
    
    return 1;
}

// ===================================================
//  MUTE / UNMUTE
// ===================================================

CMD:mute(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 1+ to use this command.");
        return 1;
    }
    
    new targetid, minutes;
    if(sscanf(params, "uD", targetid, minutes)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /mute [playerid] [minutes]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] >= PlayerInfo[playerid][AdminLevel]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot mute higher or equal level admins.");
        return 1;
    }
    
    PlayerInfo[targetid][Muted] = true;
    new msg[128];
    format(msg, sizeof(msg), "🔇 %s has been muted for %d minutes by %s.", 
        PlayerName[targetid], minutes, PlayerName[playerid]);
    SendClientMessageToAll(COLOR_YELLOW, msg);
    
    format(msg, sizeof(msg), "🔇 You have been muted by %s for %d minutes.", 
        PlayerName[playerid], minutes);
    SendClientMessage(targetid, COLOR_RED, msg);
    
    return 1;
}

CMD:unmute(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 1+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /unmute [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(!PlayerInfo[targetid][Muted]) {
        SendClientMessage(playerid, COLOR_YELLOW, "⚠ Player is not muted.");
        return 1;
    }
    
    PlayerInfo[targetid][Muted] = false;
    new msg[128];
    format(msg, sizeof(msg), "🔊 %s has been unmuted by %s.", 
        PlayerName[targetid], PlayerName[playerid]);
    SendClientMessageToAll(COLOR_GREEN, msg);
    SendClientMessage(targetid, COLOR_GREEN, "✔ You have been unmuted.");
    
    return 1;
}

// ===================================================
//  FREEZE / UNFREEZE
// ===================================================

CMD:freeze(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 1+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /freeze [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] >= PlayerInfo[playerid][AdminLevel]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot freeze higher or equal level admins.");
        return 1;
    }
    
    TogglePlayerControllable(targetid, false);
    PlayerInfo[targetid][Frozen] = true;
    
    new msg[128];
    format(msg, sizeof(msg), "❄️ %s has been frozen by %s.", 
        PlayerName[targetid], PlayerName[playerid]);
    SendClientMessageToAll(COLOR_LIGHTBLUE, msg);
    
    return 1;
}

CMD:unfreeze(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 1+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /unfreeze [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(!PlayerInfo[targetid][Frozen]) {
        SendClientMessage(playerid, COLOR_YELLOW, "⚠ Player is not frozen.");
        return 1;
    }
    
    TogglePlayerControllable(targetid, true);
    PlayerInfo[targetid][Frozen] = false;
    
    new msg[128];
    format(msg, sizeof(msg), "🔥 %s has been unfrozen by %s.", 
        PlayerName[targetid], PlayerName[playerid]);
    SendClientMessageToAll(COLOR_GREEN, msg);
    
    return 1;
}

// ===================================================
//  WARN SYSTEM
// ===================================================

CMD:warn(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 1+ to use this command.");
        return 1;
    }
    
    new targetid, reason[64];
    if(sscanf(params, "us[64]", targetid, reason)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /warn [playerid] [reason]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] >= PlayerInfo[playerid][AdminLevel]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot warn higher or equal level admins.");
        return 1;
    }
    
    PlayerInfo[targetid][WarnCount]++;
    new msg[128];
    format(msg, sizeof(msg), "⚠ %s has been warned by %s. Reason: %s (Warnings: %d/3)", 
        PlayerName[targetid], PlayerName[playerid], reason, PlayerInfo[targetid][WarnCount]);
    SendClientMessageToAll(COLOR_YELLOW, msg);
    
    format(msg, sizeof(msg), "⚠ You have been warned by %s. Reason: %s", 
        PlayerName[playerid], reason);
    SendClientMessage(targetid, COLOR_RED, msg);
    
    // Auto-kick after 3 warnings
    if(PlayerInfo[targetid][WarnCount] >= 3) {
        format(msg, sizeof(msg), "⛔ %s has been kicked (3 warnings reached).", PlayerName[targetid]);
        SendClientMessageToAll(COLOR_RED, msg);
        Kick(targetid);
    }
    
    return 1;
}

CMD:clearwarns(playerid, params[]) {
    if(!IsAdmin(playerid, 2)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 2+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /clearwarns [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    PlayerInfo[targetid][WarnCount] = 0;
    new msg[128];
    format(msg, sizeof(msg), "✔ All warnings cleared for %s.", PlayerName[targetid]);
    SendClientMessage(playerid, COLOR_GREEN, msg);
    SendClientMessage(targetid, COLOR_GREEN, "✔ Your warnings have been cleared.");
    
    return 1;
}

// ===================================================
//  JAIL / UNJAIL
// ===================================================

CMD:jail(playerid, params[]) {
    if(!IsAdmin(playerid, 2)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 2+ to use this command.");
        return 1;
    }
    
    new targetid, minutes;
    if(sscanf(params, "uD", targetid, minutes)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /jail [playerid] [minutes]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(PlayerInfo[targetid][AdminLevel] >= PlayerInfo[playerid][AdminLevel]) {
        SendClientMessage(playerid, COLOR_RED, "✖ You cannot jail higher or equal level admins.");
        return 1;
    }
    
    // Save player's position
    GetPlayerPos(targetid, PlayerInfo[targetid][JailX], PlayerInfo[targetid][JailY], PlayerInfo[targetid][JailZ]);
    
    // Teleport to jail
    SetPlayerPos(targetid, 264.5208, 77.6391, 1001.0391); // LS Jail
    SetPlayerInterior(targetid, 6);
    SetPlayerVirtualWorld(targetid, 0);
    
    PlayerInfo[targetid][IsJailed] = true;
    PlayerInfo[targetid][JailTime] = minutes * 60;
    
    new msg[128];
    format(msg, sizeof(msg), "⛓️ %s has been jailed for %d minutes by %s.", 
        PlayerName[targetid], minutes, PlayerName[playerid]);
    SendClientMessageToAll(COLOR_ORANGE, msg);
    
    format(msg, sizeof(msg), "⛓️ You have been jailed by %s for %d minutes.", 
        PlayerName[playerid], minutes);
    SendClientMessage(targetid, COLOR_RED, msg);
    
    return 1;
}

CMD:unjail(playerid, params[]) {
    if(!IsAdmin(playerid, 2)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 2+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /unjail [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(!PlayerInfo[targetid][IsJailed]) {
        SendClientMessage(playerid, COLOR_YELLOW, "⚠ Player is not jailed.");
        return 1;
    }
    
    // Teleport back
    SetPlayerPos(targetid, PlayerInfo[targetid][JailX], PlayerInfo[targetid][JailY], PlayerInfo[targetid][JailZ]);
    SetPlayerInterior(targetid, 0);
    SetPlayerVirtualWorld(targetid, 0);
    
    PlayerInfo[targetid][IsJailed] = false;
    PlayerInfo[targetid][JailTime] = 0;
    
    new msg[128];
    format(msg, sizeof(msg), "🔓 %s has been unjailed by %s.", 
        PlayerName[targetid], PlayerName[playerid]);
    SendClientMessageToAll(COLOR_GREEN, msg);
    
    SendClientMessage(targetid, COLOR_GREEN, "✔ You have been released from jail.");
    
    return 1;
}

// ===================================================
//  SPECTATE MODE
// ===================================================

CMD:spectate(playerid, params[]) {
    if(!IsAdmin(playerid, 2)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 2+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /spectate [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(PlayerInfo[playerid][IsSpectating]) {
        // Stop spectating
        PlayerInfo[playerid][IsSpectating] = false;
        TogglePlayerSpectating(playerid, false);
        SetPlayerPos(playerid, 0.0, 0.0, 5.0);
        SendClientMessage(playerid, COLOR_GREEN, "✔ Spectating mode disabled.");
        return 1;
    }
    
    TogglePlayerSpectating(playerid, true);
    PlayerSpectatePlayer(playerid, targetid);
    PlayerInfo[playerid][IsSpectating] = true;
    PlayerInfo[playerid][SpectateTarget] = targetid;
    
    new msg[128];
    format(msg, sizeof(msg), "👁️ You are now spectating %s.", PlayerName[targetid]);
    SendClientMessage(playerid, COLOR_BLUE, msg);
    SendClientMessage(playerid, COLOR_YELLOW, "🔴 Type /spectate again to stop.");
    
    return 1;
}

// ===================================================
//  GIVE MONEY & SET MONEY
// ===================================================

CMD:givemoney(playerid, params[]) {
    if(!IsAdmin(playerid, 4)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 4+ to use this command.");
        return 1;
    }
    
    new targetid, amount;
    if(sscanf(params, "ud", targetid, amount)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /givemoney [playerid] [amount]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(amount < 1 || amount > 1000000) {
        SendClientMessage(playerid, COLOR_RED, "✖ Amount must be between 1 and 1,000,000.");
        return 1;
    }
    
    GivePlayerMoney(targetid, amount);
    new msg[128];
    format(msg, sizeof(msg), "✔ You gave $%d to %s.", amount, PlayerName[targetid]);
    SendClientMessage(playerid, COLOR_GREEN, msg);
    
    format(msg, sizeof(msg), "💰 Admin %s gave you $%d.", PlayerName[playerid], amount);
    SendClientMessage(targetid, COLOR_LIME, msg);
    
    return 1;
}

CMD:setmoney(playerid, params[]) {
    if(!IsAdmin(playerid, 4)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 4+ to use this command.");
        return 1;
    }
    
    new targetid, amount;
    if(sscanf(params, "ud", targetid, amount)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /setmoney [playerid] [amount]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(amount < 0 || amount > 10000000) {
        SendClientMessage(playerid, COLOR_RED, "✖ Amount must be between 0 and 10,000,000.");
        return 1;
    }
    
    ResetPlayerMoney(targetid);
    GivePlayerMoney(targetid, amount);
    
    new msg[128];
    format(msg, sizeof(msg), "✔ %s's money set to $%d.", PlayerName[targetid], amount);
    SendClientMessage(playerid, COLOR_GREEN, msg);
    
    format(msg, sizeof(msg), "💰 Admin %s set your money to $%d.", PlayerName[playerid], amount);
    SendClientMessage(targetid, COLOR_LIME, msg);
    
    return 1;
}

// ===================================================
//  GIVE WEAPON
// ===================================================

CMD:giveweapon(playerid, params[]) {
    if(!IsAdmin(playerid, 4)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 4+ to use this command.");
        return 1;
    }
    
    new targetid, weaponid, ammo;
    if(sscanf(params, "udd", targetid, weaponid, ammo)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /giveweapon [playerid] [weaponid] [ammo]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    if(weaponid < 0 || weaponid > 46) {
        SendClientMessage(playerid, COLOR_RED, "✖ Invalid weapon ID (0-46).");
        return 1;
    }
    
    GivePlayerWeapon(targetid, weaponid, ammo);
    new msg[128];
    format(msg, sizeof(msg), "✔ You gave weapon %d to %s.", weaponid, PlayerName[targetid]);
    SendClientMessage(playerid, COLOR_GREEN, msg);
    
    return 1;
}

CMD:resetweapons(playerid, params[]) {
    if(!IsAdmin(playerid, 3)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 3+ to use this command.");
        return 1;
    }
    
    new targetid;
    if(sscanf(params, "u", targetid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /resetweapons [playerid]");
        return 1;
    }
    
    if(!IsPlayerConnected(targetid)) {
        SendClientMessage(playerid, COLOR_RED, "✖ Player not connected.");
        return 1;
    }
    
    ResetPlayerWeapons(targetid);
    SendClientMessage(playerid, COLOR_GREEN, "✔ Weapons reset.");
    SendClientMessage(targetid, COLOR_RED, "🔫 Your weapons have been removed by admin.");
    
    return 1;
}

// ===================================================
//  WEATHER & TIME
// ===================================================

CMD:setweather(playerid, params[]) {
    if(!IsAdmin(playerid, 4)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 4+ to use this command.");
        return 1;
    }
    
    new weatherid;
    if(sscanf(params, "d", weatherid)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /setweather [weatherid (0-45)]");
        return 1;
    }
    
    if(weatherid < 0 || weatherid > 45) {
        SendClientMessage(playerid, COLOR_RED, "✖ Invalid weather ID (0-45).");
        return 1;
    }
    
    SetWeather(weatherid);
    new msg[128];
    format(msg, sizeof(msg), "🌤️ Admin %s changed weather to %d.", PlayerName[playerid], weatherid);
    SendClientMessageToAll(COLOR_LIGHTBLUE, msg);
    
    return 1;
}

CMD:settime(playerid, params[]) {
    if(!IsAdmin(playerid, 4)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 4+ to use this command.");
        return 1;
    }
    
    new hour, minute = 0;
    if(sscanf(params, "dD", hour, minute)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /settime [hour] [minute]");
        return 1;
    }
    
    if(hour < 0 || hour > 23 || minute < 0 || minute > 59) {
        SendClientMessage(playerid, COLOR_RED, "✖ Invalid time format.");
        return 1;
    }
    
    SetWorldTime(hour);
    new msg[128];
    format(msg, sizeof(msg), "🕐 Admin %s set time to %02d:%02d.", PlayerName[playerid], hour, minute);
    SendClientMessageToAll(COLOR_LIGHTBLUE, msg);
    
    return 1;
}

// ===================================================
//  ADMIN PANEL
// ===================================================

CMD:adminpanel(playerid, params[]) {
    if(!IsAdmin(playerid, 1)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You don't have access to admin panel.");
        return 1;
    }
    
    new dialog[1024];
    strcat(dialog, "🔰 Admin Panel\n\n");
    strcat(dialog, "1️⃣ Player Management\n");
    strcat(dialog, "2️⃣ Server Management\n");
    strcat(dialog, "3️⃣ Report System\n");
    strcat(dialog, "4️⃣ Admin List\n");
    strcat(dialog, "5️⃣ My Admin Info\n");
    
    ShowPlayerDialog(playerid, DIALOG_ADMIN_PANEL, DIALOG_STYLE_LIST, 
        "Admin Panel", dialog, "Select", "Close");
    
    return 1;
}

// ===================================================
//  DIALOG RESPONSE
// ===================================================

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
    if(!response) return 0;
    
    switch(dialogid) {
        case DIALOG_ADMIN_PANEL: {
            switch(listitem) {
                case 0: {
                    SendClientMessage(playerid, COLOR_LIGHTBLUE, "📋 Player Management Commands:");
                    SendClientMessage(playerid, -1, "/kick, /ban, /mute, /unmute, /freeze, /unfreeze");
                    SendClientMessage(playerid, -1, "/warn, /clearwarns, /jail, /unjail, /spectate");
                }
                case 1: {
                    SendClientMessage(playerid, COLOR_LIGHTBLUE, "⚙️ Server Management Commands:");
                    SendClientMessage(playerid, -1, "/setweather, /settime, /giveweapon, /resetweapons");
                    SendClientMessage(playerid, -1, "/givemoney, /setmoney");
                }
                case 2: {
                    ShowReportPanel(playerid);
                }
                case 3: {
                    ShowAdminList(playerid);
                }
                case 4: {
                    new msg[128];
                    format(msg, sizeof(msg), "🔰 Your Admin Level: %d (%s)", 
                        PlayerInfo[playerid][AdminLevel], 
                        GetAdminLevelName(PlayerInfo[playerid][AdminLevel]));
                    SendClientMessage(playerid, COLOR_ADMIN, msg);
                }
            }
        }
    }
    return 1;
}

stock ShowAdminList(playerid) {
    new dialog[1024];
    strcat(dialog, "👑 Online Admins\n\n");
    
    new count = 0;
    for(new i = 0; i < MAX_PLAYERS; i++) {
        if(IsPlayerConnected(i) && IsAdmin(i, 1)) {
            new line[64];
            format(line, sizeof(line), "%s (Level: %d)\n", 
                PlayerName[i], PlayerInfo[i][AdminLevel]);
            strcat(dialog, line);
            count++;
        }
    }
    
    if(count == 0) {
        strcat(dialog, "No admins online.");
    }
    
    ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_LIST, 
        "Admin List", dialog, "OK", "");
}

stock ShowReportPanel(playerid) {
    ShowPlayerDialog(playerid, DIALOG_REPORT_PANEL, DIALOG_STYLE_INPUT,
        "📝 Report System",
        "Enter your report:",
        "Send", "Cancel");
}

// ===================================================
//  REPORT COMMAND (For Players)
// ===================================================

CMD:report(playerid, params[]) {
    if(sscanf(params, "s[128]", params)) {
        SendClientMessage(playerid, COLOR_YELLOW, "Usage: /report [message]");
        return 1;
    }
    
    new msg[256];
    format(msg, sizeof(msg), "📝 Report from %s: %s", PlayerName[playerid], params);
    SendAdminMessage(COLOR_PINK, msg, 1);
    SendAdminMessage(COLOR_PINK, "Use /handle to view all reports", 1);
    
    SendClientMessage(playerid, COLOR_GREEN, "✔ Your report has been sent to admins.");
    return 1;
}

// ===================================================
//  SERVERSIDE COMMANDS (Level 5+)
// ===================================================

CMD:restart(playerid, params[]) {
    if(!IsAdmin(playerid, 5)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 5+ to use this command.");
        return 1;
    }
    
    SendClientMessageToAll(COLOR_RED, "⚠️ Server is restarting in 5 seconds...");
    SetTimer("ServerRestart", 5000, false);
    return 1;
}

forward ServerRestart();
public ServerRestart() {
    SendRconCommand("gmx");
}

CMD:shutdown(playerid, params[]) {
    if(!IsAdmin(playerid, 6)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 6 to use this command.");
        return 1;
    }
    
    SendClientMessageToAll(COLOR_RED, "⚠️ Server is shutting down...");
    SetTimer("ServerShutdown", 3000, false);
    return 1;
}

forward ServerShutdown();
public ServerShutdown() {
    SendRconCommand("exit");
}

// ===================================================
//  GODMODE & INVISIBLE (Level 6+)
// ===================================================

CMD:godmode(playerid, params[]) {
    if(!IsAdmin(playerid, 6)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 6 to use this command.");
        return 1;
    }
    
    PlayerInfo[playerid][GodMode] = !PlayerInfo[playerid][GodMode];
    
    new msg[128];
    format(msg, sizeof(msg), "⭐ Godmode %s.", PlayerInfo[playerid][GodMode] ? "Enabled" : "Disabled");
    SendClientMessage(playerid, COLOR_ADMIN, msg);
    return 1;
}

CMD:invisible(playerid, params[]) {
    if(!IsAdmin(playerid, 6)) {
        SendClientMessage(playerid, COLOR_RED, "✖ You need admin level 6 to use this command.");
        return 1;
    }
    
    PlayerInfo[playerid][Invisible] = !PlayerInfo[playerid][Invisible];
    
    new color = PlayerInfo[playerid][Invisible] ? COLOR_GREY : COLOR_WHITE;
    new msg[128];
    format(msg, sizeof(msg), "👻 Invisible %s.", PlayerInfo[playerid][Invisible] ? "Enabled" : "Disabled");
    SendClientMessage(playerid, color, msg);
    return 1;
}

// ===================================================
//  ON PLAYER SPAWN (Jail Check)
// ===================================================

public OnPlayerSpawn(playerid) {
    if(PlayerInfo[playerid][IsJailed]) {
        SetPlayerPos(playerid, 264.5208, 77.6391, 1001.0391);
        SetPlayerInterior(playerid, 6);
        SendClientMessage(playerid, COLOR_RED, "⛓️ You are jailed! You cannot escape.");
        return 0;
    }
    return 1;
}

// ===================================================
//  TIMER FOR JAIL COUNTDOWN
// ===================================================

forward OnJailTimer();
public OnJailTimer() {
    for(new i = 0; i < MAX_PLAYERS; i++) {
        if(IsPlayerConnected(i) && PlayerInfo[i][IsJailed]) {
            if(PlayerInfo[i][JailTime] > 0) {
                PlayerInfo[i][JailTime]--;
                
                // Show timer every 30 seconds
                if(PlayerInfo[i][JailTime] % 30 == 0) {
                    new msg[64];
                    format(msg, sizeof(msg), "⏱️ Jail time remaining: %d seconds", PlayerInfo[i][JailTime]);
                    SendClientMessage(i, COLOR_ORANGE, msg);
                }
            } else {
                // Auto unjail
                new msg[128];
                format(msg, sizeof(msg), "🔓 %s has been automatically unjailed.", PlayerName[i]);
                SendClientMessageToAll(COLOR_GREEN, msg);
                
                SetPlayerPos(i, PlayerInfo[i][JailX], PlayerInfo[i][JailY], PlayerInfo[i][JailZ]);
                SetPlayerInterior(i, 0);
                PlayerInfo[i][IsJailed] = false;
                SendClientMessage(i, COLOR_GREEN, "✔ You have been released from jail.");
            }
        }
    }
    return 1;
}

// ===================================================
//  ON GAMEMODE INIT
// ===================================================

public OnGameModeInit() {
    SetTimer("OnJailTimer", 1000, true); // Jail timer (1 second)
    SendRconCommand("hostname SA-MP: Full Admin System");
    return 1;
}

// ===================================================
//  END OF SCRIPT
// ===================================================
back