diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c047517..9f26d45b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,11 @@ Note: Dates are UTC+0. -# v3.?.? - ? - 2025-0?-? - rtldg +# v3.?.? - ? - 2025-??-? - rtldg what will go here? hmm i wonder... maybe vscript pull request? maybe updating tf2 gamedata because i forgot? who knows... +thank pixel for finding that the 0.5s on-ground start-timer thing wasn't working + # v3.5.1 - small things - 2025-06-24 - rtldg diff --git a/addons/sourcemod/scripting/include/shavit/hud.inc b/addons/sourcemod/scripting/include/shavit/hud.inc index b08a03c9..965052f9 100644 --- a/addons/sourcemod/scripting/include/shavit/hud.inc +++ b/addons/sourcemod/scripting/include/shavit/hud.inc @@ -42,6 +42,7 @@ #define HUD_GLOCK (1 << 14) // makes you spawn with a Glock #define HUD_DEBUGTARGETNAME (1 << 15) // admin option to show current targetname & classname #define HUD_SPECTATORSDEAD (1 << 16) // for only showing spectators list when you're dead/spectating. +#define HUD_PERFS_CENTER (1 << 17) // for the perf percentage in the center hud. e.g. "Jumps: 20 (66.6%)" // HUD2 - these settings will *disable* elements for the main hud #define HUD2_TIME (1 << 0) diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index b6ca3d1a..2f2e17e3 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -2301,7 +2301,7 @@ public int Native_SetPracticeMode(Handle handler, int numParams) bool practice = view_as(GetNativeCell(2)); bool alert = view_as(GetNativeCell(3)); - if(alert && practice && !gA_Timers[client].bPracticeMode && (!gB_HUD || (Shavit_GetHUDSettings(client) & HUD_NOPRACALERT) == 0)) + if(alert && practice && !gA_Timers[client].bPracticeMode && (!gB_HUD || (Shavit_GetHUDSettings(client) & HUD_NOPRACALERT) == 0) && !Shavit_InsideZone(client, Zone_Start, -1)) { Shavit_PrintToChat(client, "%T", "PracticeModeAlert", client, gS_ChatStrings.sWarning, gS_ChatStrings.sText); } diff --git a/addons/sourcemod/scripting/shavit-hud.sp b/addons/sourcemod/scripting/shavit-hud.sp index c50b421f..bc0476fa 100644 --- a/addons/sourcemod/scripting/shavit-hud.sp +++ b/addons/sourcemod/scripting/shavit-hud.sp @@ -209,6 +209,7 @@ public void OnPluginStart() ..."HUD_USP 8192\n" ..."HUD_GLOCK 16384\n" ..."HUD_SPECTATORSDEAD 65536\n" + ..."HUD_PERFS_CENTER 131072\n" ); IntToString(HUD_DEFAULT2, defaultHUD, 8); @@ -776,6 +777,10 @@ Action ShowHUDMenu(int client, int item) FormatEx(sHudItem, 64, "%T", "HudPerfs", client); menu.AddItem(sInfo, sHudItem); + FormatEx(sInfo, 16, "!%d", HUD_PERFS_CENTER); + FormatEx(sHudItem, 64, "%T", "HudPerfsCenter", client); + menu.AddItem(sInfo, sHudItem); + FormatEx(sInfo, 16, "@%d", HUD2_STYLE); FormatEx(sHudItem, 64, "%T", "HudStyleText", client); menu.AddItem(sInfo, sHudItem); @@ -1369,7 +1374,15 @@ int AddHUDToBuffer_Source2013(int client, huddata_t data, char[] buffer, int max if((gI_HUD2Settings[client] & HUD2_JUMPS) == 0) { - FormatEx(sLine, 128, "%T: %d", "HudJumpsText", client, data.iJumps); + if (!Shavit_GetStyleSettingBool(data.iStyle, "autobhop") && (gI_HUDSettings[client] & HUD_PERFS_CENTER)) + { + FormatEx(sLine, 128, "%T: %d (%.1f%)", "HudJumpsText", client, data.iJumps, Shavit_GetPerfectJumps(data.iTarget)); + } + else + { + FormatEx(sLine, 128, "%T: %d", "HudJumpsText", client, data.iJumps); + } + AddHUDLine(buffer, maxlen, sLine, iLines); } diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 4e1f7d9c..1f5739f3 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -2454,7 +2454,7 @@ public void Shavit_OnRestart(int client, int track) { SetEntPropFloat(client, Prop_Send, "m_flStamina", 0.0); - if (gCV_RestartWithFullHP.BoolValue && GetClientHealth(client) < 100) + if (gCV_RestartWithFullHP.BoolValue && GetClientHealth(client) <= 100) { SetEntityHealth(client, 100); SetEntProp(client, Prop_Send, "m_ArmorValue", 100); diff --git a/addons/sourcemod/scripting/shavit-rankings.sp b/addons/sourcemod/scripting/shavit-rankings.sp index 34dcafc7..6f37e457 100644 --- a/addons/sourcemod/scripting/shavit-rankings.sp +++ b/addons/sourcemod/scripting/shavit-rankings.sp @@ -631,9 +631,11 @@ public Action Command_SetTier(int client, int args) int tier = StringToInt(sArg); - if(args == 0 || tier < 1 || tier > 10) + int maxtier = GetMaxTier(); + + if(args == 0 || tier < 1 || tier > maxtier) { - ReplyToCommand(client, "%T", "ArgumentsMissing", client, "sm_settier (1-10) [map]"); + ReplyToCommand(client, "%T", "ArgumentsMissing", client, "sm_settier (1-%d) [map]", maxtier); return Plugin_Handled; } @@ -1722,3 +1724,10 @@ public void SQL_DeleteMap_Callback(Database db, DBResultSet results, const char[ UpdateAllPoints(true); } } + +int GetMaxTier() +{ + float val = 10.0; + gCV_DefaultTier.GetBounds(ConVarBound_Upper, val); + return RoundToFloor(val); +} diff --git a/addons/sourcemod/scripting/shavit-stats.sp b/addons/sourcemod/scripting/shavit-stats.sp index 25bdcb3d..0ab423f2 100644 --- a/addons/sourcemod/scripting/shavit-stats.sp +++ b/addons/sourcemod/scripting/shavit-stats.sp @@ -56,6 +56,7 @@ int gI_MapType[MAXPLAYERS+1]; int gI_Style[MAXPLAYERS+1]; int gI_MenuPos[MAXPLAYERS+1]; int gI_Track[MAXPLAYERS+1]; +int gI_Tier[MAXPLAYERS+1]; int gI_TargetSteamID[MAXPLAYERS+1]; char gS_TargetName[MAXPLAYERS+1][MAX_NAME_LENGTH]; @@ -753,10 +754,47 @@ public int MenuHandler_MapsDoneLeft_Track(Menu menu, MenuAction action, int para { if(action == MenuAction_Select) { - char sInfo[8]; + char sInfo[8], sTier[16]; menu.GetItem(param2, sInfo, 8); gI_Track[param1] = StringToInt(sInfo); + if(gB_Rankings) + { + Menu submenu = new Menu(MenuHandler_MapsDoneLeft_Tier); + submenu.SetTitle("%T\n ", "SelectTier", param1); + + submenu.AddItem("0", "All"); + + for(int i = 1; i <= 10; ++i) + { + IntToString(i, sInfo, 8); + FormatEx(sTier, 16, "Tier %d", i); + submenu.AddItem(sInfo, sTier); + } + + submenu.Display(param1, MENU_TIME_FOREVER); + } + else + { + ShowMaps(param1); + } + } + else if(action == MenuAction_End) + { + delete menu; + } + + return 0; +} + +public int MenuHandler_MapsDoneLeft_Tier(Menu menu, MenuAction action, int param1, int param2) +{ + if(action == MenuAction_Select) + { + char sInfo[8]; + menu.GetItem(param2, sInfo, 8); + gI_Tier[param1] = StringToInt(sInfo); + ShowMaps(param1); } else if(action == MenuAction_End) @@ -1180,7 +1218,7 @@ public int MenuHandler_TypeHandler(Menu menu, MenuAction action, int param1, int { if(action == MenuAction_Select) { - char sInfo[32]; + char sInfo[32], sTier[16]; menu.GetItem(param2, sInfo, 32); char sExploded[2][4]; @@ -1189,7 +1227,26 @@ public int MenuHandler_TypeHandler(Menu menu, MenuAction action, int param1, int gI_Track[param1] = StringToInt(sExploded[0]); gI_MapType[param1] = StringToInt(sExploded[1]); - ShowMaps(param1); + if(gB_Rankings) + { + Menu submenu = new Menu(MenuHandler_MapsDoneLeft_Tier); + submenu.SetTitle("%T\n ", "SelectTier", param1); + + submenu.AddItem("0", "All"); + + for(int i = 1; i <= 10; ++i) + { + IntToString(i, sInfo, 8); + FormatEx(sTier, 16, "Tier %d", i); + submenu.AddItem(sInfo, sTier); + } + + submenu.Display(param1, MENU_TIME_FOREVER); + } + else + { + ShowMaps(param1); + } } else if(action == MenuAction_Cancel && param2 == MenuCancel_ExitBack) { @@ -1210,21 +1267,39 @@ void ShowMaps(int client) return; } - char sQuery[512]; + char sQuery[512], tierStr[32]; + + if(gI_Tier[client] > 0) + { + FormatEx(tierStr, 32, " AND t.tier = %d", gI_Tier[client]); + } + else + { + gI_Tier[client] = 0; + } if(gI_MapType[client] == MAPSDONE) { - FormatEx(sQuery, 512, - "SELECT a.map, a.time, a.jumps, a.id, COUNT(b.map) + 1 as 'rank', a.points FROM %splayertimes a LEFT JOIN %splayertimes b ON a.time > b.time AND a.map = b.map AND a.style = b.style AND a.track = b.track WHERE a.auth = %d AND a.style = %d AND a.track = %d GROUP BY a.map, a.time, a.jumps, a.id, a.points ORDER BY a.%s;", - gS_MySQLPrefix, gS_MySQLPrefix, gI_TargetSteamID[client], gI_Style[client], gI_Track[client], (gB_Rankings)? "points DESC":"map"); + if(gB_Rankings) + { + FormatEx(sQuery, 512, + "SELECT a.map, a.time, a.jumps, a.id, COUNT(b.map) + 1 as 'rank', a.points FROM %splayertimes a LEFT JOIN %splayertimes b ON a.time > b.time AND a.map = b.map AND a.style = b.style AND a.track = b.track LEFT JOIN %smaptiers t ON a.map = t.map WHERE a.auth = %d AND a.style = %d AND a.track = %d%s GROUP BY a.map, a.time, a.jumps, a.id, a.points ORDER BY a.points DESC;", + gS_MySQLPrefix, gS_MySQLPrefix, gS_MySQLPrefix, gI_TargetSteamID[client], gI_Style[client], gI_Track[client], tierStr); + } + else + { + FormatEx(sQuery, 512, + "SELECT a.map, a.time, a.jumps, a.id, COUNT(b.map) + 1 as 'rank', a.points FROM %splayertimes a LEFT JOIN %splayertimes b ON a.time > b.time AND a.map = b.map AND a.style = b.style AND a.track = b.track WHERE a.auth = %d AND a.style = %d AND a.track = %d GROUP BY a.map, a.time, a.jumps, a.id, a.points ORDER BY a.map;", + gS_MySQLPrefix, gS_MySQLPrefix, gI_TargetSteamID[client], gI_Style[client], gI_Track[client]); + } } else { if(gB_Rankings) { FormatEx(sQuery, 512, - "SELECT DISTINCT m.map, t.tier FROM %smapzones m LEFT JOIN %smaptiers t ON m.map = t.map WHERE m.type = 0 AND m.track = %d AND m.map NOT IN (SELECT DISTINCT map FROM %splayertimes WHERE auth = %d AND style = %d AND track = %d) ORDER BY m.map;", - gS_MySQLPrefix, gS_MySQLPrefix, gI_Track[client], gS_MySQLPrefix, gI_TargetSteamID[client], gI_Style[client], gI_Track[client]); + "SELECT DISTINCT m.map, t.tier FROM %smapzones m LEFT JOIN %smaptiers t ON m.map = t.map WHERE m.type = 0 AND m.track = %d%s AND m.map NOT IN (SELECT DISTINCT map FROM %splayertimes WHERE auth = %d AND style = %d AND track = %d) ORDER BY m.map;", + gS_MySQLPrefix, gS_MySQLPrefix, gI_Track[client], tierStr, gS_MySQLPrefix, gI_TargetSteamID[client], gI_Style[client], gI_Track[client]); } else { @@ -1328,13 +1403,19 @@ public void ShowMapsCallback(Database db, DBResultSet results, const char[] erro menu.AddItem(sRecordID, sDisplay); } + char sTier[8]; + if(gI_Tier[client] > 0) + { + FormatEx(sTier, 8, "T%d ", gI_Tier[client]); + } + if(gI_MapType[client] == MAPSDONE) { - menu.SetTitle("%T (%s)", "MapsDoneFor", client, gS_StyleStrings[gI_Style[client]].sShortName, gS_TargetName[client], rows, sTrack); + menu.SetTitle("%s%T (%s)", sTier, "MapsDoneFor", client, gS_StyleStrings[gI_Style[client]].sShortName, gS_TargetName[client], rows, sTrack); } else { - menu.SetTitle("%T (%s)", "MapsLeftFor", client, gS_StyleStrings[gI_Style[client]].sShortName, gS_TargetName[client], rows, sTrack); + menu.SetTitle("%s%T (%s)", sTier, "MapsLeftFor", client, gS_StyleStrings[gI_Style[client]].sShortName, gS_TargetName[client], rows, sTrack); } if(menu.ItemCount == 0) diff --git a/addons/sourcemod/scripting/shavit-wr.sp b/addons/sourcemod/scripting/shavit-wr.sp index a09231e0..d05156b3 100644 --- a/addons/sourcemod/scripting/shavit-wr.sp +++ b/addons/sourcemod/scripting/shavit-wr.sp @@ -187,10 +187,15 @@ public void OnPluginStart() // player commands RegConsoleCmd("sm_wr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_wr [map]"); RegConsoleCmd("sm_worldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_worldrecord [map]"); + RegConsoleCmd("sm_sr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_sr [map]"); + RegConsoleCmd("sm_serverrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_serverrecord [map]"); RegConsoleCmd("sm_bwr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bwr [map] [bonus number]"); RegConsoleCmd("sm_bworldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bworldrecord [map] [bonus number]"); RegConsoleCmd("sm_bonusworldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bonusworldrecord [map] [bonus number]"); + RegConsoleCmd("sm_bsr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bsr [map] [bonus number]"); + RegConsoleCmd("sm_bserverrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bserverrecord [map] [bonus number]"); + RegConsoleCmd("sm_bonusserverrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bonusserverrecord [map] [bonus number]"); RegConsoleCmd("sm_recent", Command_RecentRecords, "View the recent #1 times set."); RegConsoleCmd("sm_recentrecords", Command_RecentRecords, "View the recent #1 times set."); @@ -438,9 +443,17 @@ void RegisterWRCommands(int style) gSM_StyleCommands.SetValue(sCommand, style); RegConsoleCmd(sCommand, Command_WorldRecord_Style, sDescription); + FormatEx(sCommand, sizeof(sCommand), "sm_sr%s", sStyleCommands[x]); + gSM_StyleCommands.SetValue(sCommand, style); + RegConsoleCmd(sCommand, Command_WorldRecord_Style, sDescription); + FormatEx(sCommand, sizeof(sCommand), "sm_bwr%s", sStyleCommands[x]); gSM_StyleCommands.SetValue(sCommand, style); RegConsoleCmd(sCommand, Command_WorldRecord_Style, sDescription); + + FormatEx(sCommand, sizeof(sCommand), "sm_bsr%s", sStyleCommands[x]); + gSM_StyleCommands.SetValue(sCommand, style); + RegConsoleCmd(sCommand, Command_WorldRecord_Style, sDescription); } } diff --git a/addons/sourcemod/translations/shavit-hud.phrases.txt b/addons/sourcemod/translations/shavit-hud.phrases.txt index dea5c879..020e20b4 100644 --- a/addons/sourcemod/translations/shavit-hud.phrases.txt +++ b/addons/sourcemod/translations/shavit-hud.phrases.txt @@ -85,6 +85,10 @@ { "en" "Perfect jumps" } + "HudPerfsCenter" + { + "en" "Perfect jumps (center hud)" + } "HudDefaultPistol" { "en" "Default Pistol: 1=USP 2=Glock" diff --git a/addons/sourcemod/translations/shavit-stats.phrases.txt b/addons/sourcemod/translations/shavit-stats.phrases.txt index c0c0f749..37830648 100644 --- a/addons/sourcemod/translations/shavit-stats.phrases.txt +++ b/addons/sourcemod/translations/shavit-stats.phrases.txt @@ -16,6 +16,10 @@ { "en" "Select timer track:" } + "SelectTier" + { + "en" "Select map tier:" + } "MapsDone" { "en" "Maps done"