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); }
/// <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); }