1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-17 23:16:38 +00:00

Pass ammo to Hit handler by record id

This commit is contained in:
Evil Eye 2025-08-23 21:56:38 +02:00
parent 2b7f775ffe
commit 592b648c3e
3 changed files with 19 additions and 8 deletions

View file

@ -515,7 +515,7 @@ namespace MWLua
if (!weapon.isEmpty())
data["weapon"] = LObject(weapon);
if (!ammo.isEmpty())
data["ammo"] = LObject(weapon);
data["ammo"] = ammo.getCellRef().getRefId().serializeText();
data["type"] = attackType;
data["strength"] = attackStrength;
data["damage"] = damageTable;

View file

@ -15,6 +15,7 @@
#include "apps/openmw/mwmechanics/drawstate.hpp"
#include "apps/openmw/mwworld/class.hpp"
#include "apps/openmw/mwworld/inventorystore.hpp"
#include "apps/openmw/mwworld/manualref.hpp"
#include "apps/openmw/mwworld/worldmodel.hpp"
#include "../localscripts.hpp"
@ -439,19 +440,29 @@ namespace MWLua
else if (sourceTypeStr == "magic")
sourceType = MWMechanics::DamageSourceType::Magical;
sol::optional<Object> weapon = options.get<sol::optional<Object>>("weapon");
sol::optional<Object> ammo = options.get<sol::optional<Object>>("ammo");
std::string_view ammoId = options.get_or<std::string_view>("ammo", {});
ESM::RefId ammo = ESM::RefId::deserializeText(ammoId);
context.mLuaManager->addAction(
[self = Object(self), damages = std::move(damageCpp),
attacker = options.get<sol::optional<Object>>("attacker"), weapon = ammo ? ammo : weapon,
attacker = options.get<sol::optional<Object>>("attacker"), weapon, ammo,
successful = options.get<bool>("successful"), sourceType = sourceType] {
MWWorld::Ptr attackerPtr;
MWWorld::Ptr weaponPtr;
if (attacker)
attackerPtr = attacker->ptr();
if (weapon)
weaponPtr = weapon->ptr();
self.ptr().getClass().onHit(self.ptr(), damages, weaponPtr, attackerPtr, successful, sourceType);
weaponPtr = weapon->ptrOrEmpty();
if (!ammo.empty())
{
MWWorld::ManualRef projectileRef(*MWBase::Environment::get().getESMStore(), ammo);
weaponPtr = projectileRef.getPtr();
self.ptr().getClass().onHit(
self.ptr(), damages, weaponPtr, attackerPtr, successful, sourceType);
}
else
self.ptr().getClass().onHit(
self.ptr(), damages, weaponPtr, attackerPtr, successful, sourceType);
},
"HitAction");
};

View file

@ -192,7 +192,7 @@ local function applyArmor(attack)
I.SkillProgression.skillUsed(skillid, {useType = I.SkillProgression.SKILL_USE_TYPES.Armor_HitByOpponent})
end
if item and Armor.objectIsInstance(item) then
local attackerIsUnarmedCreature = attack.attacker and not attack.weapon and Creature.objectIsInstance(attack.attacker)
local attackerIsUnarmedCreature = attack.attacker and not attack.weapon and not attack.ammo and Creature.objectIsInstance(attack.attacker)
if settings:get('unarmedCreatureAttacksDamageArmor') or not attackerIsUnarmedCreature then
core.sendGlobalEvent('ModifyItemCondition', { actor = self, item = item, amount = diff })
end
@ -307,7 +307,7 @@ end
-- @field [parent=#AttackInfo] openmw.self#ATTACK_TYPE type (Optional) Attack variant if applicable. For melee attacks this represents chop vs thrust vs slash. For unarmed creatures this implies which of its 3 possible attacks were used. For other attacks this field can be ignored.
-- @field [parent=#AttackInfo] openmw.types#Actor attacker (Optional) Attacking actor
-- @field [parent=#AttackInfo] openmw.types#Weapon weapon (Optional) Attacking weapon
-- @field [parent=#AttackInfo] openmw.types#Weapon ammo (Optional) Ammo
-- @field [parent=#AttackInfo] #string ammo (Optional) Ammo record ID
-- @field [parent=#AttackInfo] openmw.util#Vector3 hitPos (Optional) Where on the victim the attack is landing. Used to spawn blood effects. Blood effects are skipped if nil.
return {
--- Basic combat interface
@ -330,7 +330,7 @@ return {
interface = {
--- Interface version
-- @field [parent=#Combat] #number version
version = 0,
version = 1,
--- Add new onHit handler for this actor
-- If `handler(attack)` returns false, other handlers for