mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Added additional check to AI weapon switching fix
This commit is contained in:
@@ -19,13 +19,13 @@ namespace game
|
||||
namespace sf = sfall;
|
||||
|
||||
static const long aiUseItemAPCost = 2;
|
||||
/*
|
||||
|
||||
// Implementation of ai_can_use_weapon_ engine function with the HOOK_CANUSEWEAPON hook
|
||||
bool CombatAI::ai_can_use_weapon(fo::GameObject* source, fo::GameObject* weapon, long hitMode) {
|
||||
bool result = fo::func::ai_can_use_weapon(source, weapon, hitMode);
|
||||
return sf::CanUseWeaponHook_Invoke(result, source, weapon, hitMode);
|
||||
}
|
||||
*/
|
||||
|
||||
static long drugUsePerfFixMode;
|
||||
|
||||
void __stdcall CombatAI::ai_check_drugs(fo::GameObject* source) {
|
||||
|
||||
@@ -15,7 +15,7 @@ class CombatAI {
|
||||
public:
|
||||
static void init();
|
||||
|
||||
//static bool ai_can_use_weapon(fo::GameObject* source, fo::GameObject* weapon, long hitMode);
|
||||
static bool ai_can_use_weapon(fo::GameObject* source, fo::GameObject* weapon, long hitMode);
|
||||
|
||||
static void __stdcall ai_check_drugs(fo::GameObject* source);
|
||||
};
|
||||
|
||||
@@ -243,10 +243,13 @@ static long __fastcall ai_try_attack_switch_fix(fo::GameObject* target, long &hi
|
||||
}
|
||||
}
|
||||
|
||||
bool canUseCurr = game::CombatAI::ai_can_use_weapon(source, weapon, hitMode);
|
||||
|
||||
// does the NPC have other weapons in inventory?
|
||||
fo::GameObject* item = fo::func::ai_search_inven_weap(source, 1, target); // search based on AP
|
||||
if (item) {
|
||||
// is using a close range weapon?
|
||||
if (!canUseCurr) return 1; // can't use current weapon, so switch anyway
|
||||
// is it a close-range weapon?
|
||||
long wType = fo::func::item_w_subtype(item, fo::AttackType::ATKTYPE_RWEAPON_PRIMARY);
|
||||
if (wType <= fo::AttackSubType::MELEE) { // unarmed and melee weapons, check the distance before switching
|
||||
if (!game::ai::AIHelpers::AttackInRange(source, item, target)) return -1; // target out of range, exit ai_try_attack_
|
||||
@@ -255,7 +258,7 @@ static long __fastcall ai_try_attack_switch_fix(fo::GameObject* target, long &hi
|
||||
}
|
||||
|
||||
// no other weapon in inventory
|
||||
if (fo::func::item_w_range(source, fo::AttackType::ATKTYPE_PUNCH) >= fo::func::obj_dist(source, target)) {
|
||||
if (!canUseCurr || fo::func::item_w_range(source, fo::AttackType::ATKTYPE_PUNCH) >= fo::func::obj_dist(source, target)) {
|
||||
hitMode = fo::AttackType::ATKTYPE_PUNCH;
|
||||
return 0; // change hit mode, continue attack cycle
|
||||
}
|
||||
|
||||
@@ -680,13 +680,13 @@ static void __declspec(naked) CanUseWeaponHook() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
||||
bool CanUseWeaponHook_Invoke(bool result, fo::GameObject* source, fo::GameObject* weapon, long hitMode) {
|
||||
return (HookScripts::HookHasScript(HOOK_CANUSEWEAPON))
|
||||
? CanUseWeaponHook_Script(result, source, weapon, hitMode)
|
||||
: result;
|
||||
}
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Inject_ToHitHook() {
|
||||
|
||||
@@ -26,6 +26,6 @@ int __fastcall AmmoCostHook_Script(DWORD hookType, fo::GameObject* weapon, DWORD
|
||||
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);
|
||||
//bool CanUseWeaponHook_Invoke(bool result, fo::GameObject* source, fo::GameObject* weapon, long hitMode);
|
||||
bool CanUseWeaponHook_Invoke(bool result, fo::GameObject* source, fo::GameObject* weapon, long hitMode);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user