From 6ccecd80144595c244146b76782b18d1a208a6bb Mon Sep 17 00:00:00 2001 From: shavit Date: Tue, 26 Jun 2018 19:27:48 +0300 Subject: [PATCH 01/24] code duplication brothers --- addons/sourcemod/scripting/shavit-replay.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 91906c2e..844573e7 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -1599,7 +1599,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 } } - else if(Shavit_GetTimerStatus(client) == Timer_Running && ReplayEnabled(Shavit_GetBhopStyle(client)) && Shavit_GetTimerStatus(client) == Timer_Running) + else if(ReplayEnabled(Shavit_GetBhopStyle(client)) && Shavit_GetTimerStatus(client) == Timer_Running) { gA_PlayerFrames[client].Resize(gI_PlayerFrames[client] + 1); From b6ca23d9f07ba4d384daf934133e7800f91a48cc Mon Sep 17 00:00:00 2001 From: shavit Date: Tue, 26 Jun 2018 19:30:18 +0300 Subject: [PATCH 02/24] reduced size to 32 blablabla yes the usual things sql error nairda --- addons/sourcemod/scripting/include/shavit.inc | 1 + addons/sourcemod/scripting/shavit-core.sp | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/scripting/include/shavit.inc b/addons/sourcemod/scripting/include/shavit.inc index ba639c7a..94e49a0a 100644 --- a/addons/sourcemod/scripting/include/shavit.inc +++ b/addons/sourcemod/scripting/include/shavit.inc @@ -26,6 +26,7 @@ #define SHAVIT_VERSION "2.2.0" #define STYLE_LIMIT 256 #define MAX_ZONES 64 +#define MAX_NAME_LENGTH_SQL 32 // HUD #define HUD_NONE (0) diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 58ea3916..5657aa1c 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -1400,9 +1400,9 @@ public void OnClientPutInServer(int client) return; } - char[] sName = new char[MAX_NAME_LENGTH]; - GetClientName(client, sName, MAX_NAME_LENGTH); - ReplaceString(sName, MAX_NAME_LENGTH, "#", "?"); // to avoid this: https://user-images.githubusercontent.com/3672466/28637962-0d324952-724c-11e7-8b27-15ff021f0a59.png + char[] sName = new char[MAX_NAME_LENGTH_SQL]; + GetClientName(client, sName, MAX_NAME_LENGTH_SQL); + ReplaceString(sName, MAX_NAME_LENGTH_SQL, "#", "?"); // to avoid this: https://user-images.githubusercontent.com/3672466/28637962-0d324952-724c-11e7-8b27-15ff021f0a59.png int iLength = ((strlen(sName) * 2) + 1); char[] sEscapedName = new char[iLength]; From 519756bd70f05c380588f67017770a3657c7868c Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 28 Jun 2018 19:07:37 +0300 Subject: [PATCH 03/24] fixed the !save issues --- addons/sourcemod/scripting/shavit-misc.sp | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 759b1f24..cd917a52 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -1518,7 +1518,7 @@ public Action Command_Save(int client, int args) int iMaxCPs = GetMaxCPs(client); - if(gI_CheckpointsCache[client][iCheckpoints] >= iMaxCPs) + if(gI_CheckpointsCache[client][iCheckpoints] > iMaxCPs) { return Plugin_Handled; } @@ -1547,25 +1547,13 @@ public Action Command_Save(int client, int args) } } - bool bSegmenting = CanSegment(client); - bool bSaved = false; + bool bOverflow = index >= iMaxCPs; - if(!bSegmenting) + if(SaveCheckpoint(client, index, bOverflow)) { - bSaved = SaveCheckpoint(client, gI_CheckpointsCache[client][iCheckpoints]); - gI_CheckpointsCache[client][iCurrentCheckpoint] = ++gI_CheckpointsCache[client][iCheckpoints]; - } - - else - { - bool bOverflow = gI_CheckpointsCache[client][iCheckpoints] >= iMaxCPs; - bSaved = SaveCheckpoint(client, gI_CheckpointsCache[client][iCheckpoints], bOverflow); - gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[client][iCheckpoints]; - } + gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? (iMaxCPs - 1):(index + 1); - if(bSaved) - { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, (index + 1), gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); } return Plugin_Handled; From 15a36a2e2fcc10e8d35a4c7834cf9ec8c472d732 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 28 Jun 2018 19:12:43 +0300 Subject: [PATCH 04/24] cya basevelocity (fix for prediction issue) --- addons/sourcemod/scripting/shavit-misc.sp | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index cd917a52..c51ee5de 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -39,7 +39,6 @@ enum CheckpointsCache Float:fCPPosition[3], Float:fCPAngles[3], Float:fCPVelocity[3], - Float:fCPBaseVelocity[3], MoveType:mtCPMoveType, Float:fCPGravity, Float:fCPSpeed, @@ -1808,9 +1807,6 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) GetEntPropVector(target, Prop_Data, "m_vecAbsVelocity", temp); CopyArray(temp, cpcache[fCPVelocity], 3); - GetEntPropVector(target, Prop_Data, "m_vecBaseVelocity", temp); - CopyArray(temp, cpcache[fCPBaseVelocity], 3); - char[] sTargetname = new char[32]; GetEntPropString(target, Prop_Data, "m_iName", sTargetname, 32); @@ -2002,21 +1998,22 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) float ang[3]; CopyArray(cpcache[fCPAngles], ang, 3); - TeleportEntity(client, pos, - ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0 || cpcache[bCPSegmented])? ang:NULL_VECTOR, - NULL_VECTOR); + float vel[3]; if((gI_CheckpointsSettings[client] & CP_VELOCITY) > 0 || cpcache[bCPSegmented]) { - float basevel[3]; - CopyArray(cpcache[fCPBaseVelocity], basevel, 3); - SetEntPropVector(client, Prop_Data, "m_vecBaseVelocity", basevel); - - float vel[3]; CopyArray(cpcache[fCPVelocity], vel, 3); - SetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", vel); } + else + { + vel = NULL_VECTOR; + } + + TeleportEntity(client, pos, + ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0 || cpcache[bCPSegmented])? ang:NULL_VECTOR, + vel); + MoveType mt = cpcache[mtCPMoveType]; if(mt == MOVETYPE_LADDER || mt == MOVETYPE_WALK) From ea339ed6c7fb2eed26e921a5966b33b87ac283e4 Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 29 Jun 2018 00:50:56 +0300 Subject: [PATCH 05/24] rewrote some of the save/tele code for the 100000000th time --- addons/sourcemod/scripting/shavit-misc.sp | 64 +++++++++++++---------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index c51ee5de..e2dd67bc 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -246,8 +246,8 @@ public void OnPluginStart() RegConsoleCmd("sm_cp", Command_Checkpoints, "Opens the checkpoints menu. Alias for sm_cpmenu."); RegConsoleCmd("sm_checkpoint", Command_Checkpoints, "Opens the checkpoints menu. Alias for sm_cpmenu."); RegConsoleCmd("sm_checkpoints", Command_Checkpoints, "Opens the checkpoints menu. Alias for sm_cpmenu."); - RegConsoleCmd("sm_save", Command_Save, "Saves checkpoint (default: 1). Usage: sm_save [number]"); - RegConsoleCmd("sm_tele", Command_Tele, "Teleports to checkpoint (default: 1). Usage: sm_tele [number]"); + RegConsoleCmd("sm_save", Command_Save, "Saves checkpoint. Usage: sm_save [number]"); + RegConsoleCmd("sm_tele", Command_Tele, "Teleports to checkpoint. Usage: sm_tele [number]"); gH_CheckpointsCookie = RegClientCookie("shavit_checkpoints", "Checkpoints settings", CookieAccess_Protected); gSM_Checkpoints = new StringMap(); gA_Targetnames = new ArrayList(ByteCountToCells(32)); @@ -1516,12 +1516,6 @@ public Action Command_Save(int client, int args) } int iMaxCPs = GetMaxCPs(client); - - if(gI_CheckpointsCache[client][iCheckpoints] > iMaxCPs) - { - return Plugin_Handled; - } - bool bSegmented = CanSegment(client); if(!gB_Checkpoints && !bSegmented) @@ -1531,7 +1525,7 @@ public Action Command_Save(int client, int args) return Plugin_Handled; } - int index = gI_CheckpointsCache[client][iCheckpoints]; + int index = gI_CheckpointsCache[client][iCheckpoints] + 1; if(args > 0) { @@ -1540,19 +1534,27 @@ public Action Command_Save(int client, int args) int parsed = StringToInt(arg); - if(parsed > 0 && parsed <= iMaxCPs) + if(0 < parsed <= iMaxCPs) { index = (parsed - 1); } } - bool bOverflow = index >= iMaxCPs; - - if(SaveCheckpoint(client, index, bOverflow)) + if(index > iMaxCPs) { - gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? (iMaxCPs - 1):(index + 1); + index = iMaxCPs; + } - Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + if(SaveCheckpoint(client, index, false)) + { + gI_CheckpointsCache[client][iCurrentCheckpoint] = index; + + if(index < iMaxCPs) + { + gI_CheckpointsCache[client][iCheckpoints]++; + } + + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); } return Plugin_Handled; @@ -1574,7 +1576,7 @@ public Action Command_Tele(int client, int args) return Plugin_Handled; } - int index = (gI_CheckpointsCache[client][iCurrentCheckpoint] - 1); + int index = gI_CheckpointsCache[client][iCurrentCheckpoint]; if(args > 0) { @@ -1583,9 +1585,9 @@ public Action Command_Tele(int client, int args) int parsed = StringToInt(arg); - if(parsed > 0 && parsed <= gI_MaxCP) + if(0 < parsed <= gI_MaxCP) { - index = (parsed - 1); + index = parsed; } } @@ -1673,29 +1675,30 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int { case 0: { + bool bOverflow = gI_CheckpointsCache[param1][iCheckpoints] >= iMaxCPs; + if(!bSegmenting) { // fight an exploit - if(gI_CheckpointsCache[param1][iCheckpoints] >= iMaxCPs) + if(bOverflow) { return 0; } SaveCheckpoint(param1, gI_CheckpointsCache[param1][iCheckpoints]); - gI_CheckpointsCache[param1][iCurrentCheckpoint] = ++gI_CheckpointsCache[param1][iCheckpoints]; + gI_CheckpointsCache[param1][iCurrentCheckpoint] = gI_CheckpointsCache[param1][iCheckpoints]; } else { - bool bOverflow = gI_CheckpointsCache[param1][iCheckpoints] >= iMaxCPs; - SaveCheckpoint(param1, gI_CheckpointsCache[param1][iCheckpoints], bOverflow); + SaveCheckpoint(param1, gI_CheckpointsCache[param1][iCheckpoints] + 1, bOverflow); gI_CheckpointsCache[param1][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[param1][iCheckpoints]; } } case 1: { - TeleportToCheckpoint(param1, iCurrent - 1, true); + TeleportToCheckpoint(param1, iCurrent, true); } case 2: @@ -1916,8 +1919,8 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) if(overflow) { int iMaxCPs = GetMaxCPs(client); - - for(int i = 0; i < iMaxCPs; i++) + + for(int i = 1; i <= iMaxCPs; i++) { CheckpointsCache cpcacheold[PCPCACHE_SIZE]; FormatEx(sKey, 32, "%d_%d", iSerial, i); @@ -1940,10 +1943,13 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) gSM_Checkpoints.SetArray(sKey, cpcacheold[0], view_as(PCPCACHE_SIZE)); } - index = (iMaxCPs - 1); + SetCheckpoint(client, iMaxCPs, cpcache); } - SetCheckpoint(client, index, cpcache); + else + { + SetCheckpoint(client, index, cpcache); + } return true; } @@ -1959,7 +1965,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) if(!GetCheckpoint(client, index, cpcache)) { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsEmpty", client, (index + 1), gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscCheckpointsEmpty", client, index, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); return; } @@ -2080,7 +2086,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) if(!suppressMessage) { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsTeleported", client, (index + 1), gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + Shavit_PrintToChat(client, "%T", "MiscCheckpointsTeleported", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); } } From fbf7736ae1ff3c93cf7c3ef34ec5697bbda02485 Mon Sep 17 00:00:00 2001 From: shavit Date: Mon, 9 Jul 2018 02:49:36 +0300 Subject: [PATCH 06/24] fixed menu saving --- addons/sourcemod/scripting/shavit-misc.sp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index e2dd67bc..075f4a7c 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -1667,7 +1667,6 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int { if(action == MenuAction_Select) { - bool bSegmenting = CanSegment(param1); int iMaxCPs = GetMaxCPs(param1); int iCurrent = gI_CheckpointsCache[param1][iCurrentCheckpoint]; @@ -1675,6 +1674,7 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int { case 0: { + bool bSegmenting = CanSegment(param1); bool bOverflow = gI_CheckpointsCache[param1][iCheckpoints] >= iMaxCPs; if(!bSegmenting) @@ -1685,7 +1685,7 @@ public int MenuHandler_Checkpoints(Menu menu, MenuAction action, int param1, int return 0; } - SaveCheckpoint(param1, gI_CheckpointsCache[param1][iCheckpoints]); + SaveCheckpoint(param1, ++gI_CheckpointsCache[param1][iCheckpoints]); gI_CheckpointsCache[param1][iCurrentCheckpoint] = gI_CheckpointsCache[param1][iCheckpoints]; } @@ -1956,7 +1956,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) void TeleportToCheckpoint(int client, int index, bool suppressMessage) { - if(index < 0 || index >= gI_MaxCP || (!gB_Checkpoints && !CanSegment(client))) + if(index < 0 || index > gI_MaxCP || (!gB_Checkpoints && !CanSegment(client))) { return; } From 9d4077d4ba3d20dd232c7fbbefcaac7562b67b12 Mon Sep 17 00:00:00 2001 From: shavit Date: Tue, 10 Jul 2018 08:35:00 +0300 Subject: [PATCH 07/24] untested but might fix #0 in topleft hud i can't reproduce the issue on demand unfortunately so this is a gamble --- addons/sourcemod/scripting/shavit-wr.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/shavit-wr.sp b/addons/sourcemod/scripting/shavit-wr.sp index b317e009..f6822e61 100644 --- a/addons/sourcemod/scripting/shavit-wr.sp +++ b/addons/sourcemod/scripting/shavit-wr.sp @@ -2308,7 +2308,7 @@ public void SQL_UpdateLeaderboards_Callback(Database db, DBResultSet results, co int GetRankForTime(int style, float time, int track) { - if(time < gF_WRTime[style][track] || gI_RecordAmount[style][track] <= 0) + if(time <= gF_WRTime[style][track] || gI_RecordAmount[style][track] <= 0) { return 1; } From bb81a61507b03fb60cae68daaa9ed5015cb26b3c Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 10 Aug 2018 17:13:55 +0300 Subject: [PATCH 08/24] kinda fixed csgo hud (untested) --- addons/sourcemod/scripting/shavit-hud.sp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/shavit-hud.sp b/addons/sourcemod/scripting/shavit-hud.sp index eab93910..2ad2b398 100644 --- a/addons/sourcemod/scripting/shavit-hud.sp +++ b/addons/sourcemod/scripting/shavit-hud.sp @@ -623,6 +623,14 @@ void TriggerHUDUpdate(int client, bool keysonly = false) // keysonly because CS: } } +void FixCSGOText(char[] buffer, int maxlen) +{ + if(gEV_Type == Engine_CSGO) + { + Format(buffer, maxlen, "
%s
", buffer); + } +} + void UpdateHUD(int client) { int target = GetHUDTarget(client); @@ -675,7 +683,8 @@ void UpdateHUD(int client) if(strlen(sHintText) > 0) { - PrintHintText(client, sHintText); + FixCSGOText(sHintText, 512); + PrintHintText(client, "%s", sHintText); } else if((gI_HUDSettings[client] & HUD_CENTER) > 0) @@ -807,6 +816,7 @@ void UpdateHUD(int client) } } + FixCSGOText(sHintText, 512); PrintHintText(client, "%s", sHintText); } @@ -816,6 +826,7 @@ void UpdateHUD(int client) if(style == -1) { + FixCSGOText(sHintText, 512); PrintHintText(client, "%T", (gEV_Type != Engine_TF2)? "NoReplayData":"NoReplayDataTF2", client); return; @@ -864,6 +875,7 @@ void UpdateHUD(int client) Format(sHintText, 512, "%s\n%T: %d", sHintText, "HudSpeedText", client, iSpeed); } + FixCSGOText(sHintText, 512); PrintHintText(client, "%s", sHintText); } } From a584082fd7ee34fe170893bd2b1965f06c0dfda3 Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 10 Aug 2018 17:23:55 +0300 Subject: [PATCH 09/24] bandaid fix for checkpoint theft exploit --- addons/sourcemod/scripting/shavit-misc.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 075f4a7c..451dbe1c 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -1914,7 +1914,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) cpcache[bCPSegmented] = false; } - cpcache[bCPSpectated] = (client != target); + cpcache[bCPSpectated] = (client != target || bCPSegmented); // spoof a segmented cp to avoid abuse(? my brain is melting rn) if(overflow) { From 5a933fd135dc2d17d49af49deedf0a1e6f45f53a Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 22:04:39 +0300 Subject: [PATCH 10/24] Fixed segmented CPs and made !save match !cp's save behavior. --- addons/sourcemod/scripting/shavit-misc.sp | 51 +++++++++---------- .../translations/shavit-misc.phrases.txt | 4 ++ 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 451dbe1c..cefab6a4 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -53,7 +53,7 @@ enum CheckpointsCache iCPClassname, ArrayList:aCPFrames, bool:bCPSegmented, - bool:bCPSpectated, + iCPSerial, iCPGroundEntity, PCPCACHE_SIZE } @@ -246,7 +246,7 @@ public void OnPluginStart() RegConsoleCmd("sm_cp", Command_Checkpoints, "Opens the checkpoints menu. Alias for sm_cpmenu."); RegConsoleCmd("sm_checkpoint", Command_Checkpoints, "Opens the checkpoints menu. Alias for sm_cpmenu."); RegConsoleCmd("sm_checkpoints", Command_Checkpoints, "Opens the checkpoints menu. Alias for sm_cpmenu."); - RegConsoleCmd("sm_save", Command_Save, "Saves checkpoint. Usage: sm_save [number]"); + RegConsoleCmd("sm_save", Command_Save, "Saves checkpoint."); RegConsoleCmd("sm_tele", Command_Tele, "Teleports to checkpoint. Usage: sm_tele [number]"); gH_CheckpointsCookie = RegClientCookie("shavit_checkpoints", "Checkpoints settings", CookieAccess_Protected); gSM_Checkpoints = new StringMap(); @@ -1516,9 +1516,9 @@ public Action Command_Save(int client, int args) } int iMaxCPs = GetMaxCPs(client); - bool bSegmented = CanSegment(client); + bool bSegmenting = CanSegment(client); - if(!gB_Checkpoints && !bSegmented) + if(!gB_Checkpoints && !bSegmenting) { Shavit_PrintToChat(client, "%T", "FeatureDisabled", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); @@ -1526,35 +1526,34 @@ public Action Command_Save(int client, int args) } int index = gI_CheckpointsCache[client][iCheckpoints] + 1; - - if(args > 0) - { - char[] arg = new char[4]; - GetCmdArg(1, arg, 4); - - int parsed = StringToInt(arg); - - if(0 < parsed <= iMaxCPs) - { - index = (parsed - 1); - } - } if(index > iMaxCPs) { index = iMaxCPs; } - if(SaveCheckpoint(client, index, false)) - { - gI_CheckpointsCache[client][iCurrentCheckpoint] = index; + bool bOverflow = gI_CheckpointsCache[client][iCheckpoints] >= iMaxCPs; - if(index < iMaxCPs) + if(!bSegmenting) + { + if(bOverflow) { - gI_CheckpointsCache[client][iCheckpoints]++; + Shavit_PrintToChat(client, "%T", "MiscCheckpointsOverflow", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + + return Plugin_Handled; } - Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + if(SaveCheckpoint(client, index)) + { + gI_CheckpointsCache[client][iCurrentCheckpoint] = ++gI_CheckpointsCache[client][iCheckpoints]; + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + } + } + + else if(SaveCheckpoint(client, index, bOverflow)) + { + gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[client][iCheckpoints]; + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); } return Plugin_Handled; @@ -1914,7 +1913,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) cpcache[bCPSegmented] = false; } - cpcache[bCPSpectated] = (client != target || bCPSegmented); // spoof a segmented cp to avoid abuse(? my brain is melting rn) + cpcache[iCPSerial] = GetClientSerial(target); if(overflow) { @@ -1991,8 +1990,8 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) { Shavit_StopTimer(client); } - - if(!cpcache[bCPSegmented] || cpcache[bCPSpectated]) + + if(!cpcache[bCPSegmented] || GetClientSerial(client) != cpcache[iCPSerial]) { Shavit_SetPracticeMode(client, true, !bInStart); } diff --git a/addons/sourcemod/translations/shavit-misc.phrases.txt b/addons/sourcemod/translations/shavit-misc.phrases.txt index 69064b7d..dc4a070d 100644 --- a/addons/sourcemod/translations/shavit-misc.phrases.txt +++ b/addons/sourcemod/translations/shavit-misc.phrases.txt @@ -83,6 +83,10 @@ "#format" "{1:d},{2:s},{3:s}" "en" "Checkpoint {1} is {2}empty{3}." } + "MiscCheckpointsOverflow" + { + "en" "Unable to save due to checkpoint overflow." + } "MiscSegmentedCommand" { "#format" "{1:s},{2:s}" From be0b9e6c44d9881f8341cbbd4494509a1a92622b Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 22:23:29 +0300 Subject: [PATCH 11/24] Added shavit_replay_botplususe (#660) --- addons/sourcemod/scripting/shavit-replay.sp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 844573e7..2da72482 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -109,6 +109,7 @@ ConVar gCV_TimeLimit = null; ConVar gCV_DefaultTeam = null; ConVar gCV_CentralBot = null; ConVar gCV_BotShooting = null; +ConVar gCV_BotPlusUse = null; // cached cvars bool gB_Enabled = true; @@ -117,6 +118,7 @@ float gF_TimeLimit = 5400.0; int gI_DefaultTeam = 3; bool gB_CentralBot = true; int gI_BotShooting = 3; +bool gB_BotPlusUse = true; // timer settings int gI_Styles = 0; @@ -211,6 +213,7 @@ public void OnPluginStart() 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); + gCV_BotPlusUse = CreateConVar("shavit_replay_botplususe", "1", "Allow bots to use +use?", 0, true, 0.0, true, 1.0); gCV_Enabled.AddChangeHook(OnConVarChanged); gCV_ReplayDelay.AddChangeHook(OnConVarChanged); @@ -218,6 +221,7 @@ public void OnPluginStart() gCV_DefaultTeam.AddChangeHook(OnConVarChanged); gCV_CentralBot.AddChangeHook(OnConVarChanged); gCV_BotShooting.AddChangeHook(OnConVarChanged); + gCV_BotPlusUse.AddChangeHook(OnConVarChanged); AutoExecConfig(); @@ -253,6 +257,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n gI_DefaultTeam = gCV_DefaultTeam.IntValue; gB_CentralBot = gCV_CentralBot.BoolValue; gI_BotShooting = gCV_BotShooting.IntValue; + gB_BotPlusUse = gCV_BotPlusUse.BoolValue; if(convar == gCV_CentralBot) { @@ -1544,6 +1549,11 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 buttons &= ~IN_ATTACK2; } + if(gB_BotPlusUse) + { + buttons &= ~IN_USE; + } + MoveType mt = MOVETYPE_NOCLIP; if(gA_FrameCache[style][track][3] >= 0x02) From b132ed4e08592a67389211db7fe94d55eab33046 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 22:23:57 +0300 Subject: [PATCH 12/24] pretend you didnt see this --- addons/sourcemod/scripting/shavit-replay.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 2da72482..4c4f1b7c 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -1549,7 +1549,7 @@ public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3 buttons &= ~IN_ATTACK2; } - if(gB_BotPlusUse) + if(!gB_BotPlusUse) { buttons &= ~IN_USE; } From 791fc7c3b3ed36392630996c4c99f21422345f59 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 22:41:14 +0300 Subject: [PATCH 13/24] fixed memory leak with cps --- addons/sourcemod/scripting/shavit-misc.sp | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index cefab6a4..1d8efb14 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -1525,17 +1525,16 @@ public Action Command_Save(int client, int args) return Plugin_Handled; } - int index = gI_CheckpointsCache[client][iCheckpoints] + 1; - - if(index > iMaxCPs) - { - index = iMaxCPs; - } - bool bOverflow = gI_CheckpointsCache[client][iCheckpoints] >= iMaxCPs; + int index = gI_CheckpointsCache[client][iCheckpoints] + 1; if(!bSegmenting) { + if(index > iMaxCPs) + { + index = iMaxCPs; + } + if(bOverflow) { Shavit_PrintToChat(client, "%T", "MiscCheckpointsOverflow", client, index, gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); @@ -1550,10 +1549,13 @@ public Action Command_Save(int client, int args) } } - else if(SaveCheckpoint(client, index, bOverflow)) + else { - gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[client][iCheckpoints]; - Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + if(SaveCheckpoint(client, index, bOverflow)) + { + gI_CheckpointsCache[client][iCurrentCheckpoint] = (bOverflow)? iMaxCPs:++gI_CheckpointsCache[client][iCheckpoints]; + Shavit_PrintToChat(client, "%T", "MiscCheckpointsSaved", client, gI_CheckpointsCache[client][iCurrentCheckpoint], gS_ChatStrings[sMessageVariable], gS_ChatStrings[sMessageText]); + } } return Plugin_Handled; @@ -1929,7 +1931,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) continue; // ??? } - if(i == 0) + if(i == 1) { delete cpcacheold[aCPFrames]; gSM_Checkpoints.Remove(sKey); From 90cd1ba53c65056714447ad8de079cae7881a080 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 23:06:52 +0300 Subject: [PATCH 14/24] Fixed shavit_misc_prespeed 4. Set to 4 and combine with shavit_core_nozaxisspeed 1 to get the same behavior that SourceCode timer has. --- addons/sourcemod/scripting/shavit-misc.sp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 1d8efb14..3d110195 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -301,7 +301,7 @@ public void OnPluginStart() // cvars and stuff gCV_GodMode = CreateConVar("shavit_misc_godmode", "3", "Enable godmode for players?\n0 - Disabled\n1 - Only prevent fall/world damage.\n2 - Only prevent damage from other players.\n3 - Full godmode.", 0, true, 0.0, true, 3.0); - gCV_PreSpeed = CreateConVar("shavit_misc_prespeed", "1", "Stop prespeeding in the start zone?\n0 - Disabled, fully allow prespeeding.\n1 - Limit relatively to prestrafelimit.\n2 - Block bunnyhopping in startzone.\n3 - Limit to prestrafelimit and block bunnyhopping.\n4 - Limit to prestrafelimit but allow prespeeding.", 0, true, 0.0, true, 4.0); + gCV_PreSpeed = CreateConVar("shavit_misc_prespeed", "1", "Stop prespeeding in the start zone?\n0 - Disabled, fully allow prespeeding.\n1 - Limit relatively to prestrafelimit.\n2 - Block bunnyhopping in startzone.\n3 - Limit to prestrafelimit and block bunnyhopping.\n4 - Limit to prestrafelimit but allow prespeeding. Combine with shavit_core_nozaxisspeed 1 for SourceCode timer's behavior.", 0, true, 0.0, true, 4.0); gCV_HideTeamChanges = CreateConVar("shavit_misc_hideteamchanges", "1", "Hide team changes in chat?\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); gCV_RespawnOnTeam = CreateConVar("shavit_misc_respawnonteam", "1", "Respawn whenever a player joins a team?\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); gCV_RespawnOnRestart = CreateConVar("shavit_misc_respawnonrestart", "1", "Respawn a dead player if they use the timer restart command?\n0 - Disabled\n1 - Enabled", 0, true, 0.0, true, 1.0); @@ -1010,15 +1010,13 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float if(gI_PreSpeed == 1 || gI_PreSpeed >= 3) { - float fLimit = gF_PrestrafeLimit; - float fSpeed[3]; GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", fSpeed); + float fLimit = view_as(gA_StyleSettings[gI_Style[client]][fRunspeed]) + gF_PrestrafeLimit; + if(gI_PreSpeed < 4) { - fLimit = view_as(gA_StyleSettings[gI_Style[client]][fRunspeed]) + gF_PrestrafeLimit; - // if trying to jump, add a very low limit to stop prespeeding in an elegant way // otherwise, make sure nothing weird is happening (such as sliding at ridiculous speeds, at zone enter) if(fSpeed[2] > 0.0) From 482cd86c8cbc2c38f5ae4bfc3d23dc5287310bc4 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 23:28:45 +0300 Subject: [PATCH 15/24] Fixed low gravity styles. thanks @strafe!!! --- addons/sourcemod/scripting/shavit-core.sp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index 5657aa1c..16b643c7 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -135,6 +135,7 @@ bool gB_StopChatSound = false; bool gB_HookedJump = false; char gS_LogPath[PLATFORM_MAX_PATH]; int gI_GroundTicks[MAXPLAYERS+1]; +MoveType gMT_MoveType[MAXPLAYERS+1]; // flags int gI_StyleFlag[STYLE_LIMIT]; @@ -797,11 +798,6 @@ void VelocityChanges(int data) return; } - if(view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier]) != 1.0) - { - SetEntityGravity(client, view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier])); - } - if(view_as(gA_StyleSettings[gI_Style[client]][fSpeedMultiplier]) != 1.0) { SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", view_as(gA_StyleSettings[gI_Style[client]][fSpeedMultiplier])); @@ -1827,6 +1823,17 @@ public void PreThinkPost(int client) { sv_enablebunnyhopping.BoolValue = view_as(gA_StyleSettings[gI_Style[client]][bEnableBunnyhopping]); } + + MoveType mtMoveType = GetEntityMoveType(client); + + if(view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier]) != 1.0 && + (mtMoveType == MOVETYPE_WALK || mtMoveType == MOVETYPE_ISOMETRIC) && + (gMT_MoveType[client] == MOVETYPE_LADDER || GetEntityGravity(client) == 1.0)) + { + SetEntityGravity(client, view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier])); + } + + gMT_MoveType[client] = mtMoveType; } } @@ -2272,4 +2279,6 @@ void UpdateStyleSettings(int client) char[] sAiraccelerate = new char[8]; FloatToString(gA_StyleSettings[gI_Style[client]][fAiraccelerate], sAiraccelerate, 8); sv_airaccelerate.ReplicateToClient(client, sAiraccelerate); + + SetEntityGravity(client, view_as(gA_StyleSettings[gI_Style[client]][fGravityMultiplier])); } From aaa76e4e1d3d7f3f54bfd72e4207d05aede63a78 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 23:38:23 +0300 Subject: [PATCH 16/24] Fixed HUD showing wrong speeds for slowmo styles (#601) --- addons/sourcemod/scripting/shavit-hud.sp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sourcemod/scripting/shavit-hud.sp b/addons/sourcemod/scripting/shavit-hud.sp index 2ad2b398..6708996b 100644 --- a/addons/sourcemod/scripting/shavit-hud.sp +++ b/addons/sourcemod/scripting/shavit-hud.sp @@ -832,6 +832,7 @@ void UpdateHUD(int client) return; } + iSpeed = RoundToNearest(float(iSpeed) / view_as(gA_StyleSettings[style][fSpeedMultiplier])); track = Shavit_GetReplayBotTrack(target); float fReplayTime = Shavit_GetReplayTime(style, track); From 833b1289f48e2541f2357b5ecda7d33a95d1e960 Mon Sep 17 00:00:00 2001 From: shavit Date: Thu, 13 Sep 2018 23:45:46 +0300 Subject: [PATCH 17/24] Fixed HUD speclist being broken for spectators. (#663) --- addons/sourcemod/scripting/shavit-hud.sp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-hud.sp b/addons/sourcemod/scripting/shavit-hud.sp index 6708996b..ca0b39e5 100644 --- a/addons/sourcemod/scripting/shavit-hud.sp +++ b/addons/sourcemod/scripting/shavit-hud.sp @@ -990,7 +990,7 @@ void UpdateSpectatorList(int client, Panel panel, bool &draw) for(int i = 1; i <= MaxClients; i++) { - if(i == client || !IsValidClient(i) || IsFakeClient(i) || !IsClientObserver(i) || GetClientTeam(i) < 1 || GetHUDTarget(i) != client) + if(i == client || !IsValidClient(i) || IsFakeClient(i) || !IsClientObserver(i) || GetClientTeam(i) < 1 || GetHUDTarget(i) != target) { continue; } @@ -1131,7 +1131,7 @@ void UpdateKeyHint(int client) for(int i = 1; i <= MaxClients; i++) { - if(i == client || !IsValidClient(i) || IsFakeClient(i) || !IsClientObserver(i) || GetClientTeam(i) < 1 || GetHUDTarget(i) != client) + if(i == client || !IsValidClient(i) || IsFakeClient(i) || !IsClientObserver(i) || GetClientTeam(i) < 1 || GetHUDTarget(i) != target) { continue; } From e6dc81ef590c1a4e5e304ce2b28440abd4055ebb Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 00:11:00 +0300 Subject: [PATCH 18/24] Added shavit_replay_botweapon (#659) --- addons/sourcemod/scripting/shavit-replay.sp | 40 +++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-replay.sp b/addons/sourcemod/scripting/shavit-replay.sp index 4c4f1b7c..5de7a5de 100644 --- a/addons/sourcemod/scripting/shavit-replay.sp +++ b/addons/sourcemod/scripting/shavit-replay.sp @@ -110,6 +110,7 @@ ConVar gCV_DefaultTeam = null; ConVar gCV_CentralBot = null; ConVar gCV_BotShooting = null; ConVar gCV_BotPlusUse = null; +ConVar gCV_BotWeapon = null; // cached cvars bool gB_Enabled = true; @@ -119,6 +120,7 @@ int gI_DefaultTeam = 3; bool gB_CentralBot = true; int gI_BotShooting = 3; bool gB_BotPlusUse = true; +char gS_BotWeapon[32] = ""; // timer settings int gI_Styles = 0; @@ -214,6 +216,7 @@ public void OnPluginStart() 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); gCV_BotPlusUse = CreateConVar("shavit_replay_botplususe", "1", "Allow bots to use +use?", 0, true, 0.0, true, 1.0); + gCV_BotWeapon = CreateConVar("shavit_replay_botweapon", "", "Choose which weapon the bot will hold.\nLeave empty to use the default.\nSet to \"none\" to have none.\nExample: weapon_usp"); gCV_Enabled.AddChangeHook(OnConVarChanged); gCV_ReplayDelay.AddChangeHook(OnConVarChanged); @@ -222,6 +225,7 @@ public void OnPluginStart() gCV_CentralBot.AddChangeHook(OnConVarChanged); gCV_BotShooting.AddChangeHook(OnConVarChanged); gCV_BotPlusUse.AddChangeHook(OnConVarChanged); + gCV_BotWeapon.AddChangeHook(OnConVarChanged); AutoExecConfig(); @@ -258,6 +262,7 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n gB_CentralBot = gCV_CentralBot.BoolValue; gI_BotShooting = gCV_BotShooting.IntValue; gB_BotPlusUse = gCV_BotPlusUse.BoolValue; + gCV_BotWeapon.GetString(gS_BotWeapon, 32); if(convar == gCV_CentralBot) { @@ -1269,10 +1274,39 @@ void UpdateReplayInfo(int client, int style, float time, int track) } } - // Spectating is laggy if the player has no weapons - if(gEV_Type != Engine_TF2 && GetPlayerWeaponSlot(client, CS_SLOT_KNIFE) == -1) + if(gEV_Type != Engine_TF2 && strlen(gS_BotWeapon) > 0) { - GivePlayerItem(client, "weapon_knife"); + int iWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon"); + + if(StrEqual(gS_BotWeapon, "none")) + { + if(iWeapon != -1 && IsValidEntity(iWeapon)) + { + CS_DropWeapon(client, iWeapon, false); + AcceptEntityInput(iWeapon, "Kill"); + } + } + + else + { + char[] sClassname = new char[32]; + + if(iWeapon != -1 && IsValidEntity(iWeapon)) + { + GetEntityClassname(iWeapon, sClassname, 32); + + if(!StrEqual(gS_BotWeapon, sClassname)) + { + CS_DropWeapon(client, iWeapon, false); + AcceptEntityInput(iWeapon, "Kill"); + } + } + + else + { + GivePlayerItem(client, gS_BotWeapon); + } + } } } From b473265a3bd88b408b84a712763858ae72327c96 Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 01:53:57 +0300 Subject: [PATCH 19/24] Fixed teleporting to stolen CP from start zone not showing alert. --- addons/sourcemod/scripting/shavit-misc.sp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 3d110195..aecad210 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -1984,17 +1984,10 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) return; } - bool bInStart = Shavit_InsideZone(client, Zone_Start, -1); - - if(bInStart) + if(Shavit_InsideZone(client, Zone_Start, -1)) { Shavit_StopTimer(client); } - - if(!cpcache[bCPSegmented] || GetClientSerial(client) != cpcache[iCPSerial]) - { - Shavit_SetPracticeMode(client, true, !bInStart); - } any snapshot[TIMERSNAPSHOT_SIZE]; CopyArray(cpcache[aCPSnapshot], snapshot, TIMERSNAPSHOT_SIZE); @@ -2019,6 +2012,11 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0 || cpcache[bCPSegmented])? ang:NULL_VECTOR, vel); + if(!cpcache[bCPSegmented] || GetClientSerial(client) != cpcache[iCPSerial]) + { + Shavit_SetPracticeMode(client, true, true); + } + MoveType mt = cpcache[mtCPMoveType]; if(mt == MOVETYPE_LADDER || mt == MOVETYPE_WALK) From 6d7980c03570be71dcf47fe025dc3ab8e7ccb940 Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 10:49:50 +0300 Subject: [PATCH 20/24] Fixed exploit that allowed you to escape practice mode in segmented run. --- addons/sourcemod/scripting/shavit-misc.sp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index aecad210..f1b53da8 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -54,6 +54,7 @@ enum CheckpointsCache ArrayList:aCPFrames, bool:bCPSegmented, iCPSerial, + bool:bCPPractice, iCPGroundEntity, PCPCACHE_SIZE } @@ -1914,6 +1915,7 @@ bool SaveCheckpoint(int client, int index, bool overflow = false) } cpcache[iCPSerial] = GetClientSerial(target); + cpcache[bCPPractice] = Shavit_IsPracticeMode(target); if(overflow) { @@ -2012,7 +2014,7 @@ void TeleportToCheckpoint(int client, int index, bool suppressMessage) ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0 || cpcache[bCPSegmented])? ang:NULL_VECTOR, vel); - if(!cpcache[bCPSegmented] || GetClientSerial(client) != cpcache[iCPSerial]) + if(cpcache[bCPPractice] || !cpcache[bCPSegmented] || GetClientSerial(client) != cpcache[iCPSerial]) { Shavit_SetPracticeMode(client, true, true); } From 46d16c80eefcae8b04c514cfd8c14d4cd28a809c Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 16:57:46 +0300 Subject: [PATCH 21/24] Added !ranks (rank preview, #610) --- addons/sourcemod/scripting/shavit-chat.sp | 228 +++++++++++++++++- .../translations/shavit-chat.phrases.txt | 38 +++ 2 files changed, 255 insertions(+), 11 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-chat.sp b/addons/sourcemod/scripting/shavit-chat.sp index f00ad351..13e76ca2 100644 --- a/addons/sourcemod/scripting/shavit-chat.sp +++ b/addons/sourcemod/scripting/shavit-chat.sp @@ -34,6 +34,7 @@ #define MAXLENGTH_NAME 192 #define MAXLENGTH_TEXT 192 #define MAXLENGTH_MESSAGE 255 +#define MAXLENGTH_DISPLAY 192 #define MAXLENGTH_CMESSAGE 16 #define MAXLENGTH_BUFFER 255 @@ -45,7 +46,7 @@ enum ChatRanksCache bool:bCRFree, String:sCRName[MAXLENGTH_NAME], String:sCRMessage[MAXLENGTH_MESSAGE], - String:sCRDisplay[192], + String:sCRDisplay[MAXLENGTH_DISPLAY], CRCACHE_SIZE } @@ -135,6 +136,7 @@ public void OnPluginStart() RegConsoleCmd("sm_ccmessage", Command_CCMessage, "Toggles/sets a custom chat message color. Usage: sm_ccmessage or sm_ccmessage \"off\" to disable."); RegConsoleCmd("sm_chatrank", Command_ChatRanks, "View a menu with the chat ranks available to you."); RegConsoleCmd("sm_chatranks", Command_ChatRanks, "View a menu with the chat ranks available to you."); + RegConsoleCmd("sm_ranks", Command_Ranks, "View a menu with all the obtainable chat ranks."); RegAdminCmd("sm_cclist", Command_CCList, ADMFLAG_CHAT, "Print the custom chat setting of all online players."); RegAdminCmd("sm_reloadchatranks", Command_ReloadChatRanks, ADMFLAG_ROOT, "Reloads the chatranks config file."); @@ -238,7 +240,7 @@ bool LoadChatConfig() kv.GetString("name", aChatTitle[sCRName], MAXLENGTH_NAME, "{name}"); kv.GetString("message", aChatTitle[sCRMessage], MAXLENGTH_MESSAGE, ""); - kv.GetString("display", aChatTitle[sCRDisplay], 192, ""); + kv.GetString("display", aChatTitle[sCRDisplay], MAXLENGTH_DISPLAY, ""); if(strlen(aChatTitle[sCRDisplay]) > 0) { @@ -512,8 +514,6 @@ void Frame_SendText(DataPack pack) } EndMessage(); - - return; } public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) @@ -782,13 +782,13 @@ Action ShowChatRanksMenu(int client, int item) Menu menu = new Menu(MenuHandler_ChatRanks); menu.SetTitle("%T\n ", "SelectChatRank", client); - char[] sDisplay = new char[128]; - FormatEx(sDisplay, 128, "%T\n ", "AutoAssign", client); + char[] sDisplay = new char[MAXLENGTH_DISPLAY]; + FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%T\n ", "AutoAssign", client); menu.AddItem("-2", sDisplay, (gI_ChatSelection[client] == -2)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); if(gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2)) { - FormatEx(sDisplay, 128, "%T\n ", "CustomChat", client); + FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%T\n ", "CustomChat", client); menu.AddItem("-1", sDisplay, (gI_ChatSelection[client] == -1)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); } @@ -804,14 +804,15 @@ Action ShowChatRanksMenu(int client, int item) any[] aCache = new any[CRCACHE_SIZE]; gA_ChatRanks.GetArray(i, aCache, view_as(CRCACHE_SIZE)); - strcopy(sDisplay, 192, aCache[sCRDisplay]); - ReplaceString(sDisplay, 192, "", "\n"); - StrCat(sDisplay, 192, "\n "); // to add spacing between each entry + char[] sMenuDisplay = new char[MAXLENGTH_DISPLAY]; + strcopy(sMenuDisplay, MAXLENGTH_DISPLAY, aCache[sCRDisplay]); + ReplaceString(sMenuDisplay, MAXLENGTH_DISPLAY, "", "\n"); + StrCat(sMenuDisplay, MAXLENGTH_DISPLAY, "\n "); // to add spacing between each entry char[] sInfo = new char[8]; IntToString(i, sInfo, 8); - menu.AddItem(sInfo, sDisplay, (gI_ChatSelection[client] == i)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); + menu.AddItem(sInfo, sMenuDisplay, (gI_ChatSelection[client] == i)? ITEMDRAW_DISABLED:ITEMDRAW_DEFAULT); } menu.ExitButton = true; @@ -842,6 +843,211 @@ public int MenuHandler_ChatRanks(Menu menu, MenuAction action, int param1, int p } } +public Action Command_Ranks(int client, int args) +{ + if(client == 0) + { + return Plugin_Handled; + } + + return ShowRanksMenu(client, 0); +} + +Action ShowRanksMenu(int client, int item) +{ + Menu menu = new Menu(MenuHandler_Ranks); + menu.SetTitle("%T\n ", "ChatRanksMenu", client); + + int iLength = gA_ChatRanks.Length; + + for(int i = 0; i < iLength; i++) + { + any[] aCache = new any[CRCACHE_SIZE]; + gA_ChatRanks.GetArray(i, aCache, view_as(CRCACHE_SIZE)); + + // TODO: skip ranks with admin flags + + char[] sDisplay = new char[MAXLENGTH_DISPLAY]; + strcopy(sDisplay, MAXLENGTH_DISPLAY, aCache[sCRDisplay]); + ReplaceString(sDisplay, MAXLENGTH_DISPLAY, "", "\n"); + + char[][] sExplodedString = new char[2][32]; + ExplodeString(sDisplay, "\n", sExplodedString, 2, 64); + + FormatEx(sDisplay, MAXLENGTH_DISPLAY, "%s\n ", sExplodedString[0]); + + char[] sRequirements = new char[64]; + + if(!aCache[bCRFree]) + { + if(aCache[fCRFrom] == 0) + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Unranked", client); + } + + else + { + // this is really ugly + bool bRanged = (aCache[fCRFrom] != aCache[fCRTo] && aCache[fCRTo] != 2147483648.0); + + if(aCache[iCRRangeType] == Rank_Flat) + { + if(bRanged) + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat_Ranged", client, RoundToZero(aCache[fCRFrom]), RoundToZero(aCache[fCRTo])); + } + + else + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Flat", client, RoundToZero(aCache[fCRFrom])); + } + } + + else if(aCache[iCRRangeType] == Rank_Percentage) + { + if(bRanged) + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage_Ranged", client, aCache[fCRFrom], '%', aCache[fCRTo], '%'); + } + + else + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Percentage", client, aCache[fCRFrom], '%'); + } + } + + else if(aCache[iCRRangeType] == Rank_Points) + { + if(bRanged) + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points_Ranged", client, RoundToZero(aCache[fCRFrom]), RoundToZero(aCache[fCRTo])); + } + + else + { + FormatEx(sRequirements, 64, "%T", "ChatRanksMenu_Points", client, RoundToZero(aCache[fCRFrom])); + } + } + } + } + + StrCat(sDisplay, MAXLENGTH_DISPLAY, sRequirements); + StrCat(sDisplay, MAXLENGTH_DISPLAY, "\n "); + + char[] sInfo = new char[8]; + IntToString(i, sInfo, 8); + + menu.AddItem(sInfo, sDisplay); + } + + // why even + if(menu.ItemCount == 0) + { + menu.AddItem("-1", "Nothing"); + } + + menu.ExitButton = true; + menu.DisplayAt(client, item, MENU_TIME_FOREVER); + + return Plugin_Handled; +} + +public int MenuHandler_Ranks(Menu menu, MenuAction action, int param1, int param2) +{ + if(action == MenuAction_Select) + { + char[] sInfo = new char[8]; + menu.GetItem(param2, sInfo, 8); + + PreviewChat(param1, StringToInt(sInfo)); + ShowRanksMenu(param1, GetMenuSelectionPosition()); + } + + else if(action == MenuAction_End) + { + delete menu; + } +} + +void PreviewChat(int client, int rank) +{ + char[] sTextFormatting = new char[MAXLENGTH_BUFFER]; + gSM_Messages.GetString((gEV_Type != Engine_TF2)? "Cstrike_Chat_All":"TF_Chat_All", sTextFormatting, MAXLENGTH_BUFFER); + Format(sTextFormatting, MAXLENGTH_BUFFER, "\x01%s", sTextFormatting); + + char[] sOriginalName = new char[MAXLENGTH_NAME]; + GetClientName(client, sOriginalName, MAXLENGTH_NAME); + + // remove control characters + for(int i = 0; i < sizeof(gS_ControlCharacters); i++) + { + ReplaceString(sOriginalName, MAXLENGTH_NAME, gS_ControlCharacters[i], ""); + } + + any[] aCache = new any[CRCACHE_SIZE]; + gA_ChatRanks.GetArray(rank, aCache, view_as(CRCACHE_SIZE)); + + char[] sName = new char[MAXLENGTH_NAME]; + strcopy(sName, MAXLENGTH_NAME, aCache[sCRName]); + + char[] sCMessage = new char[MAXLENGTH_CMESSAGE]; + strcopy(sCMessage, MAXLENGTH_CMESSAGE, aCache[sCRMessage]); + + FormatChat(client, sName, MAXLENGTH_NAME); + + if(gEV_Type == Engine_CSGO) + { + FormatEx(sOriginalName, MAXLENGTH_NAME, " %s", sName); + } + + else + { + strcopy(sOriginalName, MAXLENGTH_NAME, sName); + } + + FormatChat(client, sCMessage, MAXLENGTH_CMESSAGE); + + char[] sSampleText = new char[MAXLENGTH_MESSAGE]; + strcopy(sSampleText, MAXLENGTH_MESSAGE, "The quick brown fox jumps over the lazy dog"); + Format(sSampleText, MAXLENGTH_MESSAGE, "%s%s", sCMessage, sSampleText); + + ReplaceString(sTextFormatting, MAXLENGTH_BUFFER, "{name}", sOriginalName); + ReplaceString(sTextFormatting, MAXLENGTH_BUFFER, "{def}", "\x01"); + ReplaceString(sTextFormatting, MAXLENGTH_BUFFER, "{colon}", gS_Colon); + ReplaceString(sTextFormatting, MAXLENGTH_BUFFER, "{msg}", sSampleText); + + Handle hSayText2 = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS); + + if(hSayText2 != null) + { + if(gB_Protobuf) + { + Protobuf pbmsg = view_as(hSayText2); + pbmsg.SetInt("ent_idx", client); + pbmsg.SetBool("chat", true); + pbmsg.SetString("msg_name", sTextFormatting); + + for(int i = 1; i <= 4; i++) + { + pbmsg.AddString("params", ""); + } + + delete pbmsg; + } + + else + { + BfWrite bfmsg = view_as(hSayText2); + bfmsg.WriteByte(client); + bfmsg.WriteByte(true); + bfmsg.WriteString(sTextFormatting); + delete bfmsg; + } + } + + EndMessage(); +} + bool HasRankAccess(int client, int rank) { bool bAllowCustom = gI_CustomChat > 0 && (CheckCommandAccess(client, "shavit_chat", ADMFLAG_CHAT) || gI_CustomChat == 2); diff --git a/addons/sourcemod/translations/shavit-chat.phrases.txt b/addons/sourcemod/translations/shavit-chat.phrases.txt index 04feca76..edac00d6 100644 --- a/addons/sourcemod/translations/shavit-chat.phrases.txt +++ b/addons/sourcemod/translations/shavit-chat.phrases.txt @@ -59,4 +59,42 @@ { "en" "Custom\nUse custom chat settings. See !cchelp for more information." } + "ChatRanksMenu" + { + "en" "Obtainable chat ranks:\nSelect an entry to preview.\n" + } + "ChatRanksMenu_Unranked" + { + "en" "Unranked" + } + "ChatRanksMenu_Points" + { + "#format" "{1:d}" + "en" "Have {1} points" + } + "ChatRanksMenu_Points_Ranged" + { + "#format" "{1:d},{2:d}" + "en" "Have between {1} and {2} points" + } + "ChatRanksMenu_Flat" + { + "#format" "{1:d}" + "en" "Ranked #{1} or better" + } + "ChatRanksMenu_Flat_Ranged" + { + "#format" "{1:d},{2:d}" + "en" "Ranked between #{1} and #{2}" + } + "ChatRanksMenu_Percentage" + { + "#format" "{1:.1f},{2:c}" + "en" "Top {1}{2}" + } + "ChatRanksMenu_Percentage_Ranged" + { + "#format" "{1:.1f},{2:c},{3:.1f},{4:c}" + "en" "Between top {1}{2} and {3}{4}" + } } \ No newline at end of file From ca89965b7b57e8168ed10dd9ea16e478e3fc9105 Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 17:29:30 +0300 Subject: [PATCH 22/24] Added "easteregg" and "flag" to chat title settings. (#606) --- addons/sourcemod/configs/shavit-chat.cfg | 3 ++ addons/sourcemod/scripting/shavit-chat.sp | 37 +++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/configs/shavit-chat.cfg b/addons/sourcemod/configs/shavit-chat.cfg index c5dd1fe7..35bef11f 100644 --- a/addons/sourcemod/configs/shavit-chat.cfg +++ b/addons/sourcemod/configs/shavit-chat.cfg @@ -4,6 +4,9 @@ // "message" - a prefix to the message itself. Default: "" // "display" - display text in the !chatranks menu. "" for a new line. Filling this is required. // "free" - is this title available for everyone to use? Default: "0" +// "easteregg" - is this title an easter egg? Set to 1 to hide it from the !ranks menu. Default: "0" +// "flag" - set to an admin flag to require privileges for this title. Can use an override instead of a flag. +// Combine with "free" "1" to instantly give access to privileged users. Default: "" // // Global variables: // {default} - default color diff --git a/addons/sourcemod/scripting/shavit-chat.sp b/addons/sourcemod/scripting/shavit-chat.sp index 13e76ca2..2c212b21 100644 --- a/addons/sourcemod/scripting/shavit-chat.sp +++ b/addons/sourcemod/scripting/shavit-chat.sp @@ -44,6 +44,8 @@ enum ChatRanksCache Float:fCRFrom, Float:fCRTo, bool:bCRFree, + bool:bCREasterEgg, + String:sCRAdminFlag[32], String:sCRName[MAXLENGTH_NAME], String:sCRMessage[MAXLENGTH_MESSAGE], String:sCRDisplay[MAXLENGTH_DISPLAY], @@ -237,10 +239,12 @@ bool LoadChatConfig() } aChatTitle[bCRFree] = view_as(kv.GetNum("free", false)); - + aChatTitle[bCREasterEgg] = view_as(kv.GetNum("easteregg", false)); + kv.GetString("name", aChatTitle[sCRName], MAXLENGTH_NAME, "{name}"); kv.GetString("message", aChatTitle[sCRMessage], MAXLENGTH_MESSAGE, ""); kv.GetString("display", aChatTitle[sCRDisplay], MAXLENGTH_DISPLAY, ""); + kv.GetString("flag", aChatTitle[sCRAdminFlag], 32, ""); if(strlen(aChatTitle[sCRDisplay]) > 0) { @@ -865,7 +869,36 @@ Action ShowRanksMenu(int client, int item) any[] aCache = new any[CRCACHE_SIZE]; gA_ChatRanks.GetArray(i, aCache, view_as(CRCACHE_SIZE)); - // TODO: skip ranks with admin flags + char[] sFlag = new char[32]; + strcopy(sFlag, 32, aCache[sCRAdminFlag]); + + bool bFlagAccess = false; + int iSize = strlen(sFlag); + + if(iSize == 0) + { + bFlagAccess = true; + } + + else if(iSize == 1) + { + AdminFlag afFlag = view_as(0); + + if(FindFlagByChar(sFlag[0], afFlag)) + { + bFlagAccess = GetAdminFlag(GetUserAdmin(client), afFlag); + } + } + + else + { + bFlagAccess = CheckCommandAccess(client, sFlag, 0, true); + } + + if(aCache[bCREasterEgg] || !bFlagAccess) + { + continue; + } char[] sDisplay = new char[MAXLENGTH_DISPLAY]; strcopy(sDisplay, MAXLENGTH_DISPLAY, aCache[sCRDisplay]); From bd4e75a85d2735da9f09cfb7c0d1f862f77c21eb Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 17:43:01 +0300 Subject: [PATCH 23/24] 2.3.0 --- 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 94e49a0a..67660e46 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.2.0" +#define SHAVIT_VERSION "2.3.0" #define STYLE_LIMIT 256 #define MAX_ZONES 64 #define MAX_NAME_LENGTH_SQL 32 From ae8d2e28b816287aeecd5a1a5e9e59f05eb57f80 Mon Sep 17 00:00:00 2001 From: shavit Date: Fri, 14 Sep 2018 17:50:50 +0300 Subject: [PATCH 24/24] oops --- addons/sourcemod/scripting/shavit-chat.sp | 35 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/scripting/shavit-chat.sp b/addons/sourcemod/scripting/shavit-chat.sp index 2c212b21..23095a3e 100644 --- a/addons/sourcemod/scripting/shavit-chat.sp +++ b/addons/sourcemod/scripting/shavit-chat.sp @@ -1096,8 +1096,39 @@ bool HasRankAccess(int client, int rank) return false; } - static any aCache[view_as(bCRFree)+1]; - gA_ChatRanks.GetArray(rank, aCache[0], sizeof(aCache)); // a hack to only retrieve up to what we want + any[] aCache = new any[CRCACHE_SIZE]; + gA_ChatRanks.GetArray(rank, aCache, view_as(CRCACHE_SIZE)); + + char[] sFlag = new char[32]; + strcopy(sFlag, 32, aCache[sCRAdminFlag]); + + bool bFlagAccess = false; + int iSize = strlen(sFlag); + + if(iSize == 0) + { + bFlagAccess = true; + } + + else if(iSize == 1) + { + AdminFlag afFlag = view_as(0); + + if(FindFlagByChar(sFlag[0], afFlag)) + { + bFlagAccess = GetAdminFlag(GetUserAdmin(client), afFlag); + } + } + + else + { + bFlagAccess = CheckCommandAccess(client, sFlag, 0, true); + } + + if(!bFlagAccess) + { + return false; + } if(aCache[bCRFree]) {