From bb81b558acf7c2b32e7047e46c17e5c57fb44648 Mon Sep 17 00:00:00 2001 From: Michael Busby Date: Sun, 21 Aug 2022 14:49:36 -0500 Subject: [PATCH 1/2] Prototype: Override Shared Random Values --- .../scripting/l4d2_sharedrandom_overrides.smx | Bin 0 -> 4152 bytes .../scripting/l4d2_sharedrandom_overrides.sp | 131 ++++++++++++++++++ .../scripting/shared_random_funcs.txt | 63 +++++++++ 3 files changed, 194 insertions(+) create mode 100644 addons/sourcemod/scripting/l4d2_sharedrandom_overrides.smx create mode 100644 addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp create mode 100644 addons/sourcemod/scripting/shared_random_funcs.txt diff --git a/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.smx b/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.smx new file mode 100644 index 0000000000000000000000000000000000000000..36027073a07dac717b6e83a657d20b4b444775d3 GIT binary patch literal 4152 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 a4}Ip!#@!7K4f^y94b%;OGTM*fnEnq*^y5tc literal 0 HcmV?d00001 diff --git a/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp b/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp new file mode 100644 index 000000000..8f8f437e4 --- /dev/null +++ b/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp @@ -0,0 +1,131 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include + +#define PLUGIN_VERSION "0.1" + +public Plugin myinfo = +{ + name = "[L4D] Shared Random Overrides", + author = "ProdigySim", + description = "Hook and override calls to Shared Random values", + version = PLUGIN_VERSION, + url = "https://github.com/Target5150/MoYu_Server_Stupid_Plugins" +}; + +#define GAMEDATA_FILE "shared_random_funcs" + +StringMap g_hOverrideValues; + +/** +NAMES + +CLIENT: SharedRandomFloat( CTerrorGun::FireBullet HorizSpread 40966199 0 ) +CLIENT: SharedRandomFloat( CTerrorGun::FireBullet VertSpread -1207581035 0 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread -1772348738 2 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir -1613363080 2 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread 53268011 3 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir -782302255 3 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread 1604119874 4 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir -477022257 4 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread -890488361 5 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir -1390920602 5 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread -1374928343 6 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir 2122522781 6 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread 998020796 7 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir 805972788 7 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet Spread 392955131 8 ) +CLIENT: SharedRandomFloat( CTerrorPlayer::FireBullet SpreadDir 455035041 8 ) +CLIENT: SharedRandomInt( HorizKickDir -783437243 0 ) + + */ +public void OnPluginStart() +{ + Handle conf = LoadGameConfigFile(GAMEDATA_FILE); + if (!conf) + SetFailState("Missing gamedata \"" ... GAMEDATA_FILE... "\""); + + Handle hDetour = DHookCreateFromConf(conf, "SharedRandomFloat"); + if (!hDetour) + SetFailState("Missing detour setup \"SharedRandomFloat\""); + + if (!DHookEnableDetour(hDetour, false, SharedRandomFloat)) + SetFailState("Failed to enable detour \"SharedRandomFloat\""); + + if (!DHookEnableDetour(hDetour, true, SharedRandomFloatPost)) + SetFailState("Failed to detour post \"SharedRandomFloat\"."); + + delete conf; + + g_hOverrideValues = CreateTrie(); + + // Range: +/- CWeaponInfo data value + g_hOverrideValues.SetValue("CTerrorGun::FireBullet HorizSpread", 0.5); + + // Range: +/- CWeaponInfo data value + g_hOverrideValues.SetValue("CTerrorGun::FireBullet VertSpread", 0.5); + + // Range: +/- CWeaponInfo data value (probably spread/maxspread?) + g_hOverrideValues.SetValue("CTerrorPlayer::FireBullet Spread", 0.5); + // Range: 0.0 to 180.0 + g_hOverrideValues.SetValue("CTerrorPlayer::FireBullet SpreadDir", 0.5); +} + +// https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/shared/util_shared.h#L57-L68 +// This function is called when the server will consume a shared random value. +// We can override this value and not advance the RNG. +public MRESReturn SharedRandomFloat(Handle hReturn, Handle hParams) +{ + // Store the current random shared name + static char sharedname[128]; + DHookGetParamString(hParams, 1, sharedname, sizeof(sharedname)); + + float flMinVal = DHookGetParam(hParams, 2); + float flMaxVal = DHookGetParam(hParams, 3); + int additionalSeed = DHookGetParam(hParams, 4); + + float overrideValue = 0.0; + if (OverrideSharedRandom(sharedname, flMinVal, flMaxVal, additionalSeed, overrideValue)) + { + return MRES_Override; + } + return MRES_Ignored; +} + +public MRESReturn SharedRandomFloatPost(Handle hReturn, Handle hParams) +{ + // Store the current random shared name + static char sharedname[128]; + DHookGetParamString(hParams, 1, sharedname, sizeof(sharedname)); + + float flMinVal = DHookGetParam(hParams, 2); + float flMaxVal = DHookGetParam(hParams, 3); + int additionalSeed = DHookGetParam(hParams, 4); + + float randomValue = DHookGetReturn(hReturn); + LogMessage("SharedRandomfloat(%s, %f, %f, %d) = %f", sharedname, flMinVal, flMaxVal, additionalSeed, randomValue); + return MRES_Ignored; +} + +bool OverrideSharedRandom(const char[] sharedname, float flMinVal, float flMaxVal, int additionalSeed, float& overrideValue) +{ + LogMessage("SharedRandomfloat(%s, %f, %f, %d)", sharedname, flMinVal, flMaxVal, additionalSeed); + + if (g_hOverrideValues.ContainsKey(sharedname)) + { + // Override this value based on override settings. + // Uses a scalar "factor" to determine where in the requested range to return a value. + // e.g. + // factor 0.0 -> Returns min value. + // factor 1.0 -> Returns max value. + // factor 0.5 -> Returns a value halfway between min and max + float factor = 0.0; + g_hOverrideValues.GetValue(sharedname, factor); + overrideValue = flMinVal + ((flMaxVal - flMinVal) * factor); + return true; + } + // Don't override this value. + return false; +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/shared_random_funcs.txt b/addons/sourcemod/scripting/shared_random_funcs.txt new file mode 100644 index 000000000..2d4e0129d --- /dev/null +++ b/addons/sourcemod/scripting/shared_random_funcs.txt @@ -0,0 +1,63 @@ +"Games" +{ + "#default" + { + "Functions" + { + /** + https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/shared/util_shared.h#L57-L68 + **/ + "SharedRandomFloat" + { + "signature" "SharedRandomFloat" + "callconv" "cdecl" + "return" "float" + "arguments" + { + "sharedname" + { + "type" "charptr" + } + "flMinVal" + { + "type" "float" + } + "flMaxVal" + { + "type" "float" + } + "additionalSeed" + { + "type" "int" + } + } + } + } + } + + "left4dead" + { + "Signatures" + { + "SharedRandomFloat" + { + "library" "server" + "linux" "@_Z17SharedRandomFloatPKcffi" + "windows" "" + } + } + } + + "left4dead2" + { + "Signatures" + { + "SharedRandomFloat" + { + "library" "server" + "linux" "@_Z17SharedRandomFloatPKcffi" + "windows" "" + } + } + } +} \ No newline at end of file From d962973a360a34f7030b8cec36181c3023b9b716 Mon Sep 17 00:00:00 2001 From: Michael Busby Date: Sun, 21 Aug 2022 15:57:02 -0500 Subject: [PATCH 2/2] don't forget to override return value --- .../scripting/l4d2_sharedrandom_overrides.smx | Bin 4152 -> 4170 bytes .../scripting/l4d2_sharedrandom_overrides.sp | 1 + 2 files changed, 1 insertion(+) diff --git a/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.smx b/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.smx index 36027073a07dac717b6e83a657d20b4b444775d3..aabbf1ed4f0e8ae26b3faa68b07538be9cd24933 100644 GIT binary patch delta 3707 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 P+5@o8|IGw{M9=;|YjD|u delta 3689 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 Ihso#v5AhfVEC2ui diff --git a/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp b/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp index 8f8f437e4..1e624ba18 100644 --- a/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp +++ b/addons/sourcemod/scripting/l4d2_sharedrandom_overrides.sp @@ -89,6 +89,7 @@ public MRESReturn SharedRandomFloat(Handle hReturn, Handle hParams) float overrideValue = 0.0; if (OverrideSharedRandom(sharedname, flMinVal, flMaxVal, additionalSeed, overrideValue)) { + DHookSetReturn(hReturn, overrideValue); return MRES_Override; } return MRES_Ignored;