From e50a2e2ce21d74f7d575f97201c246c1cd00bee5 Mon Sep 17 00:00:00 2001
From: MW
Date: Sun, 4 Nov 2007 14:06:41 +0000
Subject: Applying Teravus patch # 557. Some glue code for the updating of
 prim's velocity.

---
 OpenSim/Framework/IClientAPI.cs                    |  4 +-
 OpenSim/Region/ClientStack/ClientView.API.cs       | 43 +++++++++++++++++-----
 .../Region/Environment/Scenes/SceneObjectPart.cs   | 38 +++++++++++++++++--
 .../Region/Examples/SimpleApp/MyNpcCharacter.cs    |  6 ++-
 4 files changed, 76 insertions(+), 15 deletions(-)

diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 62c50d5..7fcbe9e 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -414,6 +414,8 @@ namespace OpenSim.Framework
 
         void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
                                  LLQuaternion rotation);
+        void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
+                                 LLQuaternion rotation,LLVector3 velocity);
 
         void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List<InventoryItemBase> items);
         void SendInventoryItemDetails(LLUUID ownerID, InventoryItemBase item);
@@ -444,4 +446,4 @@ namespace OpenSim.Framework
         event Action<IClientAPI> OnConnectionClosed;
         void SendLogoutPacket();
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs
index 83b4cbc..b02fcf6 100644
--- a/OpenSim/Region/ClientStack/ClientView.API.cs
+++ b/OpenSim/Region/ClientStack/ClientView.API.cs
@@ -1049,14 +1049,28 @@ namespace OpenSim.Region.ClientStack
         public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
                                         LLQuaternion rotation)
         {
+            LLVector3 velocity = new LLVector3(0f,0f,0f);
             ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
             terse.RegionData.RegionHandle = regionHandle;
             terse.RegionData.TimeDilation = timeDilation;
             terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
-            terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation);
+            terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity);
 
             OutPacket(terse);
         }
+        public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
+                                        LLQuaternion rotation, LLVector3 velocity)
+        {
+            
+            ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
+            terse.RegionData.RegionHandle = regionHandle;
+            terse.RegionData.TimeDilation = timeDilation;
+            terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
+            terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity);
+
+            OutPacket(terse);
+        }
+        
 
         #endregion
 
@@ -1158,7 +1172,7 @@ namespace OpenSim.Region.ClientStack
         /// <returns></returns>
         protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID,
                                                                                           LLVector3 position,
-                                                                                          LLQuaternion rotation)
+                                                                                          LLQuaternion rotation, LLVector3 velocity)
         {
             uint ID = localID;
             byte[] bytes = new byte[60];
@@ -1178,13 +1192,24 @@ namespace OpenSim.Region.ClientStack
             i += 12;
             ushort ac = 32767;
 
+            ushort velx, vely, velz;
+            Vector3 vel = new Vector3(velocity.X, velocity.Y, velocity.Z);
+
+            vel = vel/128.0f;
+            vel.x += 1;
+            vel.y += 1;
+            vel.z += 1;
             //vel
-            bytes[i++] = (byte) (ac%256);
-            bytes[i++] = (byte) ((ac >> 8)%256);
-            bytes[i++] = (byte) (ac%256);
-            bytes[i++] = (byte) ((ac >> 8)%256);
-            bytes[i++] = (byte) (ac%256);
-            bytes[i++] = (byte) ((ac >> 8)%256);
+            velx = (ushort)(32768 * (vel.x));
+            vely = (ushort)(32768 * (vel.y));
+            velz = (ushort)(32768 * (vel.z));
+
+            bytes[i++] = (byte) (velx % 256);
+            bytes[i++] = (byte) ((velx >> 8) % 256);
+            bytes[i++] = (byte) (vely % 256);
+            bytes[i++] = (byte) ((vely >> 8) % 256);
+            bytes[i++] = (byte) (velz % 256);
+            bytes[i++] = (byte) ((velz >> 8) % 256);
 
             //accel
             bytes[i++] = (byte) (ac%256);
@@ -1372,4 +1397,4 @@ namespace OpenSim.Region.ClientStack
 
         #endregion
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 535e765..1852ba7 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -235,7 +235,22 @@ namespace OpenSim.Region.Environment.Scenes
         /// <summary></summary>
         public LLVector3 Velocity
         {
-            get { return m_velocity; }
+            get {
+                //if (PhysActor.Velocity.x != 0 || PhysActor.Velocity.y != 0
+                //|| PhysActor.Velocity.z != 0)
+                //{
+                if (PhysActor != null)
+                {
+                    if (PhysActor.IsPhysical)
+                    {
+                        m_velocity.X = PhysActor.Velocity.X;
+                        m_velocity.Y = PhysActor.Velocity.Y;
+                        m_velocity.Z = PhysActor.Velocity.Z;
+                    }
+                }
+                
+                return m_velocity; 
+            }
             set { m_velocity = value; }
         }
 
@@ -995,13 +1010,28 @@ namespace OpenSim.Region.Environment.Scenes
             LLVector3 lPos;
             lPos = OffsetPosition;
             LLQuaternion mRot = RotationOffset;
-            remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot);
+            if ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) == 0)
+            {
+                remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot);
+            }
+            else
+            {
+                remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot, Velocity);
+            }
         }
 
         public void SendTerseUpdateToClient(IClientAPI remoteClient, LLVector3 lPos)
         {
             LLQuaternion mRot = RotationOffset;
-            remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot);
+            if ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) == 0)
+            {
+                remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot);
+            }
+            else
+            {
+                remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot, Velocity);
+                //System.Console.WriteLine("Vel:" + Velocity);
+            }
         }
 
         #endregion
@@ -1113,4 +1143,4 @@ namespace OpenSim.Region.Environment.Scenes
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
index 9ed1f35..e7a09ac 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
@@ -281,6 +281,10 @@ namespace SimpleApp
                                                 LLVector3 position, LLQuaternion rotation)
         {
         }
+        public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
+                                        LLVector3 position, LLQuaternion rotation,LLVector3 velocity)
+        {
+        }
 
         public virtual void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List<InventoryItemBase> items)
         {
@@ -430,4 +434,4 @@ namespace SimpleApp
         {
         }
     }
-}
\ No newline at end of file
+}
-- 
cgit v1.1