summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/gokz-spec.sp
diff options
context:
space:
mode:
Diffstat (limited to 'sourcemod/scripting/gokz-spec.sp')
-rw-r--r--sourcemod/scripting/gokz-spec.sp323
1 files changed, 0 insertions, 323 deletions
diff --git a/sourcemod/scripting/gokz-spec.sp b/sourcemod/scripting/gokz-spec.sp
deleted file mode 100644
index 29f842f..0000000
--- a/sourcemod/scripting/gokz-spec.sp
+++ /dev/null
@@ -1,323 +0,0 @@
-#include <sourcemod>
-
-#include <cstrike>
-
-#include <gokz/core>
-
-#undef REQUIRE_EXTENSIONS
-#undef REQUIRE_PLUGIN
-#include <updater>
-
-#pragma newdecls required
-#pragma semicolon 1
-
-
-
-public Plugin myinfo =
-{
- name = "GOKZ Spectate Menu",
- author = "DanZay",
- description = "Provides easy ways to spectate players",
- version = GOKZ_VERSION,
- url = GOKZ_SOURCE_URL
-};
-
-#define UPDATER_URL GOKZ_UPDATER_BASE_URL..."gokz-spec.txt"
-
-
-
-// =====[ PLUGIN EVENTS ]=====
-
-public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
-{
- RegPluginLibrary("gokz-spec");
- return APLRes_Success;
-}
-
-public void OnPluginStart()
-{
- LoadTranslations("common.phrases");
- LoadTranslations("gokz-common.phrases");
- LoadTranslations("gokz-spec.phrases");
-
- RegisterCommands();
-}
-
-public void OnAllPluginsLoaded()
-{
- if (LibraryExists("updater"))
- {
- Updater_AddPlugin(UPDATER_URL);
- }
-}
-
-public void OnLibraryAdded(const char[] name)
-{
- if (StrEqual(name, "updater"))
- {
- Updater_AddPlugin(UPDATER_URL);
- }
-}
-
-
-
-// =====[ SPEC MENU ]=====
-
-int DisplaySpecMenu(int client, bool useFilter = false, char[] filter = "")
-{
- Menu menu = new Menu(MenuHandler_Spec);
- menu.SetTitle("%T", "Spec Menu - Title", client);
- int menuItems = SpecMenuAddItems(client, menu, useFilter, filter);
- if (menuItems == 0 || menuItems == 1)
- {
- delete menu;
- }
- else
- {
- menu.Display(client, MENU_TIME_FOREVER);
- }
- return menuItems;
-}
-
-bool Spectate(int client)
-{
- if (!CanSpectate(client))
- {
- return false;
- }
-
- GOKZ_JoinTeam(client, CS_TEAM_SPECTATOR);
-
- // Put player in free look mode and apply according movetype
- SetEntProp(client, Prop_Send, "m_iObserverMode", 6);
- SetEntityMoveType(client, MOVETYPE_OBSERVER);
- return true;
-}
-
-// Returns whether change to spectating the target was successful
-bool SpectatePlayer(int client, int target, bool printMessage = true)
-{
- if (!CanSpectate(client))
- {
- return false;
- }
-
- if (target == client)
- {
- Spectate(client);
- return true;
- }
- else if (!IsPlayerAlive(target))
- {
- if (printMessage)
- {
- GOKZ_PrintToChat(client, true, "%t", "Spectate Failure (Dead)");
- GOKZ_PlayErrorSound(client);
- }
- return false;
- }
-
- GOKZ_JoinTeam(client, CS_TEAM_SPECTATOR);
- SetEntProp(client, Prop_Send, "m_iObserverMode", 4);
- SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", target);
-
- return true;
-}
-
-bool CanSpectate(int client)
-{
- return !IsPlayerAlive(client) || GOKZ_GetPaused(client) || GOKZ_GetCanPause(client);
-}
-
-public int MenuHandler_Spec(Menu menu, MenuAction action, int param1, int param2)
-{
- if (action == MenuAction_Select)
- {
- char info[16];
- menu.GetItem(param2, info, sizeof(info));
- int target = GetClientOfUserId(StringToInt(info));
-
- if (!IsValidClient(target))
- {
- GOKZ_PrintToChat(param1, true, "%t", "Player No Longer Valid");
- GOKZ_PlayErrorSound(param1);
- DisplaySpecMenu(param1);
- }
- else if (!SpectatePlayer(param1, target))
- {
- DisplaySpecMenu(param1);
- }
- }
- else if (action == MenuAction_End)
- {
- delete menu;
- }
- return 0;
-}
-
-// Returns number of items added to the menu
-int SpecMenuAddItems(int client, Menu menu, bool useFilter, char[] filter)
-{
- char display[MAX_NAME_LENGTH + 4];
- int targetCount = 0;
- int latestResult;
-
- for (int i = 1; i <= MaxClients; i++)
- {
- if (!IsClientInGame(i) || !IsPlayerAlive(i) || i == client)
- {
- continue;
- }
- if (useFilter)
- {
- FormatEx(display, sizeof(display), "%N", i);
- if (StrContains(display, filter, false) != -1)
- {
- if (IsFakeClient(i))
- {
- FormatEx(display, sizeof(display), "BOT %N", i);
- }
- }
- else // If it doesn't fit the filter, move on
- {
- continue;
- }
- }
- else
- {
- if (IsFakeClient(i))
- {
- FormatEx(display, sizeof(display), "BOT %N", i);
- }
- else
- {
- FormatEx(display, sizeof(display), "%N", i);
- }
- }
- latestResult = i;
- menu.AddItem(IntToStringEx(GetClientUserId(i)), display, ITEMDRAW_DEFAULT);
- targetCount++;
- }
- // The only spectate-able player is the latest result, this happens when the player issuing the command also fits in the filter
- if (targetCount == 1)
- {
- SpectatePlayer(client, latestResult);
- }
-
- return targetCount;
-}
-
-
-
-// =====[ COMMANDS ]=====
-
-void RegisterCommands()
-{
- RegConsoleCmd("sm_spec", CommandSpec, "[KZ] Spectate another player. Usage: !spec <player>");
- RegConsoleCmd("sm_specs", CommandSpecs, "[KZ] List currently spectating players in chat.");
- RegConsoleCmd("sm_speclist", CommandSpecs, "[KZ] List currently spectating players in chat.");
-}
-
-public Action CommandSpec(int client, int args)
-{
- // If no arguments, display the spec menu
- if (args < 1)
- {
- if (DisplaySpecMenu(client) == 0)
- {
- // No targets, so just join spec
- Spectate(client);
- }
- }
- // Otherwise try to spectate the player
- else
- {
- char specifiedPlayer[MAX_NAME_LENGTH];
- GetCmdArg(1, specifiedPlayer, sizeof(specifiedPlayer));
-
- char targetName[MAX_TARGET_LENGTH];
- int targetList[1], targetCount;
- bool tnIsML;
- int flags = COMMAND_FILTER_NO_MULTI | COMMAND_FILTER_NO_IMMUNITY | COMMAND_FILTER_ALIVE;
-
- if ((targetCount = ProcessTargetString(
- specifiedPlayer,
- client,
- targetList,
- 1,
- flags,
- targetName,
- sizeof(targetName),
- tnIsML)) == 1)
- {
- SpectatePlayer(client, targetList[0]);
- }
- else if (targetCount == COMMAND_TARGET_AMBIGUOUS)
- {
- DisplaySpecMenu(client, true, specifiedPlayer);
- }
- else
- {
- ReplyToTargetError(client, targetCount);
- }
-
- }
- return Plugin_Handled;
-}
-
-public Action CommandSpecs(int client, int args)
-{
- int specs = 0;
- char specNames[1024];
-
- int target = IsPlayerAlive(client) ? client : GetObserverTarget(client);
- int targetSpecs = 0;
- char targetSpecNames[1024];
-
- for (int i = 1; i <= MaxClients; i++)
- {
- if (IsClientInGame(i) && !IsFakeClient(i) && IsSpectating(i))
- {
- specs++;
- if (specs == 1)
- {
- FormatEx(specNames, sizeof(specNames), "{lime}%N", i);
- }
- else
- {
- Format(specNames, sizeof(specNames), "%s{grey}, {lime}%N", specNames, i);
- }
-
- if (target != -1 && GetObserverTarget(i) == target)
- {
- targetSpecs++;
- if (targetSpecs == 1)
- {
- FormatEx(targetSpecNames, sizeof(targetSpecNames), "{lime}%N", i);
- }
- else
- {
- Format(targetSpecNames, sizeof(targetSpecNames), "%s{grey}, {lime}%N", targetSpecNames, i);
- }
- }
- }
- }
-
- if (specs == 0)
- {
- GOKZ_PrintToChat(client, true, "%t", "Spectator List (None)");
- }
- else
- {
- GOKZ_PrintToChat(client, true, "%t", "Spectator List", specs, specNames);
- if (targetSpecs == 0)
- {
- GOKZ_PrintToChat(client, false, "%t", "Target Spectator List (None)", target);
- }
- else
- {
- GOKZ_PrintToChat(client, false, "%t", "Target Spectator List", target, targetSpecs, targetSpecNames);
- }
- }
- return Plugin_Handled;
-} \ No newline at end of file