#pragma semicolon 1
#include <sourcemod>
#include <vip>
public Plugin:myinfo =
{
name = "VIP [Chat]",
author = "wS",
version = "1.4.2"
};
#include "vip_chat/vars.sp"
#include "vip_chat/vars_server.sp"
#include "vip_chat/functions.sp"
#include "vip_chat/colors.sp"
#include "vip_chat/tags.sp"
#include "vip_chat/menu.sp"
#include "vip_chat/say.sp"
#include "vip_chat/exceptions.sp"
#include "vip_chat/gag.sp"
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
// native VIP_ChatSkipMessage(client);
RegPluginLibrary("ws_vip_chat");
MarkNativeAsOptional("BaseComm_IsClientGagged");
MarkNativeAsOptional("BfWriteByte");
MarkNativeAsOptional("BfWriteString");
CreateNative("VIP_ChatSkipMessage", VIP_ChatSkipMessage_);
return APLRes_Success;
}
public VIP_ChatSkipMessage_(Handle:plugin, args)
{
// Возможно какой-то плаг ждёт в чате текст игрока.
// VIP чат не сработает один раз, а значит сообщение не будет заблокировано и тот плаг сможет его поймать.
g_bSkipMessage[GetNativeCell(1)] = true;
}
public OnPluginStart()
{
if (!(g_ItemID = VIP_RegisterItem(ITEM_NAME, VIP_ITEM_SELECT)))
SetFailState("VIP_RegisterItem error (%s)", ITEM_NAME);
g_ServerType = VIP_GetServerType();
for (new client = 1; client <= MaxClients; client++)
{
g_sMyTag[client][0] = 0x01;
g_sMyTag[client][1] = 0;
for (new i = 0; i < 3; i++)
{
g_iMyColorIndex [client] = INVALID_INDEX;
g_sMyColorString[client][0] = 0x01;
g_sMyColorString[client][1] = 0;
}
}
ServerVars();
LoadTranslations("vip_chat.phrases");
AddCommandListener(SayHook, "say");
AddCommandListener(SayHook, "say_team");
}
///////////////////////////////////////////////////////////////////////////////////
public bool:VIP_CurrentItemValue(client, ItemID, String:ItemValue[], ItemValueSize)
{
if (g_bEnabled[client] && g_bReady[client])
{
IntToString(1, ItemValue, ItemValueSize);
return true;
}
ItemValue[0] = 0;
return false;
}
public VipGiveAction:VIP_GiveAccess(client, ItemID, String:ItemValue[ITEM_INFO_LENGTH], bool:bCallAfterAdminAction, CURRENT_ACCESS, Handle:kv)
{
if (g_bAccess[client]) return VGA_AlreadyEnabled;
g_bAccess[client] = true;
if (!bCallAfterAdminAction || CURRENT_ACCESS == CURRENT_ACCESS_YES_GROUP)
{
// Или это авто-выдача доступа по флагу/группе.
// Или это админ включает/изменяет функцию VIP игроку.
// В обоих случаях нам нужно взять инфу из кэша.
if (!kv)
return VGA_Stop;
decl String:group[GROUP_LENGTH];
if (!VIP_GetGroupName(client, group, GROUP_LENGTH))
group[0] = 0;
for (new eForce:i; i < eForce; i++)
g_bForce[client] = false;
KvRewind(kv);
g_bEnabled[client] = KvGetNum(kv, "chat_off", 0) == 0;
decl String:sKey[COLOR_NAME_LENGTH], index;
if (group[0] && g_hForceTagAndColorKv)
{
KvRewind(g_hForceTagAndColorKv);
if (KvJumpToKey(g_hForceTagAndColorKv, group, false))
{
KvGetString(g_hForceTagAndColorKv, "tag", g_sMyTag[client], TAG_LENGTH, "");
if (g_sMyTag[client][0])
{
g_bForce[client][eF_tag] = true;
}
else
{
g_bForce[client][eF_tag] = false;
g_sMyTag[client][0] = 0x01;
g_sMyTag[client][1] = 0;
}
new const String:s[][] = {"tag_color", "nick_color", "msg_color"};
for (new i = 0; i < sizeof(s); i++)
{
KvGetString(g_hForceTagAndColorKv, s, sKey, sizeof(sKey), "");
if (TrimString(sKey))
{
g_bForce[client][i + 1] = true;
if ((index = FindStringInArray(g_hColorNameKeyAr, sKey)) > -1)
{
g_iMyColorIndex[client] = index;
GetArrayString(g_hColorStringAr, index, g_sMyColorString[client], sizeof(g_sMyColorString[][]));
}
else
{
g_sMyColorString[client][0] = 0x01;
g_sMyColorString[client][1] = 0;
}
}
else
{
g_bForce[client][i + 1] = false;
g_sMyColorString[client][0] = 0x01;
g_sMyColorString[client][1] = 0;
}
}
}
}
/////
decl Handle:hTrie;
// тег
if (g_sMyTag[client][0] == 0x01 && !g_bForce[client][eF_tag])
{
KvGetString(kv, "chat_tag", sKey, sizeof(sKey));
if (sKey[0] && (g_iMyTagIndex[client] = FindStringInArray(g_hTagKeyAr, sKey)) > -1 && (!(hTrie = Handle:GetArrayCell(g_hTagVipGroupAr, g_iMyTagIndex[client])) || group[0] && GetTrieValue(hTrie, group, hTrie)))
{
GetArrayString(g_hTagAr, g_iMyTagIndex[client], g_sMyTag[client], TAG_LENGTH);
}
else
g_iMyTagIndex[client] = INVALID_INDEX;
}
// цвета
new const String:s[][] = {"chat_tag_color", "chat_nick_color", "chat_text_color"};
for (new i = 0; i < sizeof(s); i++)
{
if (g_sMyColorString[client][0] == 0x01 && !g_bForce[client][i + 1])
{
KvGetString(kv, s, sKey, sizeof(sKey));
if (sKey[0] && (index = FindStringInArray(g_hColorNameKeyAr, sKey)) > -1 && (!(hTrie = Handle:GetArrayCell(g_hColorVipGroupAr, index)) || group[0] && GetTrieValue(hTrie, group, hTrie)))
{
g_iMyColorIndex[client] = index;
GetArrayString(g_hColorStringAr, index, g_sMyColorString[client], sizeof(g_sMyColorString[][]));
}
}
}
wS_Ready(client);
if (g_bReady[client])
{
if (g_bEnabled[client])
VIP_NotifyItemStatusChanged(client, ITEM_NAME, true);
}
else
g_bEnabled[client] = false;
//if (bCallAfterAdminAction) wS_MainMenu(client);
//return VGA_Continue;
}
if (!CURRENT_ACCESS && bCallAfterAdminAction) wS_MainMenu(client);
return VGA_Continue;
}
public VIP_TakeAccess(client, ItemID, bool:bToggledByClient)
{
OnClientDisconnect_Post(client);
VIP_NotifyItemStatusChanged(client, ITEM_NAME, false);
}
///////////////////////////////////////////////////////////////////////////////////
public VIP_MenuSelect(client, ItemID)
{
wS_MainMenu(client);
}
public OnMapStart()
{
wS_ReloadColors();
wS_ReloadTags();
wS_ReloadExceptions();
//
if (g_hForceTagAndColorKv) CloseHandle(g_hForceTagAndColorKv);
g_hForceTagAndColorKv = CreateKeyValues("force_tag_and_colors");
if (!FileToKeyValues(g_hForceTagAndColorKv, "cfg/vip/modules/chat/force_tag_and_colors.txt") || !KvGotoFirstSubKey(g_hForceTagAndColorKv, true))
{
CloseHandle(g_hForceTagAndColorKv);
g_hForceTagAndColorKv = INVALID_HANDLE;
}
//
}
public OnClientDisconnect_Post(client)
{
g_bAccess[client] = false;
g_bReady[client] = false;
g_bEnabled[client] = false;
g_iMyTagIndex[client] = INVALID_INDEX;
g_sMyTag[client][0] = 0x01;
g_sMyTag[client][1] = 0;
for (new i = 0; i < 3; i++)
{
g_iMyColorIndex [client] = INVALID_INDEX;
g_sMyColorString[client][0] = 0x01;
g_sMyColorString[client][1] = 0;
}
g_bSkipMessage[client] = false;
g_fLastChatMsgTime[client] = 0.0;
}