From 7e07cf44f4ded3a6535f39d3810c8ebcb92ea01d Mon Sep 17 00:00:00 2001 From: Date: Sat, 30 Aug 2008 22:48:37 +0000 Subject: [PATCH] Added support for linked sets in Simian (unlinking is not yet supported). Moved static BuildFullUpdate and related functions to SimulationObject.cs git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2190 52acb1d6-8a22-11de-b505-999d5b087335 --- Programs/Simian/Extensions/AvatarManager.cs | 2 +- .../Simian/Extensions/ConnectionManagement.cs | 7 ++ Programs/Simian/Extensions/Messaging.cs | 2 + Programs/Simian/Extensions/Movement.cs | 71 +-------------- Programs/Simian/Extensions/ObjectManager.cs | 69 +++++++++++++-- Programs/Simian/Extensions/SceneManager.cs | 9 +- Programs/Simian/Extensions/UDPServer.cs | 8 ++ Programs/Simian/SimulationObject.cs | 87 +++++++++++++++++++ 8 files changed, 178 insertions(+), 77 deletions(-) diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs index adb30388..447cd5e3 100644 --- a/Programs/Simian/Extensions/AvatarManager.cs +++ b/Programs/Simian/Extensions/AvatarManager.cs @@ -220,7 +220,7 @@ namespace Simian.Extensions //TODO: What is WearableData used for? - ObjectUpdatePacket update = Movement.BuildFullUpdate(agent.Avatar, + ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(agent.Avatar, NameValue.NameValuesToString(agent.Avatar.NameValues), Server.RegionHandle, agent.State, agent.Flags | PrimFlags.ObjectYouOwner); Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State); diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs index e41e28d4..cb488851 100644 --- a/Programs/Simian/Extensions/ConnectionManagement.cs +++ b/Programs/Simian/Extensions/ConnectionManagement.cs @@ -97,6 +97,13 @@ namespace Simian.Extensions } server.UDP.RemoveClient(agent); + + //HACK: Notify everyone when someone logs off + OfflineNotificationPacket offline = new OfflineNotificationPacket(); + offline.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[1]; + offline.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); + offline.AgentBlock[0].AgentID = agent.AgentID; + server.UDP.BroadcastPacket(offline, PacketCategory.State); } } } diff --git a/Programs/Simian/Extensions/Messaging.cs b/Programs/Simian/Extensions/Messaging.cs index f45ff251..3d2dc872 100644 --- a/Programs/Simian/Extensions/Messaging.cs +++ b/Programs/Simian/Extensions/Messaging.cs @@ -74,6 +74,8 @@ namespace Simian.Extensions sendIM.MessageBlock.Timestamp = 0; sendIM.MessageBlock.Position = agent.Avatar.Position; + sendIM.AgentData.AgentID = agent.AgentID; + Server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); break; diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index 3e8aa900..88d55ce3 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -338,7 +338,7 @@ namespace Simian.Extensions agent.State = update.AgentData.State; agent.Flags = (PrimFlags)update.AgentData.Flags; - ObjectUpdatePacket fullUpdate = BuildFullUpdate(agent.Avatar, + ObjectUpdatePacket fullUpdate = SimulationObject.BuildFullUpdate(agent.Avatar, NameValue.NameValuesToString(agent.Avatar.NameValues), server.RegionHandle, agent.State, agent.Flags); @@ -389,74 +389,5 @@ namespace Simian.Extensions heightWidth.HeightWidthBlock.Height, heightWidth.HeightWidthBlock.Width), Helpers.LogLevel.Info); } - public static ObjectUpdatePacket BuildFullUpdate(Primitive obj, string nameValues, ulong regionHandle, - byte state, PrimFlags flags) - { - byte[] objectData = new byte[60]; - int pos = 0; - obj.Position.GetBytes().CopyTo(objectData, pos); - pos += 12; - obj.Velocity.GetBytes().CopyTo(objectData, pos); - pos += 12; - obj.Acceleration.GetBytes().CopyTo(objectData, pos); - pos += 12; - obj.Rotation.GetBytes().CopyTo(objectData, pos); - pos += 12; - obj.AngularVelocity.GetBytes().CopyTo(objectData, pos); - - ObjectUpdatePacket update = new ObjectUpdatePacket(); - update.RegionData.RegionHandle = regionHandle; - update.RegionData.TimeDilation = UInt16.MaxValue; - update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; - update.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock(); - update.ObjectData[0].ClickAction = (byte)obj.ClickAction; - update.ObjectData[0].CRC = 0; - update.ObjectData[0].ExtraParams = new byte[0]; //FIXME: Need a serializer for ExtraParams - update.ObjectData[0].Flags = (byte)flags; - update.ObjectData[0].FullID = obj.ID; - update.ObjectData[0].Gain = obj.SoundGain; - update.ObjectData[0].ID = obj.LocalID; - update.ObjectData[0].JointAxisOrAnchor = obj.JointAxisOrAnchor; - update.ObjectData[0].JointPivot = obj.JointPivot; - update.ObjectData[0].JointType = (byte)obj.Joint; - update.ObjectData[0].Material = (byte)obj.PrimData.Material; - update.ObjectData[0].MediaURL = new byte[0]; // FIXME: - update.ObjectData[0].NameValue = Utils.StringToBytes(nameValues); - update.ObjectData[0].ObjectData = objectData; - update.ObjectData[0].OwnerID = obj.Properties.OwnerID; - update.ObjectData[0].ParentID = obj.ParentID; - update.ObjectData[0].PathBegin = Primitive.PackBeginCut(obj.PrimData.PathBegin); - update.ObjectData[0].PathCurve = (byte)obj.PrimData.PathCurve; - update.ObjectData[0].PathEnd = Primitive.PackEndCut(obj.PrimData.PathEnd); - update.ObjectData[0].PathRadiusOffset = Primitive.PackPathTwist(obj.PrimData.PathRadiusOffset); - update.ObjectData[0].PathRevolutions = Primitive.PackPathRevolutions(obj.PrimData.PathRevolutions); - update.ObjectData[0].PathScaleX = Primitive.PackPathScale(obj.PrimData.PathScaleX); - update.ObjectData[0].PathScaleY = Primitive.PackPathScale(obj.PrimData.PathScaleY); - update.ObjectData[0].PathShearX = (byte)Primitive.PackPathShear(obj.PrimData.PathShearX); - update.ObjectData[0].PathShearY = (byte)Primitive.PackPathShear(obj.PrimData.PathShearY); - update.ObjectData[0].PathSkew = Primitive.PackPathTwist(obj.PrimData.PathSkew); - update.ObjectData[0].PathTaperX = Primitive.PackPathTaper(obj.PrimData.PathTaperX); - update.ObjectData[0].PathTaperY = Primitive.PackPathTaper(obj.PrimData.PathTaperY); - update.ObjectData[0].PathTwist = Primitive.PackPathTwist(obj.PrimData.PathTwist); - update.ObjectData[0].PathTwistBegin = Primitive.PackPathTwist(obj.PrimData.PathTwistBegin); - update.ObjectData[0].PCode = (byte)obj.PrimData.PCode; - update.ObjectData[0].ProfileBegin = Primitive.PackBeginCut(obj.PrimData.ProfileBegin); - update.ObjectData[0].ProfileCurve = (byte)obj.PrimData.ProfileCurve; - update.ObjectData[0].ProfileEnd = Primitive.PackEndCut(obj.PrimData.ProfileEnd); - update.ObjectData[0].ProfileHollow = Primitive.PackProfileHollow(obj.PrimData.ProfileHollow); - update.ObjectData[0].PSBlock = new byte[0]; // FIXME: - update.ObjectData[0].TextColor = obj.TextColor.GetBytes(true); - update.ObjectData[0].TextureAnim = obj.TextureAnim.GetBytes(); - update.ObjectData[0].TextureEntry = obj.Textures.ToBytes(); - update.ObjectData[0].Radius = obj.SoundRadius; - update.ObjectData[0].Scale = obj.Scale; - update.ObjectData[0].Sound = obj.Sound; - update.ObjectData[0].State = state; - update.ObjectData[0].Text = Utils.StringToBytes(obj.Text); - update.ObjectData[0].UpdateFlags = (uint)flags; - update.ObjectData[0].Data = new byte[0]; // FIXME: - - return update; - } } } diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index a8898970..2622606b 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -23,6 +23,8 @@ namespace Simian.Extensions Server.UDP.RegisterPacketCallback(PacketType.ObjectAdd, new PacketCallback(ObjectAddHandler)); Server.UDP.RegisterPacketCallback(PacketType.ObjectSelect, new PacketCallback(ObjectSelectHandler)); Server.UDP.RegisterPacketCallback(PacketType.ObjectDeselect, new PacketCallback(ObjectDeselectHandler)); + Server.UDP.RegisterPacketCallback(PacketType.ObjectLink, new PacketCallback(ObjectLinkHandler)); + Server.UDP.RegisterPacketCallback(PacketType.ObjectDelink, new PacketCallback(ObjectDelinkHandler)); Server.UDP.RegisterPacketCallback(PacketType.ObjectShape, new PacketCallback(ObjectShapeHandler)); Server.UDP.RegisterPacketCallback(PacketType.DeRezObject, new PacketCallback(DeRezObjectHandler)); Server.UDP.RegisterPacketCallback(PacketType.MultipleObjectUpdate, new PacketCallback(MultipleObjectUpdateHandler)); @@ -40,7 +42,7 @@ namespace Simian.Extensions CompleteAgentMovementPacket complete = (CompleteAgentMovementPacket)packet; SceneObjects.ForEach(delegate(SimulationObject obj) { - ObjectUpdatePacket update = Movement.BuildFullUpdate(obj.Prim, String.Empty, obj.Prim.RegionHandle, 0, obj.Prim.Flags); + ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(obj.Prim, String.Empty, obj.Prim.RegionHandle, 0, obj.Prim.Flags); Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State); }); } @@ -178,12 +180,12 @@ namespace Simian.Extensions SceneObjects.Add(prim.LocalID, prim.ID, simObj); // Send an update out to the creator - ObjectUpdatePacket updateToOwner = Movement.BuildFullUpdate(prim, String.Empty, prim.RegionHandle, 0, + ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(prim, String.Empty, prim.RegionHandle, 0, prim.Flags | PrimFlags.CreateSelected | PrimFlags.ObjectYouOwner); Server.UDP.SendPacket(agent.AgentID, updateToOwner, PacketCategory.State); // Send an update out to everyone else - ObjectUpdatePacket updateToOthers = Movement.BuildFullUpdate(prim, String.Empty, prim.RegionHandle, 0, + ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(prim, String.Empty, prim.RegionHandle, 0, prim.Flags); lock (Server.Agents) { @@ -241,6 +243,62 @@ namespace Simian.Extensions // TODO: Do we need this at all? } + void ObjectLinkHandler(Packet packet, Agent agent) + { + ObjectLinkPacket link = (ObjectLinkPacket)packet; + List linkSet = new List(); + for (int i=0; i