summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/gokz-racing/race.sp
diff options
context:
space:
mode:
authornavewindre <nw@moneybot.cc>2023-12-04 18:06:10 +0100
committernavewindre <nw@moneybot.cc>2023-12-04 18:06:10 +0100
commitaef0d1c1268ab7d4bc18996c9c6b4da16a40aadc (patch)
tree43e766b51704f4ab8b383583bdc1871eeeb9c698 /sourcemod/scripting/gokz-racing/race.sp
parent38f1140c11724da05a23a10385061200b907cf6e (diff)
bbbbbbbbwaaaaaaaaaaa
Diffstat (limited to 'sourcemod/scripting/gokz-racing/race.sp')
-rw-r--r--sourcemod/scripting/gokz-racing/race.sp221
1 files changed, 221 insertions, 0 deletions
diff --git a/sourcemod/scripting/gokz-racing/race.sp b/sourcemod/scripting/gokz-racing/race.sp
new file mode 100644
index 0000000..5ddc2a8
--- /dev/null
+++ b/sourcemod/scripting/gokz-racing/race.sp
@@ -0,0 +1,221 @@
+/*
+ Race info storing and accessing using a StringMap.
+ Each race is given a unique race ID when created.
+ See the RaceInfo enum for what information is accessible.
+ See the RaceStatus enum for possible race states.
+*/
+
+
+
+static StringMap raceInfo;
+static int lastRaceID;
+
+
+
+// =====[ GENERAL ]=====
+
+int GetRaceInfo(int raceID, RaceInfo prop)
+{
+ ArrayList info;
+ if (raceInfo.GetValue(IntToStringEx(raceID), info))
+ {
+ return info.Get(view_as<int>(prop));
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+static bool SetRaceInfo(int raceID, RaceInfo prop, int value)
+{
+ ArrayList info;
+ if (raceInfo.GetValue(IntToStringEx(raceID), info))
+ {
+ int oldValue = info.Get(view_as<int>(prop));
+ if (oldValue != value)
+ {
+ info.Set(view_as<int>(prop), value);
+ Call_OnRaceInfoChanged(raceID, prop, oldValue, value);
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+int IncrementFinishedRacerCount(int raceID)
+{
+ int finishedRacers = GetRaceInfo(raceID, RaceInfo_FinishedRacerCount) + 1;
+ SetRaceInfo(raceID, RaceInfo_FinishedRacerCount, finishedRacers);
+ return finishedRacers;
+}
+
+int GetRaceHost(int raceID)
+{
+ return GetClientOfUserId(GetRaceInfo(raceID, RaceInfo_HostUserID));
+}
+
+ArrayList GetUnfinishedRacers(int raceID)
+{
+ ArrayList racers = new ArrayList();
+ for (int i = 1; i <= MaxClients; i++)
+ {
+ if (GetRaceID(i) == raceID && !IsFinished(i))
+ {
+ racers.Push(i);
+ }
+ }
+ return racers;
+}
+
+int GetUnfinishedRacersCount(int raceID)
+{
+ ArrayList racers = GetUnfinishedRacers(raceID);
+ int count = racers.Length;
+ delete racers;
+ return count;
+}
+
+ArrayList GetAcceptedRacers(int raceID)
+{
+ ArrayList racers = new ArrayList();
+ for (int i = 1; i <= MaxClients; i++)
+ {
+ if (GetRaceID(i) == raceID && IsAccepted(i))
+ {
+ racers.Push(i);
+ }
+ }
+ return racers;
+}
+
+int GetAcceptedRacersCount(int raceID)
+{
+ ArrayList racers = GetAcceptedRacers(raceID);
+ int count = racers.Length;
+ delete racers;
+ return count;
+}
+
+
+
+// =====[ REGISTRATION ]=====
+
+int RegisterRace(int host, int type, int course, int mode, int checkpointRule, int cooldownRule)
+{
+ int raceID = ++lastRaceID;
+
+ ArrayList info = new ArrayList(1, view_as<int>(RACEINFO_COUNT));
+ info.Set(view_as<int>(RaceInfo_ID), raceID);
+ info.Set(view_as<int>(RaceInfo_Status), RaceStatus_Pending);
+ info.Set(view_as<int>(RaceInfo_HostUserID), GetClientUserId(host));
+ info.Set(view_as<int>(RaceInfo_FinishedRacerCount), 0);
+ info.Set(view_as<int>(RaceInfo_Type), type);
+ info.Set(view_as<int>(RaceInfo_Course), course);
+ info.Set(view_as<int>(RaceInfo_Mode), mode);
+ info.Set(view_as<int>(RaceInfo_CheckpointRule), checkpointRule);
+ info.Set(view_as<int>(RaceInfo_CooldownRule), cooldownRule);
+
+ raceInfo.SetValue(IntToStringEx(raceID), info);
+
+ Call_OnRaceRegistered(raceID);
+
+ return raceID;
+}
+
+static void UnregisterRace(int raceID)
+{
+ ArrayList info;
+ if (raceInfo.GetValue(IntToStringEx(raceID), info))
+ {
+ delete info;
+ raceInfo.Remove(IntToStringEx(raceID));
+ }
+}
+
+
+
+// =====[ START ]=====
+
+bool StartRace(int raceID)
+{
+ SetRaceInfo(raceID, RaceInfo_Status, RaceStatus_Countdown);
+
+ for (int client = 1; client <= MaxClients; client++)
+ {
+ if (GetRaceID(client) == raceID)
+ {
+ StartRacer(client);
+ GOKZ_PrintToChat(client, true, "%t", "Race Countdown Started");
+ }
+ }
+
+ CreateTimer(RC_COUNTDOWN_TIME, Timer_EndCountdown, raceID);
+
+ return true;
+}
+
+public Action Timer_EndCountdown(Handle timer, int raceID)
+{
+ SetRaceInfo(raceID, RaceInfo_Status, RaceStatus_Started);
+ return Plugin_Continue;
+}
+
+
+
+// =====[ ABORT ]=====
+
+bool AbortRace(int raceID)
+{
+ SetRaceInfo(raceID, RaceInfo_Status, RaceStatus_Aborting);
+
+ for (int client = 1; client <= MaxClients; client++)
+ {
+ if (GetRaceID(client) == raceID)
+ {
+ AbortRacer(client);
+ GOKZ_PrintToChat(client, true, "%t", "Race Has Been Aborted");
+ GOKZ_PlayErrorSound(client);
+ }
+ }
+
+ UnregisterRace(raceID);
+
+ return true;
+}
+
+
+
+// =====[ EVENTS ]=====
+
+void OnPluginStart_Race()
+{
+ raceInfo = new StringMap();
+}
+
+void OnFinish_Race(int raceID)
+{
+ if (GetUnfinishedRacersCount(raceID) == 0)
+ {
+ UnregisterRace(raceID);
+ }
+}
+
+void OnRequestAccepted_Race(int raceID)
+{
+ if (GetRaceInfo(raceID, RaceInfo_Type) == RaceType_Duel)
+ {
+ StartRace(raceID);
+ }
+}
+
+void OnRequestDeclined_Race(int raceID)
+{
+ if (GetRaceInfo(raceID, RaceInfo_Type) == RaceType_Duel)
+ {
+ AbortRace(raceID);
+ }
+} \ No newline at end of file