summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/gokz-localranks/misc.sp
diff options
context:
space:
mode:
Diffstat (limited to 'sourcemod/scripting/gokz-localranks/misc.sp')
-rw-r--r--sourcemod/scripting/gokz-localranks/misc.sp319
1 files changed, 319 insertions, 0 deletions
diff --git a/sourcemod/scripting/gokz-localranks/misc.sp b/sourcemod/scripting/gokz-localranks/misc.sp
new file mode 100644
index 0000000..0c6d96c
--- /dev/null
+++ b/sourcemod/scripting/gokz-localranks/misc.sp
@@ -0,0 +1,319 @@
+/*
+ Miscellaneous functions.
+*/
+
+
+
+// =====[ COMPLETION MVP STARS ]=====
+
+void CompletionMVPStarsUpdate(int client)
+{
+ DB_GetCompletion(client, GetSteamAccountID(client), GOKZ_GetDefaultMode(), false);
+}
+
+void CompletionMVPStarsUpdateAll()
+{
+ for (int client = 1; client <= MaxClients; client++)
+ {
+ if (IsClientInGame(client) && !IsFakeClient(client))
+ {
+ CompletionMVPStarsUpdate(client);
+ }
+ }
+}
+
+
+
+// =====[ ANNOUNCEMENTS ]=====
+
+void PrecacheAnnouncementSounds()
+{
+ if (!LoadSounds())
+ {
+ SetFailState("Failed to load file: \"%s\".", LR_CFG_SOUNDS);
+ }
+}
+
+static bool LoadSounds()
+{
+ KeyValues kv = new KeyValues("sounds");
+ if (!kv.ImportFromFile(LR_CFG_SOUNDS))
+ {
+ return false;
+ }
+
+ char downloadPath[256];
+
+ kv.GetString("beatrecord", gC_BeatRecordSound, sizeof(gC_BeatRecordSound));
+ FormatEx(downloadPath, sizeof(downloadPath), "sound/%s", gC_BeatRecordSound);
+ AddFileToDownloadsTable(downloadPath);
+ PrecacheSound(gC_BeatRecordSound, true);
+
+ delete kv;
+ return true;
+}
+
+static void PlayBeatRecordSound()
+{
+ GOKZ_EmitSoundToAll(gC_BeatRecordSound, _, "Server Record");
+}
+
+void AnnounceNewTime(
+ int client,
+ int course,
+ int mode,
+ float runTime,
+ int teleportsUsed,
+ bool firstTime,
+ float pbDiff,
+ int rank,
+ int maxRank,
+ bool firstTimePro,
+ float pbDiffPro,
+ int rankPro,
+ int maxRankPro)
+{
+ // Main Course
+ if (course == 0)
+ {
+ // Main Course PRO Times
+ if (teleportsUsed == 0)
+ {
+ if (firstTimePro)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Time - First Time (PRO)",
+ client, GOKZ_FormatTime(runTime), rankPro, maxRankPro, gC_ModeNamesShort[mode]);
+ }
+ else if (pbDiffPro < 0)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Time - Beat PB (PRO)",
+ client, GOKZ_FormatTime(runTime), GOKZ_FormatTime(FloatAbs(pbDiffPro)), rankPro, maxRankPro, gC_ModeNamesShort[mode]);
+ }
+ else
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Time - Miss PB (PRO)",
+ client, GOKZ_FormatTime(runTime), GOKZ_FormatTime(pbDiffPro), rankPro, maxRankPro, gC_ModeNamesShort[mode]);
+ }
+ }
+ // Main Course NUB Times
+ else
+ {
+ if (firstTime)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Time - First Time",
+ client, GOKZ_FormatTime(runTime), rank, maxRank, gC_ModeNamesShort[mode]);
+ }
+ else if (pbDiff < 0)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Time - Beat PB",
+ client, GOKZ_FormatTime(runTime), GOKZ_FormatTime(FloatAbs(pbDiff)), rank, maxRank, gC_ModeNamesShort[mode]);
+ }
+ else
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Time - Miss PB",
+ client, GOKZ_FormatTime(runTime), GOKZ_FormatTime(pbDiff), rank, maxRank, gC_ModeNamesShort[mode]);
+ }
+ }
+ }
+ // Bonus Course
+ else
+ {
+ // Bonus Course PRO Times
+ if (teleportsUsed == 0)
+ {
+ if (firstTimePro)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Time - First Time (PRO)",
+ client, course, GOKZ_FormatTime(runTime), rankPro, maxRankPro, gC_ModeNamesShort[mode]);
+ }
+ else if (pbDiffPro < 0)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Time - Beat PB (PRO)",
+ client, course, GOKZ_FormatTime(runTime), GOKZ_FormatTime(FloatAbs(pbDiffPro)), rankPro, maxRankPro, gC_ModeNamesShort[mode]);
+ }
+ else
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Time - Miss PB (PRO)",
+ client, course, GOKZ_FormatTime(runTime), GOKZ_FormatTime(pbDiffPro), rankPro, maxRankPro, gC_ModeNamesShort[mode]);
+ }
+ }
+ // Bonus Course NUB Times
+ else
+ {
+ if (firstTime)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Time - First Time",
+ client, course, GOKZ_FormatTime(runTime), rank, maxRank, gC_ModeNamesShort[mode]);
+ }
+ else if (pbDiff < 0)
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Time - Beat PB",
+ client, course, GOKZ_FormatTime(runTime), GOKZ_FormatTime(FloatAbs(pbDiff)), rank, maxRank, gC_ModeNamesShort[mode]);
+ }
+ else
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Time - Miss PB",
+ client, course, GOKZ_FormatTime(runTime), GOKZ_FormatTime(pbDiff), rank, maxRank, gC_ModeNamesShort[mode]);
+ }
+ }
+ }
+}
+
+void AnnounceNewRecord(int client, int course, int mode, int recordType)
+{
+ if (course == 0)
+ {
+ switch (recordType)
+ {
+ case RecordType_Nub:
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Record (NUB)", client, gC_ModeNamesShort[mode]);
+ }
+ case RecordType_Pro:
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Record (PRO)", client, gC_ModeNamesShort[mode]);
+ }
+ case RecordType_NubAndPro:
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Record (NUB and PRO)", client, gC_ModeNamesShort[mode]);
+ }
+ }
+ }
+ else
+ {
+ switch (recordType)
+ {
+ case RecordType_Nub:
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Record (NUB)", client, course, gC_ModeNamesShort[mode]);
+ }
+ case RecordType_Pro:
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Record (PRO)", client, course, gC_ModeNamesShort[mode]);
+ }
+ case RecordType_NubAndPro:
+ {
+ GOKZ_PrintToChatAll(true, "%t", "New Bonus Record (NUB and PRO)", client, course, course, gC_ModeNamesShort[mode]);
+ }
+ }
+ }
+
+ PlayBeatRecordSound(); // Play sound!
+}
+
+
+
+// =====[ MISSED RECORD TRACKING ]=====
+
+void ResetRecordMissed(int client)
+{
+ for (int timeType = 0; timeType < TIMETYPE_COUNT; timeType++)
+ {
+ gB_RecordMissed[client][timeType] = false;
+ }
+}
+
+void UpdateRecordMissed(int client)
+{
+ if (!GOKZ_GetTimerRunning(client) || gB_RecordMissed[client][TimeType_Nub] && gB_RecordMissed[client][TimeType_Pro])
+ {
+ return;
+ }
+
+ int course = GOKZ_GetCourse(client);
+ int mode = GOKZ_GetCoreOption(client, Option_Mode);
+ float currentTime = GOKZ_GetTime(client);
+
+ bool nubRecordExists = gB_RecordExistsCache[course][mode][TimeType_Nub];
+ float nubRecordTime = gF_RecordTimesCache[course][mode][TimeType_Nub];
+ bool nubRecordMissed = gB_RecordMissed[client][TimeType_Nub];
+ bool proRecordExists = gB_RecordExistsCache[course][mode][TimeType_Pro];
+ float proRecordTime = gF_RecordTimesCache[course][mode][TimeType_Pro];
+ bool proRecordMissed = gB_RecordMissed[client][TimeType_Pro];
+
+ if (nubRecordExists && !nubRecordMissed && currentTime >= nubRecordTime)
+ {
+ gB_RecordMissed[client][TimeType_Nub] = true;
+
+ // Check if nub record is also the pro record, and call the forward appropriately
+ if (proRecordExists && FloatAbs(nubRecordTime - proRecordTime) < EPSILON)
+ {
+ gB_RecordMissed[client][TimeType_Pro] = true;
+ Call_OnRecordMissed(client, nubRecordTime, course, mode, Style_Normal, RecordType_NubAndPro);
+ }
+ else
+ {
+ Call_OnRecordMissed(client, nubRecordTime, course, mode, Style_Normal, RecordType_Nub);
+ }
+ }
+ else if (proRecordExists && !proRecordMissed && currentTime >= proRecordTime)
+ {
+ gB_RecordMissed[client][TimeType_Pro] = true;
+ Call_OnRecordMissed(client, proRecordTime, course, mode, Style_Normal, RecordType_Pro);
+ }
+}
+
+
+
+// =====[ MISSED PB TRACKING ]=====
+
+#define MISSED_PB_SOUND "buttons/button18.wav"
+
+void ResetPBMissed(int client)
+{
+ for (int timeType = 0; timeType < TIMETYPE_COUNT; timeType++)
+ {
+ gB_PBMissed[client][timeType] = false;
+ }
+}
+
+void UpdatePBMissed(int client)
+{
+ if (!GOKZ_GetTimerRunning(client) || gB_PBMissed[client][TimeType_Nub] && gB_PBMissed[client][TimeType_Pro])
+ {
+ return;
+ }
+
+ int course = GOKZ_GetCourse(client);
+ int mode = GOKZ_GetCoreOption(client, Option_Mode);
+ float currentTime = GOKZ_GetTime(client);
+
+ bool nubPBExists = gB_PBExistsCache[client][course][mode][TimeType_Nub];
+ float nubPBTime = gF_PBTimesCache[client][course][mode][TimeType_Nub];
+ bool nubPBMissed = gB_PBMissed[client][TimeType_Nub];
+ bool proPBExists = gB_PBExistsCache[client][course][mode][TimeType_Pro];
+ float proPBTime = gF_PBTimesCache[client][course][mode][TimeType_Pro];
+ bool proPBMissed = gB_PBMissed[client][TimeType_Pro];
+
+ if (nubPBExists && !nubPBMissed && currentTime >= nubPBTime)
+ {
+ gB_PBMissed[client][TimeType_Nub] = true;
+
+ // Check if nub PB is also the pro PB, and call the forward appropriately
+ if (proPBExists && FloatAbs(nubPBTime - proPBTime) < EPSILON)
+ {
+ gB_PBMissed[client][TimeType_Pro] = true;
+ Call_OnPBMissed(client, nubPBTime, course, mode, Style_Normal, RecordType_NubAndPro);
+ }
+ else
+ {
+ Call_OnPBMissed(client, nubPBTime, course, mode, Style_Normal, RecordType_Nub);
+ }
+ }
+ else if (proPBExists && !proPBMissed && currentTime >= proPBTime)
+ {
+ gB_PBMissed[client][TimeType_Pro] = true;
+ Call_OnPBMissed(client, proPBTime, course, mode, Style_Normal, RecordType_Pro);
+ }
+}
+
+void DoPBMissedReport(int client, float pbTime, int recordType)
+{
+ switch (recordType)
+ {
+ case RecordType_Nub:GOKZ_PrintToChat(client, true, "%t", "Missed PB (NUB)", GOKZ_FormatTime(pbTime));
+ case RecordType_Pro:GOKZ_PrintToChat(client, true, "%t", "Missed PB (PRO)", GOKZ_FormatTime(pbTime));
+ case RecordType_NubAndPro:GOKZ_PrintToChat(client, true, "%t", "Missed PB (NUB and PRO)", GOKZ_FormatTime(pbTime));
+ }
+ GOKZ_EmitSoundToClient(client, MISSED_PB_SOUND, _, "Missed PB");
+} \ No newline at end of file