mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-20 05:23:51 +00:00
Merge pull request #2659 from Capostrophic/aitravel
Handle out-of-range actors' travel packages (bug #5212)
This commit is contained in:
commit
2bed25a5e8
7 changed files with 30 additions and 8 deletions
|
@ -180,6 +180,7 @@
|
||||||
Bug #5209: Spellcasting ignores race height
|
Bug #5209: Spellcasting ignores race height
|
||||||
Bug #5210: AiActivate allows actors to open dialogue and inventory windows
|
Bug #5210: AiActivate allows actors to open dialogue and inventory windows
|
||||||
Bug #5211: Screen fades in if the first loaded save is in interior cell
|
Bug #5211: Screen fades in if the first loaded save is in interior cell
|
||||||
|
Bug #5212: AiTravel does not work for actors outside of AI processing range
|
||||||
Bug #5213: SameFaction script function is broken
|
Bug #5213: SameFaction script function is broken
|
||||||
Bug #5218: Crash when disabling ToggleBorders
|
Bug #5218: Crash when disabling ToggleBorders
|
||||||
Bug #5220: GetLOS crashes when actor isn't loaded
|
Bug #5220: GetLOS crashes when actor isn't loaded
|
||||||
|
|
|
@ -1695,6 +1695,11 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (aiActive && iter->first != player && isConscious(iter->first))
|
||||||
|
{
|
||||||
|
CreatureStats &stats = iter->first.getClass().getCreatureStats(iter->first);
|
||||||
|
stats.getAiSequence().execute(iter->first, *ctrl, duration, /*outOfRange*/true);
|
||||||
|
}
|
||||||
|
|
||||||
if(iter->first.getClass().isNpc())
|
if(iter->first.getClass().isNpc())
|
||||||
{
|
{
|
||||||
|
@ -1722,7 +1727,15 @@ namespace MWMechanics
|
||||||
{
|
{
|
||||||
const float dist = (playerPos - iter->first.getRefData().getPosition().asVec3()).length();
|
const float dist = (playerPos - iter->first.getRefData().getPosition().asVec3()).length();
|
||||||
bool isPlayer = iter->first == player;
|
bool isPlayer = iter->first == player;
|
||||||
bool inRange = isPlayer || dist <= mActorsProcessingRange;
|
CreatureStats &stats = iter->first.getClass().getCreatureStats(iter->first);
|
||||||
|
// Actors with active AI should be able to move.
|
||||||
|
bool alwaysActive = false;
|
||||||
|
if (!isPlayer && isConscious(iter->first) && !stats.isParalyzed())
|
||||||
|
{
|
||||||
|
MWMechanics::AiSequence& seq = stats.getAiSequence();
|
||||||
|
alwaysActive = !seq.isEmpty() && seq.getActivePackage()->alwaysActive();
|
||||||
|
}
|
||||||
|
bool inRange = isPlayer || dist <= mActorsProcessingRange || alwaysActive;
|
||||||
int activeFlag = 1; // Can be changed back to '2' to keep updating bounding boxes off screen (more accurate, but slower)
|
int activeFlag = 1; // Can be changed back to '2' to keep updating bounding boxes off screen (more accurate, but slower)
|
||||||
if (isPlayer)
|
if (isPlayer)
|
||||||
activeFlag = 2;
|
activeFlag = 2;
|
||||||
|
|
|
@ -104,6 +104,9 @@ namespace MWMechanics
|
||||||
|
|
||||||
virtual osg::Vec3f getDestination() { return osg::Vec3f(0, 0, 0); }
|
virtual osg::Vec3f getDestination() { return osg::Vec3f(0, 0, 0); }
|
||||||
|
|
||||||
|
// Return true if any loaded actor with this AI package must be active.
|
||||||
|
virtual bool alwaysActive() const { return false; }
|
||||||
|
|
||||||
/// Reset pathfinding state
|
/// Reset pathfinding state
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ bool isActualAiPackage(int packageTypeId)
|
||||||
packageTypeId <= AiPackage::TypeIdActivate);
|
packageTypeId <= AiPackage::TypeIdActivate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AiSequence::execute (const MWWorld::Ptr& actor, CharacterController& characterController, float duration)
|
void AiSequence::execute (const MWWorld::Ptr& actor, CharacterController& characterController, float duration, bool outOfRange)
|
||||||
{
|
{
|
||||||
if(actor != getPlayer())
|
if(actor != getPlayer())
|
||||||
{
|
{
|
||||||
|
@ -209,6 +209,9 @@ void AiSequence::execute (const MWWorld::Ptr& actor, CharacterController& charac
|
||||||
}
|
}
|
||||||
|
|
||||||
MWMechanics::AiPackage* package = mPackages.front();
|
MWMechanics::AiPackage* package = mPackages.front();
|
||||||
|
if (!package->alwaysActive() && outOfRange)
|
||||||
|
return;
|
||||||
|
|
||||||
int packageTypeId = package->getTypeId();
|
int packageTypeId = package->getTypeId();
|
||||||
// workaround ai packages not being handled as in the vanilla engine
|
// workaround ai packages not being handled as in the vanilla engine
|
||||||
if (isActualAiPackage(packageTypeId))
|
if (isActualAiPackage(packageTypeId))
|
||||||
|
|
|
@ -110,7 +110,7 @@ namespace MWMechanics
|
||||||
void stopPursuit();
|
void stopPursuit();
|
||||||
|
|
||||||
/// Execute current package, switching if needed.
|
/// Execute current package, switching if needed.
|
||||||
void execute (const MWWorld::Ptr& actor, CharacterController& characterController, float duration);
|
void execute (const MWWorld::Ptr& actor, CharacterController& characterController, float duration, bool outOfRange=false);
|
||||||
|
|
||||||
/// Simulate the passing of time using the currently active AI package
|
/// Simulate the passing of time using the currently active AI package
|
||||||
void fastForward(const MWWorld::Ptr &actor);
|
void fastForward(const MWWorld::Ptr &actor);
|
||||||
|
|
|
@ -34,6 +34,8 @@ namespace MWMechanics
|
||||||
|
|
||||||
virtual bool useVariableSpeed() const { return true;}
|
virtual bool useVariableSpeed() const { return true;}
|
||||||
|
|
||||||
|
virtual bool alwaysActive() const { return true; }
|
||||||
|
|
||||||
virtual osg::Vec3f getDestination() { return osg::Vec3f(mX, mY, mZ); }
|
virtual osg::Vec3f getDestination() { return osg::Vec3f(mX, mY, mZ); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -103,13 +103,13 @@ actors processing range
|
||||||
:Range: 3584 to 7168
|
:Range: 3584 to 7168
|
||||||
:Default: 7168
|
:Default: 7168
|
||||||
|
|
||||||
This setting allows to specify a distance from player in game units, in which OpenMW updates actor's state.
|
This setting specifies the actor state update distance from the player in game units.
|
||||||
Actor state update includes AI, animations, and physics processing.
|
Actor state update includes AI, animations, and physics processing.
|
||||||
Actors near that border start softly fade out instead of just appearing/disapperaing.
|
Actors close to this distance softly fade in and out instead of appearing or disappearing abruptly.
|
||||||
It is not recommended to change this value from default if you use mods with
|
Keep in mind that actors running Travel AI packages are always active to avoid
|
||||||
long-range AiTravel packages (e.g. patrols, caravans and travellers).
|
issues in mods with long-range AiTravel packages (for example, patrols, caravans and travellers).
|
||||||
|
|
||||||
This setting can be controlled in game with the "Actors processing range slider" in the Prefs panel of the Options menu.
|
This setting can be controlled in game with the "Actors Processing Range" slider in the Prefs panel of the Options menu.
|
||||||
|
|
||||||
classic reflected absorb spells behavior
|
classic reflected absorb spells behavior
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue