diff --git a/apps/openmw/mwmp/Cell.cpp b/apps/openmw/mwmp/Cell.cpp index dd9211d31..edf8e40ad 100644 --- a/apps/openmw/mwmp/Cell.cpp +++ b/apps/openmw/mwmp/Cell.cpp @@ -99,6 +99,18 @@ void Cell::readPositions(ActorList& actorList) DedicatedActor *actor = dedicatedActors[mapIndex]; actor->position = baseActor.position; actor->direction = baseActor.direction; + + if (!actor->hasPositionData) + { + actor->hasPositionData = true; + + // If this is our first packet about this actor's position, force an update + // now instead of waiting for its frame + // + // That way, if this actor is about to become a LocalActor, initial data about it + // received from the server still gets set + actor->setPosition(); + } } } } diff --git a/apps/openmw/mwmp/DedicatedActor.cpp b/apps/openmw/mwmp/DedicatedActor.cpp index 09c4996bc..5e95d47cb 100644 --- a/apps/openmw/mwmp/DedicatedActor.cpp +++ b/apps/openmw/mwmp/DedicatedActor.cpp @@ -29,6 +29,7 @@ DedicatedActor::DedicatedActor() animation.groupname = ""; sound = ""; + hasPositionData = false; hasStatsDynamicData = false; hasChangedCell = true; @@ -77,7 +78,7 @@ void DedicatedActor::move(float dt) } else { - world->moveObject(ptr, position.pos[0], position.pos[1], position.pos[2]); + setPosition(); hasChangedCell = false; } @@ -89,6 +90,12 @@ void DedicatedActor::move(float dt) world->rotateObject(ptr, position.rot[0], position.rot[1], position.rot[2]); } +void DedicatedActor::setPosition() +{ + MWBase::World *world = MWBase::Environment::get().getWorld(); + world->moveObject(ptr, position.pos[0], position.pos[1], position.pos[2]); +} + void DedicatedActor::setAnimFlags() { using namespace MWMechanics; diff --git a/apps/openmw/mwmp/DedicatedActor.hpp b/apps/openmw/mwmp/DedicatedActor.hpp index d2623c543..059101751 100644 --- a/apps/openmw/mwmp/DedicatedActor.hpp +++ b/apps/openmw/mwmp/DedicatedActor.hpp @@ -15,8 +15,9 @@ namespace mwmp virtual ~DedicatedActor(); void update(float dt); - void setCell(MWWorld::CellStore *cellStore); void move(float dt); + void setCell(MWWorld::CellStore *cellStore); + void setPosition(); void setAnimFlags(); void playAnimation(); void playSound();