From a77bd6652fc8bf3ae3612f35479c0b184103a835 Mon Sep 17 00:00:00 2001
From: David Cernat <davidcernat@gmail.com>
Date: Mon, 1 May 2017 21:55:50 +0300
Subject: [PATCH] [Client] Read ActorPosition packets sent from Lua script cell
 loads

---
 apps/openmw/mwmp/Cell.cpp           | 12 ++++++++++++
 apps/openmw/mwmp/DedicatedActor.cpp |  9 ++++++++-
 apps/openmw/mwmp/DedicatedActor.hpp |  3 ++-
 3 files changed, 22 insertions(+), 2 deletions(-)

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();