1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-12-19 17:23:07 +00:00

FEAT: Add a binding for passing time in world

This commit is contained in:
Dave Corley 2025-10-07 11:24:13 -05:00 committed by Alexei Kotov
parent ebfe91a108
commit 209b7fd5c6
8 changed files with 30 additions and 1 deletions

View file

@ -309,6 +309,7 @@ namespace MWBase
virtual float getAngleToPlayer(const MWWorld::Ptr& ptr) const = 0; virtual float getAngleToPlayer(const MWWorld::Ptr& ptr) const = 0;
virtual MWMechanics::GreetingState getGreetingState(const MWWorld::Ptr& ptr) const = 0; virtual MWMechanics::GreetingState getGreetingState(const MWWorld::Ptr& ptr) const = 0;
virtual bool isTurningToPlayer(const MWWorld::Ptr& ptr) const = 0; virtual bool isTurningToPlayer(const MWWorld::Ptr& ptr) const = 0;
virtual void fastForwardAi() const = 0;
}; };
} }

View file

@ -210,6 +210,8 @@ namespace MWBase
virtual void advanceTime(double hours, bool incremental = false) = 0; virtual void advanceTime(double hours, bool incremental = false) = 0;
///< Advance in-game time. ///< Advance in-game time.
virtual void fastForwardAi() const = 0;
virtual MWWorld::TimeStamp getTimeStamp() const = 0; virtual MWWorld::TimeStamp getTimeStamp() const = 0;
///< Return current in-game time and number of day since new game start. ///< Return current in-game time and number of day since new game start.

View file

@ -60,7 +60,16 @@ namespace MWLua
{ {
using Misc::FiniteFloat; using Misc::FiniteFloat;
MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager(); Misc::NotNullPtr<MWBase::World> world = MWBase::Environment::get().getWorld();
MWWorld::DateTimeManager* timeManager = world->getTimeManager();
api["advanceTime"] = [context, world](const FiniteFloat hours) {
if (hours <= 0.0f)
throw std::runtime_error("Time may only be advanced forward");
world->advanceTime(hours);
world->fastForwardAi();
};
api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); }; api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); };
api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) { api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) {

View file

@ -2071,4 +2071,9 @@ namespace MWMechanics
{ {
return mActors.isTurningToPlayer(ptr); return mActors.isTurningToPlayer(ptr);
} }
void MechanicsManager::fastForwardAi() const
{
mActors.fastForwardAi();
}
} }

View file

@ -242,6 +242,7 @@ namespace MWMechanics
float getAngleToPlayer(const MWWorld::Ptr& ptr) const override; float getAngleToPlayer(const MWWorld::Ptr& ptr) const override;
GreetingState getGreetingState(const MWWorld::Ptr& ptr) const override; GreetingState getGreetingState(const MWWorld::Ptr& ptr) const override;
bool isTurningToPlayer(const MWWorld::Ptr& ptr) const override; bool isTurningToPlayer(const MWWorld::Ptr& ptr) const override;
void fastForwardAi() const override;
private: private:
bool canCommitCrimeAgainst(const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker); bool canCommitCrimeAgainst(const MWWorld::Ptr& victim, const MWWorld::Ptr& attacker);

View file

@ -919,6 +919,11 @@ namespace MWWorld
} }
} }
void World::fastForwardAi() const
{
MWBase::Environment::get().getMechanicsManager()->fastForwardAi();
}
TimeStamp World::getTimeStamp() const TimeStamp World::getTimeStamp() const
{ {
return mTimeManager->getTimeStamp(); return mTimeManager->getTimeStamp();

View file

@ -309,6 +309,8 @@ namespace MWWorld
void advanceTime(double hours, bool incremental = false) override; void advanceTime(double hours, bool incremental = false) override;
///< Advance in-game time. ///< Advance in-game time.
void fastForwardAi() const override;
TimeStamp getTimeStamp() const override; TimeStamp getTimeStamp() const override;
///< Return current in-game time and number of day since new game start. ///< Return current in-game time and number of day since new game start.

View file

@ -205,4 +205,8 @@
-- core.sendGlobalEvent('SpawnVfx', {model = model, position = pos}) -- core.sendGlobalEvent('SpawnVfx', {model = model, position = pos})
-- --
---
-- Advance the world time by a certain number of hours. This advances time, weather, and AI, but does not perform other functions associated with the passage of time, eg regeneration.
-- @function [parent=#world] advanceTime
return nil return nil