Hitmarker: check for outputs

This commit is contained in:
neon 2019-10-27 02:29:01 +02:00
parent 09ce29cda8
commit 0cbb43502c

View File

@ -5,14 +5,18 @@
#include <clientprefs>
#include <multicolors>
#include <dhooks>
#include <outputinfo>
#pragma newdecls required
#pragma semicolon 1
#define SPECMODE_NONE 0
#define SPECMODE_FIRSTPERSON 4
#define SPECMODE_THIRDPERSON 5
#define SPECMODE_FREELOOK 6
#pragma newdecls required
#pragma semicolon 1
#define MAX_EDICTS 4096
bool g_bHasOutputs[MAX_EDICTS];
bool g_bShowBossHitmarker[MAXPLAYERS+1];
bool g_bShowZombieHitmarker[MAXPLAYERS+1];
@ -33,6 +37,8 @@ Handle g_hCookie_HitmarkerSound;
Handle g_hCookie_HitmarkerSoundVolume;
Handle g_hCookie_HitmarkerSkin;
ConVar g_hCVar_Debug;
bool g_bLate;
//----------------------------------------------------------------------------------------------------
@ -41,9 +47,9 @@ bool g_bLate;
public Plugin myinfo =
{
name = "Hitmarker",
author = "Neon & Nano",
author = "Neon",
description = "Players can enable or disable their hitmarkers while shooting zombies or bosses",
version = "3.0.1",
version = "3.1",
};
//----------------------------------------------------------------------------------------------------
@ -80,6 +86,9 @@ public void OnPluginStart()
g_hCookie_HitmarkerSoundVolume = RegClientCookie("hitmarker_sound_volume", "", CookieAccess_Private);
g_hCookie_HitmarkerSkin = RegClientCookie("hitmarker_skin", "", CookieAccess_Private);
g_hCVar_Debug = CreateConVar("sm_hitmarker_debug", "0", "", FCVAR_NONE, true, 0.0, true, 1.0);
AutoExecConfig();
RegConsoleCmd("sm_hm", OnHitmarkerSettings);
RegConsoleCmd("sm_hitmarker", OnHitmarkerSettings);
RegConsoleCmd("sm_bhm", OnToggleBossHitmarker);
@ -420,6 +429,18 @@ public int MenuHandler_MainMenu(Menu menu, MenuAction action, int client, int se
}
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnEntitySpawned(int Entity, const char[] sClassname)
{
int ent = EntRefToEntIndex(Entity);
if ((GetOutputCount(ent, "m_OnDamaged") > 0) || (GetOutputCount(ent, "m_OnHealthChanged") > 0))
g_bHasOutputs[ent] = true;
else
g_bHasOutputs[ent] = false;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
@ -450,14 +471,18 @@ public void OnBossDamaged(CBoss Boss, CConfig Config, int client, float damage)
//----------------------------------------------------------------------------------------------------
public MRESReturn Detour_OnTakeDamage(int entity, Handle hReturn, Handle hParams)
{
int iHealth = GetEntProp(entity, Prop_Data, "m_iHealth");
if (!iHealth)
return MRES_Ignored;
int client = DHookGetParamObjectPtrVar(hParams, 1, 3*(3*4) + 0, ObjectValueType_Ehandle);
//https://github.com/alliedmodders/hl2sdk/blob/css/game/shared/takedamageinfo.h#L115
//float dmg = DHookGetParamObjectPtrVar(hParams, 1, 48, ObjectValueType_Float);
//int ret = DHookGetReturn(hReturn);
int iHealth = GetEntProp(entity, Prop_Data, "m_iHealth");
int client = DHookGetParamObjectPtrVar(hParams, 1, 3*(3*4) + 0, ObjectValueType_Ehandle);
if (g_hCVar_Debug.BoolValue)
{
float dmg = DHookGetParamObjectPtrVar(hParams, 1, 48, ObjectValueType_Float);
PrintToChatAll("Detour_OnTakeDamage: ent: %d; client: %d; m_iHealth: %d; output: %d; dmg: %f", entity, client, iHealth, g_bHasOutputs[entity], dmg);
}
if (!iHealth && !g_bHasOutputs[entity])
return MRES_Ignored;
if (!IsValidClient(client))
return MRES_Ignored;