void ObjectDelinkHandler(Packet packet, Agent agent)
        {
            ObjectDelinkPacket delink = (ObjectDelinkPacket)packet;

            List <SimulationObject> linkSet = new List <SimulationObject>();

            for (int i = 0; i < delink.ObjectData.Length; i++)
            {
                SimulationObject obj;
                if (!server.Scene.TryGetObject(delink.ObjectData[i].ObjectLocalID, out obj))
                {
                    //TODO: send an error message
                    return;
                }
                else if (obj.Prim.OwnerID != agent.AgentID)
                {
                    //TODO: send an error message
                    return;
                }
                else
                {
                    linkSet.Add(obj);
                }
            }

            ObjectUpdatePacket update = new ObjectUpdatePacket();

            update.RegionData.RegionHandle = server.RegionHandle;
            update.RegionData.TimeDilation = UInt16.MaxValue;

            update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[linkSet.Count];

            for (int i = 0; i < linkSet.Count; i++)
            {
                update.ObjectData[i] = SimulationObject.BuildUpdateBlock(linkSet[i].Prim,
                                                                         server.RegionHandle, 0, linkSet[i].Prim.Flags);

                update.ObjectData[i].ParentID = 0;
                linkSet[i].LinkNumber         = 0;

                //add root prim orientation to child prims
                if (i > 0)
                {
                    linkSet[i].Prim.Position  = linkSet[0].Prim.Position + Vector3.Transform(linkSet[i].Prim.Position, Matrix4.CreateFromQuaternion(linkSet[0].Prim.Rotation));
                    linkSet[i].Prim.Rotation *= linkSet[0].Prim.Rotation;
                }

                update.ObjectData[i].ObjectData = SimulationObject.BuildObjectData(
                    linkSet[i].Prim.Position, linkSet[i].Prim.Rotation,
                    Vector3.Zero, Vector3.Zero, Vector3.Zero);
            }

            server.UDP.BroadcastPacket(update, PacketCategory.State);
        }
Exemple #2
0
        /// <summary>
        /// Delink/Unlink multiple prims from a linkset
        /// </summary>
        /// <param name="simulator">A reference to the <seealso cref="OpenMetaverse.Simulator"/> object where the objects reside</param>
        /// <param name="localIDs">An array which contains the IDs of the objects to delink</param>
        public void DelinkPrims(Simulator simulator, List<uint> localIDs)
        {
            ObjectDelinkPacket packet = new ObjectDelinkPacket();

            packet.AgentData.AgentID = Client.Self.AgentID;
            packet.AgentData.SessionID = Client.Self.SessionID;

            packet.ObjectData = new ObjectDelinkPacket.ObjectDataBlock[localIDs.Count];

            int i = 0;
            foreach (uint localID in localIDs)
            {
                packet.ObjectData[i] = new ObjectDelinkPacket.ObjectDataBlock();
                packet.ObjectData[i].ObjectLocalID = localID;

                i++;
            }

            Client.Network.SendPacket(packet, simulator);
        }