SourceMod Moderator
|
03-05-2017
, 19:06
Re: Dynamic Objects and Properties - v.0.0.24 - [2017.02.11]
|
#231
|
Code:
L 03/05/2017 - 18:02:27: [SM] Exception reported: Could not read Handle 2d002d (error 1)
L 03/05/2017 - 18:02:27: [SM] Blaming: dynamic.smx
L 03/05/2017 - 18:02:27: [SM] Call stack trace:
L 03/05/2017 - 18:02:27: [SM] [0] GetPluginStatus
L 03/05/2017 - 18:02:27: [SM] [1] Line 246, ..\dynamic.sp::_Dynamic_CollectGarbage
L 03/05/2017 - 18:02:27: [SM] [2] Line 73, ..\dynamic.sp::OnLibraryRemoved
I'm getting this error. I've tried doing it with and without disposing everything in OnPluginEnd, the result is the same. It happens every time the plugins unloads.
PHP Code:
#include <sourcemod> #include <dynamic>
#pragma semicolon 1 #pragma newdecls required
#define PLUGIN_VERSION "1.0"
Database myDatabase = null;
/* Chars */ char ga_sSteamID[MAXPLAYERS + 1][128];
/* Booleans */ bool ga_bLoaded[MAXPLAYERS + 1] = {false, ...};
/* ArrayList */ ArrayList donorArray = null;
#include "donor.sp"
public Plugin myinfo = { name = "[ANY] Donor Ranks", author = "Headline", description = "A custom donation system", version = PLUGIN_VERSION, url="http://www.michaelwflaherty.com" };
public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int err_max) { MarkNativeAsOptional("Store_GetClientCredits");
CreateNative("GetDonorArray", Native_GetDonorArray); RegPluginLibrary("hl_donationmanager"); return APLRes_Success; }
public int Native_GetDonorArray(Handle plugin, int iNumParams) { return view_as<int>(donorArray); }
public void OnPluginStart() { Database.Connect(SQLCallback_OnConnect, "donations"); RegAdminCmd("sm_printdonors", Command_PrintDonors, ADMFLAG_ROOT, "A TEST COMMAND"); }
public Action Command_PrintDonors(int client, int args) { char buffer[300]; for (int i = 0; i < donorArray.Length; i++) { view_as<Donor>(donorArray.Get(i)).GetToString(buffer, sizeof(buffer)); PrintToConsole(client, buffer); } } public void OnMapStart() { donorArray = new ArrayList(); }
public void OnClientPostAdminCheck(int client) { GetClientAuthId(client, AuthId_Steam2, ga_sSteamID[client], sizeof(ga_sSteamID[])); ReplaceString(ga_sSteamID[client], sizeof(ga_sSteamID[]), "STEAM_1", "STEAM_0"); Log("hl_donationmanager.log", "Player %N loaded under %s", client, ga_sSteamID[client]); char sQuery[300]; Format(sQuery, sizeof(sQuery), "SELECT * FROM aaa_gfldonations_transactions WHERE t_steamid=\"%s\"", ga_sSteamID[client]); myDatabase.Query(SQLCallback_LoadClient, sQuery, GetClientUserId(client)); }
public void OnClientDisconnect(int client) { CleanADTArray(client); }
public void OnPluginEnd() { for (int i = 0; i < donorArray.Length; i++) { view_as<Donor>(donorArray.Get(i)).Dispose(); } }
public void SQLCallback_OnConnect(Database db, const char[] error, any data) { if (db == null) { SetFailState("[Donation System] Error: %s", error); return; } myDatabase = db; AddServerIPColumn(myDatabase); }
void AddServerIPColumn(Database db) { char sQuery[300]; Format(sQuery, sizeof(sQuery), "ALTER TABLE `aaa_gfldonations_transactions` ADD `%s` int(8) NOT NULL default 0", GetServerIP()); db.Query(SQLCallback_Void, sQuery); LogMessage("[CG - Donations] Column \"%s\" added!", GetServerIP()); }
public void SQLCallback_Void(Database db, DBResultSet results, const char[] error, any data) { if (db == null) { SetFailState("Error (%i): %s", data, error); } }
public void SQLCallback_LoadClient(Database db, DBResultSet results, const char[] error, int userid) { if (db == null) { SetFailState("Error: %s", error); } int client = GetClientOfUserId(userid); if (!IsValidClient(client)) { return; } if (results.RowCount == 0) { return; }
int startTime, endTime, perk; char status[128]; results.FetchRow(); /* Grab information */ startTime = results.FetchInt(3); endTime = results.FetchInt(4); perk = results.FetchInt(7); results.FetchString(6, status, sizeof(status)); if (!StrEqual(status, "Completed")) { return; } if (endTime < GetTime()) { return; } Donor donor = Donor(); donor.PerkID = perk; donor.StartTime = startTime; donor.EndTime = endTime; donor.SetSteamID(ga_sSteamID[client]); //donorArray.Push(donor); DataPack pack = new DataPack(); pack.WriteCell(GetClientUserId(client)); pack.WriteCell(donor); pack.Reset(); char query[300]; Format(query, sizeof(query), "SELECT * from aaa_gfldonations_perks WHERE p_id = %i", perk); myDatabase.Query(SQLCallback_GetPerkString, query, pack); Format(query, sizeof(query), "SELECT `%s` FROM aaa_gfldonations_transactions WHERE t_steamid = \"%s\"", GetServerIP(), ga_sSteamID[client]); myDatabase.Query(SQLCallback_Announce, query, GetClientUserId(client)); ga_bLoaded[client] = true; }
public void SQLCallback_Announce(Database db, DBResultSet results, const char[] error, int userid) { if (db == null) { SetFailState("Error: %s", error); } int client = GetClientOfUserId(userid); if (!IsValidClient(client)) { return; } if (results.RowCount == 0) { return; } results.FetchRow(); bool result = view_as<bool>(results.FetchInt(0)); if (result) { CreateTimer(10.0, Timer_PrintAnnouncement, GetClientUserId(client)); } }
public Action Timer_PrintAnnouncement(Handle timer, int userid) { int client = GetClientOfUserId(userid); PrintToChatAll("\x04[Donations] %N has just donated!", client); PrintToChatAll("\x04[Donations] %N has just donated!", client); PrintToChatAll("\x04[Donations] %N has just donated!", client); char query[300]; Format(query, sizeof(query), "UPDATE aaa_gfldonations_transactions SET %s = 1 WHERE t_steamid = \"%s\"", GetServerIP(), ga_sSteamID[client]); myDatabase.Query(SQLCallback_Void, query); }
public void SQLCallback_GetPerkString(Database db, DBResultSet results, const char[] error, DataPack pack) { int client = GetClientOfUserId(pack.ReadCell()); Donor donor = pack.ReadCell(); delete pack; if (db == null) { SetFailState("Error: %s", error); } if (!IsValidClient(client)) { return; } if (results.RowCount == 0) { return; } results.FetchRow();
char perkString[256]; results.FetchString(5, perkString, sizeof(perkString)); donor.SetPerkString(perkString); donorArray.Push(donor); }
void CleanADTArray(int client) { char SteamID[128]; GetClientAuthId(client, AuthId_SteamID64, SteamID, sizeof(SteamID)); ReplaceString(SteamID, sizeof(SteamID), "STEAM_1", "STEAM_0");
Donor donor; char donorSteamID[128]; for (int i = 0; i < donorArray.Length; i++) { donor = donorArray.Get(i); donor.GetSteamID(donorSteamID, sizeof(donorSteamID));
if (StrEqual(donorSteamID, SteamID)) { donor.Dispose(); donorArray.Erase(i); } } }
// Returns char array of the server IP char[] GetServerIP() { char sServerIP[32]; int aArray[4]; int iLongIP = GetConVarInt(FindConVar("hostip")); aArray[0] = (iLongIP >> 24) & 0x000000FF; aArray[1] = (iLongIP >> 16) & 0x000000FF; aArray[2] = (iLongIP >> 8) & 0x000000FF; aArray[3] = iLongIP & 0x000000FF; Format(sServerIP, sizeof(sServerIP), "%d.%d.%d.%d", aArray[0], aArray[1], aArray[2], aArray[3]); return sServerIP; }
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; }
void Log(char[] sPath, const char[] sMsg, any ...) { char sLogFilePath[PLATFORM_MAX_PATH]; char sFormattedMsg[256]; BuildPath(Path_SM, sLogFilePath, sizeof(sLogFilePath), "logs/%s", sPath); VFormat(sFormattedMsg, sizeof(sFormattedMsg), sMsg, 3); LogToFileEx(sLogFilePath, "%s", sFormattedMsg); }
Last edited by headline; 03-05-2017 at 19:09.
|
|