mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-23 15:40:42 +00:00
Don't re-enable collision object for dead actors
This commit is contained in:
parent
9f716b9ed8
commit
a584aa25ab
@ -310,7 +310,7 @@ namespace MWBase
|
|||||||
|
|
||||||
virtual bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) = 0;
|
virtual bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) = 0;
|
||||||
|
|
||||||
virtual void setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled) = 0;
|
virtual void setActorCollisionMode(const MWWorld::Ptr& ptr, bool internal, bool external) = 0;
|
||||||
virtual bool isActorCollisionEnabled(const MWWorld::Ptr& ptr) = 0;
|
virtual bool isActorCollisionEnabled(const MWWorld::Ptr& ptr) = 0;
|
||||||
|
|
||||||
virtual bool toggleCollisionMode() = 0;
|
virtual bool toggleCollisionMode() = 0;
|
||||||
|
@ -1454,7 +1454,7 @@ namespace MWMechanics
|
|||||||
if (!inRange)
|
if (!inRange)
|
||||||
{
|
{
|
||||||
iter->first.getRefData().getBaseNode()->setNodeMask(0);
|
iter->first.getRefData().getBaseNode()->setNodeMask(0);
|
||||||
world->setActorCollisionMode(iter->first, false);
|
world->setActorCollisionMode(iter->first, false, false);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (!isPlayer)
|
else if (!isPlayer)
|
||||||
@ -1471,7 +1471,7 @@ namespace MWMechanics
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
world->setActorCollisionMode(iter->first, true);
|
world->setActorCollisionMode(iter->first, true, !iter->first.getClass().getCreatureStats(iter->first).isDeathAnimationFinished());
|
||||||
ctrl->update(duration);
|
ctrl->update(duration);
|
||||||
|
|
||||||
// Fade away actors on large distance (>90% of actor's processing distance)
|
// Fade away actors on large distance (>90% of actor's processing distance)
|
||||||
|
@ -1216,33 +1216,6 @@ namespace MWPhysics
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled)
|
|
||||||
{
|
|
||||||
ActorMap::iterator found = mActors.find(ptr);
|
|
||||||
if (found != mActors.end())
|
|
||||||
{
|
|
||||||
bool cmode = found->second->getCollisionMode();
|
|
||||||
if (cmode == enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
cmode = enabled;
|
|
||||||
found->second->enableCollisionMode(cmode);
|
|
||||||
found->second->enableCollisionBody(cmode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PhysicsSystem::isActorCollisionEnabled(const MWWorld::Ptr& ptr)
|
|
||||||
{
|
|
||||||
ActorMap::iterator found = mActors.find(ptr);
|
|
||||||
if (found != mActors.end())
|
|
||||||
{
|
|
||||||
bool cmode = found->second->getCollisionMode();
|
|
||||||
return cmode;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PhysicsSystem::queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &movement)
|
void PhysicsSystem::queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &movement)
|
||||||
{
|
{
|
||||||
PtrVelocityList::iterator iter = mMovementQueue.begin();
|
PtrVelocityList::iterator iter = mMovementQueue.begin();
|
||||||
|
@ -92,8 +92,6 @@ namespace MWPhysics
|
|||||||
const HeightField* getHeightField(int x, int y) const;
|
const HeightField* getHeightField(int x, int y) const;
|
||||||
|
|
||||||
bool toggleCollisionMode();
|
bool toggleCollisionMode();
|
||||||
bool isActorCollisionEnabled(const MWWorld::Ptr& ptr);
|
|
||||||
void setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled);
|
|
||||||
|
|
||||||
void stepSimulation(float dt);
|
void stepSimulation(float dt);
|
||||||
void debugDraw();
|
void debugDraw();
|
||||||
|
@ -1684,14 +1684,20 @@ namespace MWWorld
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled)
|
void World::setActorCollisionMode(const MWWorld::Ptr& ptr, bool internal, bool external)
|
||||||
{
|
{
|
||||||
mPhysics->setActorCollisionMode(ptr, enabled);
|
MWPhysics::Actor *physicActor = mPhysics->getActor(ptr);
|
||||||
|
if (physicActor && physicActor->getCollisionMode() != internal)
|
||||||
|
{
|
||||||
|
physicActor->enableCollisionMode(internal);
|
||||||
|
physicActor->enableCollisionBody(external);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool World::isActorCollisionEnabled(const MWWorld::Ptr& ptr)
|
bool World::isActorCollisionEnabled(const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
return mPhysics->isActorCollisionEnabled(ptr);
|
MWPhysics::Actor *physicActor = mPhysics->getActor(ptr);
|
||||||
|
return physicActor && physicActor->getCollisionMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool World::toggleCollisionMode()
|
bool World::toggleCollisionMode()
|
||||||
|
@ -419,7 +419,7 @@ namespace MWWorld
|
|||||||
|
|
||||||
bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) override;
|
bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) override;
|
||||||
|
|
||||||
void setActorCollisionMode(const Ptr& ptr, bool enabled) override;
|
void setActorCollisionMode(const Ptr& ptr, bool internal, bool external) override;
|
||||||
bool isActorCollisionEnabled(const Ptr& ptr) override;
|
bool isActorCollisionEnabled(const Ptr& ptr) override;
|
||||||
|
|
||||||
bool toggleCollisionMode() override;
|
bool toggleCollisionMode() override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user