From 1726fe753cbd2c8447957f28ecee96ba5ab081a1 Mon Sep 17 00:00:00 2001 From: shavit Date: Sat, 15 Sep 2018 17:25:51 +0300 Subject: [PATCH 1/6] Fixed !ranks showing unranked incorrectly. --- addons/sourcemod/scripting/shavit-chat.sp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-chat.sp b/addons/sourcemod/scripting/shavit-chat.sp index 23095a3ee..ebb737e02 100644 --- a/addons/sourcemod/scripting/shavit-chat.sp +++ b/addons/sourcemod/scripting/shavit-chat.sp @@ -31,6 +31,7 @@ #undef REQUIRE_EXTENSIONS #include +#define MAGIC_NUMBER 2147483648.0 #define MAXLENGTH_NAME 192 #define MAXLENGTH_TEXT 192 #define MAXLENGTH_MESSAGE 255 @@ -235,7 +236,7 @@ bool LoadChatConfig() float fRank = StringToFloat(sRanks); aChatTitle[fCRFrom] = fRank; - aChatTitle[fCRTo] = (aChatTitle[iCRRangeType] == Rank_Flat)? fRank:2147483648.0; + aChatTitle[fCRTo] = (aChatTitle[iCRRangeType] == Rank_Flat)? fRank:MAGIC_NUMBER; } aChatTitle[bCRFree] = view_as(kv.GetNum("free", false)); @@ -913,7 +914,7 @@ Action ShowRanksMenu(int client, int item) if(!aCache[bCRFree]) { - if(aCache[fCRFrom] == 0) + if(aCache[fCRFrom] == 0.0 && (aCache[fCRFrom] == aCache[fCRTo] || aCache[fCRTo] == MAGIC_NUMBER)) { FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Unranked", client); } @@ -921,7 +922,7 @@ Action ShowRanksMenu(int client, int item) else { // this is really ugly - bool bRanged = (aCache[fCRFrom] != aCache[fCRTo] && aCache[fCRTo] != 2147483648.0); + bool bRanged = (aCache[fCRFrom] != aCache[fCRTo] && aCache[fCRTo] != MAGIC_NUMBER); if(aCache[iCRRangeType] == Rank_Flat) { @@ -1336,7 +1337,7 @@ int RealRandomInt(int min, int max) random++; } - return (RoundToCeil(float(random) / (float(2147483647) / float(max - min + 1))) + min - 1); + return (RoundToCeil(float(random) / (2147483647.0 / float(max - min + 1))) + min - 1); } void SQL_DBConnect() From 81dbdedfba04ceacd1fc2b544462a95638968ad0 Mon Sep 17 00:00:00 2001 From: shavit Date: Sat, 15 Sep 2018 17:26:11 +0300 Subject: [PATCH 2/6] Added !deletemap (#668) --- addons/sourcemod/scripting/include/shavit.inc | 40 ++++++++++ addons/sourcemod/scripting/shavit-core.sp | 80 +++++++++++++++++++ addons/sourcemod/scripting/shavit-rankings.sp | 29 +++++++ addons/sourcemod/scripting/shavit-replay.sp | 34 ++++++++ addons/sourcemod/scripting/shavit-wr.sp | 31 +++++++ addons/sourcemod/scripting/shavit-zones.sp | 28 ++++++- 6 files changed, 241 insertions(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/include/shavit.inc b/addons/sourcemod/scripting/include/shavit.inc index 67660e467..38f61910b 100644 --- a/addons/sourcemod/scripting/include/shavit.inc +++ b/addons/sourcemod/scripting/include/shavit.inc @@ -599,6 +599,42 @@ native void Shavit_RestartTimer(int client, int track); */ native void Shavit_StopTimer(int client); +/** + * Deletes all map records for the specified map. + * Plugin will refresh if map is currently on. + * + * @param map Map name. + * @noreturn + */ +native void Shavit_WR_DeleteMap(const char[] map); + +/** + * Deletes all map zones for the specified map. + * Plugin will refresh if map is currently on. + * + * @param map Map name. + * @noreturn + */ +native void Shavit_Zones_DeleteMap(const char[] map); + +/** + * Deletes all replays for the specified map. + * Plugin will refresh if map is currently on. + * + * @param map Map name. + * @noreturn + */ +native void Shavit_Replay_DeleteMap(const char[] map); + +/** + * Deletes tier setting for the specified map. + * Points recalculation will run right after this is finished. + * + * @param map Map name. + * @noreturn + */ +native void Shavit_Rankings_DeleteMap(const char[] map); + /** * Finishes the map for a player, with their current timer stats. * Will not teleport the player to anywhere, it's handled inside the mapzones plugin. @@ -1244,8 +1280,10 @@ public void __pl_shavit_SetNTVOptional() MarkNativeAsOptional("Shavit_OpenStatsMenu"); MarkNativeAsOptional("Shavit_PauseTimer"); MarkNativeAsOptional("Shavit_PrintToChat"); + MarkNativeAsOptional("Shavit_Rankings_DeleteMap"); MarkNativeAsOptional("Shavit_ReloadReplay"); MarkNativeAsOptional("Shavit_ReloadReplays"); + MarkNativeAsOptional("Shavit_Replay_DeleteMap"); MarkNativeAsOptional("Shavit_RestartTimer"); MarkNativeAsOptional("Shavit_ResumeTimer"); MarkNativeAsOptional("Shavit_SaveSnapshot"); @@ -1254,6 +1292,8 @@ public void __pl_shavit_SetNTVOptional() MarkNativeAsOptional("Shavit_StartTimer"); MarkNativeAsOptional("Shavit_StopChatSound"); MarkNativeAsOptional("Shavit_StopTimer"); + MarkNativeAsOptional("Shavit_WR_DeleteMap"); MarkNativeAsOptional("Shavit_ZoneExists"); + MarkNativeAsOptional("Shavit_Zones_DeleteMap"); } #endif diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 16b643c75..21213a030 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -93,6 +93,8 @@ bool gB_Late = false; // modules bool gB_Zones = false; bool gB_WR = false; +bool gB_Replay = false; +bool gB_Rankings = false; // cvars ConVar gCV_Restart = null; @@ -136,6 +138,7 @@ bool gB_HookedJump = false; char gS_LogPath[PLATFORM_MAX_PATH]; int gI_GroundTicks[MAXPLAYERS+1]; MoveType gMT_MoveType[MAXPLAYERS+1]; +char gS_DeleteMap[MAXPLAYERS+1][160]; // flags int gI_StyleFlag[STYLE_LIMIT]; @@ -294,6 +297,9 @@ public void OnPluginStart() #if defined DEBUG RegConsoleCmd("sm_finishtest", Command_FinishTest); #endif + + // admin + RegAdminCmd("sm_deletemap", Command_DeleteMap, ADMFLAG_ROOT, "Deletes all map data. Usage: sm_deletemap "); // commands END // logs @@ -343,6 +349,8 @@ public void OnPluginStart() gB_Zones = LibraryExists("shavit-zones"); gB_WR = LibraryExists("shavit-wr"); + gB_Replay = LibraryExists("shavit-replay"); + gB_Rankings = LibraryExists("shavit-rankings"); } public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) @@ -372,6 +380,16 @@ public void OnLibraryAdded(const char[] name) { gB_WR = true; } + + else if(StrEqual(name, "shavit-replay")) + { + gB_Replay = true; + } + + else if(StrEqual(name, "shavit-rankings")) + { + gB_Rankings = true; + } } public void OnLibraryRemoved(const char[] name) @@ -385,6 +403,16 @@ public void OnLibraryRemoved(const char[] name) { gB_WR = false; } + + else if(StrEqual(name, "shavit-replay")) + { + gB_Replay = false; + } + + else if(StrEqual(name, "shavit-rankings")) + { + gB_Rankings = false; + } } public void OnMapStart() @@ -564,6 +592,57 @@ public Action Command_FinishTest(int client, int args) } #endif +public Action Command_DeleteMap(int client, int args) +{ + if(args == 0) + { + ReplyToCommand(client, "Usage: sm_deletemap \nOnce a map is chosen, \"sm_deletemap confirm\" to run the deletion."); + + return Plugin_Handled; + } + + char[] sArgs = new char[160]; + GetCmdArgString(sArgs, 160); + + if(StrEqual(sArgs, "confirm") && strlen(gS_DeleteMap[client]) > 0) + { + if(gB_WR) + { + Shavit_WR_DeleteMap(gS_DeleteMap[client]); + ReplyToCommand(client, "Deleted all records for %s.", gS_DeleteMap[client]); + } + + if(gB_Zones) + { + Shavit_Zones_DeleteMap(gS_DeleteMap[client]); + ReplyToCommand(client, "Deleted all zones for %s.", gS_DeleteMap[client]); + } + + if(gB_Replay) + { + Shavit_Replay_DeleteMap(gS_DeleteMap[client]); + ReplyToCommand(client, "Deleted all replay data for %s.", gS_DeleteMap[client]); + } + + if(gB_Rankings) + { + Shavit_Rankings_DeleteMap(gS_DeleteMap[client]); + ReplyToCommand(client, "Deleted all rankings for %s.", gS_DeleteMap[client]); + } + + ReplyToCommand(client, "Finished deleting data for %s.", gS_DeleteMap[client]); + strcopy(gS_DeleteMap[client], 160, ""); + } + + else + { + strcopy(gS_DeleteMap[client], 160, sArgs); + ReplyToCommand(client, "Map to delete is now %s.\nRun \"sm_deletemap confirm\" to delete all data regarding the map %s.", gS_DeleteMap[client], gS_DeleteMap[client]); + } + + return Plugin_Handled; +} + public Action Command_AutoBhop(int client, int args) { if(!IsValidClient(client)) @@ -1368,6 +1447,7 @@ public void OnClientPutInServer(int client) gI_SHSW_FirstCombination[client] = -1; gI_Track[client] = 0; gI_Style[client] = 0; + strcopy(gS_DeleteMap[client], 160, ""); if(AreClientCookiesCached(client)) { diff --git a/addons/sourcemod/scripting/shavit-rankings.sp b/addons/sourcemod/scripting/shavit-rankings.sp index 2cba07379..e26158814 100644 --- a/addons/sourcemod/scripting/shavit-rankings.sp +++ b/addons/sourcemod/scripting/shavit-rankings.sp @@ -98,6 +98,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max CreateNative("Shavit_GetPoints", Native_GetPoints); CreateNative("Shavit_GetRank", Native_GetRank); CreateNative("Shavit_GetRankedPlayers", Native_GetRankedPlayers); + CreateNative("Shavit_Rankings_DeleteMap", Native_Rankings_DeleteMap); RegPluginLibrary("shavit-rankings"); @@ -964,3 +965,31 @@ public int Native_GetRankedPlayers(Handle handler, int numParams) { return gI_RankedPlayers; } + +public int Native_Rankings_DeleteMap(Handle handler, int numParams) +{ + char[] sMap = new char[160]; + GetNativeString(1, sMap, 160); + + char[] sQuery = new char[256]; + FormatEx(sQuery, 256, "DELETE FROM %smaptiers WHERE map = '%s';", gS_MySQLPrefix, sMap); + gH_SQL.Query(SQL_DeleteMap_Callback, sQuery, StrEqual(gS_Map, sMap, false), DBPrio_High); +} + +public void SQL_DeleteMap_Callback(Database db, DBResultSet results, const char[] error, any data) +{ + if(results == null) + { + LogError("Timer (rankings deletemap) SQL query failed. Reason: %s", error); + + return; + } + + if(view_as(data)) + { + gI_Tier = 1; + + UpdateAllPoints(); + UpdateRankedPlayers(); + } +} diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 5de7a5dea..a41b57fbb 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -167,6 +167,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max CreateNative("Shavit_IsReplayDataLoaded", Native_IsReplayDataLoaded); CreateNative("Shavit_ReloadReplay", Native_ReloadReplay); CreateNative("Shavit_ReloadReplays", Native_ReloadReplays); + CreateNative("Shavit_Replay_DeleteMap", Native_Replay_DeleteMap); CreateNative("Shavit_SetReplayData", Native_SetReplayData); // registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins @@ -532,6 +533,39 @@ public int Native_GetReplayBotType(Handle handler, int numParams) return view_as((gB_CentralBot)? Replay_Central:Replay_Legacy); } +public int Native_Replay_DeleteMap(Handle handler, int numParams) +{ + char[] sMap = new char[160]; + GetNativeString(1, sMap, 160); + + for(int i = 0; i < gI_Styles; i++) + { + if(!ReplayEnabled(i)) + { + continue; + } + + for(int j = 0; j < ((gB_CentralBot)? TRACKS_SIZE:1); j++) + { + char[] sTrack = new char[4]; + FormatEx(sTrack, 4, "_%d", j); + + char[] sPath = new char[PLATFORM_MAX_PATH]; + FormatEx(sPath, PLATFORM_MAX_PATH, "%s/%d/%s%s.replay", gS_ReplayFolder, i, sMap, (j > 0)? sTrack:""); + + if(FileExists(sPath)) + { + DeleteFile(sPath); + } + } + } + + if(StrEqual(gS_Map, sMap, false)) + { + OnMapStart(); + } +} + public void Shavit_OnDatabaseLoaded() { gH_SQL = Shavit_GetDatabase(); diff --git a/addons/sourcemod/scripting/shavit-wr.sp b/addons/sourcemod/scripting/shavit-wr.sp index f6822e617..6670d811a 100644 --- a/addons/sourcemod/scripting/shavit-wr.sp +++ b/addons/sourcemod/scripting/shavit-wr.sp @@ -104,6 +104,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max CreateNative("Shavit_GetWRName", Native_GetWRName); CreateNative("Shavit_GetWRRecordID", Native_GetWRRecordID); CreateNative("Shavit_GetWRTime", Native_GetWRTime); + CreateNative("Shavit_WR_DeleteMap", Native_WR_DeleteMap); // registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins RegPluginLibrary("shavit-wr"); @@ -605,6 +606,36 @@ public int Native_GetTimeForRank(Handle handler, int numParams) return view_as(gA_Leaderboard[style][track].Get(rank - 1)); } +public int Native_WR_DeleteMap(Handle handler, int numParams) +{ + char[] sMap = new char[160]; + GetNativeString(1, sMap, 160); + + char[] sQuery = new char[256]; + FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s';", gS_MySQLPrefix, sMap); + gH_SQL.Query(SQL_DeleteMap_Callback, sQuery, StrEqual(gS_Map, sMap, false), DBPrio_High); +} + +public void SQL_DeleteMap_Callback(Database db, DBResultSet results, const char[] error, any data) +{ + if(results == null) + { + LogError("Timer (WR deletemap) SQL query failed. Reason: %s", error); + + return; + } + + if(view_as(data)) + { + OnMapStart(); + + for(int i = 1; i <= MaxClients; i++) + { + OnClientPutInServer(i); + } + } +} + #if defined DEBUG // debug public Action Command_Junk(int client, int args) diff --git a/addons/sourcemod/scripting/shavit-zones.sp b/addons/sourcemod/scripting/shavit-zones.sp index 792221cfd..7a4327181 100644 --- a/addons/sourcemod/scripting/shavit-zones.sp +++ b/addons/sourcemod/scripting/shavit-zones.sp @@ -164,9 +164,10 @@ public Plugin myinfo = public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { // zone natives - CreateNative("Shavit_ZoneExists", Native_ZoneExists); CreateNative("Shavit_InsideZone", Native_InsideZone); CreateNative("Shavit_IsClientCreatingZone", Native_IsClientCreatingZone); + CreateNative("Shavit_ZoneExists", Native_ZoneExists); + CreateNative("Shavit_Zones_DeleteMap", Native_Zones_DeleteMap); // registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins RegPluginLibrary("shavit-zones"); @@ -429,6 +430,31 @@ public int Native_InsideZone(Handle handler, int numParams) return InsideZone(GetNativeCell(1), GetNativeCell(2), GetNativeCell(3)); } +public int Native_Zones_DeleteMap(Handle handler, int numParams) +{ + char[] sMap = new char[160]; + GetNativeString(1, sMap, 160); + + char[] sQuery = new char[256]; + FormatEx(sQuery, 256, "DELETE FROM %smapzones WHERE map = '%s';", gS_MySQLPrefix, sMap); + gH_SQL.Query(SQL_DeleteMap_Callback, sQuery, StrEqual(gS_Map, sMap, false), DBPrio_High); +} + +public void SQL_DeleteMap_Callback(Database db, DBResultSet results, const char[] error, any data) +{ + if(results == null) + { + LogError("Timer (zones deletemap) SQL query failed. Reason: %s", error); + + return; + } + + if(view_as(data)) + { + OnMapStart(); + } +} + bool InsideZone(int client, int type, int track) { if(track != -1) From 99bc8b2e5901810710b370c4d1995d5695985df3 Mon Sep 17 00:00:00 2001 From: shavit Date: Sat, 22 Sep 2018 23:29:35 +0300 Subject: [PATCH 3/6] Fixed memory leaking in shavit-replay. --- addons/sourcemod/scripting/shavit-replay.sp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index a41b57fbb..3f8c09c9e 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -450,6 +450,8 @@ public int Native_SetReplayData(Handle handler, int numParams) ArrayList frames = view_as(CloneHandle(GetNativeCell(2))); gA_PlayerFrames[client] = frames.Clone(); + delete frames; + gI_PlayerFrames[client] = gA_PlayerFrames[client].Length; } @@ -1441,6 +1443,7 @@ public void Shavit_OnFinish(int client, int style, float time, int jumps, int st return; } + delete gA_Frames[style][track]; gA_Frames[style][track] = gA_PlayerFrames[client].Clone(); char[] sAuthID = new char[32]; From 82ac5c3e487be9abd378e0c77b31c7720e6911d3 Mon Sep 17 00:00:00 2001 From: shavit Date: Sat, 22 Sep 2018 23:32:06 +0300 Subject: [PATCH 4/6] 2.3.1 --- addons/sourcemod/scripting/include/shavit.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/include/shavit.inc b/addons/sourcemod/scripting/include/shavit.inc index 38f61910b..8cfd41319 100644 --- a/addons/sourcemod/scripting/include/shavit.inc +++ b/addons/sourcemod/scripting/include/shavit.inc @@ -23,7 +23,7 @@ #endif #define _shavit_included -#define SHAVIT_VERSION "2.3.0" +#define SHAVIT_VERSION "2.3.1" #define STYLE_LIMIT 256 #define MAX_ZONES 64 #define MAX_NAME_LENGTH_SQL 32 From 54c7e2daf4b0105fac3dbb85861e96fbc96982d1 Mon Sep 17 00:00:00 2001 From: shavit Date: Sat, 22 Sep 2018 23:39:39 +0300 Subject: [PATCH 5/6] Increased shavit_replay_timelimit's default to 2 hours --- addons/sourcemod/scripting/shavit-replay.sp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 3f8c09c9e..b59cac09f 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -115,7 +115,7 @@ ConVar gCV_BotWeapon = null; // cached cvars bool gB_Enabled = true; float gF_ReplayDelay = 5.0; -float gF_TimeLimit = 5400.0; +float gF_TimeLimit = 7200.0; int gI_DefaultTeam = 3; bool gB_CentralBot = true; int gI_BotShooting = 3; @@ -212,7 +212,7 @@ public void OnPluginStart() // plugin convars gCV_Enabled = CreateConVar("shavit_replay_enabled", "1", "Enable replay bot functionality?", 0, true, 0.0, true, 1.0); gCV_ReplayDelay = CreateConVar("shavit_replay_delay", "5.0", "Time to wait before restarting the replay after it finishes playing.", 0, true, 0.0, true, 10.0); - gCV_TimeLimit = CreateConVar("shavit_replay_timelimit", "5400.0", "Maximum amount of time (in seconds) to allow saving to disk.\nDefault is 5400.0 (1:30 hours)\n0 - Disabled"); + gCV_TimeLimit = CreateConVar("shavit_replay_timelimit", "7200.0", "Maximum amount of time (in seconds) to allow saving to disk.\nDefault is 7200 (2 hours)\n0 - Disabled"); gCV_DefaultTeam = CreateConVar("shavit_replay_defaultteam", "3", "Default team to make the bots join, if possible.\n2 - Terrorists/RED\n3 - Counter Terrorists/BLU", 0, true, 2.0, true, 3.0); gCV_CentralBot = CreateConVar("shavit_replay_centralbot", "1", "Have one central bot instead of one bot per replay.\nTriggered with !replay.\nRestart the map for changes to take effect.\nThe disabled setting is not supported - use at your own risk.\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); gCV_BotShooting = CreateConVar("shavit_replay_botshooting", "3", "Attacking buttons to allow for bots.\n0 - none\1 - +attack\n2 - +attack2\n3 - both", 0, true, 0.0, true, 3.0); From 619e7da8f760becc99768684b7fc3a35d989af0e Mon Sep 17 00:00:00 2001 From: shavit Date: Sat, 22 Sep 2018 23:49:48 +0300 Subject: [PATCH 6/6] Made replay plugin not record more frames after going past time limit. --- addons/sourcemod/scripting/shavit-replay.sp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index b59cac09f..7fc559b97 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -1682,6 +1682,17 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 else if(ReplayEnabled(Shavit_GetBhopStyle(client)) && Shavit_GetTimerStatus(client) == Timer_Running) { + if((gI_PlayerFrames[client] / gF_Tickrate) > gF_TimeLimit) + { + // in case of bad timing + if(gB_HijackFrame[client]) + { + gB_HijackFrame[client] = false; + } + + return Plugin_Continue; + } + gA_PlayerFrames[client].Resize(gI_PlayerFrames[client] + 1); gA_PlayerFrames[client].Set(gI_PlayerFrames[client], vecCurrentPosition[0], 0);