414 lines
14 KiB
SourcePawn
414 lines
14 KiB
SourcePawn
#include <sourcemod>
|
|
#include <sdktools>
|
|
#include <BossHP>
|
|
#include <zombiereloaded>
|
|
#include <clientprefs>
|
|
#include <multicolors>
|
|
|
|
#define SPECMODE_NONE 0
|
|
#define SPECMODE_FIRSTPERSON 4
|
|
#define SPECMODE_THIRDPERSON 5
|
|
#define SPECMODE_FREELOOK 6
|
|
|
|
#pragma newdecls required
|
|
#pragma semicolon 1
|
|
|
|
bool g_bShowBossHitmarker[MAXPLAYERS+1];
|
|
bool g_bShowZombieHitmarker[MAXPLAYERS+1];
|
|
bool g_bHitmarkerSound[MAXPLAYERS+1];
|
|
|
|
int g_iHitmarkerSoundVolume[MAXPLAYERS+1] = {100,...};
|
|
|
|
Handle g_hTimer[MAXPLAYERS+1] = {null,...};
|
|
|
|
Handle g_hCookie_ShowBossHitmarker;
|
|
Handle g_hCookie_ShowZombieHitmarker;
|
|
Handle g_hCookie_HitmarkerSound;
|
|
Handle g_hCookie_HitmarkerSoundVolume;
|
|
|
|
//Handle g_hHudText;
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Plugin myinfo =
|
|
{
|
|
name = "Htimarker",
|
|
author = "Neon & Nano",
|
|
description = "Players can enable or disable their hitmarkers while shooting zombies or bosses",
|
|
version = "1.0.0",
|
|
};
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnPluginStart()
|
|
{
|
|
g_hCookie_ShowBossHitmarker = RegClientCookie("hitmarker_boss", "", CookieAccess_Private);
|
|
g_hCookie_ShowZombieHitmarker = RegClientCookie("hitmarker_zombie", "", CookieAccess_Private);
|
|
g_hCookie_HitmarkerSound = RegClientCookie("hitmarker_sound", "", CookieAccess_Private);
|
|
g_hCookie_HitmarkerSoundVolume = RegClientCookie("hitmarker_sound_volume", "", CookieAccess_Private);
|
|
|
|
//g_hHudText = CreateHudSynchronizer();
|
|
|
|
RegConsoleCmd("sm_hm", OnHitmarkerSettings);
|
|
RegConsoleCmd("sm_hitmarker", OnHitmarkerSettings);
|
|
RegConsoleCmd("sm_bhm", OnToggleBossHitmarker);
|
|
RegConsoleCmd("sm_zhm", OnToggleZombieHitmarker);
|
|
RegConsoleCmd("sm_hmsound", OnToggleHitmarkerSound);
|
|
|
|
SetCookieMenuItem(MenuHandler_CookieMenu, 0, "Hitmarker");
|
|
|
|
HookEvent("player_hurt", OnClientHurt);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnMapStart()
|
|
{
|
|
PrecacheGeneric("overlays/nano/hitmarker.vtf", true);
|
|
PrecacheGeneric("overlays/nano/hitmarker.vmt", true);
|
|
AddFileToDownloadsTable("materials/overlays/nano/hitmarker.vtf");
|
|
AddFileToDownloadsTable("materials/overlays/nano/hitmarker.vmt");
|
|
|
|
PrecacheSound("unloze/hm_v2.mp3");
|
|
AddFileToDownloadsTable("sound/unloze/hm_v2.mp3");
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnClientCookiesCached(int client)
|
|
{
|
|
char sBuffer[4];
|
|
GetClientCookie(client, g_hCookie_ShowBossHitmarker, sBuffer, sizeof(sBuffer));
|
|
|
|
if (sBuffer[0])
|
|
g_bShowBossHitmarker[client] = true;
|
|
else
|
|
g_bShowBossHitmarker[client] = false;
|
|
|
|
GetClientCookie(client, g_hCookie_ShowZombieHitmarker, sBuffer, sizeof(sBuffer));
|
|
|
|
if (sBuffer[0])
|
|
g_bShowZombieHitmarker[client] = true;
|
|
else
|
|
g_bShowZombieHitmarker[client] = false;
|
|
|
|
GetClientCookie(client, g_hCookie_HitmarkerSound, sBuffer, sizeof(sBuffer));
|
|
|
|
if (sBuffer[0])
|
|
g_bHitmarkerSound[client] = true;
|
|
else
|
|
g_bHitmarkerSound[client] = false;
|
|
|
|
GetClientCookie(client, g_hCookie_HitmarkerSoundVolume, sBuffer, sizeof(sBuffer));
|
|
|
|
if (sBuffer[0])
|
|
g_iHitmarkerSoundVolume[client] = 100;
|
|
else
|
|
g_iHitmarkerSoundVolume[client] = StringToInt(sBuffer);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnClientDisconnect(int client)
|
|
{
|
|
g_bShowBossHitmarker[client] = false;
|
|
g_bShowZombieHitmarker[client] = false;
|
|
g_bHitmarkerSound[client] = false;
|
|
g_iHitmarkerSoundVolume[client] = 100;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action OnHitmarkerSettings(int client, int args)
|
|
{
|
|
ShowSettingsMenu(client);
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action OnToggleBossHitmarker(int client, int args)
|
|
{
|
|
ToggleBossHitmarker(client);
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void ToggleBossHitmarker(int client)
|
|
{
|
|
g_bShowBossHitmarker[client] = !g_bShowBossHitmarker[client];
|
|
SetClientCookie(client, g_hCookie_ShowBossHitmarker, g_bShowBossHitmarker[client] ? "1" : "");
|
|
|
|
CPrintToChat(client, "{cyan}[Hitmarker] {white}%s.", g_bShowBossHitmarker[client] ? "Boss Hitmarker Enabled" : "Boss Hitmarker Disabled");
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action OnToggleZombieHitmarker(int client, int args)
|
|
{
|
|
ToggleZombieHitmarker(client);
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void ToggleZombieHitmarker(int client)
|
|
{
|
|
g_bShowZombieHitmarker[client] = !g_bShowZombieHitmarker[client];
|
|
SetClientCookie(client, g_hCookie_ShowZombieHitmarker, g_bShowZombieHitmarker[client] ? "1" : "");
|
|
|
|
CPrintToChat(client, "{cyan}[Hitmarker] {white}%s.", g_bShowZombieHitmarker[client] ? "Zombie Hitmarker Enabled" : "Zombie Hitmarker Disabled");
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action OnToggleHitmarkerSound(int client, int args)
|
|
{
|
|
ToggleHitmarkerSound(client);
|
|
return Plugin_Handled;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void ToggleHitmarkerSound(int client)
|
|
{
|
|
g_bHitmarkerSound[client] = !g_bHitmarkerSound[client];
|
|
SetClientCookie(client, g_hCookie_HitmarkerSound, g_bHitmarkerSound[client] ? "1" : "");
|
|
|
|
CPrintToChat(client, "{cyan}[Hitmarker] {white}%s.", g_bHitmarkerSound[client] ? "Hitmarker Sound Enabled" : "Hitmarker Sound Disabled");
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void ToggleHitmarkerSoundVolume(int client)
|
|
{
|
|
g_iHitmarkerSoundVolume[client] += 25;
|
|
|
|
if(g_iHitmarkerSoundVolume[client] > 100)
|
|
g_iHitmarkerSoundVolume[client] = 25;
|
|
|
|
char sBuffer[16];
|
|
IntToString(g_iHitmarkerSoundVolume[client], sBuffer, sizeof(sBuffer));
|
|
|
|
SetClientCookie(client, g_hCookie_HitmarkerSoundVolume, sBuffer);
|
|
|
|
//CPrintToChat(client, "{cyan}[Hitmarker] {white}Hitmarker Sound Volume: %d\%", g_iHitmarkerSoundVolume[client]);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void ShowSettingsMenu(int client)
|
|
{
|
|
Menu menu = new Menu(MenuHandler_MainMenu);
|
|
|
|
menu.SetTitle("Hitmarker Settings", client);
|
|
|
|
char sBuffer[128];
|
|
|
|
Format(sBuffer, sizeof(sBuffer), "Boss Hitmarker: %s", g_bShowBossHitmarker[client] ? "Enabled" : "Disabled");
|
|
menu.AddItem("0", sBuffer);
|
|
|
|
Format(sBuffer, sizeof(sBuffer), "Zombie Hitmarker: %s", g_bShowZombieHitmarker[client] ? "Enabled" : "Disabled");
|
|
menu.AddItem("1", sBuffer);
|
|
|
|
Format(sBuffer, sizeof(sBuffer), "Hitmarker Sound: %s", g_bHitmarkerSound[client] ? "Enabled" : "Disabled");
|
|
menu.AddItem("2", sBuffer);
|
|
|
|
Format(sBuffer, sizeof(sBuffer), "Hitmarker Sound Volume: %d\%", g_iHitmarkerSoundVolume[client]);
|
|
menu.AddItem("3", sBuffer);
|
|
|
|
menu.ExitBackButton = true;
|
|
|
|
menu.Display(client, MENU_TIME_FOREVER);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void MenuHandler_CookieMenu(int client, CookieMenuAction action, any info, char[] buffer, int maxlen)
|
|
{
|
|
switch(action)
|
|
{
|
|
case(CookieMenuAction_DisplayOption):
|
|
{
|
|
Format(buffer, maxlen, "Hitmarker", client);
|
|
}
|
|
case(CookieMenuAction_SelectOption):
|
|
{
|
|
ShowSettingsMenu(client);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public int MenuHandler_MainMenu(Menu menu, MenuAction action, int client, int selection)
|
|
{
|
|
switch(action)
|
|
{
|
|
case(MenuAction_Select):
|
|
{
|
|
switch(selection)
|
|
{
|
|
case(0): ToggleBossHitmarker(client);
|
|
case(1): ToggleZombieHitmarker(client);
|
|
case(2): ToggleHitmarkerSound(client);
|
|
case(3): ToggleHitmarkerSoundVolume(client);
|
|
}
|
|
|
|
ShowSettingsMenu(client);
|
|
}
|
|
case(MenuAction_Cancel):
|
|
{
|
|
ShowCookieMenu(client);
|
|
}
|
|
case(MenuAction_End):
|
|
{
|
|
delete menu;
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnBossDamaged(CBoss Boss, CConfig Config, int client, float damage)
|
|
{
|
|
if (!IsValidClient(client))
|
|
return;
|
|
|
|
if (g_bShowBossHitmarker[client])
|
|
{
|
|
//SetHudTextParams(-1.0, -1.0, 0.3, 255, 0, 0, 255, 0, 0.0, 0.0, 0.0);
|
|
//ShowSyncHudText(client, g_hHudText, "∷");
|
|
ShowOverlay(client);
|
|
}
|
|
|
|
for (int spec = 1; spec <= MaxClients; spec++)
|
|
{
|
|
if (!IsClientInGame(spec) || !IsClientObserver(spec) || !g_bShowBossHitmarker[spec])
|
|
continue;
|
|
|
|
int specMode = GetClientSpectatorMode(spec);
|
|
int specTarget = GetClientSpectatorTarget(spec);
|
|
|
|
if ((specMode == SPECMODE_FIRSTPERSON) && specTarget == client)
|
|
{
|
|
//SetHudTextParams(-1.0, -1.0, 0.3, 255, 0, 0, 255, 0, 0.0, 0.0, 0.0);
|
|
//ShowSyncHudText(spec, g_hHudText, "∷");
|
|
ShowOverlay(spec);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void OnClientHurt(Event hEvent, const char[] sEvent, bool bDontBroadcast)
|
|
{
|
|
int client = GetClientOfUserId(hEvent.GetInt("attacker"));
|
|
int victim = GetClientOfUserId(hEvent.GetInt("userid"));
|
|
|
|
if (client < 1 || client > MaxClients || victim < 1 || victim > MaxClients)
|
|
return;
|
|
|
|
if (client == victim || (IsPlayerAlive(client) && ZR_IsClientZombie(client)))
|
|
return;
|
|
|
|
if (g_bShowZombieHitmarker[client])
|
|
{
|
|
//SetHudTextParams(-1.0, -1.0, 0.3, 255, 0, 0, 255, 0, 0.0, 0.0, 0.0);
|
|
//ShowSyncHudText(client, g_hHudText, "∷");
|
|
ShowOverlay(client);
|
|
}
|
|
|
|
for (int spec = 1; spec <= MaxClients; spec++)
|
|
{
|
|
if (!IsClientInGame(spec) || !IsClientObserver(spec) || !g_bShowZombieHitmarker[spec])
|
|
continue;
|
|
|
|
int specMode = GetClientSpectatorMode(spec);
|
|
int specTarget = GetClientSpectatorTarget(spec);
|
|
|
|
if (specMode == SPECMODE_FIRSTPERSON && specTarget == client)
|
|
{
|
|
//SetHudTextParams(-1.0, -1.0, 0.3, 255, 0, 0, 255, 0, 0.0, 0.0, 0.0);
|
|
//ShowSyncHudText(spec, g_hHudText, "∷");
|
|
ShowOverlay(spec);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public void ShowOverlay(int client)
|
|
{
|
|
if (g_bHitmarkerSound[client])
|
|
{
|
|
float fVolume = g_iHitmarkerSoundVolume[client] / 100.0;
|
|
EmitSoundToClient(client, "unloze/hm_v2.mp3", .volume=fVolume);
|
|
}
|
|
|
|
if (g_hTimer[client] != null)
|
|
{
|
|
delete g_hTimer[client];
|
|
g_hTimer[client] = null;
|
|
}
|
|
ClientCommand(client, "r_screenoverlay \"%s\"", "overlays/nano/hitmarker");
|
|
g_hTimer[client] = CreateTimer(0.3, ClearOverlay, client, TIMER_FLAG_NO_MAPCHANGE);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
public Action ClearOverlay(Handle timer, int client)
|
|
{
|
|
g_hTimer[client] = null;
|
|
ClientCommand(client, "r_screenoverlay \"\"");
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
stock int IsValidClient(int client, bool nobots = true)
|
|
{
|
|
if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client)))
|
|
return false;
|
|
|
|
return IsClientInGame(client);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
int GetClientSpectatorMode(int client)
|
|
{
|
|
return GetEntProp(client, Prop_Send, "m_iObserverMode");
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------
|
|
// Purpose:
|
|
//----------------------------------------------------------------------------------------------------
|
|
int GetClientSpectatorTarget(int client)
|
|
{
|
|
return GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
|
|
}
|