#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <fun>
#include <nvault>

// Forward declaration to prevent compiler issues on certain AMXX setups
#if !defined get_time_unix
native get_time_unix();
#endif

#define PLAYER_BOOST 1.03
#define ADMIN_BOOST 1.1
#define FOUNDER_BOOST 1.3

#define PLAYER_PUSH 97.1
#define ADMIN_PUSH 99.2
#define FOUNDER_PUSH 101.3

#define PLAYER_MAX_SPEED 107.0
#define PLAYER_ABSOLUTE_MAX 800.0

#define ADMIN_MAX_SPEED 111.0
#define ADMIN_ABSOLUTE_MAX 1000.0

#define FOUNDER_MAX_SPEED 117.0
#define FOUNDER_ABSOLUTE_MAX 1250.0

#define PLAYER_SPEED_REDUCTION 0.6
#define ADMIN_SPEED_REDUCTION 0.7
#define FOUNDER_SPEED_REDUCTION 0.8

#define PLUGIN "LN Advanced System"
#define VERSION "5.6-STABLE"
#define AUTHOR "LN Developer & Bolt (Fixed)"

enum {
    ADMIN_ACTION_NONE = 0,
    ADMIN_ACTION_SET_Jreck,
    ADMIN_ACTION_SET_SPEED,
    ADMIN_ACTION_SET_GRAVITY,
    ADMIN_ACTION_SET_NAME
};

// Player data
new g_iJreck[33]
new g_iDailyDay[33]
new Float:g_fLastBonus[33]
new Float:g_fLastVipTest[33]
new bool:g_bVipActive[33]
new Float:g_fVipEndTime[33]
new g_iPlayerLanguage[33]

new g_iCurrentSkinView[33]
new g_iCurrentWingsView[33]
new g_iAdminPanelTarget[33]
new g_iAdminAction[33]
new g_iPlayerListPage[33]

new g_iActiveSkin[33]
new g_iActiveWings[33]
new g_bOwnedSkin[33][6]
new g_bOwnedWings[33][3]
new g_iWingsEntity[33]

new g_iKills[33]
new g_iDeaths[33]
new g_iTotalPlayTimeSeconds[33]
new g_iTotalJreckEarned[33]

new bool:g_canBoost[33] = true
new Float:g_currentBoostMultiplier[33]
new bool:g_boostEnabled[33] = true

new g_syncNewHud
new g_vault

new g_szSkinModels[6][64] = {
    "models/player/pixel_mario/pixel_mario.mdl",
    "models/player/at_adam/at_adam.mdl",
    "models/player/seytan/seytan.mdl",
    "models/player/anime/anime.mdl",
    "models/player/tavsan_kiz/tavsan_kiz.mdl",
    ""
}

new g_szWingsModels[3][64] = {
    "",
    "models/wings/beyaz_kanat/beyaz_kanat.mdl",
    "models/wings/siyah_kanat/siyah_kanat.mdl"
}

// --- LANGUAGE ARRAYS (DECLARED HERE, INITIALIZED IN plugin_init) ---
new g_szMenuBack[6][32];
new g_szMenuNext[6][32];
new g_szMenuExit[6][32];
new g_szMenuWarning[6][128];
new g_szMainMenuTitle[6][128];
new g_szMainMenuItems[6][5][64];
new g_szSkinNames[6][6][64];
new g_szWingsNames[6][3][64];
new g_szBoostMenuTitle[6][64];
new g_szBoostMenuItems[6][2][64];
new g_szBoostSkinMenuTitle[6][64];
new g_szBoostWingsMenuTitle[6][64];
new g_szDetailMenuTitle[6][64];
new g_szDetailStats[6][5][64];
new g_szMenuBuy[6][64];
new g_szMenuSell[6][32];
new g_szMenuActivate[6][32];
new g_szMenuDeactivate[6][32];
new g_szMenuStateActive[6][32];
new g_szSellConfirmTitle[6][128];
new g_szSellConfirmInfo[6][128];
new g_szSellConfirmYes[6][32];
new g_szSellConfirmNo[6][32];
new g_szChatMessages[6][13][192];
new g_szAdminPlayerListTitle[6][64];
new g_szAdminPlayerSettingsTitle[6][128];
new g_szAdminPlayerSettingsItems[6][4][64];
new g_szAdminChatPrompt[6][5][128];
new g_szHudLabels[6][8][32];
new g_szVipStatus[6][2][32];

new g_iSkinPrices[6] = {150, 420, 600, 800, 1000, 0};
new g_iWingsPrices[3] = {0, 250, 300};

stock client_print_lang(const id, const print_type, const message[], any:...) {
    new szBuffer[256];
    vformat(szBuffer, charsmax(szBuffer), message, 4);
    if (id > 0 && is_user_connected(id)) {
        client_print(id, print_type, szBuffer);
    } else if (id == 0) {
        client_print(0, print_type, szBuffer);
    }
}

public plugin_precache() {
    for(new i = 0; i < 5; i++) {
        if(strlen(g_szSkinModels[i]) > 0) {
            precache_model(g_szSkinModels[i]);
        }
    }
    for(new i = 1; i < 3; i++) {
        if(strlen(g_szWingsModels[i]) > 0) {
            precache_model(g_szWingsModels[i]);
        }
    }
}
public initialize_languages() {
   
}

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    initialize_languages();

    register_clcmd("say /ln", "cmd_main_menu")
    register_clcmd("say_team /ln", "cmd_main_menu")
    register_clcmd("say /bs", "cmd_daily_bonus")
    register_clcmd("say_team /bs", "cmd_daily_bonus")
    register_clcmd("say /bonus", "cmd_daily_bonus")
    register_clcmd("say_team /bonus", "cmd_daily_bonus")
    register_clcmd("say /viptest", "cmd_vip_test")
    register_clcmd("say_team /viptest", "cmd_vip_test")
    register_clcmd("say /yk", "cmd_show_gravity")
    register_clcmd("say_team /yk", "cmd_show_gravity")

    register_event("DeathMsg", "event_death", "a")
    register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
    register_forward(FM_ClientCommand, "fw_ClientCommand")
    RegisterHam(Ham_Touch, "player", "player_touch_ground")

    g_syncNewHud = CreateHudSyncObj()
    g_vault = nvault_open("ln_player_data")

    set_task(600.0, "task_jreck_reward", _, _, _, "b")
    set_task(1.0, "task_update_new_hud", _, _, _, "b")
    set_task(1.0, "task_update_playtime", _, _, _, "b")
    set_task(1.0, "task_regeneration", _, _, _, "b")

    register_menu("LN Main Menu", -1, "menu_main_handler")
    register_menu("Boost Menu", -1, "menu_boost_handler")
    register_menu("Boost Skin Menu", -1, "menu_boost_skin_handler")
    register_menu("Boost Wings Menu", -1, "menu_boost_wings_handler")
    register_menu("Skin Detail Menu", -1, "menu_skin_detail_handler")
    register_menu("Wings Detail Menu", -1, "menu_wings_detail_handler")
    register_menu("Language Menu", -1, "menu_language_handler")
    register_menu("Sell Confirmation", -1, "menu_sell_confirmation");
    register_menu("Admin Player List", -1, "menu_admin_player_list_handler");
    register_menu("Admin Player Settings", -1, "menu_admin_pset_handler");
}

public plugin_end() {
    if(g_vault) nvault_close(g_vault)
}

public client_putinserver(id) {
    reset_player_data(id)
    load_player_data(id)
}

public client_disconnected(id) {
    save_player_data(id)
    if (is_valid_ent(g_iWingsEntity[id])) {
        remove_entity(g_iWingsEntity[id]);
        g_iWingsEntity[id] = 0;
    }
}

public client_spawn(id) {
    if(!is_user_alive(id)) return;
    set_task(0.1, "apply_all_effects", id);
}

public reset_player_data(id) {
    g_iJreck[id] = 0
    g_iDailyDay[id] = 0
    g_fLastBonus[id] = 0.0
    g_fLastVipTest[id] = 0.0
    g_bVipActive[id] = false
    g_fVipEndTime[id] = 0.0
    g_iPlayerLanguage[id] = 0

    g_iActiveSkin[id] = 5
    g_iActiveWings[id] = 0
    g_iWingsEntity[id] = 0

    g_iKills[id] = 0
    g_iDeaths[id] = 0
    g_iTotalPlayTimeSeconds[id] = 0
    g_iTotalJreckEarned[id] = 0

    g_iAdminAction[id] = ADMIN_ACTION_NONE
    g_iAdminPanelTarget[id] = 0
    g_iPlayerListPage[id] = 0

    for(new i = 0; i < 6; i++) g_bOwnedSkin[id][i] = false;
    for(new i = 0; i < 3; i++) g_bOwnedWings[id][i] = false;

    g_bOwnedSkin[id][5] = true
    g_bOwnedWings[id][0] = true

    g_canBoost[id] = true
    g_currentBoostMultiplier[id] = 0.0
    g_boostEnabled[id] = true
}

public save_player_data(id) {
    if(!is_user_connected(id) || !g_vault) return;
    new szAuthId[32], szKey[64], szData[512];
    get_user_authid(id, szAuthId, charsmax(szAuthId));
    if(szAuthId[0] == EOS) return;

    new szOwnedSkins[7], szOwnedWings[4];
    for(new i = 0; i < 6; i++) szOwnedSkins[i] = g_bOwnedSkin[id][i] ? '1' : '0';
    szOwnedSkins[6] = EOS;
    for(new i = 0; i < 3; i++) szOwnedWings[i] = g_bOwnedWings[id][i] ? '1' : '0';
    szOwnedWings[3] = EOS;

    formatex(szData, charsmax(szData),
        "%d|%d|%f|%f|%d|%f|%d|%s|%s|%d|%d|%d|%d|%d|%d",
        g_iJreck[id],
        g_iDailyDay[id],
        g_fLastBonus[id],
        g_fLastVipTest[id],
        g_bVipActive[id],
        g_fVipEndTime[id],
        g_iPlayerLanguage[id],
        szOwnedSkins,
        szOwnedWings,
        g_iActiveSkin[id],
        g_iActiveWings[id],
        g_iKills[id],
        g_iDeaths[id],
        g_iTotalPlayTimeSeconds[id],
        g_iTotalJreckEarned[id]
    );

    formatex(szKey, charsmax(szKey), "%s_data", szAuthId);
    nvault_set(g_vault, szKey, szData);
}

public load_player_data(id) {
    if(!is_user_connected(id) || !g_vault) return;
    new szAuthId[32], szKey[64], szData[512];
    get_user_authid(id, szAuthId, charsmax(szAuthId));
    if(szAuthId[0] == EOS) return;

    formatex(szKey, charsmax(szKey), "%s_data", szAuthId);
    if(nvault_get(g_vault, szKey, szData, charsmax(szData))) {
        new szArg[15][32];
        parse(szData,
            szArg[0], 31, szArg[1], 31, szArg[2], 31, szArg[3], 31,
            szArg[4], 31, szArg[5], 31, szArg[6], 31, szArg[7], 31,
            szArg[8], 31, szArg[9], 31, szArg[10], 31, szArg[11], 31,
            szArg[12], 31, szArg[13], 31, szArg[14], 31,
            '|'
        );

        g_iJreck[id] = str_to_num(szArg[0]);
        g_iDailyDay[id] = str_to_num(szArg[1]);
        g_fLastBonus[id] = str_to_float(szArg[2]);
        g_fLastVipTest[id] = str_to_float(szArg[3]);
        g_bVipActive[id] = bool:str_to_num(szArg[4]);
        g_fVipEndTime[id] = str_to_float(szArg[5]);
        g_iPlayerLanguage[id] = str_to_num(szArg[6]);

        for(new i = 0; i < 6; i++) g_bOwnedSkin[id][i] = (szArg[7][i] == '1');
        for(new i = 0; i < 3; i++) g_bOwnedWings[id][i] = (szArg[8][i] == '1');

        g_iActiveSkin[id] = str_to_num(szArg[9]);
        g_iActiveWings[id] = str_to_num(szArg[10]);
        g_iKills[id] = str_to_num(szArg[11]);
        g_iDeaths[id] = str_to_num(szArg[12]);
        g_iTotalPlayTimeSeconds[id] = str_to_num(szArg[13]);
        g_iTotalJreckEarned[id] = str_to_num(szArg[14]);
    }
}
public cmd_main_menu(id) {
    show_main_menu(id);
    return PLUGIN_HANDLED;
}

public show_main_menu(id) {
    new lang = g_iPlayerLanguage[id]
    new szMenu[1024]
    new len = 0

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", g_szMainMenuTitle[lang])

    new menuItems = 4
    if(get_user_flags(id) & ADMIN_KICK) menuItems = 5

    for(new i = 0; i < menuItems; i++) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w%d. \d%s^n", i+1, g_szMainMenuItems[lang][i])
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\yJreck: \w%d", g_iJreck[id])

    if(g_bVipActive[id]) {
        new remainingTime = floatround(g_fVipEndTime[id] - get_gametime())
        new hours = remainingTime / 3600
        new minutes = (remainingTime % 3600) / 60
        len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\rVIP: \w%dh %dm", hours, minutes)
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n^n\w0. \d%s", g_szMenuExit[lang])

    show_menu(id, -1, szMenu, -1, "LN Main Menu")
}

public menu_main_handler(id, menu, item) {
    if (item == 9) return PLUGIN_HANDLED; // Exit

    switch(item) {
        case 0: show_boost_menu(id)
        case 1: handle_daily_bonus(id)
        case 2: handle_vip_test(id)
        case 3: show_language_menu(id)
        case 4: {
            if(get_user_flags(id) & ADMIN_KICK) {
                g_iPlayerListPage[id] = 0;
                show_admin_player_list(id)
            }
        }
    }
    return PLUGIN_HANDLED
}

public show_boost_menu(id) {
    new lang = g_iPlayerLanguage[id]
    new szMenu[512]
    new len = 0

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", g_szBoostMenuTitle[lang])

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. \d%s^n", g_szBoostMenuItems[lang][0])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. \d%s^n", g_szBoostMenuItems[lang][1])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. \d%s", g_szMenuBack[lang])

    show_menu(id, MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_2, szMenu, -1, "Boost Menu")
}

public menu_boost_handler(id, menu, item) {
    switch(item) {
        case 0: show_boost_skin_menu(id)
        case 1: show_boost_wings_menu(id)
        case 9: show_main_menu(id)
    }
    return PLUGIN_HANDLED
}
public show_boost_skin_menu(id) {
    new lang = g_iPlayerLanguage[id]
    new szMenu[1024]
    new len = 0

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", g_szBoostSkinMenuTitle[lang])
    len += formatex(szMenu[len], charsmax(szMenu) - len, g_szMenuWarning[lang])

    for(new i = 0; i < 5; i++) {
        new szStatus[64], szActive[64]

        if(g_bOwnedSkin[id][i]) {
            formatex(szStatus, charsmax(szStatus), "\r%s", g_szMenuSell[lang])
        } else {
            formatex(szStatus, charsmax(szStatus), "\w%d Jreck", g_iSkinPrices[i])
        }

        if(g_iActiveSkin[id] == i) {
            formatex(szActive, charsmax(szActive), " \y[%s]", g_szMenuStateActive[lang])
        } else {
            szActive[0] = EOS;
        }

        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w%d. \d%s - %s%s^n", i+1, g_szSkinNames[lang][i], szStatus, szActive)
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. %s", g_szMenuBack[lang])

    show_menu(id, -1, szMenu, -1, "Boost Skin Menu")
}

public menu_boost_skin_handler(id, menu, item) {
    if(item == 9) {
        show_boost_menu(id)
        return PLUGIN_HANDLED
    }

    if(item >= 0 && item <= 4) {
        new skin_index = item;
        show_skin_detail_menu(id, skin_index)
    }

    return PLUGIN_HANDLED
}

public show_skin_detail_menu(id, skin_id) {
    g_iCurrentSkinView[id] = skin_id
    g_iCurrentWingsView[id] = -1
    new lang = g_iPlayerLanguage[id]
    new szMenu[1024], szTitle[128], szMaxHealth[32]
    new len = 0

    formatex(szTitle, charsmax(szTitle), g_szDetailMenuTitle[lang], g_szSkinNames[lang][skin_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", szTitle)

    new healthRegen[5] = {1, 2, 10, 15, 30}
    new armorRegen[5] = {1, 2, 10, 15, 30}
    new maxHealth[5] = {110, 120, 200, 230, 250}
    new jumpSpeed[5] = {10, 40, 60, 80, 0}
    new Float:gravityMult[5] = {1.0, 0.95, 0.90, 0.85, 0.80}

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w--------------------------------------------^n")
    new szStatLine[128]
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][0], healthRegen[skin_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][1], armorRegen[skin_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szMaxHealth, charsmax(szMaxHealth), "%d", maxHealth[skin_id])
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][2], szMaxHealth)
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][3], jumpSpeed[skin_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][4], gravityMult[skin_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w--------------------------------------------^n^n")

    if(g_bOwnedSkin[id][skin_id]) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. %s^n", g_szMenuSell[lang])
        if(g_iActiveSkin[id] == skin_id) {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. %s^n", g_szMenuDeactivate[lang])
        } else {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. %s^n", g_szMenuActivate[lang])
        }
    } else {
        new szBuyText[128]
        formatex(szBuyText, charsmax(szBuyText), g_szMenuBuy[lang], g_iSkinPrices[skin_id])
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. %s^n", szBuyText)
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. %s", g_szMenuBack[lang])
    show_menu(id, MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_2, szMenu, -1, "Skin Detail Menu")
}

public menu_skin_detail_handler(id, menu, item) {
    new skin_id = g_iCurrentSkinView[id];
    new lang = g_iPlayerLanguage[id];

    switch(item) {
        case 0: // Buy/Sell (Key 1)
        {
            if(!g_bOwnedSkin[id][skin_id]) { // Buy
                if(g_iJreck[id] >= g_iSkinPrices[skin_id]) {
                    g_iJreck[id] -= g_iSkinPrices[skin_id];
                    g_bOwnedSkin[id][skin_id] = true;
                    client_print_lang(id, print_chat, g_szChatMessages[lang][0], g_szSkinNames[lang][skin_id]);
                    new szName[32]; get_user_name(id, szName, charsmax(szName));
                    client_print_lang(0, print_chat, g_szChatMessages[lang][5], szName, g_szSkinNames[lang][skin_id], g_iSkinPrices[skin_id]);
                } else {
                    new neededJreck = g_iSkinPrices[skin_id] - g_iJreck[id];
                    client_print_lang(id, print_chat, g_szChatMessages[lang][1], neededJreck);
                }
            } else { // Sell
                new szMenu[512], szTitle[128]; new len = 0;
                formatex(szTitle, charsmax(szTitle), g_szSellConfirmTitle[lang], g_szSkinNames[lang][skin_id]);
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", szTitle);
                new Float:sellPrice = float(g_iSkinPrices[skin_id]) / 2.0;
                len += formatex(szMenu[len], charsmax(szMenu) - len, g_szSellConfirmInfo[lang], g_iJreck[id], sellPrice);
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. %s^n", g_szSellConfirmYes[lang]);
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. %s^n", g_szSellConfirmNo[lang]);
                show_menu(id, MENU_KEY_1 | MENU_KEY_2, szMenu, -1, "Sell Confirmation");
                return PLUGIN_HANDLED;
            }
        }
        case 1: // Activate/Deactivate (Key 2)
        {
            if(g_bOwnedSkin[id][skin_id]) {
                if(g_iActiveSkin[id] == skin_id) {
                    g_iActiveSkin[id] = 5; // Deactivate to "None"
                    client_print_lang(id, print_chat, g_szChatMessages[lang][3], g_szSkinNames[lang][skin_id]);
                } else {
                    g_iActiveSkin[id] = skin_id; // Activate
                    client_print_lang(id, print_chat, g_szChatMessages[lang][2], g_szSkinNames[lang][skin_id]);
                }
                apply_all_effects(id);
            }
        }
        case 9: // Back (Key 0)
        {
            show_boost_skin_menu(id);
            return PLUGIN_HANDLED;
        }
    }
    if(item != 9) show_skin_detail_menu(id, skin_id);
    return PLUGIN_HANDLED;
}

public menu_sell_confirmation(id, menu, item) {
    new skin_id = g_iCurrentSkinView[id];
    new wings_id = g_iCurrentWingsView[id];
    new lang = g_iPlayerLanguage[id];

    if(item == 0) { // Yes
        if(skin_id != -1) {
            new Float:sellPrice = float(g_iSkinPrices[skin_id]) / 2.0;
            g_iJreck[id] += floatround(sellPrice);
            g_bOwnedSkin[id][skin_id] = false;
            if(g_iActiveSkin[id] == skin_id) g_iActiveSkin[id] = 5;
            client_print_lang(id, print_chat, g_szChatMessages[lang][4], g_szSkinNames[lang][skin_id], sellPrice);
            apply_all_effects(id);
            show_skin_detail_menu(id, skin_id);
        } else if (wings_id != -1) {
            new Float:sellPrice = float(g_iWingsPrices[wings_id]) / 2.0;
            g_iJreck[id] += floatround(sellPrice);
            g_bOwnedWings[id][wings_id] = false;
            if(g_iActiveWings[id] == wings_id) g_iActiveWings[id] = 0;
            client_print_lang(id, print_chat, g_szChatMessages[lang][4], g_szWingsNames[lang][wings_id], sellPrice);
            apply_all_effects(id);
            show_wings_detail_menu(id, wings_id);
        }
    } else { // No
        if(skin_id != -1) show_skin_detail_menu(id, skin_id);
        else if(wings_id != -1) show_wings_detail_menu(id, wings_id);
    }
    g_iCurrentSkinView[id] = -1;
    g_iCurrentWingsView[id] = -1;
    return PLUGIN_HANDLED;
}
public show_boost_wings_menu(id) {
    new lang = g_iPlayerLanguage[id]
    new szMenu[1024]
    new len = 0

    g_iCurrentSkinView[id] = -1

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", g_szBoostWingsMenuTitle[lang])
    len += formatex(szMenu[len], charsmax(szMenu) - len, g_szMenuWarning[lang])

    for(new i = 1; i < 3; i++) {
        new szStatus[64], szActive[64]
        if(g_bOwnedWings[id][i]) {
            formatex(szStatus, charsmax(szStatus), "\r%s", g_szMenuSell[lang])
        } else {
            formatex(szStatus, charsmax(szStatus), "\w%d Jreck", g_iWingsPrices[i])
        }
        if(g_iActiveWings[id] == i) {
            formatex(szActive, charsmax(szActive), " \y[%s]", g_szMenuStateActive[lang])
        } else {
            szActive[0] = EOS;
        }
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w%d. \d%s - %s%s^n", i, g_szWingsNames[lang][i], szStatus, szActive)
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. %s", g_szMenuBack[lang])
    show_menu(id, -1, szMenu, -1, "Boost Wings Menu")
}

public menu_boost_wings_handler(id, menu, item) {
    if(item == 9) {
        show_boost_menu(id)
        return PLUGIN_HANDLED
    }
    if(item >= 0 && item <= 1) {
        new wings_index = item + 1;
        show_wings_detail_menu(id, wings_index)
    }
    return PLUGIN_HANDLED
}

public show_wings_detail_menu(id, wings_id) {
    g_iCurrentWingsView[id] = wings_id
    g_iCurrentSkinView[id] = -1
    new lang = g_iPlayerLanguage[id]
    new szMenu[1024], szTitle[128], szMaxHealth[32]
    new len = 0

    formatex(szTitle, charsmax(szTitle), g_szDetailMenuTitle[lang], g_szWingsNames[lang][wings_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", szTitle)

    new healthRegen[3] = {0, 5, 15}
    new armorRegen[3] = {0, 5, 15}
    new maxHealthBonus[3] = {0, 5, 15}
    new jumpSpeed[3] = {0, 15, 30}
    new Float:gravityMult[3] = {1.0, 0.90, 0.85}

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w--------------------------------------------^n")
    new szStatLine[128]
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][0], healthRegen[wings_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][1], armorRegen[wings_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szMaxHealth, charsmax(szMaxHealth), "+%d", maxHealthBonus[wings_id])
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][2], szMaxHealth)
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][3], jumpSpeed[wings_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    formatex(szStatLine, charsmax(szStatLine), g_szDetailStats[lang][4], gravityMult[wings_id])
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s^n", szStatLine)
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w--------------------------------------------^n^n")

    if(g_bOwnedWings[id][wings_id]) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. %s^n", g_szMenuSell[lang])
        if(g_iActiveWings[id] == wings_id) {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. %s^n", g_szMenuDeactivate[lang])
        } else {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. %s^n", g_szMenuActivate[lang])
        }
    } else {
        new szBuyText[128]
        formatex(szBuyText, charsmax(szBuyText), g_szMenuBuy[lang], g_iWingsPrices[wings_id])
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. %s^n", szBuyText)
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. %s", g_szMenuBack[lang])
    show_menu(id, MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_2, szMenu, -1, "Wings Detail Menu")
}

public menu_wings_detail_handler(id, menu, item) {
    new wings_id = g_iCurrentWingsView[id];
    new lang = g_iPlayerLanguage[id];

    switch(item) {
        case 0: // Buy/Sell
        {
            if(!g_bOwnedWings[id][wings_id]) { // Buy
                if(g_iJreck[id] >= g_iWingsPrices[wings_id]) {
                    g_iJreck[id] -= g_iWingsPrices[wings_id];
                    g_bOwnedWings[id][wings_id] = true;
                    client_print_lang(id, print_chat, g_szChatMessages[lang][0], g_szWingsNames[lang][wings_id]);
                    new szName[32]; get_user_name(id, szName, charsmax(szName));
                    client_print_lang(0, print_chat, g_szChatMessages[lang][5], szName, g_szWingsNames[lang][wings_id], g_iWingsPrices[wings_id]);
                } else {
                    new neededJreck = g_iWingsPrices[wings_id] - g_iJreck[id];
                    client_print_lang(id, print_chat, g_szChatMessages[lang][1], neededJreck);
                }
            } else { // Sell
                new szMenu[512], szTitle[128]; new len = 0;
                formatex(szTitle, charsmax(szTitle), g_szSellConfirmTitle[lang], g_szWingsNames[lang][wings_id]);
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", szTitle);
                new Float:sellPrice = float(g_iWingsPrices[wings_id]) / 2.0;
                len += formatex(szMenu[len], charsmax(szMenu) - len, g_szSellConfirmInfo[lang], g_iJreck[id], sellPrice);
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. %s^n", g_szSellConfirmYes[lang]);
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\w2. %s^n", g_szSellConfirmNo[lang]);
                show_menu(id, MENU_KEY_1 | MENU_KEY_2, szMenu, -1, "Sell Confirmation");
                return PLUGIN_HANDLED;
            }
        }
        case 1: // Activate/Deactivate
        {
            if(g_bOwnedWings[id][wings_id]) {
                if(g_iActiveWings[id] == wings_id) {
                    g_iActiveWings[id] = 0; // Deactivate
                    client_print_lang(id, print_chat, g_szChatMessages[lang][3], g_szWingsNames[lang][wings_id]);
                } else {
                    g_iActiveWings[id] = wings_id; // Activate
                    client_print_lang(id, print_chat, g_szChatMessages[lang][2], g_szWingsNames[lang][wings_id]);
                }
                apply_all_effects(id);
            }
        }
        case 9: // Back
        {
            show_boost_wings_menu(id);
            return PLUGIN_HANDLED;
        }
    }
    if(item != 9) show_wings_detail_menu(id, wings_id);
    return PLUGIN_HANDLED;
}
public show_language_menu(id) {
    new lang = g_iPlayerLanguage[id]
    new szMenu[512]
    new len = 0
    new szLangNames[6][32] = {"Türkçe", "English", "Русский", "Deutsch", "Français", "Kurdî"}

    len += formatex(szMenu[len], charsmax(szMenu) - len, "\rDil Seçimi / Language Selection^n^n")
    for(new i = 0; i < 6; i++) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w%d. %s^n", i+1, szLangNames[i])
    }
    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. %s", g_szMenuBack[lang])

    show_menu(id, -1, szMenu, -1, "Language Menu")
}

public menu_language_handler(id, menu, item) {
    if(item == 9) {
        show_main_menu(id)
        return PLUGIN_HANDLED
    }
    if(item >= 0 && item <= 5) {
        g_iPlayerLanguage[id] = item
        new szLangNames[6][64] = {"Türkçe", "English", "Русский", "Deutsch", "Français", "Kurdî"}
        client_print(id, print_chat, "[LN] Dil \x04%s\x01 olarak ayarlandı. / Language set to \x04%s\x01.", szLangNames[item], szLangNames[item])
        show_main_menu(id)
    }
    return PLUGIN_HANDLED
}

public cmd_daily_bonus(id) {
    handle_daily_bonus(id)
}

public handle_daily_bonus(id) {
    new lang = g_iPlayerLanguage[id]
    new Float:currentTime = get_gametime()

    if(currentTime - g_fLastBonus[id] < 86400.0 && g_fLastBonus[id] != 0.0) {
        new remainingTime = floatround(86400.0 - (currentTime - g_fLastBonus[id]))
        new hours = remainingTime / 3600
        new minutes = (remainingTime % 3600) / 60
        client_print_lang(id, print_chat, g_szChatMessages[lang][6], hours, minutes)
        return
    }

    g_fLastBonus[id] = currentTime
    g_iDailyDay[id]++

    new reward = 0, bool:giveVip = false
    switch(g_iDailyDay[id]) {
        case 1: { reward = 10; }
        case 2: { reward = 15; }
        case 3: { reward = 30; }
        case 4: { reward = 50; }
        case 5: { reward = 100; }
        case 6: { reward = 250; }
        case 7: { reward = 0; giveVip = true; }
        case 8: { reward = 30; }
        case 9: { reward = 60; }
        case 10: { reward = 120; }
        case 11: { reward = 240; }
        case 12: { reward = 500; giveVip = true; g_iDailyDay[id] = 0; }
        default: { g_iDailyDay[id] = 1; reward = 10; }
    }

    if(giveVip) {
        g_bVipActive[id] = true
        g_fVipEndTime[id] = currentTime + 604800.0
        new day = g_iDailyDay[id] == 0 ? 12 : g_iDailyDay[id]
        client_print_lang(id, print_chat, g_szChatMessages[lang][8], day)
    } else {
        g_iJreck[id] += reward
        g_iTotalJreckEarned[id] += reward
        client_print_lang(id, print_chat, g_szChatMessages[lang][7], g_iDailyDay[id], reward)
    }
}

public cmd_vip_test(id) {
    handle_vip_test(id)
}

public handle_vip_test(id) {
    new lang = g_iPlayerLanguage[id]
    new Float:currentTime = get_gametime()

    if(g_bVipActive[id]) {
        client_print_lang(id, print_chat, g_szChatMessages[lang][9])
        return
    }

    if(currentTime - g_fLastVipTest[id] < 86400.0 && g_fLastVipTest[id] != 0.0) {
        new remainingTime = floatround(86400.0 - (currentTime - g_fLastVipTest[id]))
        new hours = remainingTime / 3600
        new minutes = (remainingTime % 3600) / 60
        client_print_lang(id, print_chat, g_szChatMessages[lang][10], hours, minutes)
        return
    }

    g_fLastVipTest[id] = currentTime
    g_bVipActive[id] = true
    g_fVipEndTime[id] = currentTime + 3600.0
    client_print_lang(id, print_chat, g_szChatMessages[lang][11])
}

public cmd_show_gravity(id) {
    if (!is_user_alive(id)) {
        return PLUGIN_HANDLED;
    }

    new Float:currentGravity;
    pev(id, pev_gravity, currentGravity);

    new lang = g_iPlayerLanguage[id];
    client_print_lang(id, print_chat, g_szChatMessages[lang][12], currentGravity);

    return PLUGIN_HANDLED;
}
public task_regeneration() {
    for(new id = 1; id <= get_maxplayers(); id++) {
        if(!is_user_alive(id)) continue

        new currentHealth = get_user_health(id)
        new currentArmor = get_user_armor(id)
        new healthRegen = 0, armorRegen = 0, maxHealth = 100

        new activeSkin = g_iActiveSkin[id];
        if(activeSkin >= 0 && activeSkin < 5) {
            new skinHealthRegen[5] = {1, 2, 10, 15, 30};
            new skinArmorRegen[5] = {1, 2, 10, 15, 30};
            new skinMaxHealth[5] = {110, 120, 200, 230, 250};
            healthRegen += skinHealthRegen[activeSkin];
            armorRegen += skinArmorRegen[activeSkin];
            maxHealth = skinMaxHealth[activeSkin];
        }

        new activeWings = g_iActiveWings[id];
        if(activeWings > 0 && activeWings < 3) {
            new wingsHealthRegen[3] = {0, 5, 15};
            new wingsArmorRegen[3] = {0, 5, 15};
            new wingsMaxHealthBonus[3] = {0, 5, 15};
            healthRegen += wingsHealthRegen[activeWings];
            armorRegen += wingsArmorRegen[activeWings];
            maxHealth += wingsMaxHealthBonus[activeWings];
        }

        if(bool:g_bVipActive[id]) {
            if(currentHealth < 115) {
                set_user_health(id, min(currentHealth + 1, 115));
            }
            if(currentArmor < 100) {
                set_user_armor(id, min(currentArmor + 1, 100));
            }
        }

        if(healthRegen > 0 && currentHealth < maxHealth) {
            set_user_health(id, min(currentHealth + healthRegen, maxHealth));
        }
        if(armorRegen > 0 && currentArmor < 100) {
            set_user_armor(id, min(currentArmor + armorRegen, 100));
        }
    }
}

public fw_PlayerPreThink(id) {
    if (!is_user_alive(id) || !g_boostEnabled[id]) return FMRES_IGNORED

    new buttons = pev(id, pev_button)
    new flags = pev(id, pev_flags)

    if ((buttons & IN_JUMP) && (flags & FL_ONGROUND)) {
        new Float:baseBoost, Float:pushForce
        if (get_user_flags(id) & ADMIN_IMMUNITY) { baseBoost = FOUNDER_BOOST; pushForce = FOUNDER_PUSH; }
        else if (get_user_flags(id) & ADMIN_KICK) { baseBoost = ADMIN_BOOST; pushForce = ADMIN_PUSH; }
        else { baseBoost = PLAYER_BOOST; pushForce = PLAYER_PUSH; }

        new jumpBonus = 0
        new activeSkin = g_iActiveSkin[id];
        if(activeSkin >= 0 && activeSkin < 5) { new skinJumpSpeed[5] = {10, 40, 60, 80, 0}; jumpBonus += skinJumpSpeed[activeSkin]; }
        new activeWings = g_iActiveWings[id];
        if(activeWings > 0 && activeWings < 3) { new wingsJumpSpeed[3] = {0, 15, 30}; jumpBonus += wingsJumpSpeed[activeWings]; }
        if(g_bVipActive[id]) jumpBonus += 50

        g_currentBoostMultiplier[id] = adjust_boost_multiplier(id, baseBoost)
        new Float:velocity[3]; pev(id, pev_velocity, velocity)
        velocity[2] *= g_currentBoostMultiplier[id]
        velocity[2] += float(jumpBonus)

        new Float:angles[3], Float:direction[3]; pev(id, pev_angles, angles)
        angle_vector(angles, ANGLEVECTOR_FORWARD, direction)
        velocity[0] += direction[0] * pushForce
        velocity[1] += direction[1] * pushForce
        set_pev(id, pev_velocity, velocity)
    }
    return FMRES_IGNORED
}

Float:adjust_boost_multiplier(id, Float:baseBoost) {
    new Float:speed = get_player_speed(id)
    new Float:maxSpeed, Float:absoluteMax, Float:reduction
    if (get_user_flags(id) & ADMIN_IMMUNITY) { maxSpeed = FOUNDER_MAX_SPEED; absoluteMax = FOUNDER_ABSOLUTE_MAX; reduction = FOUNDER_SPEED_REDUCTION; }
    else if (get_user_flags(id) & ADMIN_KICK) { maxSpeed = ADMIN_MAX_SPEED; absoluteMax = ADMIN_ABSOLUTE_MAX; reduction = ADMIN_SPEED_REDUCTION; }
    else { maxSpeed = PLAYER_MAX_SPEED; absoluteMax = PLAYER_ABSOLUTE_MAX; reduction = PLAYER_SPEED_REDUCTION; }
    if(speed > absoluteMax) return 0.1
    if(speed > maxSpeed) return baseBoost * reduction
    return baseBoost
}

Float:get_player_speed(id) {
    new Float:velocity[3]; pev(id, pev_velocity, velocity)
    return vector_length(velocity)
}

public player_touch_ground(id) {
    g_canBoost[id] = true
    g_currentBoostMultiplier[id] = 0.0
}

public event_death() {
    new killer = read_data(1)
    new victim = read_data(2)
    new lang = g_iPlayerLanguage[killer]
    new szChatKillReward[6][64] = {"[LN] +3 Jreck kazandınız!", "[LN] +3 Jreck earned!", "[LN] +3 Jreck zarabotano!", "[LN] +3 Jreck verdient!", "[LN] +3 Jreck gagné!", "[LN] +3 Jreck qezenc kir!"}

    if(killer != victim && is_user_connected(killer)) {
        g_iJreck[killer] += 3
        g_iTotalJreckEarned[killer] += 3
        g_iKills[killer]++
        client_print_lang(killer, print_chat, szChatKillReward[lang])
    }

    if(is_user_connected(victim)) {
        g_iDeaths[victim]++
        g_canBoost[victim] = true
        g_currentBoostMultiplier[victim] = 0.0
        g_boostEnabled[victim] = true
        if (is_valid_ent(g_iWingsEntity[victim])) { remove_entity(g_iWingsEntity[victim]); g_iWingsEntity[victim] = 0; }
    }
}

public task_jreck_reward() {
    new szChatTimeReward[6][128] = {"[LN] +%d Jreck (10 dakika bonusu)", "[LN] +%d Jreck (10 minute bonus)", "[LN] +%d Jreck (10 minut bonus)", "[LN] +%d Jreck (10 Minuten Bonus)", "[LN] +%d Jreck (bonus de 10 minutes)", "[LN] +%d Jreck (bonusa 10 deqeyan)"}
    for(new id = 1; id <= get_maxplayers(); id++) {
        if(!is_user_connected(id)) continue
        new lang = g_iPlayerLanguage[id]
        new flags = get_user_flags(id)
        new reward = (flags & ADMIN_IMMUNITY) ? 15 : 5
        g_iJreck[id] += reward
        g_iTotalJreckEarned[id] += reward
        client_print_lang(id, print_chat, szChatTimeReward[lang], reward)
    }
}

public task_update_playtime() {
    for(new id = 1; id <= get_maxplayers(); id++) {
        if(is_user_connected(id)) g_iTotalPlayTimeSeconds[id]++
    }
}

public format_playtime(seconds, output[], len) {
    new days = seconds / 86400;
    new hours = (seconds % 86400) / 3600;
    new minutes = (seconds % 3600) / 60;
    new secs = seconds % 60;
    formatex(output, len, "Gun(%d)-%02d:%02d:%02d", days, hours, minutes, secs);
}
public task_update_new_hud() {
    new szVipExpired[6][64] = {"[LN] VIP süresi doldu!", "[LN] VIP expired!", "[LN] VIP istek!", "[LN] VIP abgelaufen!", "[LN] VIP expiré!", "[LN] VIP qediya!"};

    for(new id = 1; id <= get_maxplayers(); id++) {
        if(!is_user_connected(id)) continue

        new hud_player_id = id
        if(is_user_alive(id) && pev(id, pev_iuser1) == 4) { // Is spectator
            new target = pev(id, pev_iuser2)
            if(target > 0 && is_user_connected(target)) {
                hud_player_id = target
            }
        }

        if(!is_user_connected(hud_player_id) || !is_user_alive(hud_player_id)) continue

        new lang = g_iPlayerLanguage[id]
        new szHudString[1024], szName[32], szPlayTime[64]

        get_user_name(hud_player_id, szName, charsmax(szName))
        format_playtime(g_iTotalPlayTimeSeconds[hud_player_id], szPlayTime, charsmax(szPlayTime))

        new szRole[32] = "Özellikler";

        new Float:pushForce
        if (get_user_flags(hud_player_id) & ADMIN_IMMUNITY) { pushForce = FOUNDER_PUSH; }
        else if (get_user_flags(hud_player_id) & ADMIN_KICK) { pushForce = ADMIN_PUSH; }
        else { pushForce = PLAYER_PUSH; }

        new szVipInfo[64]
        if(g_bVipActive[hud_player_id]) {
            if(g_fVipEndTime[hud_player_id] - get_gametime() > 31536000) {
                formatex(szVipInfo, charsmax(szVipInfo), "%s", g_szHudLabels[lang][7])
            } else {
                new Float:timeDiff = g_fVipEndTime[hud_player_id] - get_gametime();
                if (timeDiff < 0.0) timeDiff = 0.0;
                new remainingTime = floatround(timeDiff)
                new hours = remainingTime / 3600
                new minutes = (remainingTime % 3600) / 60
                new bool:isTest = (g_fVipEndTime[hud_player_id] - g_fLastVipTest[hud_player_id] < 3601.0 && g_fVipEndTime[hud_player_id] - g_fLastVipTest[hud_player_id] > 0.0)
                formatex(szVipInfo, charsmax(szVipInfo), "%s: %dh %dm", isTest ? g_szVipStatus[lang][0] : g_szVipStatus[lang][1], hours, minutes)
            }
        } else {
            szVipInfo[0] = EOS
        }

        new Float:currentSpeed = get_player_speed(hud_player_id);

        formatex(szHudString, charsmax(szHudString),
            "%s (%s)^n- [%s: %s] -^n- [%s: %d] -^n- [%s: %s] -^n- [%s: %s] -^n- [%s: %s] -^n- [%s: %.0f] -^n- [%s: %.1f] -",
            szName, szRole,
            g_szHudLabels[lang][0], szPlayTime,
            g_szHudLabels[lang][1], g_iJreck[hud_player_id],
            g_szHudLabels[lang][2], szVipInfo,
            g_szHudLabels[lang][3], g_szSkinNames[lang][g_iActiveSkin[hud_player_id]],
            g_szHudLabels[lang][4], g_szWingsNames[lang][g_iActiveWings[hud_player_id]],
            g_szHudLabels[lang][5], currentSpeed,
            g_szHudLabels[lang][6], pushForce
        )

        set_hudmessage(30, 200, 30, -1.0, 0.65, 0, 0.0, 1.1, 0.0, 0.0, 4)
        ShowSyncHudMsg(id, g_syncNewHud, szHudString)

        if(g_bVipActive[id] && get_gametime() >= g_fVipEndTime[id]) {
            g_bVipActive[id] = false
            g_fVipEndTime[id] = 0.0
            client_print_lang(id, print_chat, szVipExpired[lang])
        }
    }
}

public apply_all_effects(id) {
    if(!is_user_alive(id)) return
    apply_skin_model(id);
    apply_wings_model(id);
    adjust_player_max_health(id);
    apply_player_gravity(id);
}

public adjust_player_max_health(id) {
    if(!is_user_alive(id)) return

    new maxHealth = 100
    new activeSkin = g_iActiveSkin[id];
    if(activeSkin >= 0 && activeSkin < 5) {
        new skinMaxHealth[5] = {110, 120, 200, 230, 250};
        maxHealth = skinMaxHealth[activeSkin];
    }

    new activeWings = g_iActiveWings[id];
    if(activeWings > 0 && activeWings < 3) {
        new wingsMaxHealthBonus[3] = {0, 5, 15};
        maxHealth += wingsMaxHealthBonus[activeWings];
    }

    if(get_user_health(id) > maxHealth) {
        set_user_health(id, maxHealth)
    }
}

public apply_player_gravity(id) {
    if(!is_user_alive(id)) return

    new Float:finalGravity = 1.0;

    new activeSkin = g_iActiveSkin[id];
    if(activeSkin >= 0 && activeSkin < 5) {
        new Float:skinGravity[5] = {1.0, 0.95, 0.90, 0.85, 0.80};
        finalGravity *= skinGravity[activeSkin];
    }

    new activeWings = g_iActiveWings[id];
    if(activeWings > 0 && activeWings < 3) {
        new Float:wingsGravity[3] = {1.0, 0.90, 0.85};
        finalGravity *= wingsGravity[activeWings];
    }

    set_user_gravity(id, finalGravity);
}

public apply_skin_model(id) {
    if(!is_user_alive(id)) return
    new activeSkin = g_iActiveSkin[id];
    if(activeSkin >= 0 && activeSkin < 5 && strlen(g_szSkinModels[activeSkin]) > 0) {
        cs_set_user_model(id, g_szSkinModels[activeSkin]);
    } else {
        cs_reset_user_model(id);
    }
}

public apply_wings_model(id) {
    if (!is_user_alive(id)) return;
    if (is_valid_ent(g_iWingsEntity[id])) { remove_entity(g_iWingsEntity[id]); g_iWingsEntity[id] = 0; }
    new activeWings = g_iActiveWings[id];
    if (activeWings > 0 && activeWings < 3) {
        new wings = create_entity("info_target");
        if (!is_valid_ent(wings)) return;
        new Float:vOrigin[3]; pev(id, pev_origin, vOrigin);
        engfunc(EngFunc_SetModel, wings, g_szWingsModels[activeWings]);
        set_pev(wings, pev_origin, vOrigin);
        set_pev(wings, pev_movetype, MOVETYPE_FOLLOW);
        set_pev(wings, pev_aiment, id);
        set_pev(wings, pev_owner, id);
        g_iWingsEntity[id] = wings;
    }
}
// --- ADMIN PANEL ---

public show_admin_player_list(id) {
    new lang = g_iPlayerLanguage[id]
    new szMenu[1024], szTitle[128]
    new len = 0, i, player_id
    new players[32], num

    get_players(players, num, "ch")

    new max_pages = (num - 1) / 7;
    if (g_iPlayerListPage[id] > max_pages) g_iPlayerListPage[id] = max_pages;

    formatex(szTitle, charsmax(szTitle), "%s (%d/%d)", g_szAdminPlayerListTitle[lang], g_iPlayerListPage[id] + 1, max_pages + 1)
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", szTitle)

    new start = g_iPlayerListPage[id] * 7
    new end = min(start + 7, num)

    for (i = start; i < end; i++) {
        player_id = players[i]
        new szName[32]
        get_user_name(player_id, szName, charsmax(szName))
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w%d. \d%s^n", i - start + 1, szName)
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n")
    if (g_iPlayerListPage[id] > 0) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w8. \d%s^n", g_szMenuBack[lang])
    }
    if (end < num) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w9. \d%s^n", g_szMenuNext[lang])
    }
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\w0. \d%s", g_szMenuExit[lang])

    show_menu(id, -1, szMenu, -1, "Admin Player List")
}

public menu_admin_player_list_handler(id, menu, item) {
    if (item == 9) { // Exit
        show_main_menu(id)
        return PLUGIN_HANDLED
    }

    new players[32], num
    get_players(players, num, "ch")

    if (item == 7) { // Back page
        if (g_iPlayerListPage[id] > 0) g_iPlayerListPage[id]--
        show_admin_player_list(id)
        return PLUGIN_HANDLED
    }

    if (item == 8) { // Next page
        if ((g_iPlayerListPage[id] + 1) * 7 < num) g_iPlayerListPage[id]++
        show_admin_player_list(id)
        return PLUGIN_HANDLED
    }

    new target_index = g_iPlayerListPage[id] * 7 + item
    if (target_index < num) {
        new target_id = players[target_index]
        g_iAdminPanelTarget[id] = target_id
        show_admin_player_settings(id)
    }

    return PLUGIN_HANDLED
}

public show_admin_player_settings(id) {
    new target_id = g_iAdminPanelTarget[id]
    if(!is_user_connected(target_id)) {
        show_admin_player_list(id)
        return
    }

    new lang = g_iPlayerLanguage[id]
    new szMenu[1024], szTitle[128], szName[32]
    new len = 0

    get_user_name(target_id, szName, charsmax(szName))

    new szRole[32] = "Özellikler";

    formatex(szTitle, charsmax(szTitle), g_szAdminPlayerSettingsTitle[lang], szName, szRole)
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%s^n^n", szTitle)

    for(new i = 0; i < 4; i++) {
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w%d. \d%s^n", i+1, g_szAdminPlayerSettingsItems[lang][i])
    }

    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\w0. \d%s", g_szMenuBack[lang])

    show_menu(id, -1, szMenu, -1, "Admin Player Settings")
}

public menu_admin_pset_handler(id, menu, item) {
    if (item == 9) { // Back
        show_admin_player_list(id)
        return PLUGIN_HANDLED
    }

    new target_id = g_iAdminPanelTarget[id]
    if(!is_user_connected(target_id)) {
        show_admin_player_list(id)
        return PLUGIN_HANDLED
    }

    new lang = g_iPlayerLanguage[id]
    new szName[32]
    get_user_name(target_id, szName, charsmax(szName))

    switch(item) {
        case 0: {
            g_iAdminAction[id] = ADMIN_ACTION_SET_Jreck
            client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][0], szName)
        }
        case 1: {
            g_iAdminAction[id] = ADMIN_ACTION_SET_SPEED
            client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][1], szName)
        }
        case 2: {
            g_iAdminAction[id] = ADMIN_ACTION_SET_GRAVITY
            client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][2], szName)
        }
        case 3: {
            g_iAdminAction[id] = ADMIN_ACTION_SET_NAME
            client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][3], szName)
        }
    }

    return PLUGIN_HANDLED
}

public fw_ClientCommand(id) {
    if(g_iAdminAction[id] == ADMIN_ACTION_NONE) return FMRES_IGNORED

    new szCmd[32]
    read_argv(0, szCmd, charsmax(szCmd))

    if(equali(szCmd, "say") || equali(szCmd, "say_team")) {
        new target_id = g_iAdminPanelTarget[id]
        if(!is_user_connected(target_id)) {
            g_iAdminAction[id] = ADMIN_ACTION_NONE
            return FMRES_IGNORED
        }

        new szValue[192]
        read_args(szValue, charsmax(szValue))
        remove_quotes(szValue)

        new lang = g_iPlayerLanguage[id]
        new szTargetName[32]
        get_user_name(target_id, szTargetName, charsmax(szTargetName))

        switch(g_iAdminAction[id]) {
            case ADMIN_ACTION_SET_Jreck: {
                g_iJreck[target_id] = str_to_num(szValue)
                client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][4], szTargetName, szValue)
            }
            case ADMIN_ACTION_SET_SPEED: {
                set_user_maxspeed(target_id, str_to_float(szValue))
                client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][4], szTargetName, szValue)
            }
            case ADMIN_ACTION_SET_GRAVITY: {
                set_user_gravity(target_id, str_to_float(szValue))
                client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][4], szTargetName, szValue)
            }
            case ADMIN_ACTION_SET_NAME: {
                set_user_info(target_id, "name", szValue)
                client_print_lang(id, print_chat, g_szAdminChatPrompt[lang][4], szTargetName, szValue)
            }
        }

        g_iAdminAction[id] = ADMIN_ACTION_NONE
        return FMRES_SUPERCEDE
    }

    return FMRES_IGNORED
}



