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/Region/ClientStack/ClientView.API.cs | 43 +++++++++++++++++----- .../Region/Environment/Scenes/SceneObjectPart.cs | 38 +++++++++++++++++-- .../Region/Examples/SimpleApp/MyNpcCharacter.cs | 6 ++- 3 files changed, 73 insertions(+), 14 deletions(-) (limited to 'OpenSim/Region') 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 /// 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 /// 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 items) { @@ -430,4 +434,4 @@ namespace SimpleApp { } } -} \ No newline at end of file +} -- cgit v1.1