void MultipleObjectUpdateHandler(Packet packet, Agent agent) { MultipleObjectUpdatePacket update = (MultipleObjectUpdatePacket)packet; for (int i = 0; i < update.ObjectData.Length; i++) { MultipleObjectUpdatePacket.ObjectDataBlock block = update.ObjectData[i]; SimulationObject obj; if (server.Scene.TryGetObject(block.ObjectLocalID, out obj)) { UpdateType type = (UpdateType)block.Type; bool linked = ((type & UpdateType.Linked) != 0); int pos = 0; Vector3 position = obj.Prim.Position; Quaternion rotation = obj.Prim.Rotation; Vector3 scale = obj.Prim.Scale; if ((type & UpdateType.Position) != 0) { position = new Vector3(block.Data, pos); pos += 12; } if ((type & UpdateType.Rotation) != 0) { rotation = new Quaternion(block.Data, pos, true); pos += 12; } if ((type & UpdateType.Scale) != 0) { scale = new Vector3(block.Data, pos); pos += 12; // FIXME: Use this in linksets bool uniform = ((type & UpdateType.Uniform) != 0); } // Although the object has already been modified, we need // to inform the scene manager of the changes so they are // sent to clients and propagated to other extensions server.Scene.ObjectTransform(this, obj, position, rotation, obj.Prim.Velocity, obj.Prim.Acceleration, obj.Prim.AngularVelocity, scale); } else { // Ghosted prim, send a kill message to this agent // FIXME: Handle children KillObjectPacket kill = new KillObjectPacket(); kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = block.ObjectLocalID; server.UDP.SendPacket(agent.AgentID, kill, PacketCategory.State); } } }
protected bool MultipleObjUpdate(SimClient simClient, Packet packet) { MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; for (int i = 0; i < multipleupdate.ObjectData.Length; i++) { if (multipleupdate.ObjectData[i].Type == 9) //change position { libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0); foreach (Entity ent in m_world.Entities.Values) { if (ent.localid == multipleupdate.ObjectData[i].ObjectLocalID) { ((OpenSim.world.Primitive)ent).UpdatePosition(pos); } } //should update stored position of the prim } else if (multipleupdate.ObjectData[i].Type == 10)//rotation { libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true); foreach (Entity ent in m_world.Entities.Values) { if (ent.localid == multipleupdate.ObjectData[i].ObjectLocalID) { ent.rotation = new Axiom.MathLib.Quaternion(rot.W, rot.X, rot.Y, rot.Z); ((OpenSim.world.Primitive)ent).UpdateFlag = true; } } } else if (multipleupdate.ObjectData[i].Type == 13)//scale { libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12); foreach (Entity ent in m_world.Entities.Values) { if (ent.localid == multipleupdate.ObjectData[i].ObjectLocalID) { ((OpenSim.world.Primitive)ent).Scale = scale; } } } } return(true); }
/// <summary> /// Send a Multiple Object Update packet to change the size, scale or rotation of a primitive /// </summary> /// <param name="simulator">A reference to the <seealso cref="OpenMetaverse.Simulator"/> object where the object resides</param> /// <param name="localID">The objects ID which is local to the simulator the object is in</param> /// <param name="data">The new rotation, size, or position of the target object</param> /// <param name="type">The flags from the <seealso cref="UpdateType"/> Enum</param> public void UpdateObject(Simulator simulator, uint localID, Vector3 data, UpdateType type) { MultipleObjectUpdatePacket multiObjectUpdate = new MultipleObjectUpdatePacket(); multiObjectUpdate.AgentData.AgentID = Client.Self.AgentID; multiObjectUpdate.AgentData.SessionID = Client.Self.SessionID; multiObjectUpdate.ObjectData = new MultipleObjectUpdatePacket.ObjectDataBlock[1]; multiObjectUpdate.ObjectData[0] = new MultipleObjectUpdatePacket.ObjectDataBlock(); multiObjectUpdate.ObjectData[0].Type = (byte)type; multiObjectUpdate.ObjectData[0].ObjectLocalID = localID; multiObjectUpdate.ObjectData[0].Data = data.GetBytes(); Client.Network.SendPacket(multiObjectUpdate, simulator); }
/// <summary> /// Change the Rotation of an object that is either a child or a whole linkset /// </summary> /// <param name="simulator">A reference to the <seealso cref="OpenMetaverse.Simulator"/> object where the object resides</param> /// <param name="localID">The objects ID which is local to the simulator the object is in</param> /// <param name="quat">The new scale of the object</param> /// <param name="childOnly">If true, will change rotation of this prim only, not entire linkset</param> public void SetRotation(Simulator simulator, uint localID, Quaternion quat, bool childOnly) { UpdateType type = UpdateType.Rotation; if (!childOnly) type |= UpdateType.Linked; MultipleObjectUpdatePacket multiObjectUpdate = new MultipleObjectUpdatePacket(); multiObjectUpdate.AgentData.AgentID = Client.Self.AgentID; multiObjectUpdate.AgentData.SessionID = Client.Self.SessionID; multiObjectUpdate.ObjectData = new MultipleObjectUpdatePacket.ObjectDataBlock[1]; multiObjectUpdate.ObjectData[0] = new MultipleObjectUpdatePacket.ObjectDataBlock(); multiObjectUpdate.ObjectData[0].Type = (byte)type; multiObjectUpdate.ObjectData[0].ObjectLocalID = localID; multiObjectUpdate.ObjectData[0].Data = quat.GetBytes(); Client.Network.SendPacket(multiObjectUpdate, simulator); }
/// <summary> /// Change the position of an object /// </summary> /// <param name="simulator">A reference to the <seealso cref="libsecondlife.Simulator"/> object where the object resides</param> /// <param name="localID">The objects ID which is local to the simulator the object is in</param> /// <param name="position">The new position of the object</param> public void SetPosition(Simulator simulator, uint localID, LLVector3 position) { MultipleObjectUpdatePacket multiObjectUpdate = new MultipleObjectUpdatePacket(); multiObjectUpdate.AgentData.AgentID = Client.Self.AgentID; multiObjectUpdate.AgentData.SessionID = Client.Self.SessionID; multiObjectUpdate.ObjectData = new MultipleObjectUpdatePacket.ObjectDataBlock[1]; multiObjectUpdate.ObjectData[0] = new MultipleObjectUpdatePacket.ObjectDataBlock(); multiObjectUpdate.ObjectData[0].Type = 9; multiObjectUpdate.ObjectData[0].ObjectLocalID = localID; multiObjectUpdate.ObjectData[0].Data = position.GetBytes(); Client.Network.SendPacket(multiObjectUpdate, simulator); }