#include <amxmodx>
 
/*  Ami előtt // van az le van tiltva, ami előtt nincs, az aktív. Itt tudsz mindent módosítani. */
 
#define PREFIXEK                // Alap prefixek engedélyezése.
#if defined PREFIXEK
    //#define EGYEDI_PREFIXEK       // Egyedi prefixek engedélyezése "addons/amxmodx/configs/egyedi_prefixek.ini"
#endif
//#define STEAM_PREFIX              // Steam prefix engedélyezése.
#define ZOLD_IRAS           // Zöld írás az Adminoknak és a VIP-nek.
#define TULAJ_JOG   ADMIN_RCON  // Tulaj jog a Tulaj prefixhez. (alap: "l")
#define ADMIN_JOG       ADMIN_BAN   // Admin jog az Admin prefixhez. (alap: "d")
#define VIP_JOG     ADMIN_LEVEL_H   // VIP jog a VIP prefixhez. (alap: "t")
//#define ANTI_FLOOD            // Anti-flood bekapcsolása (ki kell törölni a plugins.ini-ből az alap "antiflood.amxx"-et.)
#define IDOKOZ      0.75        // Flood időköz
#define ADMIN_LAT           // Az Admin látja az élő és a halott, és a két csapat írását egyaránt.
//#define ALAP_CHAT     // Élő nem látja a halott írását, kivéve az Admin,ha az ADMIN_LAT aktív. (alap: mindenki látja a halottat is.)
 
#if defined STEAM_PREFIX
new bool:steames[33];
#endif
#if defined EGYEDI_PREFIXEK
enum _:ADATOK 
{ 
    TIPUS[2], 
    ELLENORZES[32], 
    PREFIX[64] 
};
new Array:adat, jatekosadat[ADATOK];
new prefix[33][64];
#endif
 
#define GetBit(%1,%2)       (%1 & (1 << (%2 & 31)))
#define SetBit(%1,%2)       %1 |= (1 << (%2 & 31))
#define ResetBit(%1,%2)     %1 &= ~(1 << (%2 & 31))
#if defined ADMIN_LAT
new bitadmin;
#endif
new bitelo;
 
public plugin_init()
{
    #define AUTHOR "neygomon, mforce"
    register_plugin("Lite Chat", "1.0", AUTHOR);
    register_cvar("lite_chat", AUTHOR, FCVAR_SERVER | FCVAR_SPONLY);
 
    register_clcmd("say", "HandlerSay");
    register_clcmd("say_team", "HandlerSayTeam");
 
    register_event("ResetHUD", "eResetHUD", "be");
    register_event("DeathMsg", "eDeathMsg", "a", "1>0");
}
 
#if defined EGYEDI_PREFIXEK
public plugin_cfg()
{
    adat = ArrayCreate(ADATOK);
 
    new betolt[256], fp = fopen("addons/amxmodx/configs/egyedi_prefixek.ini", "rt");
    if(!fp) return set_fail_state("A fajlt ^"addons/amxmodx/configs/egyedi_prefixek.ini^" nem talaltuk");
 
    while(!feof(fp))
    {
        fgets(fp, betolt, charsmax(betolt));
        if(betolt[0] && betolt[0] != ';' && parse(betolt, jatekosadat[TIPUS], charsmax(jatekosadat[TIPUS]), jatekosadat[ELLENORZES], charsmax(jatekosadat[ELLENORZES]), jatekosadat[PREFIX], charsmax(jatekosadat[PREFIX])))
            ArrayPushArray(adat, jatekosadat);
    }
    return fclose(fp);
}
#endif
public client_putinserver(id)
{
#if defined EGYEDI_PREFIXEK
    kereses(id);
#endif  
#if defined STEAM_PREFIX
    steames[id] = is_user_steam(id) ? true : false;
#endif
#if defined ADMIN_LAT
    if(get_user_flags(id) & ADMIN_CHAT) SetBit(bitadmin, id);
    else ResetBit(bitadmin, id);
#endif
}
 
public client_disconnect(id)    ResetBit(bitelo, id);
public eResetHUD(id)        SetBit(bitelo, id);
public eDeathMsg()      ResetBit(bitelo, read_data(2)); 
 
public HandlerSay(id) return uzenetformazas(id, false);
public HandlerSayTeam(id) return uzenetformazas(id, true);
 
uzenetformazas(id, bool:csapat)
{
#define MAX_BIT 180
    static uzenet[MAX_BIT], stringkonvertalas[charsmax(uzenet) * 2 + 1]; 
    read_args(uzenet, charsmax(uzenet));
    remove_quotes(uzenet);
 
    if(uzenet[0] == EOS || uzenet[0] == '/' || equal(uzenet, " "))
        return PLUGIN_HANDLED_MAIN;
#if defined ANTI_FLOOD
    static Float:floodido[33], Float:jatekido, figyelmeztetes[33];
 
    if(floodido[id] > (jatekido = get_gametime()))
    {
        if(++figyelmeztetes[id] > 2)
        {           
            client_print(id, print_chat, "NE FLOODOLJ!");
            floodido[id] = jatekido + IDOKOZ + 3.0;
            return PLUGIN_HANDLED;
        }
    }
    else if(figyelmeztetes[id]) figyelmeztetes[id]--;
    floodido[id] = jatekido + IDOKOZ;
#endif
    static fullos, tagek[MAX_BIT], team_lekeres, sTeam[16];
    team_lekeres  = get_user_team(id, sTeam, charsmax(sTeam));
 
    switch(team_lekeres)
    {
        case 1: fullos = formatex(tagek, charsmax(tagek), "%s%s", GetBit(bitelo, id) ? "^1" : "^1*Halott* ", csapat ? "^1[T] " : "");
        case 2: fullos = formatex(tagek, charsmax(tagek), "%s%s", GetBit(bitelo, id) ? "^1" : "^1*Halott* ", csapat ? "^1[CT] " : "");
        default:fullos = formatex(tagek, charsmax(tagek), "^1*Spec* ");
    }
#if defined ZOLD_IRAS || (defined PREFIXEK && !defined EGYEDI_PREFIXEK)
    static hozzaferes; hozzaferes = jogellenorzes(id);
#endif  
#if defined STEAM_PREFIX
    if(steames[id])
        fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "^1[^4Steam^1] ");
#endif
#if defined PREFIXEK    
    #if defined EGYEDI_PREFIXEK
    if(prefix[id][0])
    {
        replace_all(prefix[id], charsmax(prefix[]), "!n", "^1");
        replace_all(prefix[id], charsmax(prefix[]), "!t", "^3");
        replace_all(prefix[id], charsmax(prefix[]), "!g", "^4");
        fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "%s ", prefix[id]);
    }   
    #else
    static const adminprefixek[][] = { "", "^4[Tulaj] ", "^4[Admin] ", "^4[VIP] " };
    fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "%s", adminprefixek[hozzaferes]);
    #endif
#endif  
#if defined ZOLD_IRAS
    switch(hozzaferes)
    {
        case 0: fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "^3%%s1^1 :  %%s2");
        default:fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "^4%%s1^1 :  ^3%%s2");
    }
#else
    fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "^3%%s1^1 :  %%s2");
#endif 
    stringkonvertalas = uzenet;
    replace_all( stringkonvertalas, charsmax( stringkonvertalas ), "", " " );
    replace_all( stringkonvertalas, charsmax( stringkonvertalas ), "", " " ); 
 
    static bitlimit; bitlimit = MAX_BIT;
    while(fullos + strlen(stringkonvertalas) > MAX_BIT) stringkonvertalas[bitlimit -= 10] = 0;
 
    static players[32], pcount; get_players(players, pcount, "c");
    switch(csapat)
    {
        case true:
        {
            for(new i; i < pcount; i++)
            {
#if defined ADMIN_LAT               
                if(GetBit(bitadmin, players[i]) || (GetBit(bitelo, id) == GetBit(bitelo, players[i]) && team_lekeres == get_user_team(players[i])))
#else
                if(GetBit(bitelo, id) == GetBit(bitelo, players[i]) && team_lekeres == get_user_team(players[i]))
#endif
                    PrintChat(players[i], id, tagek, stringkonvertalas);
            }                               
        }
        case false:
        {   
            for(new i; i < pcount; i++)
#if defined ALAP_CHAT           
    #if defined ADMIN_LAT           
                if(GetBit(bitadmin, players[i]) || GetBit(bitelo, id) == GetBit(bitelo, players[i]))
    #else
                if(GetBit(bitelo, id) == GetBit(bitelo, players[i]))
    #endif              
                    PrintChat(players[i], id, tagek, stringkonvertalas);
#else
                PrintChat(players[i], id, tagek, stringkonvertalas);
#endif  
        }
    }
    static sAuthId[25], sName[32];
    get_user_name(id, sName, charsmax(sName)); 
    get_user_authid(id, sAuthId, charsmax(sAuthId));
    log_message("^"%s<%d><%s><%s>^" %s ^"%s^"", sName, get_user_userid(id), sAuthId, sTeam, csapat ? "say_team" : "say" , stringkonvertalas);   
    return PLUGIN_HANDLED;
}
 
PrintChat(iReceiver, iSender, const tagek[], const uzenet[])
{
    message_begin(MSG_ONE, 76, .player=iReceiver);
    write_byte(iSender);
    write_string(tagek);
    write_string("");
    write_string(uzenet);
    message_end();
}
 
stock kereses(const id)
{
    for(new i; i < ArraySize(adat); i++)
    {
        ArrayGetArray(adat, i, jatekosadat);
        switch(jatekosadat[TIPUS])
        {
            case 'j': 
            {
                if(get_user_flags(id) & read_flags(jatekosadat[ELLENORZES]))
                    return copy(prefix[id], charsmax(prefix[]), jatekosadat[PREFIX]);
            }   
            case 'i': 
            {
                static sIP[16]; get_user_ip(id, sIP, charsmax(sIP), 1);
                if(!strcmp(jatekosadat[ELLENORZES], sIP)) 
                    return copy(prefix[id], charsmax(prefix[]), jatekosadat[PREFIX]);
            }       
            case 's': 
            {
                static sAuthid[25]; get_user_authid(id, sAuthid, charsmax(sAuthid));
                if(!strcmp(jatekosadat[ELLENORZES], sAuthid)) 
                    return copy(prefix[id], charsmax(prefix[]), jatekosadat[PREFIX]);
            }       
        }
    }
    return prefix[id][0] = 0;
}
 
stock jogellenorzes(id)
{
    static flagek; flagek = get_user_flags(id);
    if(flagek & TULAJ_JOG)  return 1;
    else if(flagek & ADMIN_JOG) return 2;
    else if(flagek & VIP_JOG)   return 3;
    return 0;
}
 
stock bool:is_user_steam(id)
{
    static dp_pointer;
    if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
    {
        server_cmd("dp_clientinfo %d", id);
        server_exec();
        return (get_pcvar_num(dp_pointer) == 2) ? true : false;
    }
    return false;
}