Skip to content

Commit

Permalink
[charger_incap_damage] Update
Browse files Browse the repository at this point in the history
1) Removed unnecessary checks and code
2) Fixed the problem that the plugin does not work if z_charger_pound_dmg is not equal to 15
  • Loading branch information
A1mDev committed Nov 11, 2024
1 parent f832b72 commit 2bb9334
Showing 1 changed file with 91 additions and 70 deletions.
161 changes: 91 additions & 70 deletions addons/sourcemod/scripting/charger_incap_damage.sp
Original file line number Diff line number Diff line change
@@ -1,94 +1,115 @@
#pragma semicolon 1
#pragma newdecls required

#include <sourcemod>
#include <sdkhooks>

#define TEAM_SURVIVOR 2
#define TEAM_INFECTED 3
#define ZC_CHARGER 6
#define CHARGER_DMG_POUND 15.0
#define DEBUG 0

bool bLateLoad;
ConVar hDmgIncappedPound;
#define TEAM_SURVIVOR 2
#define TEAM_ZOMBIE 3

public Plugin myinfo =
{
name = "Incapped Charger Damage",
author = "Sir",
description = "Modify Charger pummel damage done to Survivors",
version = "1.0",
url = "https://github.com/SirPlease/L4D2-Competitive-Rework"
}
#define ZC_CHARGER 6

/* -------------------------------
* Init
* ------------------------------- */
bool
g_bLateLoad = false;

public APLRes AskPluginLoad2(Handle plugin, bool late, char[] error, int errMax)
ConVar
g_hCvarZChargerPoundDmg = null,
g_hCvarDmgIncappedPound = null;

public Plugin myinfo =
{
name = "Incapped Charger Damage",
author = "Sir, A1m`",
description = "Modify Charger pummel damage done to Survivors",
version = "2.1",
url = "https://github.com/SirPlease/L4D2-Competitive-Rework"
};

public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErrMax)
{
bLateLoad = late;
return APLRes_Success;
g_bLateLoad = bLate;
return APLRes_Success;
}

public void OnPluginStart()
{
// hook already existing clients if loading late
if (bLateLoad) {
for (int i = 1; i < MaxClients+1; i++) {
if (IsClientInGame(i)) {
SDKHook(i, SDKHook_OnTakeDamage, OnTakeDamage);
}
}
}
hDmgIncappedPound = CreateConVar("charger_dmg_incapped", "15.0", "Pound Damage dealt to incapped Survivors.");
}


/* -------------------------------
* General hooks / events
* ------------------------------- */
g_hCvarDmgIncappedPound = CreateConVar("charger_dmg_incapped", "-1.0", "Pound Damage dealt to incapped Survivors.");

public void OnClientPostAdminCheck(int client)
{
SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
g_hCvarZChargerPoundDmg = FindConVar("z_charger_pound_dmg");
LateLoadPlugin();
}

/* --------------------------------------
* GOT MY EYES ON YOU, DAMAGE
* -------------------------------------- */

Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3])
void LateLoadPlugin()
{
if (!inflictor || !attacker || !victim || !IsValidEdict(victim) || !IsValidEdict(inflictor)) { return Plugin_Continue; }

// only check player-to-player damage
if (!IsClientAndInGame(attacker) || !IsClientAndInGame(victim)) { return Plugin_Continue; }

// check teams
if (GetClientTeam(attacker) != TEAM_INFECTED || GetClientTeam(victim) != TEAM_SURVIVOR) { return Plugin_Continue; }

// only allow chargers
if (GetEntProp(attacker, Prop_Send, "m_zombieClass") != ZC_CHARGER) { return Plugin_Continue; }

if (damage == CHARGER_DMG_POUND && (damageForce[0] == 0.0 && damageForce[1] == 0.0 && damageForce[2] == 0.0))
{
// POUND
damage = IsIncapped(victim) ? GetConVarFloat(hDmgIncappedPound) : damage;
return Plugin_Changed;
}
return Plugin_Continue;
// hook already existing clients if loading late
if (!g_bLateLoad) {
return;
}

for (int i = 1; i <= MaxClients; i++) {
if (!IsClientInGame(i)) {
continue;
}

OnClientPutInServer(i);
}
}

/* --------------------------------------
* Shared function(s)
* -------------------------------------- */

bool IsClientAndInGame(int index)
public void OnClientPutInServer(int iClient)
{
return (index > 0 && index <= MaxClients && IsClientInGame(index));
SDKHook(iClient, SDKHook_OnTakeDamage, Hook_OnTakeDamage);
}

bool IsIncapped(int client)
/* @A1m`:
Pound damage:
- damageForce = 0 0 0
- Damage equal to convar 'z_charger_pound_dmg', def 15
- Game function: CTerrorPlayer::HandleAnimEvent
[Hook_OnTakeDamage] Victim: Ellis (4), attacker: A1m` (2), inflictor: player (2), damage: 15.000000, damagetype: 128
weapon: None (-1), damageForce: 0.000000 0.000000 0.000000, damagePosition: 0.000000 0.000000 0.000000
m_carryVictim: -1, m_pummelVictim: 4, m_isCharging: 0
[Hook_OnTakeDamage] Victim: (Nick) 5, attacker: (Noname`) 2, inflictor: 2, damage: 15.000000, damagetype: 128
[Hook_OnTakeDamage] Weapon: -1, damageforce: 0.000000 0.000000 0.000000, damageposition: 0.000000 0.000000 0.000000
*/
Action Hook_OnTakeDamage(int iVictim, int &iAttacker, int &iInflictor, float &fDamage, int &iDamagetype, \
int &iWeapon, float fDamageForce[3], float fDamagePosition[3])
{
return view_as<bool>(GetEntProp(client, Prop_Send, "m_isIncapacitated"));
}
if (iDamagetype != DMG_CLUB
|| fDamage != g_hCvarZChargerPoundDmg.FloatValue
|| g_hCvarDmgIncappedPound.FloatValue <= 0.0
) {
return Plugin_Continue;
}

if (GetClientTeam(iVictim) != TEAM_SURVIVOR
|| GetEntProp(iVictim, Prop_Send, "m_isIncapacitated", 1) < 1
) {
return Plugin_Continue;
}

if (iAttacker < 1 || iAttacker > MaxClients
|| GetClientTeam(iAttacker) != TEAM_ZOMBIE
|| GetEntProp(iAttacker, Prop_Send, "m_zombieClass") != ZC_CHARGER
) {
return Plugin_Continue;
}

int iPummelVictim = GetEntPropEnt(iAttacker, Prop_Send, "m_pummelVictim");
if (iPummelVictim != iVictim) {
return Plugin_Continue;
}

#if DEBUG
PrintToChatAll("[Hook_OnTakeDamage] Victim: (%N) %d, attacker: (%N) %d, inflictor: %d, damage: %f, damagetype: %d ", \
iVictim, iVictim, iAttacker, iAttacker, iInflictor, fDamage, iDamagetype);
PrintToChatAll("[Hook_OnTakeDamage] Weapon: %d, damageforce: %f %f %f, damageposition: %f %f %f", \
iWeapon, fDamageForce[0], fDamageForce[1], fDamageForce[2], fDamagePosition[0], fDamagePosition[1], fDamagePosition[2]);
#endif

fDamage = g_hCvarDmgIncappedPound.FloatValue;
return Plugin_Changed;
}

0 comments on commit 2bb9334

Please sign in to comment.