diff --git a/OpenMetaverse/Primitives/Primitive.cs b/OpenMetaverse/Primitives/Primitive.cs
index f5fb2632..da5e0e8e 100644
--- a/OpenMetaverse/Primitives/Primitive.cs
+++ b/OpenMetaverse/Primitives/Primitive.cs
@@ -480,8 +480,7 @@ namespace OpenMetaverse
private const byte HOLE_MASK = 0xF0;
///
- internal byte profileCurve;
-
+ public byte profileCurve;
///
public PathCurve PathCurve;
///
diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs
index 64d69faf..8e8d041d 100644
--- a/Programs/Simian/Extensions/ObjectManager.cs
+++ b/Programs/Simian/Extensions/ObjectManager.cs
@@ -24,6 +24,7 @@ namespace Simian.Extensions
Server.UDPServer.RegisterPacketCallback(PacketType.ObjectAdd, new UDPServer.PacketCallback(ObjectAddHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.ObjectSelect, new UDPServer.PacketCallback(ObjectSelectHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.ObjectDeselect, new UDPServer.PacketCallback(ObjectDeselectHandler));
+ Server.UDPServer.RegisterPacketCallback(PacketType.ObjectShape, new UDPServer.PacketCallback(ObjectShapeHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.DeRezObject, new UDPServer.PacketCallback(DeRezObjectHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.MultipleObjectUpdate, new UDPServer.PacketCallback(MultipleObjectUpdateHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.RequestObjectPropertiesFamily, new UDPServer.PacketCallback(RequestObjectPropertiesFamilyHandler));
@@ -232,6 +233,53 @@ namespace Simian.Extensions
// TODO: Do we need this at all?
}
+ void ObjectShapeHandler(Packet packet, Agent agent)
+ {
+ ObjectShapePacket shape = (ObjectShapePacket)packet;
+
+ for (int i = 0; i < shape.ObjectData.Length; i++)
+ {
+ ObjectShapePacket.ObjectDataBlock block = shape.ObjectData[i];
+
+ SimulationObject obj;
+ if (SceneObjects.TryGetValue(block.ObjectLocalID, out obj))
+ {
+ obj.Prim.PrimData.PathBegin = Primitive.UnpackBeginCut(block.PathBegin);
+ obj.Prim.PrimData.PathCurve = (PathCurve)block.PathCurve;
+ obj.Prim.PrimData.PathEnd = Primitive.UnpackEndCut(block.PathEnd);
+ obj.Prim.PrimData.PathRadiusOffset = Primitive.UnpackPathTwist(block.PathRadiusOffset);
+ obj.Prim.PrimData.PathRevolutions = Primitive.UnpackPathRevolutions(block.PathRevolutions);
+ obj.Prim.PrimData.PathScaleX = Primitive.UnpackPathScale(block.PathScaleX);
+ obj.Prim.PrimData.PathScaleY = Primitive.UnpackPathScale(block.PathScaleY);
+ obj.Prim.PrimData.PathShearX = Primitive.UnpackPathShear((sbyte)block.PathShearX);
+ obj.Prim.PrimData.PathShearY = Primitive.UnpackPathShear((sbyte)block.PathShearY);
+ obj.Prim.PrimData.PathSkew = Primitive.UnpackPathTwist(block.PathSkew);
+ obj.Prim.PrimData.PathTaperX = Primitive.UnpackPathTaper(block.PathTaperX);
+ obj.Prim.PrimData.PathTaperY = Primitive.UnpackPathTaper(block.PathTaperY);
+ obj.Prim.PrimData.PathTwist = Primitive.UnpackPathTwist(block.PathTwist);
+ obj.Prim.PrimData.PathTwistBegin = Primitive.UnpackPathTwist(block.PathTwistBegin);
+ obj.Prim.PrimData.ProfileBegin = Primitive.UnpackBeginCut(block.ProfileBegin);
+ obj.Prim.PrimData.profileCurve = block.ProfileCurve;
+ obj.Prim.PrimData.ProfileEnd = Primitive.UnpackEndCut(block.ProfileEnd);
+ obj.Prim.PrimData.ProfileHollow = Primitive.UnpackProfileHollow(block.ProfileHollow);
+
+ // Send the update out to everyone
+ ObjectUpdatePacket editedobj = Movement.BuildFullUpdate(obj.Prim, String.Empty, obj.Prim.RegionHandle, 0,
+ obj.Prim.Flags);
+ lock (Server.Agents)
+ {
+ foreach (Agent recipient in Server.Agents.Values)
+ recipient.SendPacket(editedobj);
+ }
+ }
+ else
+ {
+ Logger.Log("Got an ObjectShape packet for unknown object " + block.ObjectLocalID,
+ Helpers.LogLevel.Warning);
+ }
+ }
+ }
+
void DeRezObjectHandler(Packet packet, Agent agent)
{
DeRezObjectPacket derez = (DeRezObjectPacket)packet;