Implement snapshots for checkpoints/TAS. #313 #158

This commit is contained in:
shavitush 2017-06-17 09:34:46 +03:00
parent a099fc7600
commit d429dd0a78
11 changed files with 268 additions and 110 deletions

View File

@ -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");

View File

@ -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<bool>(GetNativeCell(2));
bool alert = view_as<bool>(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<int>(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<bool>(snapshot[bTimerEnabled]);
gF_PauseStartTime[client] = view_as<float>(snapshot[fPauseStartTime]);
gF_PauseTotalTime[client] = view_as<float>(snapshot[fPauseTotalTime]);
gB_ClientPaused[client] = false; // Pausing is disabled in practice mode.
gI_Jumps[client] = view_as<int>(snapshot[iJumps]);
gBS_Style[client] = view_as<BhopStyle>(snapshot[bsStyle]);
gI_Strafes[client] = view_as<int>(snapshot[iStrafes]);
gI_TotalMeasures[client] = view_as<int>(snapshot[iTotalMeasures]);
gI_GoodGains[client] = view_as<int>(snapshot[iGoodGains]);
gF_StartTime[client] = GetEngineTime() - view_as<float>(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<BhopStyle>(0);
gB_PracticeMode[client] = false;
UpdateAutoBhop(client);
if(AreClientCookiesCached(client))

View File

@ -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, "<font size=\"18\" face=\"Stratum2\">");
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</font>", "HudPaused", client);
char[] sUnpausedItem = new char[64];
FormatEx(sUnpausedItem, 64, "%s</font> (%d)\t", sTime, iPotentialRank);
FormatEx(sUnpausedItem, 64, "%s</font> (%d)\t", sTime, rank);
Format(sHintText, 512, "%s%T: <font color='#%s'>%s", sHintText, "HudTimeText", client, sColor, (tStatus == Timer_Paused)? sPauseItem:sUnpausedItem);
Format(sHintText, 512, "%s%T: <font color='#%s'>%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: <font color='#%s'>%s</font>", 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: <font color='#%s'>%s</font>", 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<BhopStyle>(0);
BhopStyle style = view_as<BhopStyle>(0);
for(int i = 0; i < gI_Styles; i++)
{
if(Shavit_GetReplayBotIndex(view_as<BhopStyle>(i)) == target)
{
bsStyle = view_as<BhopStyle>(i);
style = view_as<BhopStyle>(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, "<font face='Stratum2'>");
Format(sHintText, 512, "%s\t<u><font color='#%s'>%s %T</font></u>", sHintText, gS_StyleStrings[bsStyle][sHTMLColor], gS_StyleStrings[bsStyle][sStyleName], "ReplayText", client);
Format(sHintText, 512, "%s\t<u><font color='#%s'>%s %T</font></u>", sHintText, gS_StyleStrings[style][sHTMLColor], gS_StyleStrings[style][sStyleName], "ReplayText", client);
Format(sHintText, 512, "%s\n\t%T: <font color='#00FF00'>%s</font> / %s", sHintText, "HudTimeText", client, sTime, sWR);
Format(sHintText, 512, "%s\n\t%T: %d", sHintText, "HudSpeedText", client, iSpeed);
Format(sHintText, 512, "%s</font>", 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);
}

View File

@ -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<BhopStyle>(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,

View File

@ -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<BhopStyle>(results.FetchInt(3));
FormatEx(sDisplay, 128, "%T: %s", "Style", client, gS_StyleStrings[bsStyle][sStyleName]);
BhopStyle style = view_as<BhopStyle>(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);
}

View File

@ -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<BhopStyle>(results.FetchInt(5));
int jumps = results.FetchInt(4);
BhopStyle style = view_as<BhopStyle>(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<BhopStyle>(results.FetchInt(3));
FormatEx(sDisplay, 128, "%T: %s", "WRStyle", client, gS_StyleStrings[bsStyle][sStyleName]);
BhopStyle style = view_as<BhopStyle>(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
}

View File

@ -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<int>(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<int>(Zone_Stop)))
{

View File

@ -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"
{

View File

@ -56,6 +56,10 @@
{
"en" "Sync"
}
"HudPracticeMode"
{
"en" "[PRACTICE]"
}
// ---------- Menus ---------- //
"HUDMenuTitle"
{

View File

@ -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}"

View File

@ -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."
}
}