Добавяне на меню за причина към GagSystem

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
menkisa
Извън линия
Потребител
Потребител
Мнения: 103
Регистриран на: 06 Яну 2020, 15:41
Се отблагодари: 20 пъти
Получена благодарност: 8 пъти

Добавяне на меню за причина към GagSystem

Мнение от menkisa » 07 Апр 2021, 05:06

Здравейте,

може ли да се направи следното съб-меню към GagSystem плъгина. Не е нужно да се премахва messagemode amx_TYPE_GAGREASON, а да се добави към събменю като "Custom Reason" например на MENU_KEY_8 , a останалите преди това, да са готови като например Swearing, Insulting, Abusing, Spamming etc. Благодаря предварително!

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <regex>
#include <nvault>
#include <WPMGPrintChatColor>

#define LOG_GAGS

#define IP_PATTERN "([0-9]+.*[1-9][0-9]+.*[0-9]+.*[0-9])"
#define VERSION "1.1"

enum _:GagState
{
    GAG_NOT,
    GAG_YES,
    GAG_EXPIRED
};

enum _:GagTimeData
{
    DISPLAY[64],
    MINUTES
};

new const g_GagTimes[][GagTimeData] =
{
    { "1 minute", 1 },
    { "5 minutes", 5 },
    { "10 minutes", 10 },
    { "15 minutes", 15 },
    { "20 minutes", 20 },
    { "30 minutes", 30 },
    { "1 hour", 60 },
    { "2 hours", 120 },
    { "6 hours", 360 },
    { "1 day", 1440 },
    { "1 week", 10080 },
    { "Permanent", 0 }
}

new const g_szVaultName[] = "gagsystem";
new const g_szChatPrefix[] = "[GagSystem]";
new const g_szGagSound[] = "buttons/blip1.wav";
new const g_szLineStyle[] = "======================================================";
#if defined LOG_GAGS
new const g_szLogFile[] = "addons/amxmodx/logs/gag_system.log";
#endif

new g_iNVaultHandle, Regex:g_iRegexIPPattern, g_iUnused, g_iHudChannel, g_iThinkingEnt;
new g_iGagTimeIndex[33], g_iUserTarget[33], bool:g_blIsUserMuted[33];
new gp_blHudEnabled, gp_blEnableGagExpireMsg;
new g_GagForward, g_UngagForward;

public plugin_init()
{
    register_plugin("Gag System", VERSION, "TheRedShoko @ AMXX-BG.info");
    register_cvar("gagsystem_shoko", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED);

    register_clcmd("say", "CommandSayExecuted");
    register_clcmd("say_team", "CommandSayExecuted");

    g_GagForward = CreateMultiForward("user_gagged", ET_IGNORE, FP_CELL);
    g_UngagForward = CreateMultiForward("user_ungagged", ET_IGNORE, FP_CELL);

    gp_blHudEnabled = register_cvar("gagsystem_showhud", "1");
    gp_blEnableGagExpireMsg = register_cvar("gagsystem_printexpired", "1");

    #if AMXX_VERSION_NUM >= 183
    hook_cvar_change(gp_blEnableGagExpireMsg, "GagExpireCvarChanged");
    #endif

    register_forward(FM_Voice_SetClientListening, "PlayerVoiceSpeak", 0);
    register_forward(FM_ClientUserInfoChanged, "FwClientInfoChanged", 0);
    register_forward(FM_Think, "FwEntityThink", 1);

    register_clcmd("amx_gag", "CommandGag", ADMIN_SLAY, "<name | #id | ip> <time> <reason>");
    register_clcmd("amx_ungag", "CommandUngag", ADMIN_SLAY, "<name | #id | ip>");
    register_clcmd("amx_gagmenu", "CommandGagMenu", ADMIN_SLAY);
    register_clcmd("amx_TYPE_GAGREASON", "CommandGagReason", ADMIN_SLAY);
    register_clcmd("amx_cleangags", "CommandCleanDB", ADMIN_RCON);

    #if AMXX_VERSION_NUM < 183
    g_iRegexIPPattern = regex_compile(IP_PATTERN, g_iUnused, "", 0);
    #else
    g_iRegexIPPattern = regex_compile_ex(IP_PATTERN);
    #endif

    g_iNVaultHandle = nvault_open(g_szVaultName);

    if (g_iNVaultHandle == INVALID_HANDLE)
    {
        set_fail_state("Failed to open NVault DB!");
    }

    g_iHudChannel = CreateHudSyncObj();
    g_iThinkingEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    set_pev(g_iThinkingEnt, pev_nextthink, get_gametime() + 0.1);
}

public plugin_precache()
{
    precache_sound(g_szGagSound);
}

public plugin_end()
{
    nvault_close(g_iNVaultHandle);
    regex_free(g_iRegexIPPattern);
}

public plugin_natives()
{
	register_native("is_user_gagged", "native_is_gagged");

	register_native("gag_user", "native_gag_user");
	register_native("gag_user_byid", "native_gag_id");

	register_native("ungag_user", "native_ungag_user");
	register_native("ungag_user_byid", "native_ungag_id");
}

public native_is_gagged()
{
	new id = get_param(1);
	new bool:shouldPrint = bool:get_param(2);

	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
		return false;
	}

	return IsUserGagged(id, shouldPrint) == GAG_YES;
}

public native_gag_user()
{
	new szIP[16], szName[32], iDuration, szReason[64], szAdmin[32];

	get_string(1, szName, charsmax(szName));
	get_string(2, szIP, charsmax(szIP));
	iDuration = get_param(3);
	get_string(4, szReason, charsmax(szReason));
	get_string(5, szAdmin, charsmax(szAdmin));

	if (!regex_match_c(szIP, g_iRegexIPPattern, g_iUnused))
	{
		log_error(AMX_ERR_NATIVE, "%s is not a valid IP Address!", szIP);
		return;
	}

	if (iDuration < 0) 
	{
		log_error(AMX_ERR_NATIVE, "Time cannot be negative!");
		return;
	}

	GagUser(szName, szIP, iDuration, szReason, szAdmin);
}

public native_gag_id()
{
	new id;

	id = get_param(1);

	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
		return;
	}

	new szName[32], szIP[16], szReason[64], iDuration, szAdmin[32];
	iDuration = get_param(2);

	if (iDuration < 0) 
	{
		log_error(AMX_ERR_NATIVE, "Time cannot be negative!");
		return;
	}

	get_string(3, szReason, charsmax(szReason));
	get_string(4, szAdmin, charsmax(szAdmin));

	get_user_name(id, szName, charsmax(szName));
	get_user_ip(id, szIP, charsmax(szIP), 1);

	GagUser(szName, szIP, iDuration, szReason, szAdmin);
}

public native_ungag_user()
{
	new szIP[16], szName[32], szAdmin[32];

	get_string(1, szName, charsmax(szName));
	get_string(2, szIP, charsmax(szIP));
	get_string(3, szAdmin, charsmax(szAdmin));

	if (!regex_match_c(szIP, g_iRegexIPPattern, g_iUnused))
	{
		log_error(AMX_ERR_NATIVE, "%s is not a valid IP Address!", szIP);
		return;
	}

	UngagUser(szName, szIP, szAdmin);
}

public native_ungag_id()
{
	new id;

	id = get_param(1);

	if (!is_user_connected(id))
	{
		log_error(AMX_ERR_NATIVE, "Invalid player ID %d", id);
		return;
	}

	new szAdmin[32], szName[32], szIP[16];

	get_string(2, szAdmin, charsmax(szAdmin));

	get_user_name(id, szName, charsmax(szName));
	get_user_ip(id, szIP, charsmax(szIP), 1);

	UngagUser(szName, szIP, szAdmin);
}

public client_putinserver(id)
{
    g_blIsUserMuted[id] = IsUserGagged(id, false) == GAG_YES;
}

#if AMXX_VERSION_NUM >= 183
public GagExpireCvarChanged(pcvar, szOldValue[], szNewValue[])
{
    if (str_to_num(szNewValue) == 1)
    {
        set_pev(g_iThinkingEnt, pev_nextthink, get_gametime() + 1.0);
    }
}
#endif

public PlayerVoiceSpeak(receiver, id)
{
    if (receiver == id || !is_user_connected(id))
    {
        return FMRES_IGNORED;
    }

    if (g_blIsUserMuted[id])
    {
        engfunc(EngFunc_SetClientListening, receiver, id, false);
        return FMRES_SUPERCEDE;
    }

    return FMRES_IGNORED;
}

public FwClientInfoChanged(id)
{
    if (!is_user_connected(id))
    {
        return FMRES_IGNORED;
    }

    new szOldName[32], szNewName[32];
    get_user_name(id, szOldName, charsmax(szOldName));
    get_user_info(id, "name", szNewName, charsmax(szNewName));

    if (!equal(szOldName, szNewName) && szOldName[0] != EOS && IsUserGagged(id, false) == GAG_YES)
    {
        set_user_info(id, "name", szOldName);
        return FMRES_HANDLED;
    }

    return FMRES_IGNORED;
}

public FwEntityThink(iEnt)
{
    if (iEnt != g_iThinkingEnt || !get_pcvar_num(gp_blEnableGagExpireMsg))
    {
        return;
    }

    static iPlayers[32], iPlayersNum, id;
    get_players(iPlayers, iPlayersNum);

    for (new i = 0; i < iPlayersNum; i++)
    {
        id = iPlayers[i];

        if (IsUserGagged(id, false) == GAG_EXPIRED)
        {
            static szName[32];
            get_user_name(id, szName, charsmax(szName));

            PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y is no longer gagged!", g_szChatPrefix, szName);

            if (get_pcvar_num(gp_blHudEnabled))
            {
                set_hudmessage(255, 0, 0, 0.05, 0.30);
                ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s gag has expired^n%s", g_szLineStyle, szName, g_szLineStyle);
            }
        }
    }

    set_pev(iEnt, pev_nextthink, get_gametime() + 10.0);
}

public CommandSayExecuted(id)
{
    if (IsUserGagged(id) == GAG_YES)
    {
        return PLUGIN_HANDLED;
    }

    return PLUGIN_CONTINUE;
}

public CommandGag(id, iLevel, iCmdId)
{
    if (!cmd_access(id, iLevel, iCmdId, 4))
    {
        return PLUGIN_HANDLED;
    }

    new szTarget[33], szTargetIP[16], szTime[8], szReason[64];
    read_argv(1, szTarget, charsmax(szTarget));

    if (!regex_match_c(szTarget, g_iRegexIPPattern, g_iUnused))
    {
        new iTarget = cmd_target(id, szTarget);

        if (!iTarget)
        {
            return PLUGIN_HANDLED;
        }

        get_user_name(iTarget, szTarget, charsmax(szTarget));
        get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1);
        g_blIsUserMuted[iTarget] = true;
    }
    else
    {
        copy(szTargetIP, charsmax(szTargetIP), szTarget);
    }

    read_argv(2, szTime, charsmax(szTime));
    read_argv(3, szReason, charsmax(szReason));
    new iTime = str_to_num(szTime);

    new szAdmin[32];
    get_user_name(id, szAdmin, charsmax(szAdmin));

    console_print(id, "%s", GagUser(szTarget, szTargetIP, iTime, szReason, szAdmin));

    return PLUGIN_HANDLED;
}

public CommandUngag(id, iLevel, iCmdId)
{
    if (!cmd_access(id, iLevel, iCmdId, 2))
    {
        return PLUGIN_HANDLED;
    }

    new szTarget[32], szTargetIP[16];
    read_argv(1, szTarget, charsmax(szTarget));

    if (!regex_match_c(szTarget, g_iRegexIPPattern, g_iUnused))
    {
        new iTarget = cmd_target(id, szTarget, CMDTARGET_ALLOW_SELF);

        if (!iTarget)
        {
            return PLUGIN_HANDLED;
        }

        get_user_name(iTarget, szTarget, charsmax(szTarget));
        get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1);
    }
    else
    {
        copy(szTargetIP, charsmax(szTargetIP), szTarget);
    }

    new szAdminName[32];
    get_user_name(id, szAdminName, charsmax(szAdminName));

    console_print(id, "%s", UngagUser(szTarget, szTargetIP, szAdminName));

    return PLUGIN_HANDLED;
}

public CommandGagMenu(id, iLevel, iCmdId)
{
    if (!cmd_access(id, iLevel, iCmdId, 1))
    {
        return PLUGIN_HANDLED;
    }

    g_iGagTimeIndex[id] = 0;
    g_iUserTarget[id] = 0;
    ShowGagMenu(id);

    return PLUGIN_HANDLED;
}

ShowGagMenu(id, page = 0)
{
    new iMenu = menu_create("\rGag Menu", "GagMenuHandler");

    new iPlayers[32], iPlayersNum;
    get_players(iPlayers, iPlayersNum);

    new szItem[64], szName[32], szIndex[8];
    new iPlayer;

    for (new i = 0; i < iPlayersNum; i++)
    {
        iPlayer = iPlayers[i];

        if (i % 6 == 0)
        {
            formatex(szItem, charsmax(szItem), "\yGag length \r[\w%s\r]^n", g_GagTimes[g_iGagTimeIndex[id]][DISPLAY]);
            menu_additem(iMenu, szItem, "time");
        }

        get_user_name(iPlayer, szName, charsmax(szName));
        num_to_str(iPlayer, szIndex, charsmax(szIndex));

        if (IsUserGagged(iPlayer, false))
        {
            formatex(szItem, charsmax(szItem), "\y%s \r[\wGagged\r]", szName);
        }
        else if (get_user_flags(iPlayer) & ADMIN_IMMUNITY)
        {
            formatex(szItem, charsmax(szItem), "\d%s \r[\wHas immunity\r]", szName);
        }
        else
        {
            copy(szItem, charsmax(szItem), szName);
        }

        menu_additem(iMenu, szItem, szIndex);
    }

    menu_display(id, iMenu, page);
}

public GagMenuHandler(id, iMenu, Item)
{
    if (Item == MENU_EXIT)
    {
        menu_destroy(iMenu);
        return;
    }

    new szInfo[8], iTemp;
    menu_item_getinfo(iMenu, Item, iTemp, szInfo, charsmax(szInfo), _, _, iTemp);

    if (equal(szInfo, "time"))
    {
        ++g_iGagTimeIndex[id];
        g_iGagTimeIndex[id] %= sizeof g_GagTimes;
        menu_destroy(iMenu);
        ShowGagMenu(id, Item / 7);
        return;
    }

    new iTarget = str_to_num(szInfo);

    if (IsUserGagged(iTarget, false) == GAG_YES)
    {
        new szName[32], szIP[16], szAdminName[32];
        get_user_name(id, szAdminName, charsmax(szAdminName));
        get_user_name(iTarget, szName, charsmax(szName));
        get_user_ip(iTarget, szIP, charsmax(szIP), 1);

        UngagUser(szName, szIP, szAdminName);

        menu_destroy(iMenu);
        return;
    }

    if (get_user_flags(iTarget) & ADMIN_IMMUNITY)
    {
        menu_destroy(iMenu);
        return;
    }

    g_iUserTarget[id] = iTarget;
    client_cmd(id, "messagemode amx_TYPE_GAGREASON");

    menu_destroy(iMenu);
}

public CommandGagReason(id, iLevel, iCmdId)
{
    if (!cmd_access(id, iLevel, iCmdId, 2) || !is_user_connected(g_iUserTarget[id]))
    {
        return PLUGIN_HANDLED;
    }

    new szReason[64], szName[32], szIP[16], szAdminName[32];
    read_argv(1, szReason, charsmax(szReason));

    get_user_name(id, szAdminName, charsmax(szAdminName));

    get_user_name(g_iUserTarget[id], szName, charsmax(szName));
    get_user_ip(g_iUserTarget[id], szIP, charsmax(szIP), 1);

    GagUser(szName, szIP, g_GagTimes[g_iGagTimeIndex[id]][MINUTES], szReason, szAdminName);
    g_blIsUserMuted[g_iUserTarget[id]] = true;

    ShowGagMenu(id);

    return PLUGIN_HANDLED;
}

public CommandCleanDB(id, iLevel, iCmdId)
{
    if (!cmd_access(id, iLevel, iCmdId, 1))
    {
        return PLUGIN_HANDLED;
    }

    nvault_prune(g_iNVaultHandle, 0, get_systime());

    console_print(id, "Database has been cleaned.");

    return PLUGIN_HANDLED;
}

UngagUser(szName[], szIP[], szAdmin[])
{
    new szResult[64], szTemp[3];

    if (!nvault_get(g_iNVaultHandle, szIP, szTemp, charsmax(szTemp)))
    {
        formatex(szResult, charsmax(szResult), "User with IP %s not found.", szIP);
        return szResult;
    }

    nvault_remove(g_iNVaultHandle, szIP);

    if (!equal(szName, szIP))
    {
        new iTarget = cmd_target(0, szName, 0);

        g_blIsUserMuted[iTarget] = false;

        PrintChatColor(iTarget, PRINT_COLOR_PLAYERTEAM, "!g%s!y You have been ungagged by admin!t %s!y!", g_szChatPrefix, szAdmin);

        PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y has been ungagged by!g %s!y.", g_szChatPrefix, szName, szAdmin);

        if (get_pcvar_num(gp_blHudEnabled))
        {
            set_hudmessage(255, 0, 0, 0.05, 0.30);
            ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been ungagged by %s^n%s", g_szLineStyle, szName, szAdmin, g_szLineStyle);
        }
    }

    new id = find_player("d", szIP);
    if (id != 0)
    {
    	ExecuteForward(g_UngagForward, g_iUnused, id);
    }

    #if defined LOG_GAGS
    log_to_file(g_szLogFile, "[UNGAG] ADMIN: %s | TARGET_NAME: %s [IP: %s]", szAdmin, szName, szIP);
    #endif
    copy(szResult, charsmax(szResult), "Player has been ungagged");
    return szResult;
}

GagUser(szName[], szIP[], iDuration, szReason[], szAdminName[])
{
    new iExpireTime = iDuration != 0 ? get_systime() + (iDuration * 60) : 0;

    new szResult[64];

    if (nvault_get(g_iNVaultHandle, szIP, szResult, charsmax(szResult)))
    {
        copy(szResult, charsmax(szResult), "Player is already gagged.");
        return szResult;
    }

    new szValue[512];
    formatex(szValue, charsmax(szValue), "^"%s^"#^"%s^"#%d#^"%s^"", szName, szReason, iExpireTime, szAdminName);

    set_hudmessage(0, 255, 0, 0.05, 0.30);

    if (iExpireTime == 0)
    {
        PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y has been gagged by!g %s!y. Reason: !t%s!y. Gag expires!t never!y.", g_szChatPrefix, szName, szAdminName, szReason);

        if (get_pcvar_num(gp_blHudEnabled))
        {
            ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been gagged by %s^nExpires never^nReason: %s^n%s", g_szLineStyle, szName, szAdminName, szReason, g_szLineStyle);
        }
    }
    else
    {
        PrintChatColor(0, PRINT_COLOR_PLAYERTEAM, "!g%s!y Player!t %s!y has been gagged by!g %s!y. Reason: !t%s!y. Gag expires!t %s", g_szChatPrefix, szName, szAdminName, szReason, GetTimeAsString(iDuration * 60));

        if (get_pcvar_num(gp_blHudEnabled))
        {
            ShowSyncHudMsg(0, g_iHudChannel, "%s^n%s has been gagged by %s^nExpires in %s^nReason: %s^n%s", g_szLineStyle, szName, szAdminName, GetTimeAsString(iDuration * 60), szReason, g_szLineStyle);
        }
    }

    emit_sound(0, CHAN_AUTO, g_szGagSound, 1.0, ATTN_NORM, SND_SPAWNING, PITCH_NORM);

    #if defined LOG_GAGS
    log_to_file(g_szLogFile, "ADMIN: %s | PLAYER: %s [IP: %s] | REASON: %s | TIME: %s", szAdminName, szName, szIP, szReason, GetTimeAsString(iDuration * 60));
    #endif

    new id = find_player("d", szIP);

    if (id != 0)
    {
    	ExecuteForward(g_GagForward, g_iUnused, id);
    }

    nvault_set(g_iNVaultHandle, szIP, szValue);

    copy(szResult, charsmax(szResult), "Player successfully gagged.");
    return szResult;
}

IsUserGagged(id, bool:print = true)
{
    new szIP[16], szVaultData[512];
    get_user_ip(id, szIP, charsmax(szIP), 1);

    if (!nvault_get(g_iNVaultHandle, szIP, szVaultData, charsmax(szVaultData)))
    {
        g_blIsUserMuted[id] = false;
        return GAG_NOT;
    }

    new szGaggedName[32], szReason[64], szExpireDate[32], szAdminName[32];
    replace_all(szVaultData, charsmax(szVaultData), "#", " ");
    parse(szVaultData, szGaggedName, charsmax(szGaggedName), szReason, charsmax(szReason), szExpireDate, charsmax(szExpireDate), szAdminName, charsmax(szAdminName));

    new iExpireTime = str_to_num(szExpireDate);

    if (get_systime() < iExpireTime || iExpireTime == 0)
    {
        if (print)
        {
            if (iExpireTime == 0)
            {
                PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g%s!y You are gagged! Your gag expires!t never!y.", g_szChatPrefix);
            }
            else
            {
                PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g%s!y You are gagged! Your gag expires in!t %s", g_szChatPrefix, GetTimeAsString(iExpireTime - get_systime()));
            }

            PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g%s!y Gagged by!g %s!y. Gagged nickname:!t %s!y. Gag reason:!t %s!y.", g_szChatPrefix, szAdminName, szGaggedName, szReason);
        }

        g_blIsUserMuted[id] = true;

        return GAG_YES;
    }

    g_blIsUserMuted[id] = false;
    ExecuteForward(g_UngagForward, g_iUnused, id);

    nvault_remove(g_iNVaultHandle, szIP);

    return GAG_EXPIRED;
}

GetTimeAsString(seconds)
{
    new iYears = seconds / 31536000;
    seconds %= 31536000;

    new iMonths = seconds / 2592000;
    seconds %= 2592000;

    new iWeeks = seconds / 604800;
    seconds %= 604800;

    new iDays = seconds / 86400;
    seconds %= 86400;

    new iHours = seconds / 3600;
    seconds %= 3600;

    new iMinutes = seconds / 60;
    seconds %= 60;

    new szResult[256];

    if (iYears)
    {
        format(szResult, charsmax(szResult), "%s%d Year%s ", szResult, iYears, iYears == 1 ? "" : "s");
    }

    if (iMonths)
    {
        format(szResult, charsmax(szResult), "%s%d Month%s ", szResult, iMonths, iMonths == 1 ? "" : "s");
    }

    if (iWeeks)
    {
        format(szResult, charsmax(szResult), "%s%d Week%s ", szResult, iWeeks, iWeeks == 1 ? "" : "s");
    }

    if (iDays)
    {
        format(szResult, charsmax(szResult), "%s%d Day%s ", szResult, iDays, iDays == 1 ? "" : "s");
    }

    if (iHours)
    {
        format(szResult, charsmax(szResult), "%s%d Hour%s ", szResult, iHours, iHours == 1 ? "" : "s");
    }

    if (iMinutes)
    {
        format(szResult, charsmax(szResult), "%s%d Minute%s ", szResult, iMinutes, iMinutes == 1 ? "" : "s");
    }

    if (seconds)
    {
        format(szResult, charsmax(szResult), "%s%d Second%s", szResult, seconds, seconds == 1 ? "" : "s");
    }

    return szResult;
}

Аватар
menkisa
Извън линия
Потребител
Потребител
Мнения: 103
Регистриран на: 06 Яну 2020, 15:41
Се отблагодари: 20 пъти
Получена благодарност: 8 пъти

Добавяне на меню за причина към GagSystem

Мнение от menkisa » 07 Апр 2021, 20:24

Може да се локва!

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Заявки за плъгини”

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 8 госта