diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 8f047ead81..f6e4dbf74b 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -1704,14 +1704,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
// Offset the positions for the new region across the border
Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
- grp.RootPart.GroupPosition = pos;
// If we fail to cross the border, then reset the position of the scene object on that border.
uint x = 0, y = 0;
Utils.LongToUInts(newRegionHandle, out x, out y);
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
- if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent))
+ if (destination == null || !CrossPrimGroupIntoNewRegion(destination, pos, grp, silent))
{
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
@@ -1741,7 +1740,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
/// true if the crossing itself was successful, false on failure
/// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region
///
- protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, SceneObjectGroup grp, bool silent)
+ protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent)
{
//m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<");
@@ -1766,7 +1765,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
//if (m_interregionCommsOut != null)
// successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true);
if (m_aScene.SimulationService != null)
- successYN = m_aScene.SimulationService.CreateObject(destination, grp, true);
+ successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true);
if (successYN)
{
@@ -1825,7 +1824,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
gobj.IsAttachment = false;
//gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName);
- CrossPrimGroupIntoNewRegion(destination, gobj, silent);
+ CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, gobj, silent);
}
}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index a17c6aed22..85e7e94c1e 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -315,7 +315,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
* Object-related communications
*/
- public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
+ public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
{
if (destination == null)
return false;
@@ -330,12 +330,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
// We need to make a local copy of the object
ISceneObject sogClone = sog.CloneForNewScene();
sogClone.SetState(sog.GetStateSnapshot(), s);
- return s.IncomingCreateObject(sogClone);
+ return s.IncomingCreateObject(newPosition, sogClone);
}
else
{
// Use the object as it came through the wire
- return s.IncomingCreateObject(sog);
+ return s.IncomingCreateObject(newPosition, sog);
}
}
}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index f8cea71b43..eaf9506332 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -282,13 +282,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
* Object-related communications
*/
- public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
+ public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
{
if (destination == null)
return false;
// Try local first
- if (m_localBackend.CreateObject(destination, sog, isLocalCall))
+ if (m_localBackend.CreateObject(destination, newPosition, sog, isLocalCall))
{
//m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded");
return true;
@@ -296,7 +296,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
// else do the remote thing
if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
- return m_remoteConnector.CreateObject(destination, sog, isLocalCall);
+ return m_remoteConnector.CreateObject(destination, newPosition, sog, isLocalCall);
return false;
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index e7f835cdb6..7b79732dce 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2317,7 +2317,7 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public bool IncomingCreateObject(ISceneObject sog)
+ public bool IncomingCreateObject(Vector3 newPosition, ISceneObject sog)
{
//m_log.DebugFormat(" >>> IncomingCreateObject(sog) <<< {0} deleted? {1} isAttach? {2}", ((SceneObjectGroup)sog).AbsolutePosition,
// ((SceneObjectGroup)sog).IsDeleted, ((SceneObjectGroup)sog).RootPart.IsAttachment);
@@ -2333,6 +2333,9 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
+ if (newPosition != Vector3.Zero)
+ newObject.RootPart.GroupPosition = newPosition;
+
if (!AddSceneObject(newObject))
{
m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index daf711c673..9cfdf9fe9f 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3223,7 +3223,7 @@ namespace OpenSim.Region.Framework.Scenes
((SceneObjectGroup)so).LocalId = 0;
((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
so.SetState(cAgent.AttachmentObjectStates[i++], m_scene);
- m_scene.IncomingCreateObject(so);
+ m_scene.IncomingCreateObject(Vector3.Zero, so);
}
}
}
diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
index 984b843401..f0d8f69827 100644
--- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
@@ -136,6 +136,8 @@ namespace OpenSim.Server.Handlers.Simulation
int x = 0, y = 0;
UUID uuid = UUID.Zero;
string regionname = string.Empty;
+ Vector3 newPosition = Vector3.Zero;
+
if (args.ContainsKey("destination_x") && args["destination_x"] != null)
Int32.TryParse(args["destination_x"].AsString(), out x);
if (args.ContainsKey("destination_y") && args["destination_y"] != null)
@@ -144,6 +146,8 @@ namespace OpenSim.Server.Handlers.Simulation
UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
if (args.ContainsKey("destination_name") && args["destination_name"] != null)
regionname = args["destination_name"].ToString();
+ if (args.ContainsKey("new_position") && args["new_position"] != null)
+ Vector3.TryParse(args["new_position"], out newPosition);
GridRegion destination = new GridRegion();
destination.RegionID = uuid;
@@ -199,7 +203,7 @@ namespace OpenSim.Server.Handlers.Simulation
try
{
// This is the meaning of POST object
- result = CreateObject(destination, sog);
+ result = CreateObject(destination, newPosition, sog);
}
catch (Exception e)
{
@@ -211,9 +215,9 @@ namespace OpenSim.Server.Handlers.Simulation
}
// subclasses can override this
- protected virtual bool CreateObject(GridRegion destination, ISceneObject sog)
+ protected virtual bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog)
{
- return m_SimulationService.CreateObject(destination, sog, false);
+ return m_SimulationService.CreateObject(destination, newPosition, sog, false);
}
protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, UUID regionID)
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 65f01b39c5..cb003d1dd2 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -408,7 +408,7 @@ namespace OpenSim.Services.Connectors.Simulation
///
///
///
- public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
+ public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
{
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start");
@@ -421,6 +421,7 @@ namespace OpenSim.Services.Connectors.Simulation
args["sog"] = OSD.FromString(sog.ToXml2());
args["extra"] = OSD.FromString(sog.ExtraToXmlString());
args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
+ args["new_position"] = newPosition.ToString();
string state = sog.GetStateSnapshot();
if (state.Length > 0)
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs
index 5f9ce6d8b8..36fd6fcaa9 100644
--- a/OpenSim/Services/Interfaces/ISimulationService.cs
+++ b/OpenSim/Services/Interfaces/ISimulationService.cs
@@ -98,7 +98,7 @@ namespace OpenSim.Services.Interfaces
///
///
///
- bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall);
+ bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall);
///
/// Create an object from the user's inventory in the destination region.