private void TerseUpdateHandler(Packet packet, Simulator simulator) { float x, y, z, w; uint localid; LLVector4 CollisionPlane = null; LLVector3 Position; LLVector3 Velocity; LLVector3 Acceleration; LLQuaternion Rotation; LLVector3 RotationVelocity; ImprovedTerseObjectUpdatePacket update = (ImprovedTerseObjectUpdatePacket)packet; foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock block in update.ObjectData) { int i = 0; bool avatar; localid = (uint)(block.Data[i++] + (block.Data[i++] << 8) + (block.Data[i++] << 16) + (block.Data[i++] << 24)); byte state = block.Data[i++]; avatar = Convert.ToBoolean(block.Data[i++]); if (avatar) { if (OnAvatarMoved == null) { return; } CollisionPlane = new LLVector4(block.Data, i); i += 16; } else { if (OnPrimMoved == null) { return; } } // Position Position = new LLVector3(block.Data, i); i += 12; // Velocity x = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; y = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; z = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; Velocity = new LLVector3(x, y, z); // Acceleration x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; Acceleration = new LLVector3(x, y, z); // Rotation x = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; y = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; z = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; w = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; Rotation = new LLQuaternion(x, y, z, w); // Rotation velocity x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; RotationVelocity = new LLVector3(x, y, z); if (avatar) { if (localid == Client.Self.LocalID) { Client.Self.Position = Position; Client.Self.Rotation = Rotation; } AvatarUpdate avupdate = new AvatarUpdate(); avupdate.LocalID = localid; avupdate.State = state; avupdate.Position = Position; avupdate.CollisionPlane = CollisionPlane; avupdate.Velocity = Velocity; avupdate.Acceleration = Acceleration; avupdate.Rotation = Rotation; avupdate.RotationVelocity = RotationVelocity; if (OnAvatarMoved != null) { OnAvatarMoved(simulator, avupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } else { // TODO: Is there an easy way to distinguish prims from trees in this packet, // or would the client have to do it's own lookup to determine whether it's a // prim or a tree? If the latter, we should rename this update to something // less prim specific PrimUpdate primupdate = new PrimUpdate(); primupdate.LocalID = localid; primupdate.State = state; primupdate.Position = Position; primupdate.Velocity = Velocity; primupdate.Acceleration = Acceleration; primupdate.Rotation = Rotation; primupdate.RotationVelocity = RotationVelocity; if (OnPrimMoved != null) { OnPrimMoved(simulator, primupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } } }
private void TerseUpdateHandler(Packet packet, Simulator simulator) { float x, y, z, w; uint localid; LLVector4 CollisionPlane = LLVector4.Zero; LLVector3 Position; LLVector3 Velocity; LLVector3 Acceleration; LLQuaternion Rotation; LLVector3 RotationVelocity; ImprovedTerseObjectUpdatePacket update = (ImprovedTerseObjectUpdatePacket)packet; foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock block in update.ObjectData) { int i = 0; bool avatar; localid = (uint)(block.Data[i++] + (block.Data[i++] << 8) + (block.Data[i++] << 16) + (block.Data[i++] << 24)); byte state = block.Data[i++]; avatar = Convert.ToBoolean(block.Data[i++]); if (avatar) { if (OnAvatarMoved == null) return; CollisionPlane = new LLVector4(block.Data, i); i += 16; } else { if (OnPrimMoved == null) return; } // Position Position = new LLVector3(block.Data, i); i += 12; // Velocity x = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; y = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; z = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; Velocity = new LLVector3(x, y, z); // Acceleration x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; Acceleration = new LLVector3(x, y, z); // Rotation x = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; y = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; z = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; w = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; Rotation = new LLQuaternion(x, y, z, w); // Rotation velocity x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; RotationVelocity = new LLVector3(x, y, z); if (avatar) { if (localid == Client.Self.LocalID) { Client.Self.Position = Position; Client.Self.Rotation = Rotation; } AvatarUpdate avupdate = new AvatarUpdate(); avupdate.LocalID = localid; avupdate.State = state; avupdate.Position = Position; avupdate.CollisionPlane = CollisionPlane; avupdate.Velocity = Velocity; avupdate.Acceleration = Acceleration; avupdate.Rotation = Rotation; avupdate.RotationVelocity = RotationVelocity; avupdate.Textures = new TextureEntry(block.TextureEntry, 4, block.TextureEntry.Length - 4); if (OnAvatarMoved != null) { OnAvatarMoved(simulator, avupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } else { // TODO: Is there an easy way to distinguish prims from trees in this packet, // or would the client have to do it's own lookup to determine whether it's a // prim or a tree? If the latter, we should rename this update to something // less prim specific PrimUpdate primupdate = new PrimUpdate(); primupdate.LocalID = localid; primupdate.State = state; primupdate.Position = Position; primupdate.Velocity = Velocity; primupdate.Acceleration = Acceleration; primupdate.Rotation = Rotation; primupdate.RotationVelocity = RotationVelocity; primupdate.Textures = new TextureEntry(block.TextureEntry, 4, block.TextureEntry.Length - 4); if (OnPrimMoved != null) { OnPrimMoved(simulator, primupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } } }
private void Objects_OnAvatarMoved(Simulator simulator, AvatarUpdate avatar, ulong regionHandle, ushort timeDilation) { lock (AvatarList) { if (AvatarList.ContainsKey(avatar.LocalID)) { AvatarList[avatar.LocalID].Position = avatar.Position; AvatarList[avatar.LocalID].Rotation = avatar.Rotation; } } }