Код:
#include <amxmodx>
#include <cstrike>
#include <dhudmessage>
#define VERSION "1.0"
#define CHATFLAG ADMIN_IMMUNITY
#define PREFIXFILE "addons/amxmodx/configs/prefixes.ini"
#define BIT_VALID(%1,%2) ((%1) & (1 << ((%2) - 1)))
#define BIT_ADD(%1,%2) ((%1) |= (1 << ((%2) - 1)))
#define BIT_SUB(%1,%2) ((%1) &= ~(1 << ((%2) - 1)))
#define BIT_NOT_VALID(%1,%2) (~(%1) & (1 << ((%2) - 1)))
enum _:DATA {
AUTH[32],
PREFIX[32]
}
new Array:g_aData, g_PlayerData[DATA]
new g_iBitClientAccess
new g_szPrefix[33][64], g_typed[190], g_message[190], g_name[32]
new g_Flood[33] = {0, ...}
new Float:g_fLastSay[33], Float:g_Flooding[33] = {0.0, ...}
#define SAY_DELAY 60.0
#define STARTMAP_DELAY 300.0
#define FLOODTIME 0.75
public plugin_init()
{
register_plugin("Advanced Chat", VERSION, "miRror")
register_concmd("ap_reload", "LoadConPrefixes")
register_clcmd("say", "HookSay")
register_clcmd("say_team", "HookSayTeam")
g_aData = ArrayCreate(DATA)
LoadPrefixes()
}
public LoadConPrefixes(id)
{
if(!(get_user_flags(id) & CHATFLAG))
{
console_print(id, "У вас нет прав доступа для перезагрузки префиксов")
return PLUGIN_HANDLED
}
LoadPrefixes()
new players[32], pcount
get_players(players, pcount, "ch")
for(new i; i < pcount; i++)
SearchClient(players[i])
server_print("*** Префиксы успешно перезагружены ***")
console_print(id, "*** Префиксы успешно перезагружены ***")
return PLUGIN_HANDLED
}
public LoadPrefixes()
{
new fp = fopen(PREFIXFILE, "rt")
if(!fp)
return PLUGIN_HANDLED
new buff[256];
while(!feof(fp))
{
fgets(fp, buff, charsmax(buff));
if(buff[0] && buff[0] != ';' && parse(buff, g_PlayerData[AUTH], charsmax(g_PlayerData[AUTH]), g_PlayerData[PREFIX], charsmax(g_PlayerData[PREFIX])))
ArrayPushArray(g_aData, g_PlayerData)
}
return fclose(fp);
}
public client_putinserver(id)
{
g_fLastSay[id] = 0.0
SearchClient(id)
set_task(5.0, "client_access_add", id)
}
public client_access_add(id)
BIT_ADD(g_iBitClientAccess, id)
public client_disconnect(id)
{
BIT_SUB(g_iBitClientAccess, id)
if(task_exists(id))
remove_task(id)
}
public HookSay(id)
{
read_args(g_typed, charsmax(g_typed))
remove_quotes(g_typed)
trim(g_typed)
if(BIT_NOT_VALID(g_iBitClientAccess, id))
return PLUGIN_HANDLED
if(!g_typed[0] || g_typed[0] == '/' || g_typed[0] == '.')
return PLUGIN_HANDLED_MAIN
if ( CheckFlood ( id ) )
return PLUGIN_HANDLED_MAIN
if(g_typed[0] == '@' && get_user_flags(id) & CHATFLAG)
{
showdhud(id, g_typed)
return PLUGIN_HANDLED
}
get_user_name(id, g_name, charsmax(g_name))
if(g_szPrefix[id][0])
{
static szFrmt[40]
formatex(szFrmt, charsmax(szFrmt), "^1[^4%s^1]", g_szPrefix[id])
formatex(g_message, charsmax(g_message), "%s^3 %s :^4 %s", szFrmt, g_name, g_typed)
} else
formatex(g_message, charsmax(g_message), "^3%s :^1 %s", g_name, g_typed)
static players[32], pcount
get_players(players, pcount, "ch")
for(new i; i < pcount; i++)
send_message(g_message, id, players[i])
return PLUGIN_HANDLED_MAIN
}
public HookSayTeam(id)
{
read_args(g_typed, charsmax(g_typed))
remove_quotes(g_typed)
trim(g_typed)
if(BIT_NOT_VALID(g_iBitClientAccess, id))
return PLUGIN_HANDLED
if(!g_typed[0] || g_typed[0] == '/' || g_typed[0] == '.')
return PLUGIN_HANDLED_MAIN
if ( CheckFlood ( id ) )
return PLUGIN_HANDLED_MAIN
get_user_name(id, g_name, charsmax(g_name))
if(get_user_flags(id) & CHATFLAG) formatex(g_message, charsmax(g_message), "^1(Админ) ^3%s :^4 %s", g_name, g_typed)
else formatex(g_message, charsmax(g_message), "^1(Игрок) ^3%s :^1 %s", g_name, g_typed)
static players[32], pcount
get_players(players, pcount, "ch")
for(new i; i < pcount; i++)
if(get_user_flags(players[i]) & CHATFLAG || players[i] == id)
send_message(g_message, id, players[i])
return PLUGIN_HANDLED_MAIN
}
public showdhud(id, g_typed[])
{
static g_msgChannel
get_user_name(id, g_name, charsmax(g_name))
if (++g_msgChannel > 6 || g_msgChannel < 3)
g_msgChannel = 3
new Float:verpos = 0.55 + float(g_msgChannel) / 35.0
set_dhudmessage(255, 255, 255, 0.05, verpos, 0, 6.0, 6.0, 0.5, 0.15)
show_dhudmessage(0, "%s : %s", g_name, g_typed[1])
client_print(0, print_notify, "%s : %s", g_name, g_typed[1])
}
public CheckFlood(id)
{
new Float:nexTime = get_gametime()
if (g_Flooding[id] > nexTime)
{
if (g_Flood[id] >= 3)
{
client_print(id, print_notify, "** Прекратите флудить **")
g_Flooding[id] = nexTime + FLOODTIME + 3.0
return 1
}
g_Flood[id]++
}
else if (g_Flood[id])
{
g_Flood[id]--
}
g_Flooding[id] = nexTime + FLOODTIME
return 0
}
SearchClient(const id)
{
for(new i; i < ArraySize(g_aData); i++)
{
ArrayGetArray(g_aData, i, g_PlayerData);
if(get_user_flags(id) & read_flags(g_PlayerData[AUTH]))
return SetPrefix(id, g_PlayerData[PREFIX]);
}
return g_szPrefix[id] = "";
}
SetPrefix(const id, const prefix[])
return copy(g_szPrefix[id], charsmax(g_szPrefix[]), prefix);
send_message(const message[], const id, const i)
{
message_begin(MSG_ONE, 76, {0, 0, 0}, i)
write_byte(id)
write_string(message)
message_end()
}