From 8af272b3abdb4ecc64fa7cf46ef0205e4398f01c Mon Sep 17 00:00:00 2001
From: Charles Krinke
Date: Thu, 1 Nov 2007 03:56:54 +0000
Subject: Thank you, Melanie for solving: When receiving an ObjectAdd packet,
 the Rotation member is silently ignored and the prim is created with 0,0,0,1
 rotation. The patch introduces a fix that passes the Rotation parameter from
 the packet to the object and uses it in the actual object creation.

---
 OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs |  2 +-
 OpenSim/Region/Environment/Scenes/Scene.cs              |  6 +++---
 OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs   | 14 +++++++++++---
 OpenSim/Region/Environment/Scenes/SceneObjectPart.cs    |  9 +++++++--
 4 files changed, 22 insertions(+), 9 deletions(-)

(limited to 'OpenSim/Region')

diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
index 3b996d5..1e14587 100644
--- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -243,7 +243,7 @@ namespace OpenSim.Region.ClientStack
                         {
                             ObjectAddPacket addPacket = (ObjectAddPacket) Pack;
                             PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
-                            OnAddPrim(AgentId, addPacket.ObjectData.RayEnd, shape);
+                            OnAddPrim(AgentId, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation, shape);
                         }
                         break;
                     case PacketType.ObjectShape:
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index e37ad59..8da22c4 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -568,12 +568,12 @@ namespace OpenSim.Region.Environment.Scenes
         /// </summary>
         /// <param name="addPacket"></param>
         /// <param name="ownerID"></param>
-        public void AddNewPrim(LLUUID ownerID, LLVector3 pos, PrimitiveBaseShape shape)
+        public void AddNewPrim(LLUUID ownerID, LLVector3 pos, LLQuaternion rot, PrimitiveBaseShape shape)
         {
             if (PermissionsMngr.CanRezObject(ownerID, pos))
             {
                 SceneObjectGroup sceneOb =
-                    new SceneObjectGroup(this, m_regionHandle, ownerID, PrimIDAllocate(), pos, shape);
+                    new SceneObjectGroup(this, m_regionHandle, ownerID, PrimIDAllocate(), pos, rot, shape);
                 AddEntity(sceneOb);
                 SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID);
                 // if grass or tree, make phantom
@@ -1565,4 +1565,4 @@ namespace OpenSim.Region.Environment.Scenes
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 2f86d2f..aaa25e7 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -322,7 +322,7 @@ namespace OpenSim.Region.Environment.Scenes
         /// 
         /// </summary>
         public SceneObjectGroup(Scene scene, ulong regionHandle, LLUUID ownerID, uint localID, LLVector3 pos,
-                                PrimitiveBaseShape shape)
+                                LLQuaternion rot, PrimitiveBaseShape shape)
         {
             m_regionHandle = regionHandle;
             m_scene = scene;
@@ -330,13 +330,21 @@ namespace OpenSim.Region.Environment.Scenes
             // this.Pos = pos;
             LLVector3 rootOffset = new LLVector3(0, 0, 0);
             SceneObjectPart newPart =
-                new SceneObjectPart(m_regionHandle, this, ownerID, localID, shape, pos, rootOffset);
+                new SceneObjectPart(m_regionHandle, this, ownerID, localID, shape, pos, rot, rootOffset);
             m_parts.Add(newPart.UUID, newPart);
             SetPartAsRoot(newPart);
 
             AttachToBackup();
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        public SceneObjectGroup(Scene scene, ulong regionHandle, LLUUID ownerID, uint localID, LLVector3 pos,
+                                PrimitiveBaseShape shape):this(scene, regionHandle, ownerID, localID, pos, LLQuaternion.Identity, shape)
+		{
+        }
+
         #endregion
 
         public string ToXmlString()
@@ -1386,4 +1394,4 @@ namespace OpenSim.Region.Environment.Scenes
             Text = text;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 80723fa..dacac4b 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -271,6 +271,11 @@ namespace OpenSim.Region.Environment.Scenes
         {
         }
 
+        public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, LLUUID ownerID, uint localID,
+                               PrimitiveBaseShape shape, LLVector3 groupPosition, LLVector3 offsetPosition):this(regionHandle, parent, ownerID, localID, shape, groupPosition, LLQuaternion.Identity, offsetPosition)
+		{
+		}
+
         /// <summary>
         /// Create a completely new SceneObjectPart (prim)
         /// </summary>
@@ -281,7 +286,7 @@ namespace OpenSim.Region.Environment.Scenes
         /// <param name="shape"></param>
         /// <param name="position"></param>
         public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, LLUUID ownerID, uint localID,
-                               PrimitiveBaseShape shape, LLVector3 groupPosition, LLVector3 offsetPosition)
+                               PrimitiveBaseShape shape, LLVector3 groupPosition, LLQuaternion rotationOffset, LLVector3 offsetPosition)
         {
             m_name = "Primitive";
             m_regionHandle = regionHandle;
@@ -297,7 +302,7 @@ namespace OpenSim.Region.Environment.Scenes
 
             GroupPosition = groupPosition;
             OffsetPosition = offsetPosition;
-            RotationOffset = LLQuaternion.Identity;
+            RotationOffset = rotationOffset;
             Velocity = new LLVector3(0, 0, 0);
             AngularVelocity = new LLVector3(0, 0, 0);
             Acceleration = new LLVector3(0, 0, 0);
-- 
cgit v1.1