public static void AddDelegate(bool Outbound, byte type, PacketDelegate del) { if (Outbound) { if (!OutboundDelegates.ContainsKey(type)) OutboundDelegates.Add(type, new List<PacketDelegate>()); OutboundDelegates[type].Add(del); } else { if (!InboundDelegates.ContainsKey(type)) InboundDelegates.Add(type, new List<PacketDelegate>()); InboundDelegates[type].Add(del); } }
internal ProxyControllerBase(Frame frame) { mFrame = frame; ThisLogger = LogManager.GetLogger("OpenSim." + mFrame.Name + "Proxy"); mViewerConfig = new ViewerConfig(frame.Name); if (mViewerConfig.UseThread) { if (CameraThread == null) CameraThread = new ProxyControllerPacketThread(frame.Core, this); else CameraThread.AddController(this); } mAgentUpdateListener = new PacketDelegate(mProxy_AgentUpdatePacketReceived); mObjectUpdateListener = new PacketDelegate(mProxy_ObjectUpdatePacketReceived); }
private Packet OutAvatarPropertiesRequestHandler(Packet requestpacket, IPEndPoint sim) { if (requestpacket.Header.Resent) { return(requestpacket); } AvatarPropertiesRequestPacket packet = (AvatarPropertiesRequestPacket)requestpacket; UUID uuid = packet.AgentData.AvatarID; System.Timers.Timer timer = new System.Timers.Timer(5000); bool found = false; PacketDelegate replyCallback = delegate(Packet replypacket, IPEndPoint blarg) { if (!found) { UUIDNameReplyPacket reply = (UUIDNameReplyPacket)replypacket; foreach (UUIDNameReplyPacket.UUIDNameBlockBlock block in reply.UUIDNameBlock) { if (block.ID == uuid) { found = true; string firstname = Utils.BytesToString(block.FirstName); string lastname = Utils.BytesToString(block.LastName); frame.SayToUser(firstname + " " + lastname + " = " + uuid.ToString()); return(replypacket); } } } return(replypacket); }; proxy.AddDelegate(PacketType.UUIDNameReply, Direction.Incoming, replyCallback); timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e) { proxy.RemoveDelegate(PacketType.UUIDNameReply, Direction.Incoming, replyCallback); timer.Stop(); }; UUIDNameRequestPacket request = new UUIDNameRequestPacket(); request.UUIDNameBlock = new UUIDNameRequestPacket.UUIDNameBlockBlock[1]; request.UUIDNameBlock[0] = new UUIDNameRequestPacket.UUIDNameBlockBlock(); request.UUIDNameBlock[0].ID = uuid; request.Header.Reliable = true; proxy.InjectPacket(request, Direction.Outgoing); timer.Start(); return(packet); }
public static void AddDelegate(bool Outbound, byte type, PacketDelegate del) { if (Outbound) { if (!OutboundDelegates.ContainsKey(type)) { OutboundDelegates.Add(type, new List <PacketDelegate>()); } OutboundDelegates[type].Add(del); } else { if (!InboundDelegates.ContainsKey(type)) { InboundDelegates.Add(type, new List <PacketDelegate>()); } InboundDelegates[type].Add(del); } }
internal ProxyControllerBase(Frame frame) { mFrame = frame; ThisLogger = LogManager.GetLogger("OpenSim." + mFrame.Name + "Proxy"); mViewerConfig = new ViewerConfig(frame.Name); if (mViewerConfig.UseThread) { if (CameraThread == null) { CameraThread = new ProxyControllerPacketThread(frame.Core, this); } else { CameraThread.AddController(this); } } mAgentUpdateListener = new PacketDelegate(mProxy_AgentUpdatePacketReceived); mObjectUpdateListener = new PacketDelegate(mProxy_ObjectUpdatePacketReceived); }
// try to stop autopilot when sit response is received //private Packet InAvatarSitResponseHandler(Packet packet, IPEndPoint sim) //{ // if (LastAgentUpdate != null) // { // AgentUpdatePacket p = LastAgentUpdate; // p.AgentData.ControlFlags = 524288; // (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS; // proxy.InjectPacket(p, Direction.Outgoing); // p.AgentData.ControlFlags = 0; // proxy.InjectPacket(p, Direction.Outgoing); // } // return packet; //} private Packet InTerminateFriendshipHandler(Packet packet, IPEndPoint sim) { if (packet.Header.Resent) { return(packet); } UUID uuid = ((TerminateFriendshipPacket)packet).ExBlock.OtherID; string name = "(waiting)"; ManualResetEvent evt = new ManualResetEvent(false); PacketDelegate nameHandler = delegate(Packet packet2, IPEndPoint sim2) { foreach (UUIDNameReplyPacket.UUIDNameBlockBlock block in ((UUIDNameReplyPacket)packet2).UUIDNameBlock) { if (block.ID == uuid) { name = Utils.BytesToString(block.FirstName) + " " + Utils.BytesToString(block.LastName); evt.Set(); } } return(packet2); }; Thread myThread = new Thread(new ThreadStart(delegate { proxy.AddDelegate(PacketType.UUIDNameReply, Direction.Incoming, nameHandler); UUIDNameRequestPacket request = new UUIDNameRequestPacket(); request.UUIDNameBlock = new UUIDNameRequestPacket.UUIDNameBlockBlock[1]; request.UUIDNameBlock[0] = new UUIDNameRequestPacket.UUIDNameBlockBlock(); request.UUIDNameBlock[0].ID = uuid; request.Header.Reliable = true; proxy.InjectPacket(request, Direction.Outgoing); evt.WaitOne(10000, false); proxy.RemoveDelegate(PacketType.UUIDNameReply, Direction.Incoming, nameHandler); frame.SayToUser("Friendship terminated with " + name); })); myThread.Start(); return(packet); }
// RemoveDelegate: remove callback for packets of type packetName going direction public void RemoveDelegate(PacketType packetType, Direction direction, PacketDelegate packetDelegate) { lock (this) { Dictionary<PacketType, List<PacketDelegate>> delegates = (direction == Direction.Incoming ? incomingDelegates : outgoingDelegates); if (!delegates.ContainsKey(packetType)) { return; } List<PacketDelegate> delegateArray = delegates[packetType]; if (delegateArray.Contains(packetDelegate)) { delegateArray.Remove(packetDelegate); } } }
public Packet IMs(Packet p, IPEndPoint sim) { if (enabled) { GregIm g = new GregIm(); ImprovedInstantMessagePacket imm = (ImprovedInstantMessagePacket)p; g.fromname = Utils.BytesToString(imm.MessageBlock.FromAgentName); g.ownerkey = imm.AgentData.AgentID; g.regionkey = imm.MessageBlock.RegionID; g.regionpos = imm.MessageBlock.Position; bool debug = false; bool mapFound; bool regionFound; bool nameFound; mapFound = regionFound = nameFound = false; if (g.regionkey != UUID.Zero && imm.MessageBlock.Dialog == (byte)InstantMessageDialog.MessageFromObject) { /*if ((imm.MessageBlock.Dialog == 0 && imm.MessageBlock.Offline != 1) || g.ownerkey == frame.AgentID) * { * imm.MessageBlock.FromAgentName = Utils.StringToBytes(g.fromname.ToString() + " @ " + g.regionpos.ToString()); * return imm; * }*/ g.p = imm; if (debug) { frame.SayToUser("region key was not zero..:"); } // request region name RegionHandleRequestPacket rhp = new RegionHandleRequestPacket(); rhp.RequestBlock.RegionID = g.regionkey; System.Timers.Timer mygregTimer = new System.Timers.Timer(30000); PacketDelegate replyGregCallback = delegate(Packet pa, IPEndPoint s) { if (debug) { frame.SayToUser("got the region handle..."); } if (!regionFound) { regionFound = true; RegionIDAndHandleReplyPacket rid = (RegionIDAndHandleReplyPacket)pa; ulong handle = rid.ReplyBlock.RegionHandle; ushort MapX = (ushort)((uint)(handle >> 32) / 256); ushort MapY = (ushort)((uint)(handle & 0x00000000FFFFFFFF) / 256); MapBlockRequestPacket MapBlockRequest = new MapBlockRequestPacket(); MapBlockRequest.AgentData = new MapBlockRequestPacket.AgentDataBlock(); MapBlockRequest.AgentData.AgentID = frame.AgentID; MapBlockRequest.AgentData.SessionID = frame.SessionID; MapBlockRequest.AgentData.Flags = 0; MapBlockRequest.AgentData.Godlike = false; MapBlockRequest.PositionData = new MapBlockRequestPacket.PositionDataBlock(); MapBlockRequest.PositionData.MinX = MapX; MapBlockRequest.PositionData.MaxX = MapX; MapBlockRequest.PositionData.MinY = MapY; MapBlockRequest.PositionData.MaxY = MapY; System.Timers.Timer myTimer2 = new System.Timers.Timer(20000); PacketDelegate replyCallback = delegate(Packet np, IPEndPoint ss) { if (debug) { frame.SayToUser("got the map..:"); } if (!mapFound) { mapFound = true; MapBlockReplyPacket reply = (MapBlockReplyPacket)np; foreach (MapBlockReplyPacket.DataBlock block in reply.Data) { if ((block.X == MapX) && (block.Y == MapY)) { g.regionName = Utils.BytesToString(block.Name); g.regionglobalx = MapX; g.regionglobaly = MapY; g.slurl = "secondlife://" + g.regionName.Replace(" ", "%20") + "/" + g.regionpos.X.ToString() + "/" + g.regionpos.Y.ToString() + "/" + g.regionpos.Z.ToString(); System.Timers.Timer timer = new System.Timers.Timer(10000); PacketDelegate replyCallback2 = delegate(Packet replypacket, IPEndPoint blarg) { if (debug) { frame.SayToUser("got the name"); } UUIDNameReplyPacket ureply = (UUIDNameReplyPacket)replypacket; foreach (UUIDNameReplyPacket.UUIDNameBlockBlock bblock in ureply.UUIDNameBlock) { if (bblock.ID == g.ownerkey) { if (!nameFound) { nameFound = true; string firstname = Utils.BytesToString(bblock.FirstName); string lastname = Utils.BytesToString(bblock.LastName); g.ownername = firstname + " " + lastname; g.p.MessageBlock.FromAgentName = Utils.StringToBytes(g.ownername + "'s " + g.fromname + " @ " + g.slurl); form.addListItem(g.ownerkey.ToString() + " \t" + g.ownername + " \t" + g.slurl + " \t" + g.fromname + " \t" + Utils.BytesToString(g.p.MessageBlock.Message)); imm = g.p; proxy.InjectPacket(g.p, Direction.Incoming); } return(replypacket); } } return(replypacket); }; proxy.AddDelegate(PacketType.UUIDNameReply, Direction.Incoming, replyCallback2); timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e) { proxy.RemoveDelegate(PacketType.UUIDNameReply, Direction.Incoming, replyCallback2); timer.Stop(); //proxy.InjectPacket(p, Direction.Incoming); }; UUIDNameRequestPacket request = new UUIDNameRequestPacket(); request.UUIDNameBlock = new UUIDNameRequestPacket.UUIDNameBlockBlock[1]; request.UUIDNameBlock[0] = new UUIDNameRequestPacket.UUIDNameBlockBlock(); request.UUIDNameBlock[0].ID = g.ownerkey; request.Header.Reliable = true; proxy.InjectPacket(request, Direction.Outgoing); timer.Start(); } } } return(np); }; System.Timers.ElapsedEventHandler timerCallback = delegate(object sender, System.Timers.ElapsedEventArgs e) { proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback); myTimer2.Stop(); //proxy.InjectPacket(p, Direction.Incoming); }; proxy.AddDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback); myTimer2.Elapsed += timerCallback; myTimer2.Start(); proxy.InjectPacket(MapBlockRequest, Direction.Outgoing); } return(pa); }; System.Timers.ElapsedEventHandler timerGregCallback = delegate(object sender, System.Timers.ElapsedEventArgs e) { proxy.RemoveDelegate(PacketType.RegionIDAndHandleReply, Direction.Incoming, replyGregCallback); mygregTimer.Stop(); //proxy.InjectPacket(p, Direction.Incoming); }; proxy.AddDelegate(PacketType.RegionIDAndHandleReply, Direction.Incoming, replyGregCallback); mygregTimer.Elapsed += timerGregCallback; mygregTimer.Start(); proxy.InjectPacket(rhp, Direction.Outgoing); //---------------------- return(null); } } return(p); }
private void RefreshDownloadsTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (frame.proxy.KnownCaps.Count > 2) { if (form.autoupdate()) { //buiding req if (setData) { if (!regionNames.ContainsKey(shared.RegionHandle)) { ulong handle = shared.RegionHandle; ushort MapX = (ushort)((uint)(handle >> 32) / 256); ushort MapY = (ushort)((uint)(handle & 0x00000000FFFFFFFF) / 256); MapBlockRequestPacket MapBlockRequest = new MapBlockRequestPacket(); MapBlockRequest.AgentData = new MapBlockRequestPacket.AgentDataBlock(); MapBlockRequest.AgentData.AgentID = frame.AgentID; MapBlockRequest.AgentData.SessionID = frame.SessionID; MapBlockRequest.AgentData.Flags = 0; MapBlockRequest.AgentData.Godlike = false; MapBlockRequest.PositionData = new MapBlockRequestPacket.PositionDataBlock(); MapBlockRequest.PositionData.MinX = MapX; MapBlockRequest.PositionData.MaxX = MapX; MapBlockRequest.PositionData.MinY = MapY; MapBlockRequest.PositionData.MaxY = MapY; System.Timers.Timer myTimer2 = new System.Timers.Timer(20000); PacketDelegate replyCallback = delegate(Packet np, IPEndPoint ss) { MapBlockReplyPacket reply = (MapBlockReplyPacket)np; foreach (MapBlockReplyPacket.DataBlock block in reply.Data) { if ((block.X == MapX) && (block.Y == MapY)) { string regionName = Utils.BytesToString(block.Name); ushort regionglobalx = MapX; ushort regionglobaly = MapY; if (!regionNames.ContainsKey(shared.RegionHandle)) { regionNames.Add(shared.RegionHandle, regionName); } form.updateWeb(form.getBase() + "secondlife://" + regionName.Replace(" ", "%20") + "/" + shared.CameraPosition.X.ToString() + "/" + shared.CameraPosition.Y.ToString() + "/" + shared.CameraPosition.Z.ToString()); } } return(null); }; System.Timers.ElapsedEventHandler timerCallback = delegate(object asender, System.Timers.ElapsedEventArgs ee) { proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback); myTimer2.Stop(); }; proxy.AddDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback); myTimer2.Elapsed += timerCallback; myTimer2.Start(); proxy.InjectPacket(MapBlockRequest, Direction.Outgoing); } else { form.updateWeb(form.getBase() + "secondlife://" + this.regionNames[this.shared.RegionHandle].Replace(" ", "%20") + "/" + shared.CameraPosition.X.ToString() + "/" + shared.CameraPosition.Y.ToString() + "/" + shared.CameraPosition.Z.ToString()); } } else { getProfile(); } } } }
private Packet InImprovedInstantMessageHandler(Packet packet, IPEndPoint sim) { if (RegionHandle != 0) { SoundTriggerPacket sound = new SoundTriggerPacket(); sound.SoundData.SoundID = new UUID("4c366008-65da-2e84-9b74-f58a392b94c6"); sound.SoundData.OwnerID = frame.AgentID; sound.SoundData.ObjectID = frame.AgentID; sound.SoundData.ParentID = UUID.Zero; sound.SoundData.Handle = RegionHandle; sound.SoundData.Position = CameraCenter; sound.SoundData.Gain = 0.5f; sound.Header.Reliable = false; if (!File.Exists("mutesound.on")) { proxy.InjectPacket(sound, Direction.Incoming); } } ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet; //block repeated crap if (im.MessageBlock.Dialog == (byte)InstantMessageDialog.StartTyping) { if (PeopleWhoIMedMe.Contains(im.AgentData.AgentID) == false) { PeopleWhoIMedMe.Add(im.AgentData.AgentID); ImprovedInstantMessagePacket im2 = new ImprovedInstantMessagePacket(); im2.AgentData = new ImprovedInstantMessagePacket.AgentDataBlock(); im2.AgentData.AgentID = im.AgentData.AgentID; im2.AgentData.SessionID = im.AgentData.SessionID; im2.MessageBlock = new ImprovedInstantMessagePacket.MessageBlockBlock(); im2.MessageBlock.FromGroup = im.MessageBlock.FromGroup; im2.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; im2.MessageBlock.ParentEstateID = im.MessageBlock.ParentEstateID; im2.MessageBlock.RegionID = im.MessageBlock.RegionID; im2.MessageBlock.Position = im.MessageBlock.Position; im2.MessageBlock.Offline = im.MessageBlock.Offline; im2.MessageBlock.Dialog = 0; im2.MessageBlock.ID = im.MessageBlock.ID; im2.MessageBlock.Timestamp = im.MessageBlock.Timestamp; im2.MessageBlock.FromAgentName = im.MessageBlock.FromAgentName; im2.MessageBlock.Message = Utils.StringToBytes("/me is typing a message..."); im2.MessageBlock.BinaryBucket = im.MessageBlock.BinaryBucket; proxy.InjectPacket(im2, Direction.Incoming); } } else if (im.MessageBlock.Dialog == 22) // teleport lure { string[] bbfields = Utils.BytesToString(im.MessageBlock.BinaryBucket).Split('|'); if (bbfields.Length < 5) { return(packet); } ushort MapX; ushort MapY; double RegionX; double RegionY; double RegionZ; try { MapX = (ushort)(uint.Parse(bbfields[0]) / 256); MapY = (ushort)(uint.Parse(bbfields[1]) / 256); RegionX = double.Parse(bbfields[2]); RegionY = double.Parse(bbfields[3]); RegionZ = double.Parse(bbfields[4]); } catch { frame.SayToUser("WARNING! " + Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure IM seems to have unusual data in its BinaryBucket!"); return(packet); } // request region name System.Timers.Timer myTimer = new System.Timers.Timer(10000); string RegionName = null; PacketDelegate replyCallback = delegate(Packet p, IPEndPoint s) { MapBlockReplyPacket reply = (MapBlockReplyPacket)p; foreach (MapBlockReplyPacket.DataBlock block in reply.Data) { if ((block.X == MapX) && (block.Y == MapY)) { RegionName = Utils.BytesToString(block.Name); StringBuilder sb = new StringBuilder(); sb.Append(Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure is to "); sb.Append(RegionName + " " + RegionX.ToString() + ", " + RegionY.ToString() + ", " + RegionZ.ToString() + " "); sb.Append("secondlife://" + RegionName.Replace(" ", "%20") + "/" + RegionX.ToString() + "/" + RegionY.ToString() + "/" + RegionZ.ToString()); frame.SayToUser(sb.ToString()); } } return(null); }; System.Timers.ElapsedEventHandler timerCallback = delegate(object sender, System.Timers.ElapsedEventArgs e) { if (RegionName == null) { frame.SayToUser("Couldn't resolve the destination of " + Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure: " + Utils.BytesToString(im.MessageBlock.BinaryBucket)); } proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback); myTimer.Stop(); }; proxy.AddDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback); myTimer.Elapsed += timerCallback; myTimer.Start(); MapBlockRequestPacket MapBlockRequest = new MapBlockRequestPacket(); MapBlockRequest.AgentData = new MapBlockRequestPacket.AgentDataBlock(); MapBlockRequest.AgentData.AgentID = frame.AgentID; MapBlockRequest.AgentData.SessionID = frame.SessionID; MapBlockRequest.AgentData.Flags = 0; MapBlockRequest.AgentData.Godlike = false; MapBlockRequest.PositionData = new MapBlockRequestPacket.PositionDataBlock(); MapBlockRequest.PositionData.MinX = MapX; MapBlockRequest.PositionData.MaxX = MapX; MapBlockRequest.PositionData.MinY = MapY; MapBlockRequest.PositionData.MaxY = MapY; proxy.InjectPacket(MapBlockRequest, Direction.Outgoing); } else if (im.MessageBlock.Dialog == (byte)InstantMessageDialog.InventoryOffered) { if (im.MessageBlock.BinaryBucket[0] == (byte)AssetType.Simstate) { frame.SayToUser(Utils.BytesToString(im.MessageBlock.FromAgentName) + " offered you a SimState :O"); return(null); } } else if (im.MessageBlock.Dialog == 9) { if (im.MessageBlock.BinaryBucket[0] == (byte)AssetType.Simstate) { frame.SayToUser(im.AgentData.AgentID.ToString() + " offered you a SimState from an object at " + im.MessageBlock.Position.ToString() + " :O Message = " + Utils.BytesToString(im.MessageBlock.Message)); return(null); } } // Don't get spammed bro if (im.MessageBlock.Dialog == 0) { im.MessageBlock.ID = frame.AgentID.Equals(im.AgentData.AgentID) ? frame.AgentID : im.AgentData.AgentID ^ frame.AgentID; packet = (Packet)im; } return(packet); }
// AddDelegate: add callback packetDelegate for packets of type packetName going direction public void AddDelegate(string packetName, Direction direction, PacketDelegate packetDelegate) { lock(this) { (direction == Direction.Incoming ? incomingDelegates : outgoingDelegates)[packetName] = packetDelegate; } }
public void platHigh(int c) { Vector3 where = new Vector3(shared.CameraPosition.X, shared.CameraPosition.Y, (float)(c - 5)); System.Timers.Timer myTimer = new System.Timers.Timer(10000); PacketDelegate replyCallback = delegate(Packet p, IPEndPoint s) { return(null); }; System.Timers.ElapsedEventHandler timerCallback = delegate(object sender, System.Timers.ElapsedEventArgs e) { proxy.RemoveDelegate(PacketType.ObjectSelect, Direction.Outgoing, replyCallback); proxy.RemoveDelegate(PacketType.ObjectDeselect, Direction.Outgoing, replyCallback); myTimer.Stop(); }; proxy.AddDelegate(PacketType.ObjectDeselect, Direction.Outgoing, replyCallback); proxy.AddDelegate(PacketType.ObjectSelect, Direction.Outgoing, replyCallback); myTimer.Elapsed += timerCallback; myTimer.Start(); ObjectAddPacket a = new ObjectAddPacket(); a.Type = PacketType.ObjectAdd; a.AgentData = new ObjectAddPacket.AgentDataBlock(); a.AgentData.AgentID = frame.AgentID; a.AgentData.GroupID = UUID.Zero; a.AgentData.SessionID = frame.SessionID; a.ObjectData = new ObjectAddPacket.ObjectDataBlock(); a.ObjectData.PCode = 9; a.ObjectData.Material = 4; a.ObjectData.AddFlags = 2; a.ObjectData.PathCurve = 48; a.ObjectData.ProfileCurve = 1; a.ObjectData.PathBegin = 0; a.ObjectData.PathEnd = 0; a.ObjectData.PathScaleX = 0; a.ObjectData.PathScaleY = 0; a.ObjectData.PathShearX = 0; a.ObjectData.PathShearY = 0; a.ObjectData.PathTwist = 0; a.ObjectData.PathTwistBegin = 0; a.ObjectData.PathRadiusOffset = 0; a.ObjectData.PathTaperX = 0; a.ObjectData.PathTaperY = 0; a.ObjectData.PathRevolutions = 0; a.ObjectData.PathSkew = 0; a.ObjectData.ProfileBegin = 0; a.ObjectData.ProfileEnd = 0; a.ObjectData.ProfileHollow = 0; a.ObjectData.BypassRaycast = 1; a.ObjectData.RayStart = where; a.ObjectData.RayEnd = where; a.ObjectData.RayTargetID = UUID.Zero; a.ObjectData.RayEndIsIntersection = 0; a.ObjectData.Scale = new Vector3((float)0.01, (float)10, (float)10); a.ObjectData.Rotation = new Quaternion((float)0, (float)0.70711, (float)0, (float)0.70711); a.ObjectData.State = 0; a.Header.Reliable = true; proxy.InjectPacket(a, Direction.Outgoing); }