mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-05-04 15:57:59 +03:00
Merge branch 'lua_consume' into 'master'
Refactor consuming mechanics, improve Lua onConsume handler See merge request OpenMW/openmw!1848
This commit is contained in:
commit
e466a812d8
14 changed files with 28 additions and 46 deletions
|
@ -37,7 +37,7 @@ namespace MWBase
|
||||||
virtual void deregisterObject(const MWWorld::Ptr& ptr) = 0;
|
virtual void deregisterObject(const MWWorld::Ptr& ptr) = 0;
|
||||||
virtual void objectAddedToScene(const MWWorld::Ptr& ptr) = 0;
|
virtual void objectAddedToScene(const MWWorld::Ptr& ptr) = 0;
|
||||||
virtual void objectRemovedFromScene(const MWWorld::Ptr& ptr) = 0;
|
virtual void objectRemovedFromScene(const MWWorld::Ptr& ptr) = 0;
|
||||||
virtual void appliedToObject(const MWWorld::Ptr& toPtr, std::string_view recordId, const MWWorld::Ptr& fromPtr) = 0;
|
virtual void itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) = 0;
|
||||||
virtual void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0;
|
virtual void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0;
|
||||||
// TODO: notify LuaManager about other events
|
// TODO: notify LuaManager about other events
|
||||||
// virtual void objectOnHit(const MWWorld::Ptr &ptr, float damage, bool ishealth, const MWWorld::Ptr &object,
|
// virtual void objectOnHit(const MWWorld::Ptr &ptr, float damage, bool ishealth, const MWWorld::Ptr &object,
|
||||||
|
|
|
@ -1100,12 +1100,14 @@ namespace MWClass
|
||||||
return getNpcStats(ptr).isWerewolf() ? 0.0f : Actor::getEncumbrance(ptr);
|
return getNpcStats(ptr).isWerewolf() ? 0.0f : Actor::getEncumbrance(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Npc::apply (const MWWorld::Ptr& ptr, const std::string& id,
|
bool Npc::consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const
|
||||||
const MWWorld::Ptr& actor) const
|
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getLuaManager()->appliedToObject(ptr, id, actor);
|
MWBase::Environment::get().getWorld()->breakInvisibility(actor);
|
||||||
MWMechanics::CastSpell cast(ptr, ptr);
|
MWMechanics::CastSpell cast(actor, actor);
|
||||||
return cast.cast(id);
|
std::string recordId = consumable.getCellRef().getRefId();
|
||||||
|
MWBase::Environment::get().getLuaManager()->itemConsumed(consumable, actor);
|
||||||
|
actor.getClass().getContainerStore(actor).remove(consumable, 1, actor);
|
||||||
|
return cast.cast(recordId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Npc::skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor) const
|
void Npc::skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor) const
|
||||||
|
|
|
@ -110,11 +110,7 @@ namespace MWClass
|
||||||
float getArmorRating (const MWWorld::Ptr& ptr) const override;
|
float getArmorRating (const MWWorld::Ptr& ptr) const override;
|
||||||
///< @return combined armor rating of this actor
|
///< @return combined armor rating of this actor
|
||||||
|
|
||||||
bool apply (const MWWorld::Ptr& ptr, const std::string& id,
|
bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const override;
|
||||||
const MWWorld::Ptr& actor) const override;
|
|
||||||
///< Apply \a id on \a ptr.
|
|
||||||
/// \param actor Actor that is resposible for the ID being applied to \a ptr.
|
|
||||||
/// \return Any effect?
|
|
||||||
|
|
||||||
void adjustScale (const MWWorld::ConstPtr &ptr, osg::Vec3f &scale, bool rendering) const override;
|
void adjustScale (const MWWorld::ConstPtr &ptr, osg::Vec3f &scale, bool rendering) const override;
|
||||||
/// @param rendering Indicates if the scale to adjust is for the rendering mesh, or for the collision mesh
|
/// @param rendering Indicates if the scale to adjust is for the rendering mesh, or for the collision mesh
|
||||||
|
|
|
@ -177,7 +177,7 @@ namespace MWLua
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static_assert(std::is_same_v<EventT, OnConsume>);
|
static_assert(std::is_same_v<EventT, OnConsume>);
|
||||||
callEngineHandlers(mOnConsumeHandlers, arg.mRecordId);
|
callEngineHandlers(mOnConsumeHandlers, arg.mConsumable);
|
||||||
}
|
}
|
||||||
}, event);
|
}, event);
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ namespace MWLua
|
||||||
};
|
};
|
||||||
struct OnConsume
|
struct OnConsume
|
||||||
{
|
{
|
||||||
std::string mRecordId;
|
LObject mConsumable;
|
||||||
};
|
};
|
||||||
using EngineEvent = std::variant<OnActive, OnInactive, OnConsume, OnActivated>;
|
using EngineEvent = std::variant<OnActive, OnInactive, OnConsume, OnActivated>;
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ namespace MWLua
|
||||||
{
|
{
|
||||||
auto* lua = context.mLua;
|
auto* lua = context.mLua;
|
||||||
sol::table api(lua->sol(), sol::create);
|
sol::table api(lua->sol(), sol::create);
|
||||||
api["API_REVISION"] = 23;
|
api["API_REVISION"] = 24;
|
||||||
api["quit"] = [lua]()
|
api["quit"] = [lua]()
|
||||||
{
|
{
|
||||||
Log(Debug::Warning) << "Quit requested by a Lua script.\n" << lua->debugTraceback();
|
Log(Debug::Warning) << "Quit requested by a Lua script.\n" << lua->debugTraceback();
|
||||||
|
|
|
@ -374,9 +374,10 @@ namespace MWLua
|
||||||
mWorldView.getObjectRegistry()->deregisterPtr(ptr);
|
mWorldView.getObjectRegistry()->deregisterPtr(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LuaManager::appliedToObject(const MWWorld::Ptr& toPtr, std::string_view recordId, const MWWorld::Ptr& fromPtr)
|
void LuaManager::itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor)
|
||||||
{
|
{
|
||||||
mLocalEngineEvents.push_back({getId(toPtr), LocalScripts::OnConsume{std::string(recordId)}});
|
mWorldView.getObjectRegistry()->registerPtr(consumable);
|
||||||
|
mLocalEngineEvents.push_back({getId(actor), LocalScripts::OnConsume{LObject(getId(consumable), mWorldView.getObjectRegistry())}});
|
||||||
}
|
}
|
||||||
|
|
||||||
void LuaManager::objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor)
|
void LuaManager::objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor)
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace MWLua
|
||||||
void registerObject(const MWWorld::Ptr& ptr) override;
|
void registerObject(const MWWorld::Ptr& ptr) override;
|
||||||
void deregisterObject(const MWWorld::Ptr& ptr) override;
|
void deregisterObject(const MWWorld::Ptr& ptr) override;
|
||||||
void inputEvent(const InputEvent& event) override { mInputEvents.push_back(event); }
|
void inputEvent(const InputEvent& event) override { mInputEvents.push_back(event); }
|
||||||
void appliedToObject(const MWWorld::Ptr& toPtr, std::string_view recordId, const MWWorld::Ptr& fromPtr) override;
|
void itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) override;
|
||||||
void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) override;
|
void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) override;
|
||||||
|
|
||||||
MWBase::LuaManager::ActorControls* getActorControls(const MWWorld::Ptr&) const override;
|
MWBase::LuaManager::ActorControls* getActorControls(const MWWorld::Ptr&) const override;
|
||||||
|
|
|
@ -85,8 +85,7 @@ namespace MWMechanics
|
||||||
|
|
||||||
void ActionPotion::prepare(const MWWorld::Ptr &actor)
|
void ActionPotion::prepare(const MWWorld::Ptr &actor)
|
||||||
{
|
{
|
||||||
actor.getClass().apply(actor, mPotion.getCellRef().getRefId(), actor);
|
actor.getClass().consume(mPotion, actor);
|
||||||
actor.getClass().getContainerStore(actor).remove(mPotion, 1, actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActionWeapon::prepare(const MWWorld::Ptr &actor)
|
void ActionWeapon::prepare(const MWWorld::Ptr &actor)
|
||||||
|
|
|
@ -17,11 +17,7 @@ namespace MWWorld
|
||||||
|
|
||||||
void ActionApply::executeImp (const Ptr& actor)
|
void ActionApply::executeImp (const Ptr& actor)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->breakInvisibility(actor);
|
actor.getClass().consume(getTarget(), actor);
|
||||||
|
|
||||||
actor.getClass().apply (actor, mId, actor);
|
|
||||||
|
|
||||||
actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,11 +28,8 @@ namespace MWWorld
|
||||||
|
|
||||||
void ActionApplyWithSkill::executeImp (const Ptr& actor)
|
void ActionApplyWithSkill::executeImp (const Ptr& actor)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getWorld()->breakInvisibility(actor);
|
bool consumed = actor.getClass().consume(getTarget(), actor);
|
||||||
|
if (consumed && mUsageType != -1 && actor == MWMechanics::getPlayer())
|
||||||
if (actor.getClass().apply (actor, mId, actor) && mUsageType!=-1 && actor == MWMechanics::getPlayer())
|
|
||||||
actor.getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType);
|
actor.getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType);
|
||||||
|
|
||||||
actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,13 +12,7 @@ namespace MWWorld
|
||||||
{
|
{
|
||||||
void ActionEat::executeImp (const Ptr& actor)
|
void ActionEat::executeImp (const Ptr& actor)
|
||||||
{
|
{
|
||||||
// remove used item (assume the item is present in inventory)
|
if (actor.getClass().consume(getTarget(), actor) && actor == MWMechanics::getPlayer())
|
||||||
getTarget().getContainerStore()->remove(getTarget(), 1, actor);
|
|
||||||
|
|
||||||
// apply to actor
|
|
||||||
std::string id = getTarget().getCellRef().getRefId();
|
|
||||||
|
|
||||||
if (actor.getClass().apply (actor, id, actor) && actor == MWMechanics::getPlayer())
|
|
||||||
actor.getClass().skillUsageSucceeded (actor, ESM::Skill::Alchemy, 1);
|
actor.getClass().skillUsageSucceeded (actor, ESM::Skill::Alchemy, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ namespace MWWorld
|
||||||
void Class::insertObjectPhysics(const Ptr& ptr, const std::string& mesh, const osg::Quat& rotation, MWPhysics::PhysicsSystem& physics) const
|
void Class::insertObjectPhysics(const Ptr& ptr, const std::string& mesh, const osg::Quat& rotation, MWPhysics::PhysicsSystem& physics) const
|
||||||
{}
|
{}
|
||||||
|
|
||||||
bool Class::apply (const MWWorld::Ptr& ptr, const std::string& id, const MWWorld::Ptr& actor) const
|
bool Class::consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,13 +220,8 @@ namespace MWWorld
|
||||||
virtual float getNormalizedEncumbrance (const MWWorld::Ptr& ptr) const;
|
virtual float getNormalizedEncumbrance (const MWWorld::Ptr& ptr) const;
|
||||||
///< Returns encumbrance re-scaled to capacity
|
///< Returns encumbrance re-scaled to capacity
|
||||||
|
|
||||||
virtual bool apply (const MWWorld::Ptr& ptr, const std::string& id,
|
virtual bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const;
|
||||||
const MWWorld::Ptr& actor) const;
|
///< Consume an item, e. g. a potion.
|
||||||
///< Apply \a id on \a ptr.
|
|
||||||
/// \param actor Actor that is resposible for the ID being applied to \a ptr.
|
|
||||||
/// \return Any effect?
|
|
||||||
///
|
|
||||||
/// (default implementation: ignore and return false)
|
|
||||||
|
|
||||||
virtual void skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor=1.f) const;
|
virtual void skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor=1.f) const;
|
||||||
///< Inform actor \a ptr that a skill use has succeeded.
|
///< Inform actor \a ptr that a skill use has succeeded.
|
||||||
|
|
|
@ -66,8 +66,10 @@ Engine handler is a function defined by a script, that can be called by the engi
|
||||||
| the item is placed to the actor's inventory, (2) count of
|
| the item is placed to the actor's inventory, (2) count of
|
||||||
| the original item is set to zero, (3) and only then onActivated is
|
| the original item is set to zero, (3) and only then onActivated is
|
||||||
| called on the original item, so self.count is already zero.
|
| called on the original item, so self.count is already zero.
|
||||||
* - onConsume(recordId)
|
* - onConsume(item)
|
||||||
- Called if `recordId` (e.g. a potion) is consumed.
|
- | Called on an actor when they consume an item (e.g. a potion).
|
||||||
|
| Similarly to onActivated, the item has already been removed
|
||||||
|
| from the actor's inventory, and the count was set to zero.
|
||||||
|
|
||||||
**Only for local scripts attached to a player**
|
**Only for local scripts attached to a player**
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue