From f3cb079f9e7d2885f5c051f5abe449f68cd3beaa Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:24:08 +0300 Subject: [PATCH] Fixed low damage for Shield with AbsorbOverDamage --- src/Ext/Techno/Hooks.Shield.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Ext/Techno/Hooks.Shield.cpp b/src/Ext/Techno/Hooks.Shield.cpp index 04db0a9dd0..05ba207ec1 100644 --- a/src/Ext/Techno/Hooks.Shield.cpp +++ b/src/Ext/Techno/Hooks.Shield.cpp @@ -8,6 +8,8 @@ #include #include +bool bSkipLowDamageCheck = false; + // #issue 88 : shield logic DEFINE_HOOK(0x701900, TechnoClass_ReceiveDamage_Shield, 0x6) { @@ -31,6 +33,9 @@ DEFINE_HOOK(0x701900, TechnoClass_ReceiveDamage_Shield, 0x6) if (auto pTag = pThis->AttachedTag) pTag->RaiseEvent((TriggerEvent)PhobosTriggerEvent::ShieldBroken, pThis, CellStruct::Empty); } + + if (nDamageLeft == 0) + bSkipLowDamageCheck = true; } } return 0; @@ -38,19 +43,19 @@ DEFINE_HOOK(0x701900, TechnoClass_ReceiveDamage_Shield, 0x6) DEFINE_HOOK(0x7019D8, TechnoClass_ReceiveDamage_SkipLowDamageCheck, 0x5) { - GET(TechnoClass*, pThis, ESI); - GET(int*, Damage, EBX); - - const auto pExt = TechnoExt::ExtMap.Find(pThis); - - if (const auto pShieldData = pExt->Shield.get()) + if (bSkipLowDamageCheck) + { + bSkipLowDamageCheck = false; + } + else { - if (pShieldData->IsActive()) - return 0x7019E3; + // Restore overridden instructions + GET(int*, nDamage, EBX); + if (*nDamage < 1) + *nDamage = 1; } - // Restore overridden instructions - return *Damage >= 1 ? 0x7019E3 : 0x7019DD; + return 0x7019E3; } DEFINE_HOOK_AGAIN(0x70CF39, TechnoClass_ReplaceArmorWithShields, 0x6) //TechnoClass_EvalThreatRating_Shield