From 8fe042b23b990884546e577d0640bd67f886e404 Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:26:13 +0800 Subject: [PATCH 1/6] Add plugin files --- .../gamedata/l4d2_uncommon_adjustment.txt | 71 +++ .../optional/l4d2_uncommon_adjustment.smx | Bin 0 -> 14800 bytes .../scripting/l4d2_uncommon_adjustment.sp | 463 ++++++++++++++++++ 3 files changed, 534 insertions(+) create mode 100644 addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt create mode 100644 addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx create mode 100644 addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp diff --git a/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt b/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt new file mode 100644 index 000000000..f9d48a3d2 --- /dev/null +++ b/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt @@ -0,0 +1,71 @@ +"Games" +{ + "left4dead2" + { + "Functions" + { + "InfectedAttack::OnPunch" + { + "signature" "InfectedAttack::OnPunch" + "callconv" "thiscall" + "return" "void" + "this" "address" + "arguments" + { + "Infected *" + { + "type" "cbaseentity" + } + "CBaseEntity *" + { + "type" "cbaseentity" + } + } + } + + "CTerrorPlayer::QueueScreenBloodSplatter" + { + "signature" "CTerrorPlayer::QueueScreenBloodSplatter" + "callconv" "thiscall" + "return" "void" + "this" "entity" + "arguments" + { + "int" + { + "type" "int" + } + "float" + { + "type" "float" + } + "CTerrorPlayer::SplatterType_t" + { + "type" "int" + } + } + } + } + + "Signatures" + { + // Search convar "z_attack_infected_it_damage" + "InfectedAttack::OnPunch" + { + "library" "server" + "linux" "@_ZN14InfectedAttack7OnPunchEP8InfectedP11CBaseEntity" + "windows" "\x55\x8B\xEC\x81\xEC\x64\x01\x00\x00\xA1" + /* 55 8B EC 81 EC 64 01 00 00 A1 */ + } + + // Search convar "z_splatterdistance" + "CTerrorPlayer::QueueScreenBloodSplatter" + { + "library" "server" + "linux" "@_ZN13CTerrorPlayer24QueueScreenBloodSplatterEifNS_14SplatterType_tE" + "windows" "\x55\x8B\xEC\xA1\x2A\x2A\x2A\x2A\xF3\x0F\x10\x40\x2C\x0F\x2F\x45\x0C" + /* 55 8B EC A1 ? ? ? ? F3 0F 10 40 2C 0F 2F 45 0C */ + } + } + } +} \ No newline at end of file diff --git a/addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx b/addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx new file mode 100644 index 0000000000000000000000000000000000000000..917195823c7b682c26c4e4046cd27d0459503a78 GIT binary patch literal 14800 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 aYZ7Gt0n=fFdatm-b%Onc2%W-;?Ee6r9^N+q literal 0 HcmV?d00001 diff --git a/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp b/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp new file mode 100644 index 000000000..9dabf1e95 --- /dev/null +++ b/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp @@ -0,0 +1,463 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include +#include +#include +#include + +#define PLUGIN_VERSION "3.0" + +public Plugin myinfo = +{ + name = "[L4D2] Uncommon Adjustment", + author = "Forgetest", + description = "Custom adjustments to uncommon infected.", + version = PLUGIN_VERSION, + url = "https://github.com/Target5150/MoYu_Server_Stupid_Plugins" +}; + +methodmap GameDataWrapper < GameData { + public GameDataWrapper(const char[] file) { + GameData gd = new GameData(file); + if (!gd) SetFailState("Missing gamedata \"%s\"", file); + return view_as(gd); + } + 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; + } +} + +enum +{ + INFECTED_FLAG_RESERVED_WANDERER = 0x1, + INFECTED_FLAG_FIRE_IMMUNE = 0x2, // CEDA + INFECTED_FLAG_CRAWL_RUN = 0x4, // mudman + INFECTED_FLAG_UNDISTRACTABLE = 0x8, // workman + INFECTED_FLAG_FALLEN_SURVIVOR = 0x10, + INFECTED_FLAG_RIOTCOP_ARMOR = 0x20, + INFECTED_FLAG_ALLOW_AMBUSH = 0x40, // Removed after first shoved + INFECTED_FLAG_AMBIENT_MOB = 0x80, + + INFECTED_FLAG_NO_ATTRACT = 0x100, // Do not create "info_goal_infected_chase" + INFECTED_FLAG_WITCH_BLOCK_CLIMB = 0x200, // Block climbing when wandering around + INFECTED_FLAG_FALLEN_FLEE = 0x400, + INFECTED_FLAG_HEADSHOT_ONLY = 0x800, // "cm_HeadshotOnly" + + INFECTED_FLAG_CANT_SEE_SURVIVORS = 0x2000, + INFECTED_FLAG_CANT_HEAR_SURVIVORS = 0x4000, + INFECTED_FLAG_CANT_FEEL_SURVIVORS = 0x8000, +}; + +ConVar z_health; + +int g_iUncommonAttract; +int g_iRoadworkerSense; +int g_iJimmySense; +float g_flHealthScale; +float g_flJimmyHealthScale; +int g_iFallenEquipments; +bool g_bRiotcopArmor; +bool g_bMudmanCrouch; +bool g_bMudmanSplatter; +bool g_bJimmySplatter; + +int g_iOffs_m_nInfectedFlags; + +public void OnPluginStart() +{ + GameDataWrapper gd = new GameDataWrapper("l4d2_uncommon_adjustment"); + delete gd.CreateDetourOrFail("InfectedAttack::OnPunch", DTR_OnPunch, DTR_OnPunch_Post); + delete gd.CreateDetourOrFail("CTerrorPlayer::QueueScreenBloodSplatter", DTR_QueueScreenBloodSplatter); + delete gd; + + z_health = FindConVar("z_health"); + + CreateConVarHook("l4d2_uncommon_attract", + "3", + "Set whether clowns and Jimmy gibbs Jr. can attract zombies.\n" + ... "0 = Neither, 1 = Clowns, 2 = Jimmy gibs Jr., 3 = Both", + FCVAR_NONE, + true, 0.0, true, 3.0, + UncommonAttract_ConVarChanged); + + CreateConVarHook("l4d2_roadworker_sense_flag", + "0", + "Set whether road workers can hear and/or smell, so they will react to certain attractions.\n" + ... "0 = Neither, 1 = Hear (pipe bombs, clowns), 2 = Smell (vomit jars), 3 = Both", + FCVAR_NONE, + true, 0.0, true, 3.0, + RoadworkerSense_ConVarChanged); + + CreateConVarHook("l4d2_jimmy_sense_flag", + "0", + "Set whether Jimmy gibbs Jr. can hear and/or smell, so they will react to certain attractions.\n" + ... "0 = Neither, 1 = Hear (pipe bombs, clowns), 2 = Smell (vomit jars), 3 = Both", + FCVAR_NONE, + true, 0.0, true, 3.0, + JimmySense_ConVarChanged); + + CreateConVarHook("l4d2_uncommon_health_multiplier", + "3.0", + "How many the uncommon health is scaled by.\n" + ... "Doesn't apply to Jimmy gibs Jr., fallen survivors and Riot Cops.", + FCVAR_NONE, + true, 0.0, false, 0.0, + UncommonHealthScale_ConVarChanged); + + CreateConVarHook("l4d2_jimmy_health_multiplier", + "20.0", + "How many the health of Jimmy gibbs Jr. is scaled by.", + FCVAR_NONE, + true, 0.0, false, 0.0, + JimmyHealthScale_ConVarChanged); + + CreateConVarHook("l4d2_fallen_equipments", + "15", + "Set what items a fallen survivor can equip.\n" + ... "1 = Molotov, 2 = Pipebomb, 4 = Pills, 8 = Medkit, 15 = All, 0 = Nothing", + FCVAR_NONE, + true, 0.0, true, 15.0, + FallenEquipments_ConVarChanged); + + CreateConVarHook("l4d2_riotcop_armor", + "1", + "Set whether riotcop has armor that prevents damages in front.", + FCVAR_NONE, + true, 0.0, true, 1.0, + RiotcopArmor_ConVarChanged); + + CreateConVarHook("l4d2_mudman_crouch_run", + "1", + "Set whether mudman can crouch while running.", + FCVAR_NONE, + true, 0.0, true, 1.0, + MudmanCrouch_ConVarChanged); + + CreateConVarHook("l4d2_mudman_screen_splatter", + "1", + "Set whether mudman can blind your screen.", + FCVAR_NONE, + true, 0.0, true, 1.0, + MudmanSplatter_ConVarChanged); + + CreateConVarHook("l4d2_jimmy_screen_splatter", + "1", + "Set whether Jimmy gibbs Jr. can blind your screen.", + FCVAR_NONE, + true, 0.0, true, 1.0, + JimmySplatter_ConVarChanged); + + g_iOffs_m_nInfectedFlags = FindSendPropInfo("Infected", "m_nFallenFlags") - 4; +} + +void UncommonAttract_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_iUncommonAttract = convar.IntValue; +} + +void RoadworkerSense_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_iRoadworkerSense = convar.IntValue; +} + +void JimmySense_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_iJimmySense = convar.IntValue; +} + +void UncommonHealthScale_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_flHealthScale = convar.FloatValue; +} + +void JimmyHealthScale_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_flJimmyHealthScale = convar.FloatValue; +} + +void FallenEquipments_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_iFallenEquipments = convar.IntValue; +} + +void RiotcopArmor_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_bRiotcopArmor = convar.BoolValue; +} + +void MudmanCrouch_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_bMudmanCrouch = convar.BoolValue; +} + +void MudmanSplatter_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_bMudmanSplatter = convar.BoolValue; +} + +void JimmySplatter_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_bJimmySplatter = convar.BoolValue; +} + +public void OnEntityCreated(int entity, const char[] classname) +{ + if (classname[0] == 'i') + { + if (strcmp(classname, "infected") == 0) + { + SDKHook(entity, SDKHook_SpawnPost, SDK_OnSpawn_Post); + } + else if (strcmp(classname, "info_goal_infected_chase") == 0) + { + SDKHook(entity, SDKHook_Think, SDK_OnThink_Once); + } + } +} + +Action SDK_OnThink_Once(int entity) +{ + SDKUnhook(entity, SDKHook_Think, SDK_OnThink_Once); + return __OnThink(entity); +} + +Action __OnThink(int entity) +{ + int parent = GetEntPropEnt(entity, Prop_Data, "m_pParent"); + if (!IsValidEntity(parent)) + return Plugin_Continue; + + bool bDisableAttraction = false; + switch (GetGender(parent)) + { + case L4D2Gender_Clown: + { + bDisableAttraction = (g_iUncommonAttract & 1) == 0; + } + case L4D2Gender_Jimmy: + { + bDisableAttraction = (g_iUncommonAttract & 2) == 0; + } + } + + if (bDisableAttraction) + { + AcceptEntityInput(entity, "Disable"); + return Plugin_Handled; + } + + return Plugin_Continue; +} + +void SDK_OnSpawn_Post(int entity) +{ + if (!IsValidEdict(entity)) + return; + + int gender = GetGender(entity); + if (gender < L4D2Gender_Ceda || gender > L4D2Gender_Jimmy) + return; + + switch (gender) + { + case L4D2Gender_Fallen: + { + int flags = GetEntProp(entity, Prop_Send, "m_nFallenFlags"); + SetEntProp(entity, Prop_Send, "m_nFallenFlags", flags & g_iFallenEquipments); + } + case L4D2Gender_Crawler: + { + if (!g_bMudmanCrouch) + RemoveInfectedFlags(entity, INFECTED_FLAG_CRAWL_RUN); + } + case L4D2Gender_Riot_Control: + { + if (!g_bRiotcopArmor) + RemoveInfectedFlags(entity, INFECTED_FLAG_RIOTCOP_ARMOR); + } + case L4D2Gender_Jimmy: + { + int iHealth = RoundToFloor(z_health.FloatValue * g_flJimmyHealthScale); // classic cast to int + ResetEntityHealth(entity, iHealth); + } + default: + { + int iHealth = RoundToFloor(z_health.FloatValue * g_flHealthScale); // classic cast to int + ResetEntityHealth(entity, iHealth); + } + } +} + +public void OnActionCreated(BehaviorAction action, int owner, const char[] name) +{ + switch (name[0]) + { + case 'I': + { + if (strncmp(name, "Infected", 8) != 0) + return; + + if (strcmp(name[8], "Attack") != 0 && strcmp(name[8], "Alert") != 0 && strcmp(name[8], "Wander") != 0) + return; + + if (~GetInfectedFlags(owner) & 8) + return; + + action.OnSound = OnSound; + action.OnSoundPost = OnSoundPost; + } + } +} + +bool g_bShouldRestore = false; +Action OnSound(BehaviorAction action, int actor, int entity, const float pos[3], Address keyvalues, ActionDesiredResult result) +{ + int gender = GetGender(actor); + + bool bCanHear = false; + bool bCanSmell = false; + switch (gender) + { + case L4D2Gender_Undistractable: // road worker + { + bCanHear = (g_iRoadworkerSense & 1) != 0; + bCanSmell = (g_iRoadworkerSense & 2) != 0; + } + case L4D2Gender_Jimmy: + { + bCanHear = (g_iJimmySense & 1) != 0; + bCanSmell = (g_iJimmySense & 2) != 0; + } + } + + char cls[64]; + GetEdictClassname(entity, cls, sizeof(cls)); + + if (strcmp(cls, "info_goal_infected_chase") == 0 && GetEntPropEnt(entity, Prop_Data, "m_pParent") == -1) + { + // Vomit jar attracts zombies the same way pipe bomb does. + // But the attraction source won't move as pipe bomb's travelling, + // so the parent isn't set and it tells what the attraction is. + if (!bCanSmell) + return Plugin_Continue; + } + else + { + // Any other actual **sounds**. + if (!bCanHear) + return Plugin_Continue; + } + + RemoveInfectedFlags(actor, INFECTED_FLAG_UNDISTRACTABLE); + g_bShouldRestore = true; + + return Plugin_Continue; +} + +Action OnSoundPost(BehaviorAction action, int actor, int entity, const float pos[3], Address keyvalues, ActionDesiredResult result) +{ + if (g_bShouldRestore) + { + AddInfectedFlags(actor, INFECTED_FLAG_UNDISTRACTABLE); + g_bShouldRestore = false; + } + + return Plugin_Continue; +} + +bool g_bBlockSplatter = false; +MRESReturn DTR_OnPunch(Address pThis, DHookParam hParams) +{ + int infected = hParams.Get(1); + + switch (GetGender(infected)) + { + case L4D2Gender_Crawler: + { + if (g_bMudmanSplatter) + return MRES_Ignored; + } + + case L4D2Gender_Jimmy: + { + if (g_bJimmySplatter) + return MRES_Ignored; + } + } + + g_bBlockSplatter = true; + return MRES_Ignored; +} + +MRESReturn DTR_OnPunch_Post(Address pThis, DHookParam hParams) +{ + g_bBlockSplatter = false; + return MRES_Ignored; +} + +MRESReturn DTR_QueueScreenBloodSplatter(int client, DHookParam hParams) +{ + return g_bBlockSplatter ? MRES_Supercede : MRES_Ignored; +} + +void AddInfectedFlags(int entity, int flags) +{ + SetInfectedFlags(entity, GetInfectedFlags(entity) | flags); +} + +void RemoveInfectedFlags(int entity, int flags) +{ + SetInfectedFlags(entity, GetInfectedFlags(entity) & ~flags); +} + +int GetInfectedFlags(int entity) +{ + return GetEntData(entity, g_iOffs_m_nInfectedFlags); +} + +void SetInfectedFlags(int entity, int flags) +{ + SetEntData(entity, g_iOffs_m_nInfectedFlags, flags); +} + +void ResetEntityHealth(int entity, int health) +{ + if (health < 1) + health = 1; + + SetEntProp(entity, Prop_Data, "m_iMaxHealth", health); + SetEntProp(entity, Prop_Data, "m_iHealth", health); +} + +ConVar CreateConVarHook(const char[] name, + const char[] defaultValue, + const char[] description="", + int flags=0, + bool hasMin=false, float min=0.0, + bool hasMax=false, float max=0.0, + ConVarChanged callback) +{ + ConVar cv = CreateConVar(name, defaultValue, description, flags, hasMin, min, hasMax, max); + + Call_StartFunction(INVALID_HANDLE, callback); + Call_PushCell(cv); + Call_PushNullString(); + Call_PushNullString(); + Call_Finish(); + + cv.AddChangeHook(callback); + + return cv; +} From bb794b54827c806c2b79ab5e41cb8d04c5fe672f Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:44:08 +0800 Subject: [PATCH 2/6] l4d2_uncommon_adjustment: Add CEDA fireproof option --- .../optional/l4d2_uncommon_adjustment.smx | Bin 14800 -> 14257 bytes .../scripting/l4d2_uncommon_adjustment.sp | 20 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx b/addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx index 917195823c7b682c26c4e4046cd27d0459503a78..1d31e3bbe46853f3a29c89b403bc31ee04ad8c36 100644 GIT binary patch literal 14257 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 literal 14800 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 aYZ7Gt0n=fFdatm-b%Onc2%W-;?Ee6r9^N+q diff --git a/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp b/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp index 9dabf1e95..96e65d1df 100644 --- a/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp +++ b/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp @@ -7,7 +7,7 @@ #include #include -#define PLUGIN_VERSION "3.0" +#define PLUGIN_VERSION "3.1" public Plugin myinfo = { @@ -72,6 +72,7 @@ bool g_bRiotcopArmor; bool g_bMudmanCrouch; bool g_bMudmanSplatter; bool g_bJimmySplatter; +bool g_bCEDAFireProof; int g_iOffs_m_nInfectedFlags; @@ -159,6 +160,13 @@ public void OnPluginStart() true, 0.0, true, 1.0, JimmySplatter_ConVarChanged); + CreateConVarHook("l4d2_ceda_fire_proof", + "1", + "Set whether CEDA is fireproofed.", + FCVAR_NONE, + true, 0.0, true, 1.0, + CEDAFireProof_ConVarChanged); + g_iOffs_m_nInfectedFlags = FindSendPropInfo("Infected", "m_nFallenFlags") - 4; } @@ -212,6 +220,11 @@ void JimmySplatter_ConVarChanged(ConVar convar, const char[] oldValue, const cha g_bJimmySplatter = convar.BoolValue; } +void CEDAFireProof_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_bCEDAFireProof = convar.BoolValue; +} + public void OnEntityCreated(int entity, const char[] classname) { if (classname[0] == 'i') @@ -287,6 +300,11 @@ void SDK_OnSpawn_Post(int entity) if (!g_bRiotcopArmor) RemoveInfectedFlags(entity, INFECTED_FLAG_RIOTCOP_ARMOR); } + case L4D2Gender_Ceda: + { + if (!g_bCEDAFireProof) + RemoveInfectedFlags(entity, INFECTED_FLAG_FIRE_IMMUNE); + } case L4D2Gender_Jimmy: { int iHealth = RoundToFloor(z_health.FloatValue * g_flJimmyHealthScale); // classic cast to int From 8b7fcc876635e0eb0563dc35ffa09210c4aff05f Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:46:32 +0800 Subject: [PATCH 3/6] Configure for ZoneMod only --- cfg/cfgogl/zonemod/shared_cvars.cfg | 3 ++- cfg/cfgogl/zonemod/shared_plugins.cfg | 1 + cfg/cfgogl/zonemod/shared_settings.cfg | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cfg/cfgogl/zonemod/shared_cvars.cfg b/cfg/cfgogl/zonemod/shared_cvars.cfg index 141f8cbd2..d0602f754 100644 --- a/cfg/cfgogl/zonemod/shared_cvars.cfg +++ b/cfg/cfgogl/zonemod/shared_cvars.cfg @@ -79,7 +79,8 @@ confogl_addcvar confogl_limit_tier2_saferoom 0 // Balancing Cvars confogl_addcvar director_vs_convert_pills 0 confogl_addcvar z_finale_spawn_safety_range 600 // Tank finale bugfix -confogl_addcvar z_fallen_max_count 0 +confogl_addcvar z_fallen_max_count 1 // [l4d2_uncommon_adjustment.smx] +confogl_addcvar sv_fallen_survivor_health_multiplier 1.0 // [l4d2_uncommon_adjustment.smx] confogl_addcvar sv_infected_ceda_vomitjar_probability 0 confogl_addcvar sv_force_time_of_day 0 confogl_addcvar z_brawl_chance 0 diff --git a/cfg/cfgogl/zonemod/shared_plugins.cfg b/cfg/cfgogl/zonemod/shared_plugins.cfg index a33a65b8d..eb0a678e3 100644 --- a/cfg/cfgogl/zonemod/shared_plugins.cfg +++ b/cfg/cfgogl/zonemod/shared_plugins.cfg @@ -106,6 +106,7 @@ sm plugins load optional/staggersolver.smx sm plugins load optional/l4d2_nobackjumps.smx sm plugins load optional/l4d_common_ragdolls_be_gone.smx sm plugins load optional/l4d2_tankrage.smx +sm plugins load optional/l4d2_uncommon_adjustment.smx //---------------------- // Static shotgun spread diff --git a/cfg/cfgogl/zonemod/shared_settings.cfg b/cfg/cfgogl/zonemod/shared_settings.cfg index 9d5b74860..923e2744e 100644 --- a/cfg/cfgogl/zonemod/shared_settings.cfg +++ b/cfg/cfgogl/zonemod/shared_settings.cfg @@ -11,6 +11,19 @@ // Plugins // // ======= // +// [l4d2_uncommon_adjustment.smx] +confogl_addcvar l4d2_uncommon_attract 0 // No zombie attraction from clowns and Jimmy +confogl_addcvar l4d2_roadworker_sense_flag 2 // Roadwork should react to smells +confogl_addcvar l4d2_jimmy_sense_flag 3 // Jimmy should react to sounds and smells +confogl_addcvar l4d2_uncommon_health_multiplier 1.0 // Normalize uncommon CI's health +confogl_addcvar l4d2_jimmy_health_multiplier 1.0 // Normalize Jimmy's health +confogl_addcvar l4d2_fallen_equipments 0 // Fallen survivor carries nothing. +confogl_addcvar l4d2_riotcop_armor 0 // Remove armor from riotcops +confogl_addcvar l4d2_mudman_crouch_run 1 // Mudman can keep themselves +confogl_addcvar l4d2_mudman_screen_splatter 0 // Mudman can no longer blind your screens +confogl_addcvar l4d2_jimmy_screen_splatter 0 // Jimmy can no longer blind your screens +confogl_addcvar l4d2_ceda_fire_proof 0 // CEDA can keep themselves + // [l4d2_steady_boost.smx] confogl_addcvar l4d2_steady_boost_flags 2 // Infected only From f8fd443e32d0d9970d0f6071534be15ff4c53920 Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:47:50 +0800 Subject: [PATCH 4/6] Replace 'l4d2_uncommon_blocker' --- cfg/cfgogl/zonemod/shared_plugins.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cfg/cfgogl/zonemod/shared_plugins.cfg b/cfg/cfgogl/zonemod/shared_plugins.cfg index eb0a678e3..a579fae72 100644 --- a/cfg/cfgogl/zonemod/shared_plugins.cfg +++ b/cfg/cfgogl/zonemod/shared_plugins.cfg @@ -87,7 +87,8 @@ sm plugins load optional/l4d2_bw_rock_hit.smx sm plugins load optional/l4d2_tank_damage_cvars.smx sm plugins load optional/l4d2_getup_slide_fix.smx sm plugins load optional/l4d2_hybrid_scoremod_zone.smx -sm plugins load optional/l4d2_uncommon_blocker.smx +// sm plugins load optional/l4d2_uncommon_blocker.smx +sm plugins load optional/l4d2_uncommon_adjustment.smx sm plugins load optional/fix_engine.smx sm plugins load optional/l4d2_collision_adjustments.smx sm plugins load optional/l4d2_stats.smx @@ -106,7 +107,6 @@ sm plugins load optional/staggersolver.smx sm plugins load optional/l4d2_nobackjumps.smx sm plugins load optional/l4d_common_ragdolls_be_gone.smx sm plugins load optional/l4d2_tankrage.smx -sm plugins load optional/l4d2_uncommon_adjustment.smx //---------------------- // Static shotgun spread From 95aca53e74301e311e8e34394a819d996f11845c Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:06:31 +0800 Subject: [PATCH 5/6] Remove 'l4d2_uncommon_blocker' settings --- cfg/cfgogl/zonemod/shared_settings.cfg | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cfg/cfgogl/zonemod/shared_settings.cfg b/cfg/cfgogl/zonemod/shared_settings.cfg index 923e2744e..6e46cb579 100644 --- a/cfg/cfgogl/zonemod/shared_settings.cfg +++ b/cfg/cfgogl/zonemod/shared_settings.cfg @@ -279,10 +279,6 @@ confogl_addcvar l4d2_shotgun_ff_multi 0.5 confogl_addcvar l4d2_shotgun_ff_min 1.0 confogl_addcvar l4d2_shotgun_ff_max 8.0 -// [l4d2_uncommon_blocker.smx] -confogl_addcvar sm_uncinfblock_enabled 1 -confogl_addcvar sm_uncinfblock_flags 55 - // [lerpmonitor.smx] confogl_addcvar sm_allowed_lerp_changes 3 confogl_addcvar sm_lerp_change_spec 1 From 0b00119f1f37510da6b253c135064b4355a04ba9 Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:21:50 +0800 Subject: [PATCH 6/6] l4d2_uncommon_adjustment: Patches over detours Thanks to @A1mDev for suggesting. Change: - Removed detours in favor of patches for screen splatter options. --- .../gamedata/l4d2_uncommon_adjustment.txt | 65 +++++--------- .../optional/l4d2_uncommon_adjustment.smx | Bin 14257 -> 13866 bytes .../scripting/l4d2_uncommon_adjustment.sp | 82 ++++++------------ 3 files changed, 51 insertions(+), 96 deletions(-) diff --git a/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt b/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt index f9d48a3d2..0fe4020ba 100644 --- a/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt +++ b/addons/sourcemod/gamedata/l4d2_uncommon_adjustment.txt @@ -2,47 +2,39 @@ { "left4dead2" { - "Functions" + "MemPatches" { - "InfectedAttack::OnPunch" + "mudman_screen_splatter" { "signature" "InfectedAttack::OnPunch" - "callconv" "thiscall" - "return" "void" - "this" "address" - "arguments" + "linux" + { + "offset" "5BDh" + "verify" "\x74" + "patch" "\x90\x90" + } + "windows" { - "Infected *" - { - "type" "cbaseentity" - } - "CBaseEntity *" - { - "type" "cbaseentity" - } + "offset" "3C1h" + "verify" "\x74" + "patch" "\x90\x90" } } - "CTerrorPlayer::QueueScreenBloodSplatter" + "jimmy_screen_splatter" { - "signature" "CTerrorPlayer::QueueScreenBloodSplatter" - "callconv" "thiscall" - "return" "void" - "this" "entity" - "arguments" + "signature" "InfectedAttack::OnPunch" + "linux" + { + "offset" "5CAh" + "verify" "\x0F\x85" + "patch" "\x90\xE9" + } + "windows" { - "int" - { - "type" "int" - } - "float" - { - "type" "float" - } - "CTerrorPlayer::SplatterType_t" - { - "type" "int" - } + "offset" "3CDh" + "verify" "\x0F\x85" + "patch" "\x90\xE9" } } } @@ -57,15 +49,6 @@ "windows" "\x55\x8B\xEC\x81\xEC\x64\x01\x00\x00\xA1" /* 55 8B EC 81 EC 64 01 00 00 A1 */ } - - // Search convar "z_splatterdistance" - "CTerrorPlayer::QueueScreenBloodSplatter" - { - "library" "server" - "linux" "@_ZN13CTerrorPlayer24QueueScreenBloodSplatterEifNS_14SplatterType_tE" - "windows" "\x55\x8B\xEC\xA1\x2A\x2A\x2A\x2A\xF3\x0F\x10\x40\x2C\x0F\x2F\x45\x0C" - /* 55 8B EC A1 ? ? ? ? F3 0F 10 40 2C 0F 2F 45 0C */ - } } } } \ No newline at end of file diff --git a/addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx b/addons/sourcemod/plugins/optional/l4d2_uncommon_adjustment.smx index 1d31e3bbe46853f3a29c89b403bc31ee04ad8c36..49b9ba703abd96472c16f88fcacd82aefd8a6ed3 100644 GIT binary patch literal 13866 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 diff --git a/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp b/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp index 96e65d1df..f3df34358 100644 --- a/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp +++ b/addons/sourcemod/scripting/l4d2_uncommon_adjustment.sp @@ -2,12 +2,12 @@ #pragma newdecls required #include -#include +#include #include #include #include -#define PLUGIN_VERSION "3.1" +#define PLUGIN_VERSION "3.2" public Plugin myinfo = { @@ -24,18 +24,11 @@ methodmap GameDataWrapper < GameData { if (!gd) SetFailState("Missing gamedata \"%s\"", file); return view_as(gd); } - 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 MemoryPatch CreatePatchOrFail(const char[] name, bool enable = false) { + MemoryPatch hPatch = MemoryPatch.CreateFromConf(this, name); + if (!(enable ? hPatch.Enable() : hPatch.Validate())) + SetFailState("Failed to patch \"%s\"", name); + return hPatch; } } @@ -70,8 +63,8 @@ float g_flJimmyHealthScale; int g_iFallenEquipments; bool g_bRiotcopArmor; bool g_bMudmanCrouch; -bool g_bMudmanSplatter; -bool g_bJimmySplatter; +MemoryPatch g_Patch_MudmanSplatter; +MemoryPatch g_Patch_JimmySplatter; bool g_bCEDAFireProof; int g_iOffs_m_nInfectedFlags; @@ -79,8 +72,8 @@ int g_iOffs_m_nInfectedFlags; public void OnPluginStart() { GameDataWrapper gd = new GameDataWrapper("l4d2_uncommon_adjustment"); - delete gd.CreateDetourOrFail("InfectedAttack::OnPunch", DTR_OnPunch, DTR_OnPunch_Post); - delete gd.CreateDetourOrFail("CTerrorPlayer::QueueScreenBloodSplatter", DTR_QueueScreenBloodSplatter); + g_Patch_MudmanSplatter = gd.CreatePatchOrFail("mudman_screen_splatter", false); + g_Patch_JimmySplatter = gd.CreatePatchOrFail("jimmy_screen_splatter", false); delete gd; z_health = FindConVar("z_health"); @@ -212,12 +205,26 @@ void MudmanCrouch_ConVarChanged(ConVar convar, const char[] oldValue, const char void MudmanSplatter_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - g_bMudmanSplatter = convar.BoolValue; + // warning 213: tag mismatch (expected "bool", got "void") + // haha + // convar.BoolValue ? g_Patch_MudmanSplatter.Enable() : g_Patch_MudmanSplatter.Disable(); + + if (convar.BoolValue) + g_Patch_MudmanSplatter.Disable(); + else + g_Patch_MudmanSplatter.Enable(); } void JimmySplatter_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) { - g_bJimmySplatter = convar.BoolValue; + // warning 213: tag mismatch (expected "bool", got "void") + // haha + // convar.BoolValue ? g_Patch_JimmySplatter.Enable() : g_Patch_JimmySplatter.Disable(); + + if (convar.BoolValue) + g_Patch_JimmySplatter.Disable(); + else + g_Patch_JimmySplatter.Enable(); } void CEDAFireProof_ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) @@ -395,41 +402,6 @@ Action OnSoundPost(BehaviorAction action, int actor, int entity, const float pos return Plugin_Continue; } -bool g_bBlockSplatter = false; -MRESReturn DTR_OnPunch(Address pThis, DHookParam hParams) -{ - int infected = hParams.Get(1); - - switch (GetGender(infected)) - { - case L4D2Gender_Crawler: - { - if (g_bMudmanSplatter) - return MRES_Ignored; - } - - case L4D2Gender_Jimmy: - { - if (g_bJimmySplatter) - return MRES_Ignored; - } - } - - g_bBlockSplatter = true; - return MRES_Ignored; -} - -MRESReturn DTR_OnPunch_Post(Address pThis, DHookParam hParams) -{ - g_bBlockSplatter = false; - return MRES_Ignored; -} - -MRESReturn DTR_QueueScreenBloodSplatter(int client, DHookParam hParams) -{ - return g_bBlockSplatter ? MRES_Supercede : MRES_Ignored; -} - void AddInfectedFlags(int entity, int flags) { SetInfectedFlags(entity, GetInfectedFlags(entity) | flags);