#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <reapi>
#define ALL_DHUD //Раскомментируйте, если хотите показывать сообщения только мертвым игрокам.
#define CHAT_REPEAT_TIME 25.0 // Время между сообщениями
#define DHUD_INTERVAL 10.0 //Интервал между сообщениями (Время показа одного сообщения).
#define DHUD_COLOR 1 // Цвет DHUD сообщениия
#if DHUD_COLOR == 0
#define COLOR_RED random_num(1, 255)
#define COLOR_GREEN random_num(1, 255)
#define COLOR_BLUE random_num(1, 255)
#endif
#if DHUD_COLOR == 1
#define COLOR_RED 255
#define COLOR_GREEN 255
#define COLOR_BLUE 255
#endif
const PLAYER_KEY = 2; // Ключ для сохранения. 1. - Ник. 2. - Стим. 3.- IP
const NUMBER_DAYS_INACTIVITY = 7; // Через сколько дней удалять игрока, незаходящего на сервер
const SECONDS_IN_DAY = 86400; // Количество секунд в одном дне
const iBitChat = (1<<0);
const iBitDhud = (1<<1);
const IP_LENGHT = 16; // не трогать!
const NAME_LENGHT = 31; // не трогать!
const STEAM_LENGHT = 34; // не трогать!
const PATH_STRLEN = 64;
const AUTHID_STRLEN = 24;
const PLAYER_NAME_STRLEN = 32;
new stats_keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_0
new g_iVaultID;
#define get_settings(%0,%1) g_iPlayerSettings[%0] & %1
#define set_settings(%0,%1) g_iPlayerSettings[%0] |= %1
#define del_settings(%0,%1) g_iPlayerSettings[%0] &= ~%1
new g_iPlayerSettings[MAX_PLAYERS + 1];
new g_szTemp[35];
new adMessages[256][191];
new ad_count, iMessgCount;
new Array:g_apMessages, g_iCounter, g_iArraySize, g_pcvar_hostname;
public plugin_init()
{
register_plugin("Advert Messages", "1.4", "maFFyoZZyk & neygomon");
register_menu("ClCmdAdvertising", stats_keys, "ClCmdAdvertising_func");
set_task(CHAT_REPEAT_TIME, "advert", .flags="b");
set_task(DHUD_INTERVAL, "dhud_advert", .flags="b");
register_clcmd("adv", "ClCmdAdvertising");
g_pcvar_hostname = get_cvar_pointer("hostname");
g_apMessages = ArrayCreate(128);
}
public plugin_cfg()
{
new file = fopen("addons/amxmodx/configs/advert.ini", "rt");
if(file)
{
new buffer[512], message[191];
enum { chat, dhud };
new section = -1;
while(!feof(file))
{
fgets(file, buffer, charsmax(buffer));
trim(buffer);
switch(buffer[0])
{
case '[':
{
if(!strcmp(buffer, "[CHAT]")) section = chat;
else if(!strcmp(buffer, "[DHUD]")) section = dhud;
continue;
}
case '#': continue;
}
switch(section)
{
case chat:
{
if(buffer[0] != ';' && parse(buffer, message, charsmax(message)))
{
while(replace(message, charsmax(message), "!n", "^1")) {}
while(replace(message, charsmax(message), "!t", "^3")) {}
while(replace(message, charsmax(message), "!g", "^4")) {}
formatex(adMessages[ad_count++], charsmax(adMessages[]), "^1%s", message);
}
}
case dhud:
{
new dhHostname[64], dhIP[32];
get_user_ip(0, dhIP, charsmax(dhIP));
get_pcvar_string(g_pcvar_hostname, dhHostname, 63);
if(buffer[0] != ';' && parse(buffer, message, charsmax(message)))
{
while(replace(message, charsmax(message), "%ip%", dhIP)) {}
while(replace(message, charsmax(message), "%hostname%", dhHostname)) {}
while(replace(message, charsmax(message), "%new%", "^n")) {}
ArrayPushArray(g_apMessages, message);
}
g_iArraySize = ArraySize(g_apMessages);
}
default: continue;
}
}
fclose(file);
}
else set_fail_state("File ^"addons/amxmodx/configs/advert.ini^" not found!");
g_iVaultID = nvault_open("advertising");
nvault_prune(g_iVaultID, 0, get_systime() - SECONDS_IN_DAY * NUMBER_DAYS_INACTIVITY);
}
public client_putinserver(id)
{
get_key(id);
new s_Data[30], i_Timestamp, i_DataExists;
i_DataExists = nvault_lookup(g_iVaultID, g_szTemp, s_Data, charsmax(s_Data) , i_Timestamp);
if (!i_DataExists)
{
g_iPlayerSettings[id] = 3;
new szTempSets[12];
num_to_str(g_iPlayerSettings[id], szTempSets, charsmax(szTempSets));
nvault_set(g_iVaultID, g_szTemp, szTempSets);
}
else
g_iPlayerSettings[id] = nvault_get(g_iVaultID, g_szTemp);
}
public plugin_end()
{
nvault_close(g_iVaultID);
}
public advert()
{
static players[32], pcount;
get_players(players, pcount, "ch");
for(new i; i < pcount; i++)
{
if(get_settings(players[i], iBitChat))
ChatColor(players[i], "%s", adMessages[iMessgCount == ad_count ? (iMessgCount = 0) : iMessgCount++]);
}
}
public dhud_advert()
{
if(++g_iCounter >= g_iArraySize)
g_iCounter = 0;
static i, apPlayers[32], iPlayers;
#if defined ALL_DHUD
get_players(apPlayers, iPlayers, "bch");
#else
get_players(apPlayers, iPlayers, "ch");
#endif
static szMess[128], szName[32];
ArrayGetString(g_apMessages, g_iCounter, szMess, charsmax(szMess));
set_dhudmessage(COLOR_RED, COLOR_GREEN, COLOR_BLUE, -1.0, 0.04, 0, 2.0, DHUD_INTERVAL - 1.0);
for(i = 0; i < iPlayers; i++)
{
if(get_settings(apPlayers[i], iBitDhud))
{
replace_all(szMess, charsmax(szMess), szName, "%name%");
get_user_name(apPlayers[i], szName, charsmax(szName));
replace_all(szMess, charsmax(szMess), "%name%", szName);
show_dhudmessage(apPlayers[i], szMess);
client_print(0, print_console, "%s", szMess);
}
}
}
public ClCmdAdvertising(const id)
{
static menu[MAX_MENU_LENGTH], iLen;
iLen = 0;
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\rНастройка рекламы:^n^n");
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[1] \wРеклама в чат: %s^n", get_settings(id, iBitChat) ? "\y[\rВКЛЮЧЕНА\y]" : "\y[\dВЫКЛЮЧЕНА\y]");
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[2] \wРеклама в DHUD: %s^n^n", get_settings(id, iBitDhud) ? "\y[\rВКЛЮЧЕНА\y]" : "\y[\dВЫКЛЮЧЕНА\y]");
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\y[0] \wВыход");
show_menu(id, stats_keys, menu, -1, "ClCmdAdvertising");
return PLUGIN_HANDLED;
}
public ClCmdAdvertising_func(id, key)
{
switch(key)
{
case 0:
{
if(get_settings(id, iBitChat))
{
del_settings(id, iBitChat);
client_print_color(id, print_team_default, "^4* ^1Вы деактивировали показ рекламы в чат");
}
else
{
set_settings(id, iBitChat);
client_print_color(id, print_team_default, "^4* ^1Вы активировали показ рекламы в чат");
}
rg_send_audio(id, "events/tutor_msg.wav");
ClCmdAdvertising(id);
}
case 1:
{
if(get_settings(id, iBitDhud))
{
del_settings(id, iBitDhud);
client_print_color(id, print_team_default, "^4* ^1Вы деактивировали показ рекламы в DHUD");
}
else
{
set_settings(id, iBitDhud);
client_print_color(id, print_team_default, "^4* ^1Вы активировали показ рекламы в DHUD");
}
rg_send_audio(id, "events/tutor_msg.wav");
ClCmdAdvertising(id);
}
}
get_key(id);
new szTempSets[12];
num_to_str(g_iPlayerSettings[id], szTempSets, charsmax(szTempSets));
nvault_set(g_iVaultID, g_szTemp, szTempSets);
}
get_key(const id)
{
switch(PLAYER_KEY)
{
case 1: get_user_name(id, g_szTemp, NAME_LENGHT) // получаем ник
case 2: get_user_authid(id, g_szTemp, STEAM_LENGHT); // получаем стим
case 3: get_user_ip( id, g_szTemp, IP_LENGHT, 1 ); // получаем ip
}
}
stock ChatColor(const id, const szMessage[], any:...)
{
static pnum, players[32], szMsg[190], IdMsg;
vformat(szMsg, charsmax(szMsg), szMessage, 3);
if(!IdMsg) IdMsg = get_user_msgid("SayText");
if(id)
{
players[0] = id;
pnum = 1;
}
else get_players(players, pnum, "ch");
for(new i; i < pnum; i++)
{
message_begin(MSG_ONE, IdMsg, .player = players[i]);
write_byte(players[i]);
write_string(szMsg);
message_end();
}
}