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;