diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs
index 48f5cafdfc..4f93976a1a 100644
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs
@@ -370,6 +370,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
pa.ChangingActorID = actorID;
m_validLocalScene.PhysicsScene.AddPhysicsActorTaint(pa);
+
+ //m_log.DebugFormat("HandlePhysUpdateAttributes, ChangingActorID = {0}, PA pos = {1}, data.position={2}", pa.ChangingActorID, pa.Position, data["position"].AsVector3().ToString());
}
else
{
diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs
index cafd53ffd1..37f6674c6d 100644
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs
@@ -369,6 +369,62 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
return;
}
+ case RegionSyncMessage.MsgType.AvatarTeleportSameRegion:
+ {
+ if (PhysEngineToSceneConnectorModule.IsPhysEngineActorS)
+ {
+ OSDMap data = DeserializeMessage(msg);
+ if (data == null)
+ {
+ RegionSyncMessage.HandleError(LogHeader(), msg, "Could not deserialize JSON data.");
+ return;
+ }
+
+ // Get the parameters from data and error check
+ UUID agentID = UUID.Zero;
+ Vector3 pos = Vector3.Zero;
+
+ try
+ {
+ agentID = data["id"].AsUUID();
+ pos = data["pos"].AsVector3();
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat("{0} Caught exception in UpdatedAvatar handler (Decoding JSON): {1}", LogHeader(), e.Message);
+ }
+
+ // Find the presence in the scene and error check
+ ScenePresence presence;
+ m_scene.TryGetScenePresence(agentID, out presence);
+ if (presence == null)
+ {
+ //RegionSyncMessage.HandleWarning(LogHeader(), msg, String.Format("agentID {0} not found.", agentID.ToString()));
+ return;
+ }
+
+ if (presence.IsBalancing && presence.ControllingClient is RegionSyncAvatar)
+ {
+ lock (m_syncRoot)
+ {
+ if (m_localAvatars.ContainsKey(presence.UUID))
+ {
+
+ }
+ else
+ {
+ m_log.WarnFormat("{0} Received update for balancing avatar not in local avatar list. \"{1}\"", LogHeader(), presence.Name);
+ return;
+ }
+ }
+ }
+
+ presence.Teleport(pos);
+
+ //m_log.DebugFormat("Received AvatarTeleportSameRegion: Teleport {0} to pos {1}, now pa.pos = {2}", presence.Name, pos, presence.PhysicsActor.Position);
+ }
+ return;
+ }
case RegionSyncMessage.MsgType.UpdatedAvatar:
{
// Get the data from message and error check
@@ -464,7 +520,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
{
presence.AgentControlFlags = flags;
presence.AbsolutePosition = pos;
- m_log.DebugFormat("{0}: UpdateAvatar. Setting vel={1}", LogHeader(), vel);
+ //m_log.DebugFormat("{0}: UpdateAvatar. Setting vel={1}, AbsolutePosition = {1}", LogHeader(), vel, presence.AbsolutePosition);
presence.Velocity = vel;
presence.Rotation = rot;
// It seems the physics scene can drop an avatar if the avatar makes it angry
diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs
index 24db38cf6b..c7d7c44abe 100644
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs
@@ -66,7 +66,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
ActorConnect,
AgentAdd,
AgentUpdate,
- AgentSameRegionTeleport,
+ AgentSameRegionTeleport, //from CM to PSA
AgentRemove,
AgentRequestSit,
AgentSit,
@@ -83,6 +83,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
ChatFromClient,
AvatarTeleportOut, // An LLClientView (real client) was converted to a RegionSyncAvatar
AvatarTeleportIn, // A RegionSyncAvatar was converted to an LLClientView (real client)
+ AvatarTeleportSameRegion, //from PSA to PE
// SIM -> CM
//Terrain,
//NewObject, // objects
diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncServerModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncServerModule.cs
index a880e1f7e0..79582d1294 100644
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncServerModule.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncServerModule.cs
@@ -234,6 +234,53 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//m_log.DebugFormat("[REGION SYNC SERVER MODULE] QueuePresenceForUpdate: {0}", presence.UUID.ToString());
}
+ ///
+ /// Send a teleport message out. This should only be called when teleporting within the same region.
+ ///
+ ///
+ public void SendTeleportUpdate(ScenePresence presence)
+ {
+ if (!Active || !Synced)
+ return;
+
+ System.Threading.ThreadPool.QueueUserWorkItem(delegate
+ {
+ OSDMap data = new OSDMap(10);
+ data["id"] = OSD.FromUUID(presence.UUID);
+ // Do not include offset for appearance height. That will be handled by RegionSyncClient before sending to viewers
+ if (presence.AbsolutePosition.IsFinite())
+ data["pos"] = OSD.FromVector3(presence.AbsolutePosition);
+ else
+ data["pos"] = OSD.FromVector3(Vector3.Zero);
+ /*
+ if (presence.Velocity.IsFinite())
+ data["vel"] = OSD.FromVector3(presence.Velocity);
+ else
+ data["vel"] = OSD.FromVector3(Vector3.Zero);
+ if (System.Single.IsNaN(presence.Rotation.X))
+ data["rot"] = OSD.FromQuaternion(Quaternion.Identity);
+ else
+ data["rot"] = OSD.FromQuaternion(presence.Rotation);
+ data["fly"] = OSD.FromBoolean(presence.Flying);
+ data["flags"] = OSD.FromUInteger((uint)presence.AgentControlFlags);
+ data["anim"] = OSD.FromString(presence.Animator.CurrentMovementAnimation);
+ // needed for a full update
+ if (presence.ParentID != presence.lastSentParentID)
+ {
+ data["coll"] = OSD.FromVector4(presence.CollisionPlane);
+ data["off"] = OSD.FromVector3(presence.OffsetPosition);
+ data["pID"] = OSD.FromUInteger(presence.ParentID);
+ presence.lastSentParentID = presence.ParentID;
+ }
+ * */
+
+ RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.AvatarTeleportSameRegion, OSDParser.SerializeJsonString(data));
+
+ m_server.Broadcast(rsm);
+ });
+
+ }
+
public void SendUpdates()
{
if (!Active || !Synced)
diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs
index 2e0b19b737..a4bd5f0c5b 100644
--- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs
+++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs
@@ -434,6 +434,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
data["isColliding"] = OSD.FromBoolean(pa.IsColliding);
data["isCollidingGround"] = OSD.FromBoolean(pa.CollidingGround);
+ //m_log.DebugFormat("SendPhysUpdateAttributes, ChangingActorID = {0}, with PA at pos {1}, data.position={2}", pa.ChangingActorID, pa.Position, data["position"].AsVector3().ToString());
+
RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.PhysUpdateAttributes,
OSDParser.SerializeJsonString(data));
Send(rsm);
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionSyncServerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionSyncServerModule.cs
index 1cdf04c40d..176e58cf78 100644
--- a/OpenSim/Region/Framework/Interfaces/IRegionSyncServerModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IRegionSyncServerModule.cs
@@ -44,5 +44,6 @@ namespace OpenSim.Region.Framework.Interfaces
void SendAppearance(UUID agentID);
void SendAnimations(UUID agentID, UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs);
+ void SendTeleportUpdate(ScenePresence presence);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ae547a4c9a..4a4dfbe322 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1099,6 +1099,11 @@ namespace OpenSim.Region.Framework.Scenes
}
SendTerseUpdateToAllClients();
+
+ //This should only happen on PSA and when the teleport is within the same region.
+ //If teleport is to a remote region, CM will handle it and PSA should be
+ //executing inside this function.
+ SendTeleportUpdate();
}
public void TeleportWithMomentum(Vector3 pos)
@@ -3976,5 +3981,20 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+
+ #region REGION SYNC
+ public void SendTeleportUpdate()
+ {
+ // m_log.DebugFormat("[SCENE PRESENCE]: TerseUpdate: UUID={0}, pos={1}", m_physicsActor.UUID.ToString(), m_physicsActor.Position.ToString());
+ // REGION SYNC
+ if (m_scene.IsSyncedServer())
+ {
+ m_scene.RegionSyncServerModule.SendTeleportUpdate(this);
+ // this.PhysicsRequestingTerseUpdate();
+ // m_scene.RegionSyncModule.QueueSceneObjectPartForUpdate(this);
+ return;
+ }
+ }
+ #endregion //REGION SYNC
}
}
diff --git a/OpenSim/Region/Physics/PEPlugin/PEScene.cs b/OpenSim/Region/Physics/PEPlugin/PEScene.cs
index 94d5889d83..d600f9facc 100755
--- a/OpenSim/Region/Physics/PEPlugin/PEScene.cs
+++ b/OpenSim/Region/Physics/PEPlugin/PEScene.cs
@@ -128,6 +128,7 @@ public class PEScene : PhysicsScene
if (actor.ChangingActorID == RegionSyncServerModule.ActorID && actor.lastValues.Changed(actor))
{
SceneToPhysEngineSyncServer.RouteUpdate(actor);
+ actor.ChangingActorID = "YY";
}
}
}