From fc53df5a16bdd26aeba4031657521f1bf6d1ebc8 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Sun, 9 May 2021 19:21:40 +0800 Subject: [PATCH] Added a new hook: HOOK_CANUSEWEAPON Updated NPC armor appearance mod script. --- artifacts/mods/gl_npcarmor.int | Bin 5018 -> 5216 bytes artifacts/mods/gl_npcarmor.ssl | 15 +++++- artifacts/scripting/headers/sfall.h | 1 + artifacts/scripting/hookscripts.md | 16 +++++++ sfall/FalloutEngine/Functions_def.h | 2 + sfall/Game/combatAI.cpp | 28 ++++++++++++ sfall/Game/combatAI.h | 19 ++++++++ sfall/Modules/HookScripts.cpp | 1 + sfall/Modules/HookScripts.h | 1 + sfall/Modules/HookScripts/CombatHs.cpp | 61 +++++++++++++++++++++++-- sfall/Modules/HookScripts/CombatHs.h | 2 + sfall/ddraw.vcxproj | 2 + sfall/ddraw.vcxproj.filters | 6 +++ 13 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 sfall/Game/combatAI.cpp create mode 100644 sfall/Game/combatAI.h diff --git a/artifacts/mods/gl_npcarmor.int b/artifacts/mods/gl_npcarmor.int index 1fb06619983fdfb790a0587090706f6df32e7ed5..fe51142f3de4528c6e86e87e5306f7bc836acfde 100644 GIT binary patch delta 1373 zcmbQG{y;;Zf$0Dv0|SFl122eXZkQ+_ThGP7z`(|U0+=^Ixe`zsO2NgApaM{eH4e(? zfznWl^%(;L12Y2y!y>2vlwx;-itk`xsE3MyDNZ#81_qD|&w#mbf@=ko`3OowDIS=pVI;o>gvBVpAfN{UlZ6>oM8%R5^Gb_T%Tp5z^7G;|67y1WQj0d5 zFnTaC@oP-3V-96>n|y`YS2P0@YzzzyMh*KLj2rYpJXW>IW-M|-tZE<*17m{`M3`mI zhU7sO3#AQ21_fvRK#t6&C` zEDfw+ny~?_n*k!q*kIIT3l%qNd^-67x8Y=WR%s!2J+L4%%x7##lS^2QxY+d?SU?i& zdXqP>+A|)S{DD|bRaHBZ>O#Z~C$@pcm47)nx zqscDp{)~?%Pht0EJT&aqB8V&Ewt&){BUB6G-CVUNiXs zmto+(29^n+#6AJ0s==}`1jOc<0r5D`3=j|OABf$bu-MHA^COSKWG8MdCLX`ZdEBbf zFt4#fyvD%VVAS{&WE{_o$?LeqBzUGF(g;YH0g^&kC*R?AVB%w%EXO0m#H%pbhR2DC zH)(PMkGdc;G}$mfOypylyn`o@@xx>;UM-LYGu{Y2eu0MlU@skNDrFPFtSW`;hV%G;?bA_$s_!$CO_iKU=q}u?8D!} zB*-`U5`Tk|Ko=y47&zeOT7vE2fVfV8WpastFXO+-hXfj!1gj>y2!fnCO|XwixNWkU zkPnk^+T;?UaK?L+&j@933Hd=x6JeWdCoHSW)|3P`3zC}Ip*#t&7zdOGPH+rNO|_G& GgcShn?j{ZZ delta 1179 zcmaE$F-u*bf$0Dv0|SFl122eX4wxt)ThGbBz`(|U0+<`1TnQ)*rQqTvPyr~#s>i^< zz|6qF&;=EMQfz%t@dZ!;D8-S-z`y`<$QA~MIH(wy;`{)n7#L1LX(+}01IoAurJ)pW z5|r@`N<%5W0x09hWFoZK?=kJ$v2gNSqwR16C^`wlc5^W|)nvt0wEP8F8_d zHL!pr*vcknu-P+mOAF1`2w356Pw567i=4ZIKn^*7~ncNTqdt#*JQMre1%<| zQET!ac7H~#$vzyuj9imvakwzCPnrCHLxPDTZ1OLTBq7dIV9g+p8h}`wU6b=TC8RjJ zKpX~^1|cvFayQs#oGgF;?9`-i(89{d)j0zZr#bjJc1@rg{<&+F@eM)_dQ6G z2Squ=C@{&=z}g@+c>0z$9>J@*hEvul$7in1s$vz9;0v zB(!d_j&L}m+T<4D3^&1Pkhl@{g9R 0) { + result = rets[0]; + if (result != 0) result = 1; + } + + EndHook(); + return result; +} + +static void __declspec(naked) CanUseWeaponHook() { + __asm { + push ecx; + push ebx; // hitMode + push edx; // weapon + push eax; // source + call fo::funcoffs::ai_can_use_weapon_; + push eax; // result + call CanUseWeaponHook_Script; + pop ecx; + retn; + } +} + +long CanUseWeaponHook_Invoke(long result, fo::GameObject* source, fo::GameObject* weapon, long hitMode) { + return (HookScripts::HookHasScript(HOOK_CANUSEWEAPON)) + ? CanUseWeaponHook_Script(result, source, weapon, hitMode) + : result; +} + +//////////////////////////////////////////////////////////////////////////////// + void Inject_ToHitHook() { HookCalls(ToHitHook, { 0x421686, // combat_safety_invalidate_weapon_func_ @@ -709,6 +751,14 @@ void Inject_BestWeaponHook() { HookCall(0x429A59, ai_search_inven_weap_hook); } +void Inject_CanUseWeaponHook() { + HookCalls(CanUseWeaponHook, { + 0x429A1B, // ai_search_inven_weap_ + 0x429CF2, // ai_search_environ_ + 0x429E1C // ai_pick_hit_mode_ + }); +} + void InitCombatHookScripts() { HookScripts::LoadHookScript("hs_tohit", HOOK_TOHIT); HookScripts::LoadHookScript("hs_afterhitroll", HOOK_AFTERHITROLL); @@ -722,6 +772,7 @@ void InitCombatHookScripts() { HookScripts::LoadHookScript("hs_subcombatdmg", HOOK_SUBCOMBATDAMAGE); HookScripts::LoadHookScript("hs_targetobject", HOOK_TARGETOBJECT); HookScripts::LoadHookScript("hs_bestweapon", HOOK_BESTWEAPON); + HookScripts::LoadHookScript("hs_canuseweapon", HOOK_CANUSEWEAPON); } } diff --git a/sfall/Modules/HookScripts/CombatHs.h b/sfall/Modules/HookScripts/CombatHs.h index 04ed91f4..5027e204 100644 --- a/sfall/Modules/HookScripts/CombatHs.h +++ b/sfall/Modules/HookScripts/CombatHs.h @@ -19,11 +19,13 @@ void Inject_OnExplosionHook(); void Inject_SubCombatDamageHook(); void Inject_TargetObjectHook(); void Inject_BestWeaponHook(); +void Inject_CanUseWeaponHook(); int __fastcall AmmoCostHook_Script(DWORD hookType, fo::GameObject* weapon, DWORD &rounds); long CalcApCostHook_Invoke(fo::GameObject* source, long hitMode, long isCalled, long cost, fo::GameObject* weapon); //void FindTargetHook_Invoke(fo::GameObject* targets[], fo::GameObject* attacker); //fo::GameObject* BestWeaponHook_Invoke(fo::GameObject* bestWeapon, fo::GameObject* source, fo::GameObject* weapon1, fo::GameObject* weapon2, fo::GameObject* target); +long CanUseWeaponHook_Invoke(long result, fo::GameObject* source, fo::GameObject* weapon, long hitMode); } diff --git a/sfall/ddraw.vcxproj b/sfall/ddraw.vcxproj index d3c79632..497fc3c1 100644 --- a/sfall/ddraw.vcxproj +++ b/sfall/ddraw.vcxproj @@ -291,6 +291,7 @@ + @@ -402,6 +403,7 @@ + diff --git a/sfall/ddraw.vcxproj.filters b/sfall/ddraw.vcxproj.filters index f6023c84..edb22c53 100644 --- a/sfall/ddraw.vcxproj.filters +++ b/sfall/ddraw.vcxproj.filters @@ -343,6 +343,9 @@ Game + + Game + @@ -636,6 +639,9 @@ Game + + Game +