kilroy
:clown:
- Сообщения
- 1,065
- Реакции
- 606
- Команда форума
- #1
Помогите исправить SourceSleuth под новую серверную часть от этого СБ [ALPHA] Material Admin - рефорк SB++ 1.5.4.7
Нужно чтобы банило по IP за обход бана. И есть ещё небольшой баг, плагин не банит за обход, если бан перманентный.
Нужно чтобы банило по IP за обход бана. И есть ещё небольшой баг, плагин не банит за обход, если бан перманентный.
C-подобный:
public PlVers:__version =
{
version = 5,
filevers = "1.5.3",
date = "11/16/2014",
time = "20:46:13"
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[4];
public Extension:__ext_core =
{
name = "Core",
file = "core",
autoload = 0,
required = 0,
};
new MaxClients;
new Handle:g_hDatabase;
new Handle:g_cVar_actions;
new Handle:g_cVar_banduration;
new Handle:g_cVar_sbprefix;
new Handle:g_cVar_bansAllowed;
new Handle:g_cVar_bantype;
new Handle:g_cVar_bypass;
new Handle:g_hAllowedArray;
new bool:CanUseSourcebans;
public Plugin:myinfo =
{
name = "SourceSleuth",
description = "Useful for TF2 servers. Plugin will check for banned ips and ban the player.",
author = "ecca",
version = "1.3 fix",
url = "http://sourcemod.net"
};
/* ERROR! null */
function "NodeBlock" (number 0)
public __ext_core_SetNTVOptional()
{
MarkNativeAsOptional("GetFeatureStatus");
MarkNativeAsOptional("RequireFeature");
MarkNativeAsOptional("AddCommandListener");
MarkNativeAsOptional("RemoveCommandListener");
MarkNativeAsOptional("BfWriteBool");
MarkNativeAsOptional("BfWriteByte");
MarkNativeAsOptional("BfWriteChar");
MarkNativeAsOptional("BfWriteShort");
MarkNativeAsOptional("BfWriteWord");
MarkNativeAsOptional("BfWriteNum");
MarkNativeAsOptional("BfWriteFloat");
MarkNativeAsOptional("BfWriteString");
MarkNativeAsOptional("BfWriteEntity");
MarkNativeAsOptional("BfWriteAngle");
MarkNativeAsOptional("BfWriteCoord");
MarkNativeAsOptional("BfWriteVecCoord");
MarkNativeAsOptional("BfWriteVecNormal");
MarkNativeAsOptional("BfWriteAngles");
MarkNativeAsOptional("BfReadBool");
MarkNativeAsOptional("BfReadByte");
MarkNativeAsOptional("BfReadChar");
MarkNativeAsOptional("BfReadShort");
MarkNativeAsOptional("BfReadWord");
MarkNativeAsOptional("BfReadNum");
MarkNativeAsOptional("BfReadFloat");
MarkNativeAsOptional("BfReadString");
MarkNativeAsOptional("BfReadEntity");
MarkNativeAsOptional("BfReadAngle");
MarkNativeAsOptional("BfReadCoord");
MarkNativeAsOptional("BfReadVecCoord");
MarkNativeAsOptional("BfReadVecNormal");
MarkNativeAsOptional("BfReadAngles");
MarkNativeAsOptional("BfGetNumBytesLeft");
MarkNativeAsOptional("PbReadInt");
MarkNativeAsOptional("PbReadFloat");
MarkNativeAsOptional("PbReadBool");
MarkNativeAsOptional("PbReadString");
MarkNativeAsOptional("PbReadColor");
MarkNativeAsOptional("PbReadAngle");
MarkNativeAsOptional("PbReadVector");
MarkNativeAsOptional("PbReadVector2D");
MarkNativeAsOptional("PbGetRepeatedFieldCount");
MarkNativeAsOptional("PbReadRepeatedInt");
MarkNativeAsOptional("PbReadRepeatedFloat");
MarkNativeAsOptional("PbReadRepeatedBool");
MarkNativeAsOptional("PbReadRepeatedString");
MarkNativeAsOptional("PbReadRepeatedColor");
MarkNativeAsOptional("PbReadRepeatedAngle");
MarkNativeAsOptional("PbReadRepeatedVector");
MarkNativeAsOptional("PbReadRepeatedVector2D");
MarkNativeAsOptional("PbSetInt");
MarkNativeAsOptional("PbSetFloat");
MarkNativeAsOptional("PbSetBool");
MarkNativeAsOptional("PbSetString");
MarkNativeAsOptional("PbSetColor");
MarkNativeAsOptional("PbSetAngle");
MarkNativeAsOptional("PbSetVector");
MarkNativeAsOptional("PbSetVector2D");
MarkNativeAsOptional("PbAddInt");
MarkNativeAsOptional("PbAddFloat");
MarkNativeAsOptional("PbAddBool");
MarkNativeAsOptional("PbAddString");
MarkNativeAsOptional("PbAddColor");
MarkNativeAsOptional("PbAddAngle");
MarkNativeAsOptional("PbAddVector");
MarkNativeAsOptional("PbAddVector2D");
MarkNativeAsOptional("PbReadMessage");
MarkNativeAsOptional("PbReadRepeatedMessage");
MarkNativeAsOptional("PbAddMessage");
VerifyCoreVersion();
return 0;
}
bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
{
return strcmp(str1, str2, caseSensitive) == 0;
}
public OnPluginStart()
{
LoadTranslations("sourcesleuth.phrases");
CreateConVar("sm_sourcesleuth_version", "1.3 fix", "SourceSleuth plugin version", 401728, false, 0.0, false, 0.0);
g_cVar_actions = CreateConVar("sm_sleuth_actions", "3", "Sleuth Ban Type: 1 - Original Length, 2 - Custom Length, 3 - Double Length, 4 - Notify Admins Only", 262144, true, 1.0, true, 4.0);
g_cVar_banduration = CreateConVar("sm_sleuth_duration", "0", "Required: sm_sleuth_actions 1: Bantime to ban player if we got a match (0 = permanent (defined in minutes) )", 262144, false, 0.0, false, 0.0);
g_cVar_sbprefix = CreateConVar("sm_sleuth_prefix", "sb", "Prexfix for sourcebans tables: Default sb", 262144, false, 0.0, false, 0.0);
g_cVar_bansAllowed = CreateConVar("sm_sleuth_bansallowed", "0", "How many active bans are allowed before we act", 262144, false, 0.0, false, 0.0);
g_cVar_bantype = CreateConVar("sm_sleuth_bantype", "0", "0 - ban all type of lengths, 1 - ban only permanent bans", 262144, true, 0.0, true, 1.0);
g_cVar_bypass = CreateConVar("sm_sleuth_adminbypass", "0", "0 - Inactivated, 1 - Allow all admins with ban flag to pass the check", 262144, true, 0.0, true, 1.0);
g_hAllowedArray = CreateArray(256, 0);
AutoExecConfig(true, "Sm_SourceSleuth", "sourcemod");
SQL_TConnect(SQL_OnConnect, "sourcebans", any:0);
RegAdminCmd("sm_sleuth_reloadlist", ReloadListCallBack, 16384, "", "", 0);
LoadWhiteList();
return 0;
}
public OnAllPluginsLoaded()
{
if (LibraryExists("sourcebans"))
{
CanUseSourcebans = true;
}
return 0;
}
public OnLibraryAdded(String:name[])
{
if (StrEqual("sourcebans", name, true))
{
CanUseSourcebans = true;
}
return 0;
}
public OnLibraryRemoved(String:name[])
{
if (StrEqual("sourcebans", name, true))
{
CanUseSourcebans = false;
}
return 0;
}
public SQL_OnConnect(Handle:owner, Handle:hndl, String:error[], any:data)
{
if (hndl)
{
g_hDatabase = hndl;
}
else
{
LogError("SourceSleuth: Database connection error: %s", error);
}
return 0;
}
public Action:ReloadListCallBack(client, args)
{
ClearArray(g_hAllowedArray);
LoadWhiteList();
LogMessage("%L reloaded the whitelist", client);
if (client)
{
PrintToChat(client, "[SourceSleuth] WhiteList has been reloaded!");
}
return Action:0;
}
public OnClientPostAdminCheck(client)
{
new var1;
if (CanUseSourcebans && !IsFakeClient(client))
{
new String:steamid[32];
GetClientAuthString(client, steamid, 32, true);
new var2;
if (GetConVarBool(g_cVar_bypass) && CheckCommandAccess(client, "sleuth_admin", 8, false))
{
return 0;
}
if (FindStringInArray(g_hAllowedArray, steamid) == -1)
{
decl String:IP[32];
decl String:Prefix[64];
decl String:query[1024];
GetClientIP(client, IP, 32, true);
GetConVarString(g_cVar_sbprefix, Prefix, 64);
if (GetConVarInt(g_cVar_bantype))
{
FormatEx(query, 1024, "SELECT * FROM %s_bans WHERE ip='%s' AND RemoveType IS NULL AND length='0'", Prefix, IP);
}
else
{
FormatEx(query, 1024, "SELECT * FROM %s_bans WHERE ip='%s' AND RemoveType IS NULL AND ends > %d", Prefix, IP, GetTime({0,0}));
}
new Handle:datapack = CreateDataPack();
WritePackCell(datapack, GetClientUserId(client));
WritePackString(datapack, steamid);
WritePackString(datapack, IP);
ResetPack(datapack, false);
SQL_TQuery(g_hDatabase, SQL_CheckHim, query, datapack, DBPriority:1);
}
}
return 0;
}
public SQL_CheckHim(Handle:owner, Handle:hndl, String:error[], any:datapack)
{
decl client;
decl String:steamid[32];
decl String:IP[32];
decl String:Reason[256];
decl String:text[256];
if (datapack)
{
client = GetClientOfUserId(ReadPackCell(datapack));
ReadPackString(datapack, steamid, 32);
ReadPackString(datapack, IP, 32);
CloseHandle(datapack);
}
if (!hndl)
{
LogError("SourceSleuth: Database query error: %s", error);
}
if (SQL_FetchRow(hndl))
{
new TotalBans = SQL_GetRowCount(hndl);
if (GetConVarInt(g_cVar_bansAllowed) < TotalBans)
{
new time;
switch (GetConVarInt(g_cVar_actions))
{
case 1:
{
time = SQL_FetchInt(hndl, 6, 0) * 60;
FormatEx(Reason, 255, "[SourceSleuth] %t", "sourcesleuth_banreason");
}
case 2:
{
time = GetConVarInt(g_cVar_banduration);
FormatEx(Reason, 255, "[SourceSleuth] %t", "sourcesleuth_banreason");
}
case 3:
{
time = SQL_FetchInt(hndl, 6, 0) / 60 * 2;
FormatEx(Reason, 255, "[SourceSleuth] %t", "sourcesleuth_banreason");
}
case 4:
{
FormatEx(text, 255, "[SourceSleuth] %t", "sourcesleuth_admintext", client, steamid, IP);
PrintToAdmins("%s", text);
}
default:
{
}
}
ServerCommand("sm_banip \"%s\" %i \"%s\"", IP, time, Reason);
KickClient(client, Reason);
}
}
return 0;
}
PrintToAdmins(String:format[])
{
new String:g_Buffer[256];
new i = 1;
while (i <= MaxClients)
{
new var1;
if (CheckCommandAccess(i, "sm_sourcesleuth_printtoadmins", 8, false) && IsClientInGame(i))
{
VFormat(g_Buffer, 256, format, 2);
PrintToChat(i, "%s", g_Buffer);
}
i++;
}
return 0;
}
public LoadWhiteList()
{
decl String:path[256];
decl String:line[256];
BuildPath(PathType:0, path, 256, "configs/sourcesleuth_whitelist.cfg");
new Handle:fileHandle = OpenFile(path, "r");
while (!IsEndOfFile(fileHandle) && ReadFileLine(fileHandle, line, 256))
{
ReplaceString(line, 256, "\n", "", false);
PushArrayString(g_hAllowedArray, line);
}
CloseHandle(fileHandle);
return 0;
}