summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/gokz-hud.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-hud.sp
parent38f1140c11724da05a23a10385061200b907cf6e (diff)
bbbbbbbbwaaaaaaaaaaa
Diffstat (limited to 'sourcemod/scripting/gokz-hud.sp')
-rw-r--r--sourcemod/scripting/gokz-hud.sp334
1 files changed, 334 insertions, 0 deletions
diff --git a/sourcemod/scripting/gokz-hud.sp b/sourcemod/scripting/gokz-hud.sp
new file mode 100644
index 0000000..e9db12a
--- /dev/null
+++ b/sourcemod/scripting/gokz-hud.sp
@@ -0,0 +1,334 @@
+#include <sourcemod>
+
+#include <sdkhooks>
+#include <gokz/core>
+#include <gokz/hud>
+
+#undef REQUIRE_EXTENSIONS
+#undef REQUIRE_PLUGIN
+#include <gokz/racing>
+#include <gokz/replays>
+#include <updater>
+
+#include <gokz/kzplayer>
+
+#pragma newdecls required
+#pragma semicolon 1
+
+
+
+public Plugin myinfo =
+{
+ name = "GOKZ HUD",
+ author = "DanZay",
+ description = "Provides HUD and UI features",
+ version = GOKZ_VERSION,
+ url = GOKZ_SOURCE_URL
+};
+
+#define UPDATER_URL GOKZ_UPDATER_BASE_URL..."gokz-hud.txt"
+
+bool gB_GOKZRacing;
+bool gB_GOKZReplays;
+bool gB_MenuShowing[MAXPLAYERS + 1];
+int gI_ObserverTarget[MAXPLAYERS + 1];
+bool gB_JBTakeoff[MAXPLAYERS + 1];
+bool gB_FastUpdateRate[MAXPLAYERS + 1];
+int gI_DynamicMenu[MAXPLAYERS + 1];
+
+#include "gokz-hud/spectate_text.sp"
+#include "gokz-hud/commands.sp"
+#include "gokz-hud/hide_weapon.sp"
+#include "gokz-hud/info_panel.sp"
+#include "gokz-hud/menu.sp"
+#include "gokz-hud/options.sp"
+#include "gokz-hud/options_menu.sp"
+#include "gokz-hud/racing_text.sp"
+#include "gokz-hud/speed_text.sp"
+#include "gokz-hud/timer_text.sp"
+#include "gokz-hud/tp_menu.sp"
+#include "gokz-hud/natives.sp"
+
+// =====[ PLUGIN EVENTS ]=====
+
+public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
+{
+ CreateNatives();
+ RegPluginLibrary("gokz-hud");
+ return APLRes_Success;
+}
+
+public void OnPluginStart()
+{
+ LoadTranslations("gokz-common.phrases");
+ LoadTranslations("gokz-hud.phrases");
+
+ HookEvents();
+ RegisterCommands();
+
+ UpdateSpecList();
+ OnPluginStart_RacingText();
+ OnPluginStart_SpeedText();
+ OnPluginStart_TimerText();
+}
+
+public void OnPluginEnd()
+{
+ OnPluginEnd_Menu();
+}
+
+public void OnAllPluginsLoaded()
+{
+ if (LibraryExists("updater"))
+ {
+ Updater_AddPlugin(UPDATER_URL);
+ }
+
+ TopMenu topMenu;
+ if (LibraryExists("gokz-core") && ((topMenu = GOKZ_GetOptionsTopMenu()) != null))
+ {
+ GOKZ_OnOptionsMenuReady(topMenu);
+ }
+
+ gB_GOKZRacing = LibraryExists("gokz-racing");
+ gB_GOKZReplays = LibraryExists("gokz-replays");
+ for (int client = 1; client <= MaxClients; client++)
+ {
+ if (IsClientInGame(client))
+ {
+ OnClientPutInServer(client);
+ }
+ }
+}
+
+public void OnLibraryAdded(const char[] name)
+{
+ if (StrEqual(name, "updater"))
+ {
+ Updater_AddPlugin(UPDATER_URL);
+ }
+
+ gB_GOKZRacing = gB_GOKZRacing || StrEqual(name, "gokz-racing");
+ gB_GOKZReplays = gB_GOKZReplays || StrEqual(name, "gokz-replays");
+}
+
+public void OnLibraryRemoved(const char[] name)
+{
+ gB_GOKZRacing = gB_GOKZRacing && !StrEqual(name, "gokz-racing");
+ gB_GOKZReplays = gB_GOKZReplays && !StrEqual(name, "gokz-replays");
+}
+
+
+
+// =====[ CLIENT EVENTS ]=====
+
+public void OnClientDisconnect(int client)
+{
+ gI_ObserverTarget[client] = -1;
+}
+
+public void OnClientPutInServer(int client)
+{
+ SDKHook(client, SDKHook_PostThinkPost, OnPlayerPostThinkPost);
+}
+
+public void OnPlayerPostThinkPost(int client)
+{
+ KZPlayer player = KZPlayer(client);
+ gB_JBTakeoff[client] = (gB_JBTakeoff[client] && !player.OnGround && !player.OnLadder && !player.Noclipping) || Movement_GetJumpbugged(client);
+}
+
+public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype, int cmdnum, int tickcount, int seed, const int mouse[2])
+{
+ if (!IsValidClient(client))
+ {
+ return;
+ }
+
+ HUDInfo info;
+ KZPlayer player = KZPlayer(client);
+ KZPlayer targetPlayer = KZPlayer(player.ObserverTarget);
+
+ // Bots don't need to have their HUD drawn
+ if (player.Fake)
+ {
+ return;
+ }
+
+ if (player.Alive)
+ {
+ SetHUDInfo(player, info, cmdnum);
+ }
+ else if (targetPlayer.ID != -1 && !targetPlayer.Fake)
+ {
+ SetHUDInfo(targetPlayer, info, cmdnum);
+ }
+ else if (targetPlayer.ID != -1 && gB_GOKZReplays)
+ {
+ GOKZ_RP_GetPlaybackInfo(targetPlayer.ID, info);
+ }
+ else
+ {
+ return;
+ }
+
+ if (!IsValidClient(info.ID))
+ {
+ return;
+ }
+
+ OnPlayerRunCmdPost_InfoPanel(client, cmdnum, info);
+ OnPlayerRunCmdPost_RacingText(client, cmdnum);
+ OnPlayerRunCmdPost_SpeedText(client, cmdnum, info);
+ OnPlayerRunCmdPost_TimerText(client, cmdnum, info);
+ OnPlayerRunCmdPost_TPMenu(client, cmdnum, info);
+}
+
+public void OnPlayerSpawn(Event event, const char[] name, bool dontBroadcast) // player_spawn post hook
+{
+ int client = GetClientOfUserId(event.GetInt("userid"));
+ if (IsValidClient(client))
+ {
+ OnPlayerSpawn_HideWeapon(client);
+ OnPlayerSpawn_Menu(client);
+ }
+}
+
+public Action OnPlayerDeath(Event event, const char[] name, bool dontBroadcast) // player_death pre hook
+{
+ event.BroadcastDisabled = true; // Block death notices
+ return Plugin_Continue;
+}
+
+public void GOKZ_OnJoinTeam(int client, int team)
+{
+ OnJoinTeam_Menu(client);
+}
+
+public void GOKZ_OnTimerStart_Post(int client, int course)
+{
+ OnTimerStart_Menu(client);
+}
+
+public void GOKZ_OnTimerEnd_Post(int client, int course, float time, int teleportsUsed)
+{
+ OnTimerEnd_TimerText(client);
+ OnTimerEnd_Menu(client);
+}
+
+public void GOKZ_OnTimerStopped(int client)
+{
+ OnTimerStopped_TimerText(client);
+ OnTimerStopped_Menu(client);
+}
+
+public void GOKZ_OnPause_Post(int client)
+{
+ OnPause_Menu(client);
+}
+
+public void GOKZ_OnResume_Post(int client)
+{
+ OnResume_Menu(client);
+}
+
+public void GOKZ_OnMakeCheckpoint_Post(int client)
+{
+ OnMakeCheckpoint_Menu(client);
+}
+
+public void GOKZ_OnCountedTeleport_Post(int client)
+{
+ OnCountedTeleport_Menu(client);
+}
+
+public void GOKZ_OnStartPositionSet_Post(int client, StartPositionType type, const float origin[3], const float angles[3])
+{
+ OnStartPositionSet_Menu(client);
+}
+
+public void GOKZ_OnOptionChanged(int client, const char[] option, any newValue)
+{
+ any hudOption;
+ if (GOKZ_HUD_IsHUDOption(option, hudOption))
+ {
+ OnOptionChanged_SpeedText(client, hudOption);
+ OnOptionChanged_TimerText(client, hudOption);
+ OnOptionChanged_Menu(client, hudOption);
+ OnOptionChanged_HideWeapon(client, hudOption);
+ OnOptionChanged_Options(client, hudOption, newValue);
+ if (hudOption == HUDOption_UpdateRate)
+ {
+ gB_FastUpdateRate[client] = GOKZ_HUD_GetOption(client, HUDOption_UpdateRate) == UpdateRate_Fast;
+ }
+ else if (hudOption == HUDOption_DynamicMenu)
+ {
+ gI_DynamicMenu[client] = GOKZ_HUD_GetOption(client, HUDOption_DynamicMenu);
+ }
+ }
+}
+
+public void GOKZ_OnOptionsLoaded(int client)
+{
+ gB_FastUpdateRate[client] = GOKZ_HUD_GetOption(client, HUDOption_UpdateRate) == UpdateRate_Fast;
+ gI_DynamicMenu[client] = GOKZ_HUD_GetOption(client, HUDOption_DynamicMenu);
+}
+
+// =====[ OTHER EVENTS ]=====
+
+public void OnGameFrame()
+{
+ // Cache the spectator list every few ticks.
+ if (GetGameTickCount() % 4 == 0)
+ {
+ UpdateSpecList();
+ }
+}
+
+public void GOKZ_OnOptionsMenuCreated(TopMenu topMenu)
+{
+ OnOptionsMenuCreated_OptionsMenu(topMenu);
+}
+
+public void GOKZ_OnOptionsMenuReady(TopMenu topMenu)
+{
+ OnOptionsMenuReady_Options();
+ OnOptionsMenuReady_OptionsMenu(topMenu);
+}
+
+public void GOKZ_RC_OnRaceInfoChanged(int raceID, RaceInfo prop, int oldValue, int newValue)
+{
+ OnRaceInfoChanged_RacingText(raceID, prop, newValue);
+}
+
+
+
+// =====[ PRIVATE ]=====
+
+static void HookEvents()
+{
+ HookEvent("player_spawn", OnPlayerSpawn, EventHookMode_Post);
+ HookEvent("player_death", OnPlayerDeath, EventHookMode_Pre);
+}
+
+static void SetHUDInfo(KZPlayer player, HUDInfo info, int cmdnum)
+{
+ info.TimerRunning = player.TimerRunning;
+ info.TimeType = player.TimeType;
+ info.Time = player.Time;
+ info.Paused = player.Paused;
+ info.OnGround = player.OnGround;
+ info.OnLadder = player.OnLadder;
+ info.Noclipping = player.Noclipping;
+ info.Ducking = Movement_GetDucking(player.ID);
+ info.HitBhop = (Movement_GetJumped(player.ID) && Movement_GetTakeoffCmdNum(player.ID) == cmdnum) && Movement_GetTakeoffCmdNum(player.ID) - Movement_GetLandingCmdNum(player.ID) <= HUD_MAX_BHOP_GROUND_TICKS;
+ info.Speed = player.Speed;
+ info.ID = player.ID;
+ info.Jumped = player.Jumped;
+ info.HitPerf = player.GOKZHitPerf;
+ info.HitJB = gB_JBTakeoff[info.ID];
+ info.TakeoffSpeed = player.GOKZTakeoffSpeed;
+ info.IsTakeoff = Movement_GetTakeoffCmdNum(player.ID) == cmdnum;
+ info.Buttons = player.Buttons;
+ info.CurrentTeleport = player.TeleportCount;
+} \ No newline at end of file