From 920093b48026c45acb3285c49fcf7396266337cf Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:57:33 +0800 Subject: [PATCH 1/2] Add files --- .../optional/l4d_return_thrown_items.smx | Bin 0 -> 6459 bytes .../scripting/l4d_return_thrown_items.sp | 140 ++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 addons/sourcemod/plugins/optional/l4d_return_thrown_items.smx create mode 100644 addons/sourcemod/scripting/l4d_return_thrown_items.sp diff --git a/addons/sourcemod/plugins/optional/l4d_return_thrown_items.smx b/addons/sourcemod/plugins/optional/l4d_return_thrown_items.smx new file mode 100644 index 0000000000000000000000000000000000000000..b9a25caa639f967628971b27765119012c7dd51c GIT binary patch literal 6459 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 PF2gVCLN?ENqyPT^>v~0) literal 0 HcmV?d00001 diff --git a/addons/sourcemod/scripting/l4d_return_thrown_items.sp b/addons/sourcemod/scripting/l4d_return_thrown_items.sp new file mode 100644 index 000000000..4d2c7623c --- /dev/null +++ b/addons/sourcemod/scripting/l4d_return_thrown_items.sp @@ -0,0 +1,140 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include +#include +#include + +#define PLUGIN_VERSION "1.0" + +public Plugin myinfo = +{ + name = "[L4D & 2] Return Thrown Items", + author = "Forgetest", + description = "Return pills/adrenalines thrown through shoving key if not successfully given.", + version = PLUGIN_VERSION, + url = "https://github.com/Target5150/MoYu_Server_Stupid_Plugins", +} + +methodmap CountdownTimer { + public bool HasStarted() { + return this.m_timestamp > 0.0; + } + public bool IsElasped() { + return GetGameTime() >= this.m_timestamp; + } + property float m_duration { + public get() { return LoadFromAddress(view_as
(this) + view_as
(4), NumberType_Int32); } + } + property float m_timestamp { + public get() { return LoadFromAddress(view_as
(this) + view_as
(8), NumberType_Int32); } + } +} + +public void OnMapStart() +{ + for (int i = 1; i <= MaxClients; ++i) + { + if (IsClientInGame(i)) OnClientPutInServer(i); + } +} + +public void OnClientPutInServer(int client) +{ + SDKHook(client, SDKHook_WeaponDropPost, SDK_OnWeaponDrop_Post); +} + +void SDK_OnWeaponDrop_Post(int client, int weapon) +{ + if (GetClientTeam(client) == 3) + return; + + if (weapon <= 0 || !IsWeaponGiveable(weapon)) + return; + + // NOTE: Next weapon giving think defaults to 0.5s later, but the drop timer lasts 5.0s long. + // TODO: Make a cvar in case? Detour `CTerrorWeapon::GiveThink` for arruracy? + CreateTimer(1.0, Timer_CheckWeaponGiving, EntIndexToEntRef(weapon), TIMER_FLAG_NO_MAPCHANGE); +} + +Action Timer_CheckWeaponGiving(Handle timer, int ref) +{ + int weapon = EntRefToEntIndex(ref); + if (weapon == -1) + return Plugin_Stop; + + CheckWeaponGiving(weapon); + + return Plugin_Stop; +} + +bool CheckWeaponGiving(int weapon) +{ + CountdownTimer ct = GetWeaponDropTimer(weapon); + if (!ct.HasStarted() || ct.IsElasped()) // don't bother if not dropping + return false; + + if (GetEntPropEnt(weapon, Prop_Send, "m_hOwner") != -1) // somebody has grabbed it + return false; + + int owner = GetWeaponDroppingPlayer(weapon); + if (owner == -1 || !IsClientInGame(owner)) + return false; + + // yeah if empty, actually doesn't matter though, but yeah it feels good :) + EquipPlayerWeaponIfEmpty(owner, weapon); + + return true; +} + +void EquipPlayerWeaponIfEmpty(int client, int weapon) +{ + char cls[32]; + GetEntityClassname(weapon, cls, sizeof(cls)); + + int slot = L4D2_GetIntWeaponAttribute(cls, L4D2IWA_Bucket); + if (GetPlayerWeaponSlot(client, slot) == -1) + { + EquipPlayerWeapon(client, weapon); + } +} + +bool IsWeaponGiveable(int weapon) +{ + char cls[32]; + GetEntityClassname(weapon, cls, sizeof(cls)); + + int slot = L4D2_GetIntWeaponAttribute(cls, L4D2IWA_Bucket); + return slot == 4; +} + +CountdownTimer GetWeaponDropTimer(int weapon) +{ + static int s_iOffs_m_dropTimer = -1; + if (s_iOffs_m_dropTimer == -1) + s_iOffs_m_dropTimer = L4D_IsEngineLeft4Dead1() ? + FindSendPropInfo("CTerrorWeapon", "m_flVsLastSwingTime") + 20 : FindSendPropInfo("CTerrorWeapon", "m_nUpgradedPrimaryAmmoLoaded") + 16; + + return view_as(GetEntityAddress(weapon) + view_as
(s_iOffs_m_dropTimer)); +} + +int GetWeaponDroppingPlayer(int weapon) +{ + static int s_iOffs_m_hDroppingPlayer = -1; + if (s_iOffs_m_hDroppingPlayer == -1) + s_iOffs_m_hDroppingPlayer = L4D_IsEngineLeft4Dead1() ? + FindSendPropInfo("CTerrorWeapon", "m_flVsLastSwingTime") + 16 : FindSendPropInfo("CTerrorWeapon", "m_nUpgradedPrimaryAmmoLoaded") + 8; + + return GetEntDataEnt2(weapon, s_iOffs_m_hDroppingPlayer); +} + +// int GetWeaponDropTarget(int weapon) +// { +// static int s_iOffs_m_hDropTarget = -1; +// if (s_iOffs_m_hDropTarget == -1) +// s_iOffs_m_hDropTarget = L4D_IsEngineLeft4Dead1() ? +// FindSendPropInfo("CTerrorWeapon", "m_flVsLastSwingTime") + 12 : FindSendPropInfo("CTerrorWeapon", "m_nUpgradedPrimaryAmmoLoaded") + 12; + +// return GetEntDataEnt2(weapon, s_iOffs_m_hDropTarget); +// } From 967cee78d68ac0084b9ffedbf9380efc2d08c418 Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:58:00 +0800 Subject: [PATCH 2/2] Load as a general fix --- cfg/generalfixes.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/cfg/generalfixes.cfg b/cfg/generalfixes.cfg index 8b58782cb..c94512ca2 100644 --- a/cfg/generalfixes.cfg +++ b/cfg/generalfixes.cfg @@ -68,6 +68,7 @@ sm plugins load fixes/l4d_fix_rotated_physblocker.smx sm plugins load fixes/firebulletsfix.smx sm plugins load fixes/l4d_fix_stagger_dir.smx sm plugins load fixes/l4d2_fix_rocket_pull.smx +sm plugins load optional/l4d_return_thrown_items.smx // Anti-Cheat. sm plugins load anticheat/l4d2_noghostcheat.smx