Skip to content

Commit

Permalink
Reproduce stagger direction fix on SI
Browse files Browse the repository at this point in the history
Thanks to Alan on discord for suggesting and testing.
  • Loading branch information
jensewe committed Dec 5, 2024
1 parent 7ecc3a3 commit e9b2fb2
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 24 deletions.
116 changes: 116 additions & 0 deletions addons/sourcemod/gamedata/l4d_fix_stagger_dir.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,51 @@

"left4dead"
{
"Functions"
{
"CTerrorPlayer::OnShovedBySurvivor"
{
"linux"
{
"signature" "CTerrorPlayer::OnShovedBySurvivor [clone]"
"callconv" "cdecl"
}
"windows"
{
"signature" "CTerrorPlayer::OnShovedBySurvivor"
"callconv" "stdcall"
}
"return" "void"
"arguments"
{
"this"
{
"type" "cbaseentity"
"linux"
{
"register" "eax"
}
"windows"
{
"register" "ecx"
}
}
"a2"
{
"type" "cbaseentity"
"linux"
{
"register" "edx"
}
}
"a3"
{
"type" "vectorptr"
}
}
}
}

"Offsets"
{
"CTerrorPlayer::m_PlayerAnimState"
Expand Down Expand Up @@ -56,11 +101,69 @@
/* 83 ? ? ? 8B ? E8 ? ? ? ? 84 ? 0F 85 ? ? ? ? 8B ? 8B */
/* Search: "Player.Shoved" */
}

// Stolen from left4dhooks thanks to Silvers
/*
* CTerrorPlayer::OnShovedBySurvivor(CTerrorPlayer*, Vector const&)
*/
"CTerrorPlayer::OnShovedBySurvivor"
{
"library" "server"
"linux" "@_ZN13CTerrorPlayer18OnShovedBySurvivorEPS_RK6Vector"
"windows" "\x81\x2A\x2A\x2A\x2A\x2A\x56\x8B\x2A\xE8\x2A\x2A\x2A\x2A\x84\x2A\x0F\x85"
/* 81 ? ? ? ? ? 56 8B ? E8 ? ? ? ? 84 ? 0F 85 */
}

// Stolen from left4dhooks thanks to Silvers
/*
* CTerrorPlayer::OnShovedBySurvivor(CTerrorPlayer*, Vector const&) [clone]
*/
"CTerrorPlayer::OnShovedBySurvivor [clone]"
{
"library" "server"
"linux" "@_ZN13CTerrorPlayer18OnShovedBySurvivorEPS_RK6Vector.part.591"
}
}
}

"left4dead2"
{
"Functions"
{
"CTerrorPlayer::OnShovedBySurvivor"
{
"signature" "CTerrorPlayer::OnShovedBySurvivor"
"linux"
{
"callconv" "cdecl"
}
"windows"
{
"callconv" "stdcall"
}
"return" "void"
"arguments"
{
"this"
{
"type" "cbaseentity"
"windows"
{
"register" "ecx"
}
}
"a2"
{
"type" "cbaseentity"
}
"a3"
{
"type" "vectorptr"
}
}
}
}

"Offsets"
{
/* Windows offset:
Expand Down Expand Up @@ -104,6 +207,19 @@
* Using a long local jump as the unique portion (last few bytes of sig)
*/
}

// Stolen from left4dhooks thanks to Silvers
/*
* CTerrorPlayer::OnShovedBySurvivor(CTerrorPlayer*, Vector const&) - used by L4D2 on Special Infected (got melee'd)
* unique string "jockey_ride" in CTerrorPlayer::OnLeptOnSurvivor(), look up for "JockeyZombie.Ride", look up for var_14, CTerrorPlayer::OnShovedBySurvivor is call after that
*/
"CTerrorPlayer::OnShovedBySurvivor"
{
"library" "server"
"linux" "@_ZN13CTerrorPlayer18OnShovedBySurvivorEPS_RK6Vector"
"windows" "\x55\x8B\xEC\x81\xEC\x2A\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x33\xC5\x89\x45\xFC\x53\x8B\x5D\x2A\x56\x57\x8B\x7D\x2A\x8B\xF1"
/* 55 8B EC 81 EC ? ? ? ? A1 ? ? ? ? 33 C5 89 45 FC 53 8B 5D ? 56 57 8B 7D ? 8B F1 */
}
}
}
}
Binary file modified addons/sourcemod/plugins/fixes/l4d_fix_stagger_dir.smx
Binary file not shown.
89 changes: 65 additions & 24 deletions addons/sourcemod/scripting/l4d_fix_stagger_dir.sp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
#pragma newdecls required

#include <sourcemod>
#include <dhooks>
// #include <dhooks>
#include <left4dhooks>

#define PLUGIN_VERSION "1.0"
#define PLUGIN_VERSION "1.2"

public Plugin myinfo =
{
Expand All @@ -29,28 +30,29 @@ methodmap GameDataWrapper < GameData {
if (offset == -1) SetFailState("Missing offset \"%s\"", key);
return offset;
}
public DynamicDetour CreateDetourOrFail(
const char[] name,
DHookCallback preHook = INVALID_FUNCTION,
DHookCallback postHook = INVALID_FUNCTION) {
DynamicDetour hSetup = DynamicDetour.FromConf(this, name);
if (!hSetup)
SetFailState("Missing detour setup \"%s\"", name);
if (preHook != INVALID_FUNCTION && !hSetup.Enable(Hook_Pre, preHook))
SetFailState("Failed to pre-detour \"%s\"", name);
if (postHook != INVALID_FUNCTION && !hSetup.Enable(Hook_Post, postHook))
SetFailState("Failed to post-detour \"%s\"", name);
return hSetup;
}
// public DynamicDetour CreateDetourOrFail(
// const char[] name,
// DHookCallback preHook = INVALID_FUNCTION,
// DHookCallback postHook = INVALID_FUNCTION) {
// DynamicDetour hSetup = DynamicDetour.FromConf(this, name);
// if (!hSetup)
// SetFailState("Missing detour setup \"%s\"", name);
// if (preHook != INVALID_FUNCTION && !hSetup.Enable(Hook_Pre, preHook))
// SetFailState("Failed to pre-detour \"%s\"", name);
// if (postHook != INVALID_FUNCTION && !hSetup.Enable(Hook_Post, postHook))
// SetFailState("Failed to post-detour \"%s\"", name);
// return hSetup;
// }
}

int g_iOffs_m_PlayerAnimState;
int g_iOffs_m_flEyeYaw;

methodmap Address {}
methodmap PlayerAnimState < Address {
public static PlayerAnimState FromPlayer(int client) {
return view_as<PlayerAnimState>(GetEntData(client, g_iOffs_m_PlayerAnimState));
methodmap PlayerAnimStateEx < Address
{
public static PlayerAnimStateEx FromPlayer(int client) {
return view_as<PlayerAnimStateEx>(GetEntData(client, g_iOffs_m_PlayerAnimState));
}

property float m_flEyeYaw {
Expand All @@ -64,18 +66,57 @@ public void OnPluginStart()
g_iOffs_m_PlayerAnimState = gd.GetOffset("CTerrorPlayer::m_PlayerAnimState");
g_iOffs_m_flEyeYaw = gd.GetOffset("m_flEyeYaw");

delete gd.CreateDetourOrFail("CTerrorPlayer::OnStaggered", DTR_OnStaggered);
// https://github.com/Target5150/MoYu_Server_Stupid_Plugins/issues/70
// delete gd.CreateDetourOrFail("CTerrorPlayer::OnShovedBySurvivor", DTR_OnShovedBySurvivor);
// delete gd.CreateDetourOrFail("CTerrorPlayer::OnStaggered", DTR_OnStaggered);
delete gd;
}

MRESReturn DTR_OnStaggered(int client, DHookParam hParams)
public Action L4D_OnShovedBySurvivor(int client, int victim, const float vecDir[3])
{
if (IsClientInGame(victim))
{
float ang[3];
GetClientAbsAngles(victim, ang);
PlayerAnimStateEx.FromPlayer(victim).m_flEyeYaw = ang[1];
}

return Plugin_Continue;
}

public Action L4D2_OnStagger(int client, int source)
{
if (IsClientInGame(client) && GetClientTeam(client) == 2)
if (IsClientInGame(client))
{
float ang[3];
GetClientAbsAngles(client, ang);
PlayerAnimState.FromPlayer(client).m_flEyeYaw = ang[1];
PlayerAnimStateEx.FromPlayer(client).m_flEyeYaw = ang[1];
}

return MRES_Ignored;
}
return Plugin_Continue;
}

// MRESReturn DTR_OnShovedBySurvivor(DHookParam hParams)
// {
// int client = hParams.Get(1);
// if (IsClientInGame(client))
// {
// float ang[3];
// GetClientAbsAngles(client, ang);
// PlayerAnimStateEx.FromPlayer(client).m_flEyeYaw = ang[1];
// }

// return MRES_Ignored;
// }

// MRESReturn DTR_OnStaggered(int client, DHookParam hParams)
// {
// if (IsClientInGame(client))
// {
// float ang[3];
// GetClientAbsAngles(client, ang);
// PlayerAnimStateEx.FromPlayer(client).m_flEyeYaw = ang[1];
// }

// return MRES_Ignored;
// }

0 comments on commit e9b2fb2

Please sign in to comment.