/*
* 
* FPS:
* 
* 
* CVars:
*         cfps             1/0 // Enable/Disable FPS.                Default: 1/on.
*         cfpsall             1/0 // Print FPS MSG to all players?    Default: 1/on.
*         cfpsvisual         1/0 // Show/Hide /fps chat message?    Default: 1/on.
* 
* Usage:
*         Type " /fps <nick/#userid> " in say.
*         Type " /cfps " in say/say_team for about plugin.
* 
* Notes:
*         To change delay between user /fps command, edit DELAY_COMMAND and recompile.
*        This is engine FPS.
*         Original FPS Code by newbie.
*/
 
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
 
#define PLUGIN_NAME        "FPS.Meter"
#define PLUGIN_VERSION        "1.0"
#define PLUGIN_AUTHOR        "Raggy"
 
#pragma semicolon        1
 
#define DELAY_COUNT        1.0    //Delay between frame counts, adjust this according to server ticrate. MUST BE FLOAT
 
#define DELAY_COMMAND        5.0    //Delay between user /fps command. MUST BE FLOAT
#define COLOR            0x03    //0x01 normal, 0x04 green, 0x03 other. MUST BE CHAR
 
#define MAX_PLAYERS        32 + 1
 
new g_iUserFPS[MAX_PLAYERS];
 
new g_irFPS;
new g_irFPSAll;
new g_irFPSVisual;
 
public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
    register_cvar(PLUGIN_NAME, PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY);
    
    g_irFPS        = register_cvar("cfps",        "1");
    g_irFPSAll    = register_cvar("cfpsall",    "1");
    g_irFPSVisual    = register_cvar("cfpsvisual",    "1");
    
    register_forward(FM_PlayerPreThink, "fwdPlayerPreThink");
    
    register_clcmd("say",            "sayHandle");
    register_clcmd("say /fps",        "cmdAboutrFPS");
    register_clcmd("say_team /fps",    "cmdAboutrFPS");
}
 
public fwdPlayerPreThink(id)
{
    if ( !get_pcvar_num(g_irFPS) )
        return FMRES_IGNORED;
    
    static Float:fGameTime, Float:fCountNext[MAX_PLAYERS], iCountFrames[MAX_PLAYERS];
    
    if ( fCountNext[id] >= (fGameTime = get_gametime()) )
    {
        iCountFrames[id]++;
        
        return FMRES_IGNORED;
    }
    
    g_iUserFPS[id]        = iCountFrames[id];
    iCountFrames[id]    = 0;
    
    fCountNext[id]        = fGameTime + DELAY_COUNT;
    
    return FMRES_IGNORED;
}
 
public sayHandle(id)
{
    if ( !get_pcvar_num(g_irFPS) )
        return PLUGIN_CONTINUE;
    
    new szArgs[64];
    read_args(szArgs, charsmax(szArgs));
    remove_quotes(szArgs);
    trim(szArgs);
    
    if ( !szArgs[0] )
        return PLUGIN_HANDLED;
    
    if ( szArgs[0] != '/' )
        return PLUGIN_CONTINUE;
    
    
    //Command
    new szTarget[32];
    
    parse(szArgs,\
    szArgs, charsmax(szArgs),\
    szTarget, charsmax(szTarget));
    
    if ( !equali(szArgs, "/fps", 4) )
        return PLUGIN_CONTINUE;
    //Command
    
    
    //Delay
    new Float:fCommandDelay = DELAY_COMMAND;
    
    static Float:fCommandUsed[MAX_PLAYERS];
    
    if ( fCommandUsed[id] > get_gametime() )
    {
        printMessage(id, id, "^x01Kérlek várj^x04 %.0f^x03 másodpercet^x01 a parancsok között!", fCommandDelay);
        return PLUGIN_HANDLED;
    }
    //Delay
    
    
    //Display
    trim(szTarget);
    
    if ( !szTarget[0] )
        fCommandUsed[id] = displayFPS(id, id, fCommandDelay);
    else {
        new targetId = cmd_target(id, szTarget, 2);
        
        if ( targetId )
            fCommandUsed[id] = displayFPS(id, targetId, fCommandDelay);
        else {
            printMessage(id, id, "Nem található vagy túl sok játékos található ezzel a névvel: ^x04 %s", szTarget);
            return PLUGIN_HANDLED;
        }
    }
    //Display
    
    
    return get_pcvar_num(g_irFPSVisual) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}
 
Float:displayFPS(id, targetId, Float:fCommandDelay)  
{
    new szName[32];
    get_user_name(targetId, szName, charsmax(szName));
    
    new szMsg[192];
    formatex(szMsg, charsmax(szMsg), "^x04%s^x01-nak^x04 %d^x03 FPS^x01-e van.", szName, g_iUserFPS[targetId]);
    
    printMessage(id, get_pcvar_num(g_irFPSAll) ? 0 : id, szMsg);
    
    return get_gametime() + fCommandDelay;
}
 
printMessage(id, targetId, const sMsg[], any:...)
{
    new szMessage[192];
    
    vformat(szMessage, charsmax(szMessage), sMsg, 4);
    format(szMessage, charsmax(szMessage), "%c[FPS] %s", COLOR, szMessage);
    
    static iSayText;
    
    if ( !iSayText )
        iSayText = get_user_msgid("SayText");
    
    message_begin(targetId ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, iSayText, {0, 0, 0}, targetId);
    write_byte(id);
    write_string(szMessage);
    message_end();
}