Senior Member
|
10-24-2020
, 22:10
Invalid index -1 (count: 100)
|
#1
|
Hello,
Please help me with this error:
Code:
L 10/25/2020 - 00:04:52: [SM] Exception reported: Invalid index -1 (count: 100)
L 10/25/2020 - 00:04:52: [SM] Blaming: sbpp_lastplayer.smx
L 10/25/2020 - 00:04:52: [SM] Call stack trace:
L 10/25/2020 - 00:04:52: [SM] [0] ArrayList.Erase
L 10/25/2020 - 00:04:52: [SM] [1] Line 63, C:\Users\****\sbpp_lastplayer.sp::OnClientPostAdminCheck
Plugin:
PHP Code:
#include <sourcemod>
#include <adminmenu>
#pragma semicolon 1
#pragma newdecls required
#define PLUGIN_VERSION "2.0"
#define TAG "[SM]"
Handle g_hTopMenu = null;
ConVar gcv_iArraySize = null;
ArrayList ga_Names;
ArrayList ga_SteamIds;
ArrayList ga_Ips;
int g_ownReasons[MAXPLAYERS + 1] = false;
char g_temp_Steam[MAXPLAYERS + 1][128], g_temp_Minutes[MAXPLAYERS + 1][128], g_temp_Name[MAXPLAYERS + 1][128], g_temp_IP[MAXPLAYERS + 1][128];
public Plugin myinfo =
{
name = "Last Player List",
author = "DC",
description = "Allows you to ban players who have disconnected from the server",
version = PLUGIN_VERSION,
};
public void OnPluginStart()
{
CreateConVar("sm_last_version", PLUGIN_VERSION, "Headline's last player", FCVAR_DONTRECORD);
gcv_iArraySize = CreateConVar("sm_bandisconnected_max", "100", "List size of ban disconnected players menu");
RegAdminCmd("sm_lastban", Command_BanDisconnected, ADMFLAG_BAN, "Ban a player after they have disconnected!");
RegAdminCmd("sm_last", Command_ListDisconnected, ADMFLAG_BAN, "List all disconnected players!");
RegConsoleCmd("say", ChatHook);
RegConsoleCmd("say_team", ChatHook);
HookEvent("player_disconnect", Event_PlayerDisconnect, EventHookMode_Pre);
Handle topmenu;
if(LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
{
OnAdminMenuReady(topmenu);
}
LoadADTArray();
}
public void OnClientPostAdminCheck(int client)
{
char sSteamID[32];
GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID));
if (FindStringInArray(ga_SteamIds, sSteamID) != -1)
{
ga_Names.Erase(ga_SteamIds.FindString(sSteamID));
ga_SteamIds.Erase(ga_SteamIds.FindString(sSteamID));
ga_Ips.Erase(ga_SteamIds.FindString(sSteamID));
}
}
public void OnClientDisconnect(int client)
{
g_ownReasons[client] = false;
g_temp_Steam[client] = NULL_STRING;
g_temp_Minutes[client] = NULL_STRING;
g_temp_Name[client] = NULL_STRING;
g_temp_IP[client] = NULL_STRING;
}
public Action Event_PlayerDisconnect(Event hEvent, char[] name, bool bDontBroadcast)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
if (IsValidClient(client))
{
char sName[MAX_NAME_LENGTH];
GetClientName(client, sName, sizeof(sName));
char sDisconnectedSteamID[32];
GetClientAuthId(client, AuthId_Steam2, sDisconnectedSteamID, sizeof(sDisconnectedSteamID));
char sDisconnectedIP[32];
GetClientIP(client, sDisconnectedIP, sizeof(sDisconnectedIP));
if (FindStringInArray(ga_SteamIds, sDisconnectedSteamID) == -1)
{
PushToArrays(sName, sDisconnectedSteamID, sDisconnectedIP);
}
}
}
void PushToArrays(const char[] clientName, const char[] clientSteam, const char[] clientIP)
{
if (ga_Names.Length == 0)
{
ga_Names.PushString(clientName);
ga_SteamIds.PushString(clientSteam);
ga_Ips.PushString(clientIP);
}
else
{
ga_Names.ShiftUp(0);
ga_SteamIds.ShiftUp(0);
ga_Ips.ShiftUp(0);
ga_Names.SetString(0, clientName);
ga_SteamIds.SetString(0, clientSteam);
ga_Ips.SetString(0, clientIP);
}
/* Trucate Arrays */
if (ga_Names.Length >= gcv_iArraySize.IntValue && gcv_iArraySize.IntValue > 0)
{
ga_Names.Resize(gcv_iArraySize.IntValue);
ga_SteamIds.Resize(gcv_iArraySize.IntValue);
ga_Ips.Resize(gcv_iArraySize.IntValue);
}
}
// COMMAND CODE //
public Action ChatHook(int client, int args)
{
// is this player preparing to ban someone
if (g_ownReasons[client])
{
// get the reason
char reason[512];
GetCmdArgString(reason, sizeof(reason));
StripQuotes(reason);
g_ownReasons[client] = false;
CheckAndPerformBan(client, g_temp_Steam[client], StringToInt(g_temp_Minutes[client]), reason, g_temp_Name[client], g_temp_IP[client]);
// block the reason to be sent in chat
return Plugin_Handled;
}
return Plugin_Continue;
}
public Action Command_BanDisconnected(int client, int args)
{
if (args != 3)
{
ReplyToCommand(client, " %sUsage: sm_bandisconnected <\"steamid\"> <minutes|0> [\"reason\"] <name> <ip>", TAG);
return Plugin_Handled;
}
else
{
char steamid[20], minutes[10], reason[256], name[128], ip[20];
GetCmdArg(1, steamid, sizeof(steamid));
GetCmdArg(2, minutes, sizeof(minutes));
GetCmdArg(3, reason, sizeof(reason));
GetCmdArg(4, name, sizeof(name));
GetCmdArg(5, ip, sizeof(ip));
CheckAndPerformBan(client, steamid, StringToInt(minutes), reason, name, ip);
}
return Plugin_Handled;
}
public Action Command_ListDisconnected( int client, int args )
{
if ( ga_Names.Length >= 10 )
{
PrintToConsole( client, "************ OSTATNIE 10 ROZLACZONYCH GRACZY *****************" );
for ( int i = 0; i <= 10; i++ )
{
char sName[MAX_TARGET_LENGTH], sSteamID[32], sIP[32];
ga_Names.GetString(i, sName, sizeof(sName));
ga_SteamIds.GetString(i, sSteamID, sizeof(sSteamID));
ga_Ips.GetString(i, sIP, sizeof(sIP));
PrintToConsole(client, "NAME : %s STEAMID : %s IP : %s", sName, sSteamID, sIP);
}
PrintToConsole( client, "************ OSTATNIE 10 ROZLACZONYCH GRACZY *****************" );
}
else
{
if ( ga_Names.Length == 0 )
{
PrintToConsole(client, "%s Nie ma jeszcze rozlaczonych graczy!", TAG);
}
else
{
PrintToConsole(client, "************ OSTATNIE %i ROZLACZONYCH GRACZY *****************", GetArraySize(ga_Names) - 1);
for (int i = 0; i < ga_Names.Length; i++)
{
char sName[MAX_TARGET_LENGTH], sSteamID[32], sIP[32];
ga_Names.GetString(i, sName, sizeof(sName));
ga_SteamIds.GetString(i, sSteamID, sizeof(sSteamID));
ga_Ips.GetString(i, sIP, sizeof(sIP));
PrintToConsole(client, "** %s | %s - %s **", sName, sSteamID, sIP);
}
PrintToConsole(client, "************ OSTATNIE %i ROZLACZONYCH GRACZY *****************", GetArraySize(ga_Names) - 1);
}
}
return Plugin_Handled;
}
void CheckAndPerformBan(int client, char[] steamid, int minutes, char[] reason, char[] name, char[] ip)
{
AdminId admClient = GetUserAdmin(client);
AdminId admTarget;
if ((admTarget = FindAdminByIdentity(AUTHMETHOD_STEAM, steamid)) == INVALID_ADMIN_ID || CanAdminTarget(admClient, admTarget))
{
bool hasRoot = GetAdminFlag(admClient, Admin_Root);
SetAdminFlag(admClient, Admin_Root, true);
char temp[1024];
Format(temp, sizeof(temp), "%s [Ban Offline]", reason);
FakeClientCommand(client, "sm_addban \"%d\" \"%s\" \"%s\" \"%s\" \"%s\"", minutes, steamid, temp, name, ip);
SetAdminFlag(admClient, Admin_Root, hasRoot);
}
else
{
ReplyToCommand(client, " %s Nie mozesz zbanowac admina, ktory ma wyzszy immunitet od ciebie!", TAG);
}
}
public void OnAdminMenuReady(Handle hTopMenu)
{
if(hTopMenu == g_hTopMenu)
{
return;
}
g_hTopMenu = hTopMenu;
TopMenuObject MenuObject = AddToTopMenu(g_hTopMenu, "last_pl", TopMenuObject_Category, AdminMenu_Ban, INVALID_TOPMENUOBJECT, "sm_lastban", ADMFLAG_BAN);
if(MenuObject == INVALID_TOPMENUOBJECT)
{
return;
}
AddToTopMenu( hTopMenu, "sm_lastban", TopMenuObject_Item, AdminMenu_Ban_item, MenuObject, "sm_lastban", ADMFLAG_BAN, "Rozlaczeni gracze" );
}
public void AdminMenu_Ban(Handle topmenu, TopMenuAction action, TopMenuObject topobj_id, int iClient, char[] buffer, int maxlength)
{
if(action == TopMenuAction_DisplayOption || action == TopMenuAction_DisplayTitle)
{
Format(buffer, maxlength, "Rozlaczeni gracze" );
}
}
public void AdminMenu_Ban_item(Handle hTopMenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength)
{
g_ownReasons[param] = false;
if (action == TopMenuAction_DisplayOption)
{
Format(buffer, maxlength, "Zbanuj rozlaczonego gracza");
}
else if (action == TopMenuAction_SelectOption)
{
DisplayTargetsMenu(param, true);
}
}
public void DisplayTargetsMenu(int client, bool exitback)
{
if (ga_SteamIds.Length == 0)
{
ReplyToCommand(client, "%s Nie ma jeszcze rozlaczonych graczy!", TAG);
return;
}
Menu MainMenu = new Menu(TargetsMenu_CallBack, MenuAction_Select | MenuAction_End);
MainMenu.SetTitle("Wybierz gracza do zbanowania:");
char sDisplayBuffer[128], sSteamID[32], sName[MAX_NAME_LENGTH], temp[3];
for (int i = 0; i < ga_SteamIds.Length; i++)
{
ga_Names.GetString(i, sName, sizeof(sName));
ga_SteamIds.GetString(i, sSteamID, sizeof(sSteamID));
Format(sDisplayBuffer, sizeof(sDisplayBuffer), "%s [ %s ]", sName, sSteamID);
IntToString(i, temp, sizeof(temp));
MainMenu.AddItem(temp, sDisplayBuffer);
}
SetMenuExitBackButton(MainMenu, exitback);
DisplayMenu(MainMenu, client, MENU_TIME_FOREVER);
}
public int TargetsMenu_CallBack(Menu MainMenu, MenuAction action, int param1, int param2)
{
switch (action)
{
case MenuAction_Select:
{
char sInfo[128];
GetMenuItem(MainMenu, param2, sInfo, sizeof(sInfo));
DisplayBanTimeMenu(param1, sInfo);
}
case MenuAction_Cancel:
{
if (param2 == MenuCancel_ExitBack && g_hTopMenu != INVALID_HANDLE)
{
DisplayTopMenu(g_hTopMenu, param1, TopMenuPosition_LastCategory);
}
}
case MenuAction_End:
{
CloseHandle(MainMenu);
}
}
}
public void DisplayBanTimeMenu(int client, char[] sInfo)
{
Menu BanTimeMenu = new Menu(BanTime_CallBack, MenuAction_Select | MenuAction_End);
BanTimeMenu.SetTitle("Wybierz czas bana:");
char sInfoBuffer[128];
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,0", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "Permanenty");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,30", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "30 Minut");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,60", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "1 Godzina");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,120", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "2 Godziny");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,240", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "4 Godziny");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,480", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "8 Godzin");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,720", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "12 Godzin");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,1440", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "1 Dzien");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,10080", sInfo);
BanTimeMenu.AddItem(sInfoBuffer, "1 Tydzien");
SetMenuExitBackButton(BanTimeMenu, true);
DisplayMenu(BanTimeMenu, client, MENU_TIME_FOREVER);
}
public int BanTime_CallBack(Handle BanTimeMenu, MenuAction action, int param1, int param2)
{
switch (action)
{
case MenuAction_Select:
{
char sInfo[128];
GetMenuItem(BanTimeMenu, param2, sInfo, sizeof(sInfo));
DisplayBanReasonMenu(param1, sInfo);
}
case MenuAction_Cancel:
{
if (param2 == MenuCancel_ExitBack && g_hTopMenu != INVALID_HANDLE)
{
DisplayTopMenu(g_hTopMenu, param1, TopMenuPosition_LastCategory);
}
}
case MenuAction_End:
{
CloseHandle(BanTimeMenu);
}
}
}
void DisplayBanReasonMenu(int client, char[] sInfo)
{
Menu BanReasonMenu = new Menu(BanReason_CallBack, MenuAction_Select | MenuAction_End);
BanReasonMenu.SetTitle("Wybierz Powod:");
char sInfoBuffer[128];
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Cheatowanie", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Cheatujesz");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Wallhack", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Wallhack");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Aimbot", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Aimbot");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Skryptowanie", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Skryptowanie");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Obrazanie graczy", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Obrazanie graczy");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Obraza admina", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Obraza admina");
Format(sInfoBuffer, sizeof(sInfoBuffer), "%s,Inny powod", sInfo);
BanReasonMenu.AddItem(sInfoBuffer, "Inny powod [ wlasny ]");
SetMenuExitBackButton(BanReasonMenu, true);
DisplayMenu(BanReasonMenu, client, MENU_TIME_FOREVER);
}
public int BanReason_CallBack(Handle BanReasonMenu, MenuAction action, int param1, int param2)
{
switch (action)
{
case MenuAction_Select:
{
char sInfo[128], sTempArray[3][64];
GetMenuItem(BanReasonMenu, param2, sInfo, sizeof(sInfo));
ExplodeString(sInfo, ",", sTempArray, 3, 64);
int temp = StringToInt(sTempArray[0]);
char steamid[128], name[128], ip[128];
ga_SteamIds.GetString(temp, steamid, sizeof(steamid));
ga_Names.GetString(temp, name, sizeof(name));
ga_Ips.GetString(temp, ip, sizeof(ip));
if (StrEqual("Inny powod", sTempArray[2]))
{
g_temp_Steam[param1] = steamid;
g_temp_Minutes[param1] = sTempArray[1];
g_temp_Name[param1] = name;
g_temp_IP[param1] = ip;
g_ownReasons[param1] = true;
PrintToChat(param1, "[FG-SBANS] Proszę wpisać powód bana w czacie oraz potwierdzić przyciskiem Enter.");
return;
}
CheckAndPerformBan(param1, steamid, StringToInt(sTempArray[1]), sTempArray[2], name, ip);
}
case MenuAction_Cancel:
{
if (param2 == MenuCancel_ExitBack && g_hTopMenu != INVALID_HANDLE)
{
DisplayTopMenu(g_hTopMenu, param1, TopMenuPosition_LastCategory);
}
}
case MenuAction_End:
{
CloseHandle(BanReasonMenu);
}
}
}
void LoadADTArray()
{
ga_Names = new ArrayList(MAX_TARGET_LENGTH);
ga_SteamIds = new ArrayList(32);
ga_Ips = new ArrayList(32);
}
bool IsValidClient(int client, bool bAllowBots = false, bool bAllowDead = true)
{
if(!(1 <= client <= MaxClients) || !IsClientInGame(client) || (IsFakeClient(client) && !bAllowBots) || IsClientSourceTV(client) || IsClientReplay(client) || (!bAllowDead && !IsPlayerAlive(client)))
{
return false;
}
return true;
}
Last edited by BeNq!; 11-06-2020 at 17:11.
|
|