From d429dd0a78d6db2b2f8b42a705a6c121ab40bd83 Mon Sep 17 00:00:00 2001 From: shavitush Date: Sat, 17 Jun 2017 09:34:46 +0300 Subject: [PATCH] Implement snapshots for checkpoints/TAS. #313 #158 --- scripting/include/shavit.inc | 59 +++++++++++++++++ scripting/shavit-core.sp | 81 +++++++++++++++++++++++- scripting/shavit-hud.sp | 68 +++++++++++--------- scripting/shavit-misc.sp | 26 ++++++-- scripting/shavit-stats.sp | 54 ++++++++-------- scripting/shavit-wr.sp | 50 +++++++-------- scripting/shavit-zones.sp | 9 +-- translations/shavit-core.phrases.txt | 10 +++ translations/shavit-hud.phrases.txt | 4 ++ translations/shavit-misc.phrases.txt | 5 -- translations/shavit-rankings.phrases.txt | 12 ++-- 11 files changed, 268 insertions(+), 110 deletions(-) diff --git a/scripting/include/shavit.inc b/scripting/include/shavit.inc index ed399dd2..73989b8c 100644 --- a/scripting/include/shavit.inc +++ b/scripting/include/shavit.inc @@ -130,6 +130,23 @@ enum CHATSETTINGS_SIZE }; +enum +{ + bTimerEnabled, + fStartTime, + fCurrentTime, + fPauseStartTime, + fPauseTotalTime, + bClientPaused, + iJumps, + bsStyle, + iStrafes, + iTotalMeasures, + iGoodGains, + fServerTime, + TIMERSNAPSHOT_SIZE +}; + #if defined USES_CHAT_COLORS // hardcoded colors char gS_GlobalColorNames[][] = @@ -742,6 +759,44 @@ native int Shavit_GetChatStrings(int stringtype, char[] ChatStrings, int size); */ native int Shavit_GetHUDSettings(int client); +/** + * Sets practice mode on a client. + * Practice mode means that the client's records will not be saved, just like unranked mode, but for ranked styles. + * Intended to be used by checkpoints. + * + * @param client Client index. + * @param practice Enable or disable practice modce. + * @param alert Alert the client about practice mode? + * @noreturn + */ +native void Shavit_SetPracticeMode(int client, bool practice, bool alert); + +/** + * Gets a client's practice mode status. + * + * @param client Client index. + * @return Practice mode status. + */ +native bool Shavit_IsPracticeMode(int client); + +/** + * Save a client's timer into a snapshot. + * See the enumeration that ends with TIMERSNAPSHOT_SIZE. + * + * @param client Client index. + * @param snapshot Full snapshot of the client's timer. + * @noreturn + */ +native void Shavit_SaveSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]); + +/** + * Restores the client's timer from a snapshot. + * + * @param client Client index. + * @param snapshot Full snapshot of the client's timer. + */ +native void Shavit_LoadSnapshot(int client, any snapshot[TIMERSNAPSHOT_SIZE]); + /** * Use this native when printing anything in chat if it's related to the timer. * This native will auto-assign colors and a chat prefix. @@ -813,12 +868,16 @@ public void __pl_shavit_SetNTVOptional() MarkNativeAsOptional("Shavit_GetWRTime"); MarkNativeAsOptional("Shavit_InsideZone"); MarkNativeAsOptional("Shavit_IsClientCreatingZone"); + MarkNativeAsOptional("Shavit_IsPracticeMode"); MarkNativeAsOptional("Shavit_IsReplayDataLoaded"); + MarkNativeAsOptional("Shavit_LoadSnapshot"); MarkNativeAsOptional("Shavit_OpenStatsMenu"); MarkNativeAsOptional("Shavit_PauseTimer"); MarkNativeAsOptional("Shavit_PrintToChat"); MarkNativeAsOptional("Shavit_RestartTimer"); MarkNativeAsOptional("Shavit_ResumeTimer"); + MarkNativeAsOptional("Shavit_SaveSnapshot"); + MarkNativeAsOptional("Shavit_SetPracticeMode"); MarkNativeAsOptional("Shavit_StartTimer"); MarkNativeAsOptional("Shavit_StopTimer"); MarkNativeAsOptional("Shavit_ZoneExists"); diff --git a/scripting/shavit-core.sp b/scripting/shavit-core.sp index 85821890..7253dd70 100644 --- a/scripting/shavit-core.sp +++ b/scripting/shavit-core.sp @@ -72,6 +72,7 @@ int gI_TotalMeasures[MAXPLAYERS+1]; int gI_GoodGains[MAXPLAYERS+1]; bool gB_DoubleSteps[MAXPLAYERS+1]; float gF_StrafeWarning[MAXPLAYERS+1]; +bool gB_PracticeMode[MAXPLAYERS+1]; float gF_HSW_Requirement = 0.0; StringMap gSM_StyleCommands = null; @@ -162,6 +163,10 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max CreateNative("Shavit_GetStyleSettings", Native_GetStyleSettings); CreateNative("Shavit_GetStyleStrings", Native_GetStyleStrings); CreateNative("Shavit_GetChatStrings", Native_GetChatStrings); + CreateNative("Shavit_SetPracticeMode", Native_SetPracticeMode); + CreateNative("Shavit_IsPracticeMode", Native_IsPracticeMode); + CreateNative("Shavit_SaveSnapshot", Native_SaveSnapshot); + CreateNative("Shavit_LoadSnapshot", Native_LoadSnapshot); // registers library, check "bool LibraryExists(const char[] name)" in order to use with other plugins RegPluginLibrary("shavit"); @@ -478,7 +483,7 @@ public Action Command_StopTimer(int client, int args) public Action Command_TogglePause(int client, int args) { - if(!IsValidClient(client)) + if(!IsValidClient(client) || !gB_TimerEnabled[client]) { return Plugin_Handled; } @@ -507,6 +512,13 @@ public Action Command_TogglePause(int client, int args) return Plugin_Handled; } + if(gB_PracticeMode[client]) + { + Shavit_PrintToChat(client, "%T", "PausePractice", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + + return Plugin_Handled; + } + if(gB_ClientPaused[client]) { ResumeTimer(client); @@ -880,6 +892,69 @@ public int Native_GetChatStrings(Handle handler, int numParams) return SetNativeString(2, gS_ChatStrings[GetNativeCell(1)], GetNativeCell(3)); } +public int Native_SetPracticeMode(Handle handler, int numParams) +{ + int client = GetNativeCell(1); + bool practice = view_as(GetNativeCell(2)); + bool alert = view_as(GetNativeCell(3)); + + if(alert && practice && !gB_PracticeMode[client]) + { + Shavit_PrintToChat(client, "%T", "PracticeModeAlert", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); + } + + gB_PracticeMode[client] = practice; + + return; +} + +public int Native_IsPracticeMode(Handle handler, int numParams) +{ + return view_as(gB_PracticeMode[GetNativeCell(1)]); +} + +public int Native_SaveSnapshot(Handle handler, int numParams) +{ + int client = GetNativeCell(1); + + any[] snapshot = new any[TIMERSNAPSHOT_SIZE]; + snapshot[bTimerEnabled] = gB_TimerEnabled[client]; + snapshot[fStartTime] = gF_StartTime[client]; + snapshot[fPauseStartTime] = gF_PauseStartTime[client]; + snapshot[fPauseTotalTime] = gF_PauseTotalTime[client]; + snapshot[bClientPaused] = gB_ClientPaused[client]; + snapshot[iJumps] = gI_Jumps[client]; + snapshot[bsStyle] = gBS_Style[client]; + snapshot[iStrafes] = gI_Strafes[client]; + snapshot[iTotalMeasures] = gI_TotalMeasures[client]; + snapshot[iGoodGains] = gI_GoodGains[client]; + snapshot[fServerTime] = GetEngineTime(); + snapshot[fCurrentTime] = CalculateTime(client); + + return SetNativeArray(2, snapshot, TIMERSNAPSHOT_SIZE); +} + +public int Native_LoadSnapshot(Handle handler, int numParams) +{ + int client = GetNativeCell(1); + + any[] snapshot = new any[TIMERSNAPSHOT_SIZE]; + GetNativeArray(2, snapshot, TIMERSNAPSHOT_SIZE); + + gB_TimerEnabled[client] = view_as(snapshot[bTimerEnabled]); + gF_PauseStartTime[client] = view_as(snapshot[fPauseStartTime]); + gF_PauseTotalTime[client] = view_as(snapshot[fPauseTotalTime]); + gB_ClientPaused[client] = false; // Pausing is disabled in practice mode. + gI_Jumps[client] = view_as(snapshot[iJumps]); + gBS_Style[client] = view_as(snapshot[bsStyle]); + gI_Strafes[client] = view_as(snapshot[iStrafes]); + gI_TotalMeasures[client] = view_as(snapshot[iTotalMeasures]); + gI_GoodGains[client] = view_as(snapshot[iGoodGains]); + gF_StartTime[client] = GetEngineTime() - view_as(snapshot[fCurrentTime]); + + return; +} + void StartTimer(int client) { if(!IsValidClient(client, true) || GetClientTeam(client) < 2 || IsFakeClient(client)) @@ -887,8 +962,6 @@ void StartTimer(int client) return; } - - float fSpeed[3]; GetEntPropVector(client, Prop_Data, "m_vecVelocity", fSpeed); @@ -908,6 +981,7 @@ void StartTimer(int client) gF_PauseTotalTime[client] = 0.0; gB_ClientPaused[client] = false; + gB_PracticeMode[client] = false; SetEntityGravity(client, gA_StyleSettings[gBS_Style[client]][fGravityMultiplier]); SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", gA_StyleSettings[gBS_Style[client]][fSpeedMultiplier]); @@ -1028,6 +1102,7 @@ public void OnClientPutInServer(int client) gB_DoubleSteps[client] = false; gF_StrafeWarning[client] = 0.0; gBS_Style[client] = view_as(0); + gB_PracticeMode[client] = false; UpdateAutoBhop(client); if(AreClientCookiesCached(client)) diff --git a/scripting/shavit-hud.sp b/scripting/shavit-hud.sp index 37b97a66..f0ba55dd 100644 --- a/scripting/shavit-hud.sp +++ b/scripting/shavit-hud.sp @@ -469,11 +469,11 @@ void UpdateHUD(int client) { if(!IsFakeClient(target)) { - float fTime = Shavit_GetClientTime(target); - int iJumps = Shavit_GetClientJumps(target); - TimerStatus tStatus = Shavit_GetTimerStatus(target); - int iStrafes = Shavit_GetStrafeCount(target); - int iPotentialRank = Shavit_GetRankForTime(gBS_Style[target], fTime); + float time = Shavit_GetClientTime(target); + int jumps = Shavit_GetClientJumps(target); + TimerStatus status = Shavit_GetTimerStatus(target); + int strafes = Shavit_GetStrafeCount(target); + int rank = Shavit_GetRankForTime(gBS_Style[target], time); float fWR = 0.0; Shavit_GetWRTime(gBS_Style[target], fWR); @@ -485,27 +485,27 @@ void UpdateHUD(int client) FormatSeconds(fPB, sPB, 32); char[] sTime = new char[32]; - FormatSeconds(fTime, sTime, 32, false); + FormatSeconds(time, sTime, 32, false); if(gEV_Type == Engine_CSGO) { strcopy(sHintText, 512, ""); - if(tStatus >= Timer_Running) + if(status >= Timer_Running) { char[] sColor = new char[8]; - if(tStatus == Timer_Paused) + if(status == Timer_Paused) { strcopy(sColor, 8, "FF0000"); } - else if(fTime < fWR || fWR == 0.0) + else if(time < fWR || fWR == 0.0) { strcopy(sColor, 8, "00FF00"); } - else if(fPB != 0.0 && fTime < fPB) + else if(fPB != 0.0 && time < fPB) { strcopy(sColor, 8, "FFA500"); } @@ -519,19 +519,19 @@ void UpdateHUD(int client) FormatEx(sPauseItem, 64, "%T\t", "HudPaused", client); char[] sUnpausedItem = new char[64]; - FormatEx(sUnpausedItem, 64, "%s (%d)\t", sTime, iPotentialRank); + FormatEx(sUnpausedItem, 64, "%s (%d)\t", sTime, rank); - Format(sHintText, 512, "%s%T: %s", sHintText, "HudTimeText", client, sColor, (tStatus == Timer_Paused)? sPauseItem:sUnpausedItem); + Format(sHintText, 512, "%s%T: %s", sHintText, "HudTimeText", client, sColor, (status == Timer_Paused)? sPauseItem:sUnpausedItem); } if(fPB > 0.0) { - Format(sHintText, 512, "%s%s%T: %s (#%d)", sHintText, (tStatus >= Timer_Running)? "\t":"", "HudBestText", client, sPB, (Shavit_GetRankForTime(gBS_Style[target], fPB) - 1)); + Format(sHintText, 512, "%s%s%T: %s (#%d)", sHintText, (status >= Timer_Running)? "\t":"", "HudBestText", client, sPB, (Shavit_GetRankForTime(gBS_Style[target], fPB) - 1)); } - if(tStatus >= Timer_Running) + if(status >= Timer_Running) { - Format(sHintText, 512, "%s\n%T: %d%s\t%T: %s", sHintText, "HudJumpsText", client, iJumps, (iJumps < 1000)? "\t":"", "HudStyleText", client, gS_StyleStrings[gBS_Style[target]][sHTMLColor], gS_StyleStrings[gBS_Style[target]][sStyleName]); + Format(sHintText, 512, "%s\n%T: %d%s\t%T: %s", sHintText, "HudJumpsText", client, jumps, (jumps < 1000)? "\t":"", "HudStyleText", client, gS_StyleStrings[gBS_Style[target]][sHTMLColor], gS_StyleStrings[gBS_Style[target]][sStyleName]); } else @@ -541,16 +541,16 @@ void UpdateHUD(int client) Format(sHintText, 512, "%s\n%T: %d", sHintText, "HudSpeedText", client, iSpeed); - if(tStatus >= Timer_Running) + if(status >= Timer_Running) { if(gA_StyleSettings[gBS_Style[target]][bSync]) { - Format(sHintText, 512, "%s%s\t%T: %d (%.02f%%)", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, iStrafes, Shavit_GetSync(target)); + Format(sHintText, 512, "%s%s\t%T: %d (%.02f%%)", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, strafes, Shavit_GetSync(target)); } else { - Format(sHintText, 512, "%s%s\t%T: %d", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, iStrafes); + Format(sHintText, 512, "%s%s\t%T: %d", sHintText, (iSpeed < 1000)? "\t":"", "HudStrafeText", client, strafes); } } @@ -559,11 +559,19 @@ void UpdateHUD(int client) else { - if(tStatus != Timer_Stopped) + if(status != Timer_Stopped) { if(Shavit_GetTimerStatus(target) == Timer_Running) { - FormatEx(sHintText, 512, "%s\n%T: %s (%d)\n%T: %d\n%T: %d\n%T: %d%s", gS_StyleStrings[gBS_Style[target]][sStyleName], "HudTimeText", client, sTime, iPotentialRank, "HudJumpsText", client, iJumps, "HudStrafeText", client, iStrafes, "HudSpeedText", client, iSpeed, (gA_StyleSettings[gBS_Style[target]][fVelocityLimit] > 0.0 && Shavit_InsideZone(target, Zone_NoVelLimit))? "\nNo Speed Limit":""); + char[] sFirstLine = new char[64]; + strcopy(sFirstLine, 64, gS_StyleStrings[gBS_Style[target]][sStyleName]); + + if(Shavit_IsPracticeMode(target)) + { + Format(sFirstLine, 64, "%s %T", sFirstLine, "HudPracticeMode", client); + } + + FormatEx(sHintText, 512, "%s\n%T: %s (%d)\n%T: %d\n%T: %d\n%T: %d%s", sFirstLine, "HudTimeText", client, sTime, rank, "HudJumpsText", client, jumps, "HudStrafeText", client, strafes, "HudSpeedText", client, iSpeed, (gA_StyleSettings[gBS_Style[target]][fVelocityLimit] > 0.0 && Shavit_InsideZone(target, Zone_NoVelLimit))? "\nNo Speed Limit":""); } else @@ -583,27 +591,27 @@ void UpdateHUD(int client) else if(gB_Replay) { - BhopStyle bsStyle = view_as(0); + BhopStyle style = view_as(0); for(int i = 0; i < gI_Styles; i++) { if(Shavit_GetReplayBotIndex(view_as(i)) == target) { - bsStyle = view_as(i); + style = view_as(i); break; } } - float fStart = 0.0; - Shavit_GetReplayBotFirstFrame(bsStyle, fStart); + float start = 0.0; + Shavit_GetReplayBotFirstFrame(style, start); - float fTime = GetEngineTime() - fStart; + float time = GetEngineTime() - start; float fWR = 0.0; - Shavit_GetWRTime(bsStyle, fWR); + Shavit_GetWRTime(style, fWR); - if(fTime > fWR || !Shavit_IsReplayDataLoaded(bsStyle)) + if(time > fWR || !Shavit_IsReplayDataLoaded(style)) { PrintHintText(client, "%T", "NoReplayData", client); @@ -611,7 +619,7 @@ void UpdateHUD(int client) } char[] sTime = new char[32]; - FormatSeconds(fTime, sTime, 32, false); + FormatSeconds(time, sTime, 32, false); char[] sWR = new char[32]; FormatSeconds(fWR, sWR, 32, false); @@ -619,7 +627,7 @@ void UpdateHUD(int client) if(gEV_Type == Engine_CSGO) { FormatEx(sHintText, 512, ""); - Format(sHintText, 512, "%s\t%s %T", sHintText, gS_StyleStrings[bsStyle][sHTMLColor], gS_StyleStrings[bsStyle][sStyleName], "ReplayText", client); + Format(sHintText, 512, "%s\t%s %T", sHintText, gS_StyleStrings[style][sHTMLColor], gS_StyleStrings[style][sStyleName], "ReplayText", client); Format(sHintText, 512, "%s\n\t%T: %s / %s", sHintText, "HudTimeText", client, sTime, sWR); Format(sHintText, 512, "%s\n\t%T: %d", sHintText, "HudSpeedText", client, iSpeed); Format(sHintText, 512, "%s", sHintText); @@ -627,7 +635,7 @@ void UpdateHUD(int client) else { - FormatEx(sHintText, 512, "%s Replay", gS_StyleStrings[bsStyle][sStyleName], sHintText); + FormatEx(sHintText, 512, "%s Replay", gS_StyleStrings[style][sStyleName], sHintText); Format(sHintText, 512, "%s\n%T: %s/%s", sHintText, "HudTimeText", client, sTime, sWR); Format(sHintText, 512, "%s\n%T: %d", sHintText, "HudSpeedText", client, iSpeed); } diff --git a/scripting/shavit-misc.sp b/scripting/shavit-misc.sp index d67af587..3388f81d 100644 --- a/scripting/shavit-misc.sp +++ b/scripting/shavit-misc.sp @@ -62,6 +62,7 @@ ConVar gCV_Hostport = null; BhopStyle gBS_Style[MAXPLAYERS+1]; float gF_Checkpoints[MAXPLAYERS+1][2][3][3]; // 3 - position, angles, velocity int gI_CheckpointsSettings[MAXPLAYERS+1]; +any gA_CheckpointsSnapshots[MAXPLAYERS+1][2][TIMERSNAPSHOT_SIZE]; // cookies Handle gH_HideCookie = null; @@ -765,6 +766,21 @@ public void OnClientPutInServer(int client) } } } + + for(int i = 0; i <= 1; i++) + { + gA_CheckpointsSnapshots[client][i][bTimerEnabled] = false; + gA_CheckpointsSnapshots[client][i][fStartTime] = 0.0; + gA_CheckpointsSnapshots[client][i][fCurrentTime] = 0.0; + gA_CheckpointsSnapshots[client][i][fPauseStartTime] = 0.0; + gA_CheckpointsSnapshots[client][i][fPauseTotalTime] = 0.0; + gA_CheckpointsSnapshots[client][i][bClientPaused] = false; + gA_CheckpointsSnapshots[client][i][iJumps] = 0; + gA_CheckpointsSnapshots[client][i][bsStyle] = view_as(0); + gA_CheckpointsSnapshots[client][i][iStrafes] = 0; + gA_CheckpointsSnapshots[client][i][iTotalMeasures] = 0; + gA_CheckpointsSnapshots[client][i][iGoodGains] = 0; + } } public Action OnTakeDamage(int victim, int attacker) @@ -1170,7 +1186,7 @@ public Action OpenCheckpointsMenu(int client, int item) } Menu menu = new Menu(MenuHandler_Checkpoints, MENU_ACTIONS_DEFAULT|MenuAction_DisplayItem); - menu.SetTitle("%T\n%T", "MiscCheckpointMenu", client, "MiscCheckpointWarning", client); + menu.SetTitle("%T\n%T\n ", "MiscCheckpointMenu", client, "MiscCheckpointWarning", client); char[] sDisplay = new char[64]; FormatEx(sDisplay, 64, "%T", "MiscCheckpointSave1", client); @@ -1268,15 +1284,13 @@ void SaveCheckpoint(int client, int index) GetClientAbsOrigin(client, gF_Checkpoints[client][index][0]); GetClientEyeAngles(client, gF_Checkpoints[client][index][1]); GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", gF_Checkpoints[client][index][2]); + Shavit_SaveSnapshot(client, gA_CheckpointsSnapshots[client][index]); } void TeleportToCheckpoint(int client, int index) { - if(Shavit_GetTimerStatus(client) != Timer_Stopped) - { - Shavit_PrintToChat(client, "%T", "MiscCheckpointsStopped", client, gS_ChatStrings[sMessageWarning], gS_ChatStrings[sMessageText]); - Shavit_StopTimer(client); - } + Shavit_SetPracticeMode(client, true, true); + Shavit_LoadSnapshot(client, gA_CheckpointsSnapshots[client][index]); TeleportEntity(client, gF_Checkpoints[client][index][0], ((gI_CheckpointsSettings[client] & CP_ANGLES) > 0)? gF_Checkpoints[client][index][1]:NULL_VECTOR, diff --git a/scripting/shavit-stats.sp b/scripting/shavit-stats.sp index 16b795f9..2840e8c2 100644 --- a/scripting/shavit-stats.sp +++ b/scripting/shavit-stats.sp @@ -401,22 +401,22 @@ public void OpenStatsMenuCallback(Database db, DBResultSet results, const char[] FormatTime(sLastLogin, 32, "%Y-%m-%d %H:%M:%S", iLastLogin); Format(sLastLogin, 32, "%T: %s", "LastLogin", client, (iLastLogin != -1)? sLastLogin:"N/A"); - int iRank = -1; - float fPoints = -1.0; + int rank = -1; + float points = -1.0; if(gB_Rankings) { - fPoints = results.FetchFloat(6); - iRank = results.FetchInt(7); + points = results.FetchFloat(6); + rank = results.FetchInt(7); } char[] sRankingString = new char[64]; if(gB_Rankings) { - if(iRank > 0 && fPoints > 0.0) + if(rank > 0 && points > 0.0) { - FormatEx(sRankingString, 64, "\n%T: #%d/%d\n%T: %.02f", "Rank", client, iRank, Shavit_GetRankedPlayers(), "Points", client, fPoints); + FormatEx(sRankingString, 64, "\n%T: #%d/%d\n%T: %.02f", "Rank", client, rank, Shavit_GetRankedPlayers(), "Points", client, points); } else @@ -605,23 +605,23 @@ public void ShowMapsCallback(Database db, DBResultSet results, const char[] erro if(gI_MapType[client] == MAPSDONE) { - float fTime = results.FetchFloat(1); - int iJumps = results.FetchInt(2); - int iRank = results.FetchInt(4); + float time = results.FetchFloat(1); + int jumps = results.FetchInt(2); + int rank = results.FetchInt(4); char[] sTime = new char[32]; - FormatSeconds(fTime, sTime, 32); + FormatSeconds(time, sTime, 32); - float fPoints = results.FetchFloat(5); + float points = results.FetchFloat(5); - if(gB_Rankings && fPoints > 0.0) + if(gB_Rankings && points > 0.0) { - FormatEx(sDisplay, 192, "[#%d] %s - %s (%.03f %T)", iRank, sMap, sTime, fPoints, "MapsPoints", client); + FormatEx(sDisplay, 192, "[#%d] %s - %s (%.03f %T)", rank, sMap, sTime, points, "MapsPoints", client); } else { - FormatEx(sDisplay, 192, "[#%d] %s - %s (%d %T)", iRank, sMap, sTime, iJumps, "MapsJumps", client); + FormatEx(sDisplay, 192, "[#%d] %s - %s (%d %T)", rank, sMap, sTime, jumps, "MapsJumps", client); } int iRecordID = results.FetchInt(3); @@ -710,22 +710,22 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] results.FetchString(0, sName, MAX_NAME_LENGTH); // 1 - time - float fTime = results.FetchFloat(1); + float time = results.FetchFloat(1); char[] sTime = new char[16]; - FormatSeconds(fTime, sTime, 16); + FormatSeconds(time, sTime, 16); char[] sDisplay = new char[128]; FormatEx(sDisplay, 128, "%T: %s", "Time", client, sTime); m.AddItem("-1", sDisplay); // 2 - jumps - int iJumps = results.FetchInt(2); - FormatEx(sDisplay, 128, "%T: %d", "Jumps", client, iJumps); + int jumps = results.FetchInt(2); + FormatEx(sDisplay, 128, "%T: %d", "Jumps", client, jumps); m.AddItem("-1", sDisplay); // 3 - style - BhopStyle bsStyle = view_as(results.FetchInt(3)); - FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[bsStyle][sStyleName]); + BhopStyle style = view_as(results.FetchInt(3)); + FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[style][sStyleName]); m.AddItem("-1", sDisplay); // 4 - steamid3 @@ -734,11 +734,11 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] // 6 - map results.FetchString(6, sMap, 256); - float fPoints = results.FetchFloat(9); + float points = results.FetchFloat(9); - if(gB_Rankings && fPoints > 0.0) + if(gB_Rankings && points > 0.0) { - FormatEx(sDisplay, 192, "%T: %.03f", "Points", client, fPoints); + FormatEx(sDisplay, 192, "%T: %.03f", "Points", client, points); m.AddItem("-1", sDisplay); } @@ -754,12 +754,12 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] FormatEx(sDisplay, 128, "%T: %s", "Date", client, sDate); m.AddItem("-1", sDisplay); - int iStrafes = results.FetchInt(7); - float fSync = results.FetchFloat(8); + int strafes = results.FetchInt(7); + float sync = results.FetchFloat(8); - if(iJumps > 0 || iStrafes > 0) + if(jumps > 0 || strafes > 0) { - FormatEx(sDisplay, 128, (fSync > 0.0)? "%T: %d (%.02f%%)":"%T: %d", "Strafes", client, iStrafes, fSync, "Strafes", client, iStrafes); + FormatEx(sDisplay, 128, (sync > 0.0)? "%T: %d (%.02f%%)":"%T: %d", "Strafes", client, strafes, sync, "Strafes", client, strafes); m.AddItem("-1", sDisplay); } diff --git a/scripting/shavit-wr.sp b/scripting/shavit-wr.sp index 9c4baa13..d2922740 100644 --- a/scripting/shavit-wr.sp +++ b/scripting/shavit-wr.sp @@ -630,15 +630,15 @@ public void SQL_OpenDelete_Callback(Database db, DBResultSet results, const char results.FetchString(1, sName, MAX_NAME_LENGTH); // 2 - time - float fTime = results.FetchFloat(2); + float time = results.FetchFloat(2); char[] sTime = new char[16]; - FormatSeconds(fTime, sTime, 16); + FormatSeconds(time, sTime, 16); // 3 - jumps - int iJumps = results.FetchInt(3); + int jumps = results.FetchInt(3); char[] sDisplay = new char[128]; - FormatEx(sDisplay, 128, "#%d - %s - %s (%d jump%s)", iCount, sName, sTime, iJumps, (iJumps != 1)? "s":""); + FormatEx(sDisplay, 128, "#%d - %s - %s (%d jump%s)", iCount, sName, sTime, jumps, (jumps != 1)? "s":""); m.AddItem(sID, sDisplay); } @@ -956,15 +956,15 @@ public void SQL_WR_Callback(Database db, DBResultSet results, const char[] error results.FetchString(1, sName, MAX_NAME_LENGTH); // 2 - time - float fTime = results.FetchFloat(2); + float time = results.FetchFloat(2); char[] sTime = new char[16]; - FormatSeconds(fTime, sTime, 16); + FormatSeconds(time, sTime, 16); // 3 - jumps - int iJumps = results.FetchInt(3); + int jumps = results.FetchInt(3); char[] sDisplay = new char[128]; - FormatEx(sDisplay, 128, "#%d - %s - %s (%d %T)", iCount, sName, sTime, iJumps, "WRJumps", client); + FormatEx(sDisplay, 128, "#%d - %s - %s (%d %T)", iCount, sName, sTime, jumps, "WRJumps", client); m.AddItem(sID, sDisplay); } @@ -1095,23 +1095,23 @@ public void SQL_RR_Callback(Database db, DBResultSet results, const char[] error results.FetchString(2, sName, MAX_NAME_LENGTH); char[] sTime = new char[16]; - float fTime = results.FetchFloat(3); - FormatSeconds(fTime, sTime, 16); + float time = results.FetchFloat(3); + FormatSeconds(time, sTime, 16); - int iJumps = results.FetchInt(4); - BhopStyle bsStyle = view_as(results.FetchInt(5)); + int jumps = results.FetchInt(4); + BhopStyle style = view_as(results.FetchInt(5)); float fPoints = results.FetchFloat(6); char[] sDisplay = new char[192]; if(gB_Rankings && fPoints > 0.0) { - FormatEx(sDisplay, 192, "[%s] %s - %s @ %s (%.03f %T)", gS_StyleStrings[bsStyle][sShortName], sDisplayMap, sName, sTime, fPoints, "WRPoints", client); + FormatEx(sDisplay, 192, "[%s] %s - %s @ %s (%.03f %T)", gS_StyleStrings[style][sShortName], sDisplayMap, sName, sTime, fPoints, "WRPoints", client); } else { - FormatEx(sDisplay, 192, "[%s] %s - %s @ %s (%d %T)", gS_StyleStrings[bsStyle][sShortName], sDisplayMap, sName, sTime, iJumps, "WRJumps", client); + FormatEx(sDisplay, 192, "[%s] %s - %s @ %s (%d %T)", gS_StyleStrings[style][sShortName], sDisplayMap, sName, sTime, jumps, "WRJumps", client); } char[] sInfo = new char[192]; @@ -1204,22 +1204,22 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] results.FetchString(0, sName, MAX_NAME_LENGTH); // 1 - time - float fTime = results.FetchFloat(1); + float time = results.FetchFloat(1); char[] sTime = new char[16]; - FormatSeconds(fTime, sTime, 16); + FormatSeconds(time, sTime, 16); char[] sDisplay = new char[128]; FormatEx(sDisplay, 128, "%T: %s", "WRTime", client, sTime); m.AddItem("-1", sDisplay); // 2 - jumps - int iJumps = results.FetchInt(2); - FormatEx(sDisplay, 128, "%T: %d", "WRJumps", client, iJumps); + int jumps = results.FetchInt(2); + FormatEx(sDisplay, 128, "%T: %d", "WRJumps", client, jumps); m.AddItem("-1", sDisplay); // 3 - style - BhopStyle bsStyle = view_as(results.FetchInt(3)); - FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[bsStyle][sStyleName]); + BhopStyle style = view_as(results.FetchInt(3)); + FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[style][sStyleName]); m.AddItem("-1", sDisplay); // 6 - map @@ -1250,12 +1250,12 @@ public void SQL_SubMenu_Callback(Database db, DBResultSet results, const char[] FormatEx(sDisplay, 128, "%T: %s", "WRDate", client, sDate); m.AddItem("-1", sDisplay); - int iStrafes = results.FetchInt(7); - float fSync = results.FetchFloat(8); + int strafes = results.FetchInt(7); + float sync = results.FetchFloat(8); - if(iJumps > 0 || iStrafes > 0) + if(jumps > 0 || strafes > 0) { - FormatEx(sDisplay, 128, (fSync != -1.0)? "%T: %d (%.02f%%)":"%T: %d", "WRStrafes", client, iStrafes, fSync); + FormatEx(sDisplay, 128, (sync != -1.0)? "%T: %d (%.02f%%)":"%T: %d", "WRStrafes", client, strafes, sync); m.AddItem("-1", sDisplay); } char[] sMenuItem = new char[64]; @@ -1462,7 +1462,7 @@ public void Shavit_OnFinish(int client, BhopStyle style, float time, int jumps, // 2 - update int overwrite = 0; - if(gA_StyleSettings[style][bUnranked]) + if(gA_StyleSettings[style][bUnranked] || Shavit_IsPracticeMode(client)) { overwrite = 0; // ugly way of not writing to database } diff --git a/scripting/shavit-zones.sp b/scripting/shavit-zones.sp index b940445a..b2ea2bd4 100644 --- a/scripting/shavit-zones.sp +++ b/scripting/shavit-zones.sp @@ -1127,13 +1127,6 @@ public Action OnPlayerRunCmd(int client, int &buttons) } } - // temp variables - static float fTime; - static int iJumps; - static BhopStyle bsStyle; - bool bStarted; - Shavit_GetTimer(client, fTime, iJumps, bsStyle, bStarted); - if(InsideZone(client, view_as(Zone_Start))) { Shavit_ResumeTimer(client); @@ -1149,7 +1142,7 @@ public Action OnPlayerRunCmd(int client, int &buttons) ForcePlayerSuicide(client); } - if(bStarted) + if(Shavit_GetTimerStatus(client) == Timer_Running) { if(InsideZone(client, view_as(Zone_Stop))) { diff --git a/translations/shavit-core.phrases.txt b/translations/shavit-core.phrases.txt index b30cf0e5..6302874f 100644 --- a/translations/shavit-core.phrases.txt +++ b/translations/shavit-core.phrases.txt @@ -59,6 +59,11 @@ "#format" "{1:s},{2:s}" "en" "{1}WARNING: {2}This style is unranked. Your times WILL NOT be saved and will be only displayed to you!" } + "PracticeModeAlert" + { + "#format" "{1:s},{2:s}" + "en" "{1}WARNING: {2}You're now in practice mode. Your times WILL NOT be saved and will be only displayed to you!" + } // ---------- Pauses ---------- // "MessagePause" { @@ -90,6 +95,11 @@ "#format" "{1:s},{2:s}" "en" "Timer has been {1}paused{2}." } + "PausePractice" + { + "#format" "{1:s},{2:s}" + "en" "You {1}are not{2} allowed to pause while in practice mode." + } // ---------- Zones ---------- // "StartZoneUndefined" { diff --git a/translations/shavit-hud.phrases.txt b/translations/shavit-hud.phrases.txt index 0aaa9007..8340d491 100644 --- a/translations/shavit-hud.phrases.txt +++ b/translations/shavit-hud.phrases.txt @@ -56,6 +56,10 @@ { "en" "Sync" } + "HudPracticeMode" + { + "en" "[PRACTICE]" + } // ---------- Menus ---------- // "HUDMenuTitle" { diff --git a/translations/shavit-misc.phrases.txt b/translations/shavit-misc.phrases.txt index 4589a143..6d691ee8 100644 --- a/translations/shavit-misc.phrases.txt +++ b/translations/shavit-misc.phrases.txt @@ -63,11 +63,6 @@ { "en" "Invalid target." } - "MiscCheckpointsStopped" - { - "#format" "{1:s},{2:s}" - "en" "Your timer has been {1}stopped{2} due to teleporting." - } "MiscCheckpointsSaved" { "#format" "{1:s},{2:s}" diff --git a/translations/shavit-rankings.phrases.txt b/translations/shavit-rankings.phrases.txt index 5fb425d0..cba5a936 100644 --- a/translations/shavit-rankings.phrases.txt +++ b/translations/shavit-rankings.phrases.txt @@ -39,33 +39,33 @@ // ---------- Points ---------- // "ApproximatePoints" { - "#format" "{1s},{2:s},{3s},{4s},{5:.01f},{6s},{7s},{8:i},{9:s}" + "#format" "{1:s},{2:s},{3:s},{4:s},{5:.01f},{6:s},{7:s},{8:i},{9:s}" "en" "{1}{2}{3}: Around {4}{5}{6} points for a time of {7}{8}{9}." } "Rank" { - "#format" "{1s},{2:N},{3s},{4s},{5:i},{6s},{7s},{8:i},{9s},{10s},{11:.02f},{12:s}" + "#format" "{1:s},{2:N},{3:s},{4:s},{5:i},{6:s},{7:s},{8:i},{9:s},{10:s},{11:.02f},{12:s}" "en" "{1}{2}{3} is ranked {4}{5}{6} out of {7}{8}{9} with {10}{11} points {12}." } "UnknownPoints" { - "#format" "{1s},{2:s},{3s}" + "#format" "{1:s},{2:s},{3:s}" "en" "{1}{2}{3}: Unknown points, no records on map." } "Unranked" { - "#format" "{1s},{2:N},{3s},{4s},{5s}" + "#format" "{1:s},{2:N},{3:s},{4:s},{5:s}" "en" "{1}{2}{3} is {4}unranked{5}." } // ---------- Tiers ---------- // "Tier" { - "#format" "{1s},{2:s},{3s},{4s},{5:.01f},{6s}" + "#format" "{1:s},{2:s},{3:s},{4:s},{5:.01f},{6:s}" "en" "{1}{2}{3} is rated as {4}Tier {5}{6}." } "TierUnset" { - "#format" "{1s},{2:s},{3s}" + "#format" "{1:s},{2:s},{3:s}" "en" "{1}{2}{3} is not rated." } }