/// <summary> /// Process incoming avatar appearance /// </summary> /// <param name="packet"></param> /// <param name="sim"></param> private void AvatarAppearanceHandler(Packet packet, Simulator sim) { if (OnAvatarAppearance != null) { AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; sim.ObjectsAvatars.ForEach(delegate(Avatar av) { if (av.ID == appearance.Sender.ID) { List <byte> visualParams = new List <byte>(); foreach (AvatarAppearancePacket.VisualParamBlock block in appearance.VisualParam) { visualParams.Add(block.ParamValue); } LLObject.TextureEntry textureEntry = new Primitive.TextureEntry(appearance.ObjectData.TextureEntry, 0, appearance.ObjectData.TextureEntry.Length); LLObject.TextureEntryFace defaultTexture = textureEntry.DefaultTexture; LLObject.TextureEntryFace[] faceTextures = textureEntry.FaceTextures; try { OnAvatarAppearance(appearance.Sender.ID, appearance.Sender.IsTrial, defaultTexture, faceTextures, visualParams); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } } }); } }
public void AvatarAppearance(object sender, Agent agent, Primitive.TextureEntry textures, byte[] visualParams) { if (OnAvatarAppearance != null) { OnAvatarAppearance(sender, agent, textures, visualParams); } // Update the avatar agent.Avatar.Textures = textures; if (visualParams != null) { agent.VisualParams = visualParams; } // Broadcast the object update ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(agent.Avatar, server.RegionHandle, agent.State, agent.Flags); server.UDP.BroadcastPacket(update, PacketCategory.State); // Send the appearance packet to all other clients AvatarAppearancePacket appearance = BuildAppearancePacket(agent); lock (server.Agents) { foreach (Agent recipient in server.Agents.Values) { if (recipient != agent) { server.UDP.SendPacket(recipient.AgentID, appearance, PacketCategory.State); } } } }
// HACK: The reduction provider will deprecate this at some point void SynchronizeStateTo(Agent agent) { // Send the parcel overlay server.Parcels.SendParcelOverlay(agent); // Send object updates for objects and avatars sceneObjects.ForEach(delegate(SimulationObject obj) { ObjectUpdatePacket update = SimulationObject.BuildFullUpdate(obj.Prim, obj.Prim.RegionHandle, 0, obj.Prim.Flags); server.UDP.SendPacket(agent.AgentID, update, PacketCategory.State); }); // Send appearances for all avatars lock (server.Agents) { foreach (Agent otherAgent in server.Agents.Values) { if (otherAgent != agent) { // Send appearances for this avatar AvatarAppearancePacket appearance = BuildAppearancePacket(otherAgent); server.UDP.SendPacket(agent.AgentID, appearance, PacketCategory.State); } } } // Send terrain data SendLayerData(agent); }
private void AvatarAppearanceHandler(object sender, PacketReceivedEventArgs e) { Packet packet = e.Packet; AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; lock (Appearances) Appearances[appearance.Sender.ID] = appearance; }
private void AvatarAppearanceHandler(object sender, PacketReceivedEventArgs e) { Simulator sim = e.Simulator; var packet = e.Packet; //if (sim != client.Network.CurrentSim) { Debug("AvatarAppearance: from a differnt sim than current " + sim); } AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; Avatar found = sim.ObjectsAvatars.Find(delegate(Avatar av) { if (av.ID == appearance.Sender.ID) { List <byte> visualParams = new List <byte>(); foreach ( AvatarAppearancePacket.VisualParamBlock block in appearance.VisualParam) { visualParams.Add(block.ParamValue); } Primitive.TextureEntry textureEntry = new Primitive.TextureEntry( appearance.ObjectData.TextureEntry, 0, appearance.ObjectData.TextureEntry.Length); Primitive.TextureEntryFace defaultTexture = textureEntry.DefaultTexture; Primitive.TextureEntryFace[] faceTextures = textureEntry.FaceTextures; av.Textures = textureEntry; //if (OnAvatarAppearance != null) //{ // try { OnAvatarAppearance(appearance.Sender.ID, appearance.Sender.IsTrial, defaultTexture, faceTextures, visualParams); } // catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } //} return(true); } return(false); }); if (found != null) { return; } UUID id = appearance.Sender.ID; //if (GetSimObjectFromUUID(id) == null) CreateSimAvatar(id, this, sim); }
private void AvatarAppearanceHandler(Packet packet, Simulator simulator) { AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; LLObject.TextureEntry te = new LLObject.TextureEntry(appearance.ObjectData.TextureEntry, 0, appearance.ObjectData.TextureEntry.Length); if (IsNullOrZero(te.FaceTextures[(int)AppearanceManager.TextureIndex.EyesBaked]) && IsNullOrZero(te.FaceTextures[(int)AppearanceManager.TextureIndex.HeadBaked]) && IsNullOrZero(te.FaceTextures[(int)AppearanceManager.TextureIndex.LowerBaked]) && IsNullOrZero(te.FaceTextures[(int)AppearanceManager.TextureIndex.SkirtBaked]) && IsNullOrZero(te.FaceTextures[(int)AppearanceManager.TextureIndex.UpperBaked])) { Console.WriteLine("Avatar " + appearance.Sender.ID.ToString() + " may be a bot"); } }
bool clone(LLUUID target) { if (appearances.ContainsKey(target)) { #region AvatarAppearance to AgentSetAppearance AvatarAppearancePacket appearance = appearances[target]; AgentSetAppearancePacket set = new AgentSetAppearancePacket(); set.AgentData.AgentID = Self.AgentID; set.AgentData.SessionID = Self.SessionID; set.AgentData.SerialNum = SerialNum++; set.AgentData.Size = new LLVector3(2f, 2f, 2f); // HACK set.WearableData = new AgentSetAppearancePacket.WearableDataBlock[0]; set.VisualParam = new AgentSetAppearancePacket.VisualParamBlock[appearance.VisualParam.Length]; for (int i = 0; i < appearance.VisualParam.Length; i++) { set.VisualParam[i] = new AgentSetAppearancePacket.VisualParamBlock(); set.VisualParam[i].ParamValue = appearance.VisualParam[i].ParamValue; } set.ObjectData.TextureEntry = appearance.ObjectData.TextureEntry; #endregion AvatarAppearance to AgentSetAppearance // Detach everything we are currently wearing Appearance.AddAttachments(new List <InventoryBase>(), true); // Send the new appearance packet Network.SendPacket(set); #if DEBUG Console.Out.WriteLine("Cloned {0}", target.ToString()); #endif return(true); } else { #if DEBUG Console.Out.WriteLine("Don't know the appearance of avatar {0}", target.ToString()); #endif return(false); } }
public override string Execute(string[] args, LLUUID fromAgentID) { if (args.Length != 1) { return("Usage: importoutfit inputfile.xml"); } try { XmlReader reader = XmlReader.Create(args[0]); XmlSerializer serializer = new XmlSerializer(typeof(Packet)); AvatarAppearancePacket appearance = (AvatarAppearancePacket)serializer.Deserialize(reader); reader.Close(); AgentSetAppearancePacket set = new AgentSetAppearancePacket(); set.AgentData.AgentID = Client.Network.AgentID; set.AgentData.SessionID = Client.Network.SessionID; set.AgentData.SerialNum = SerialNum++; float AV_Height_Range = 2.025506f - 1.50856f; float AV_Height = 1.50856f + (((float)appearance.VisualParam[25].ParamValue / 255.0f) * AV_Height_Range); set.AgentData.Size = new LLVector3(0.45f, 0.6f, AV_Height); set.ObjectData.TextureEntry = appearance.ObjectData.TextureEntry; set.VisualParam = new AgentSetAppearancePacket.VisualParamBlock[appearance.VisualParam.Length]; int i = 0; foreach (AvatarAppearancePacket.VisualParamBlock block in appearance.VisualParam) { set.VisualParam[i] = new AgentSetAppearancePacket.VisualParamBlock(); set.VisualParam[i].ParamValue = block.ParamValue; i++; } set.WearableData = new AgentSetAppearancePacket.WearableDataBlock[0]; Client.Network.SendPacket(set); } catch (Exception) { return("Failed to import the appearance XML file, maybe it doesn't exist or is in the wrong format?"); } return("Imported " + args[0] + " and sent an AgentSetAppearance packet"); }
static AvatarAppearancePacket BuildAppearancePacket(Agent agent) { AvatarAppearancePacket appearance = new AvatarAppearancePacket(); appearance.ObjectData.TextureEntry = agent.Avatar.Textures.ToBytes(); appearance.Sender.ID = agent.AgentID; appearance.Sender.IsTrial = false; appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; for (int i = 0; i < 218; i++) { appearance.VisualParam[i] = new AvatarAppearancePacket.VisualParamBlock(); appearance.VisualParam[i].ParamValue = agent.VisualParams[i]; } return(appearance); }
public void SendAppearanceToOtherAgent(SimClient userInfo) { AvatarAppearancePacket avp = new AvatarAppearancePacket(); avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; avp.ObjectData.TextureEntry = this.avatarAppearanceTexture.ToBytes(); //a wearable update packets should only be sent about the viewers/agents own avatar not for other avatars //but it seems that the following code only created the packets and never actually sent them anyway /*AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket(); * aw.AgentData.AgentID = this.ControllingClient.AgentID; * aw.AgentData.SessionID = userInfo.SessionID; * aw.AgentData.SerialNum = 0; //removed the use of a random number as a random number could be less than the last number, should have a counter variable for this * * aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13]; * AgentWearablesUpdatePacket.WearableDataBlock awb; * for (int i = 0; i < 13; i++) * { * awb = new AgentWearablesUpdatePacket.WearableDataBlock(); * awb.WearableType = (byte)i; * awb.AssetID = this.Wearables[i].AssetID; * awb.ItemID = this.Wearables[i].ItemID; * aw.WearableData[i] = awb; * }*/ AvatarAppearancePacket.VisualParamBlock avblock = null; for (int i = 0; i < 218; i++) { avblock = new AvatarAppearancePacket.VisualParamBlock(); avblock.ParamValue = visualParams[i]; avp.VisualParam[i] = avblock; } avp.Sender.IsTrial = false; avp.Sender.ID = ControllingClient.AgentID; userInfo.OutPacket(avp); }
private void AvatarAppearanceHandler(Packet packet, Simulator simulator) { AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; lock (Appearances) Appearances[appearance.Sender.ID] = appearance; }
public void SendAppearanceToOtherAgent(SimClient userInfo) { AvatarAppearancePacket avp = new AvatarAppearancePacket(); avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; avp.ObjectData.TextureEntry = this.avatarAppearanceTexture.ToBytes(); //a wearable update packets should only be sent about the viewers/agents own avatar not for other avatars //but it seems that the following code only created the packets and never actually sent them anyway /*AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket(); aw.AgentData.AgentID = this.ControllingClient.AgentID; aw.AgentData.SessionID = userInfo.SessionID; aw.AgentData.SerialNum = 0; //removed the use of a random number as a random number could be less than the last number, should have a counter variable for this aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13]; AgentWearablesUpdatePacket.WearableDataBlock awb; for (int i = 0; i < 13; i++) { awb = new AgentWearablesUpdatePacket.WearableDataBlock(); awb.WearableType = (byte)i; awb.AssetID = this.Wearables[i].AssetID; awb.ItemID = this.Wearables[i].ItemID; aw.WearableData[i] = awb; }*/ AvatarAppearancePacket.VisualParamBlock avblock = null; for (int i = 0; i < 218; i++) { avblock = new AvatarAppearancePacket.VisualParamBlock(); avblock.ParamValue = visualParams[i]; avp.VisualParam[i] = avblock; } avp.Sender.IsTrial = false; avp.Sender.ID = ControllingClient.AgentID; userInfo.OutPacket(avp); }
public override string Execute(string[] args, LLUUID fromAgentID) { string targetName = String.Empty; List <DirectoryManager.AgentSearchData> matches; for (int ct = 0; ct < args.Length; ct++) { targetName = targetName + args[ct] + " "; } targetName = targetName.TrimEnd(); if (targetName.Length == 0) { return("Usage: clone [name]"); } if (Client.Directory.PeopleSearch(DirectoryManager.DirFindFlags.People, targetName, 0, 1000 * 10, out matches) && matches.Count > 0) { LLUUID target = matches[0].AgentID; targetName += String.Format(" ({0})", target); if (Client.Appearances.ContainsKey(target)) { #region AvatarAppearance to AgentSetAppearance AvatarAppearancePacket appearance = Client.Appearances[target]; AgentSetAppearancePacket set = new AgentSetAppearancePacket(); set.AgentData.AgentID = Client.Self.AgentID; set.AgentData.SessionID = Client.Self.SessionID; set.AgentData.SerialNum = SerialNum++; set.AgentData.Size = new LLVector3(2f, 2f, 2f); // HACK set.WearableData = new AgentSetAppearancePacket.WearableDataBlock[0]; set.VisualParam = new AgentSetAppearancePacket.VisualParamBlock[appearance.VisualParam.Length]; for (int i = 0; i < appearance.VisualParam.Length; i++) { set.VisualParam[i] = new AgentSetAppearancePacket.VisualParamBlock(); set.VisualParam[i].ParamValue = appearance.VisualParam[i].ParamValue; } set.ObjectData.TextureEntry = appearance.ObjectData.TextureEntry; #endregion AvatarAppearance to AgentSetAppearance // Detach everything we are currently wearing Client.Appearance.AddAttachments(new List <InventoryBase>(), true); // Send the new appearance packet Client.Network.SendPacket(set); return("Cloned " + targetName); } else { return("Don't know the appearance of avatar " + targetName); } } else { return("Couldn't find avatar " + targetName); } }
public override CmdResult ExecuteRequest(CmdRequest args) { bool detatchAll = args.IsTrue("--detatchall"); SimAvatar simAv; if (args.TryGetValue("target", out simAv)) { UUID target = simAv.ID; string targetName = simAv.GetName(); targetName += String.Format(" ({0})", target); if (Client.Appearances.ContainsKey(target)) { #region AvatarAppearance to AgentSetAppearance AvatarAppearancePacket appearance = TheBotClient.Appearances[target]; AgentSetAppearancePacket set = Client.Appearance.MakeAppearancePacket(); set.AgentData.AgentID = Client.Self.AgentID; set.AgentData.SessionID = Client.Self.SessionID; set.AgentData.SerialNum = SerialNum++; set.AgentData.Size = new Vector3(2f, 2f, 2f); // HACK set.WearableData = new AgentSetAppearancePacket.WearableDataBlock[0]; set.VisualParam = new AgentSetAppearancePacket.VisualParamBlock[appearance.VisualParam.Length]; for (int i = 0; i < appearance.VisualParam.Length; i++) { set.VisualParam[i] = new AgentSetAppearancePacket.VisualParamBlock(); set.VisualParam[i].ParamValue = appearance.VisualParam[i].ParamValue; } set.ObjectData.TextureEntry = appearance.ObjectData.TextureEntry; #endregion AvatarAppearance to AgentSetAppearance // Detach everything we are currently wearing if (detatchAll) { Client.Appearance.AddAttachments(new List <InventoryItem>(), true); } // Send the new appearance packet Client.Network.SendPacket(set); return(Success("Cloned " + targetName)); } else { /// allow clone thyself if (Client.Self.AgentID == target) { AgentSetAppearancePacket set = Client.Appearance.MakeAppearancePacket(); Client.Network.SendPacket(set); Logger.DebugLog("Send AgentSetAppearance packet"); return(Success("Cloned " + targetName)); } return(Failure("Don't know the appearance of avatar " + targetName)); } } else { return(Failure("Couldn't find avatar " + args.str)); } }
private void SendAvatarAppearancePackets(QueuedInterestListEvent[] eventDatas, IScenePresence presence) { if (!(presence is LLAgent) || presence.InterestList == null) return; LLAgent agent = (LLAgent)presence; for (int i = 0; i < eventDatas.Length; i++) { IScenePresence curPresence = (IScenePresence)eventDatas[i].Event.State; if (curPresence == presence) { m_log.Warn("Attempted to send an AvatarAppearance packet to the controlling agent"); continue; } AvatarAppearancePacket appearance = new AvatarAppearancePacket(); appearance.Sender.ID = curPresence.ID; appearance.Sender.IsTrial = false; Primitive.TextureEntry textureEntry = null; byte[] visualParams = null; if (curPresence is LLAgent) { LLAgent curAgent = (LLAgent)curPresence; // If this agent has not set VisualParams yet, skip it if (curAgent.VisualParams == null) continue; textureEntry = curAgent.TextureEntry; visualParams = curAgent.VisualParams; } if (textureEntry == null) { // Use a default texture entry for this avatar textureEntry = DEFAULT_TEXTURE_ENTRY; } if (visualParams == null) { // Use default visual params for this avatar visualParams = DEFAULT_VISUAL_PARAMS; } appearance.ObjectData.TextureEntry = textureEntry.GetBytes(); appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[visualParams.Length]; for (int j = 0; j < visualParams.Length; j++) { appearance.VisualParam[j] = new AvatarAppearancePacket.VisualParamBlock(); appearance.VisualParam[j].ParamValue = visualParams[j]; } m_udp.SendPacket(agent, appearance, ThrottleCategory.Task, false); } }
/// <summary> /// //settexture 5 8dcd4a48-2d37-4909-9f78-f7a9eb4ef903 /// </summary> /// <param name="args"></param> /// <param name="fromAgentID"></param> /// <param name="WriteLine"></param> /// <returns></returns> public override CmdResult ExecuteRequest(CmdRequest args) { UUID asset = UUID.Zero; AvatarTextureIndex index = AvatarTextureIndex.Unknown; if (args.Length > 1) { Object val; int argsUsed; if (TryEnumParse(typeof(AvatarTextureIndex), args, 0, out argsUsed, out val)) { index = (AvatarTextureIndex)val; } string targetName = args[argsUsed]; if (!UUID.TryParse(targetName, out asset)) { asset = WorldSystem.SimAssetSystem.GetAssetUUID(targetName, AssetType.Texture); } } // Get our current appearance UUID target = Client.Self.AgentID; #if COGBOT_LIBOMV AgentSetAppearancePacket set = Client.Appearance.MakeAppearancePacket(); Primitive.TextureEntry te; if (!Client.Appearances.ContainsKey(target)) { te = new Primitive.TextureEntry(set.ObjectData.TextureEntry, 0, set.ObjectData.TextureEntry.Length); } else { #region AvatarAppearance to AgentSetAppearance AvatarAppearancePacket appearance = TheBotClient.Appearances[target]; set.AgentData.AgentID = Client.Self.AgentID; set.AgentData.SessionID = Client.Self.SessionID; set.AgentData.SerialNum = SerialNum++; set.AgentData.Size = new Vector3(2f, 2f, 2f); // HACK set.WearableData = new AgentSetAppearancePacket.WearableDataBlock[0]; set.VisualParam = new AgentSetAppearancePacket.VisualParamBlock[appearance.VisualParam.Length]; for (int i = 0; i < appearance.VisualParam.Length; i++) { set.VisualParam[i] = new AgentSetAppearancePacket.VisualParamBlock(); set.VisualParam[i].ParamValue = appearance.VisualParam[i].ParamValue; } set.ObjectData.TextureEntry = appearance.ObjectData.TextureEntry; te = new Primitive.TextureEntry(appearance.ObjectData.TextureEntry, 0, appearance.ObjectData.TextureEntry.Length); #endregion AvatarAppearance to AgentSetAppearance } #region TextureEntry if (index != AvatarTextureIndex.Unknown) { Primitive.TextureEntryFace face = te.CreateFace((uint)index); face.TextureID = asset; } set.ObjectData.TextureEntry = te.GetBytes(); #endregion TextureEntry // Send the new appearance packet Client.Network.SendPacket(set); #endif return(Success("Setting texture entry for " + (AvatarTextureIndex)index + " to " + asset)); }
public AvatarAppearancePacket BuildAppearancePacket() { AvatarAppearancePacket appearance = new AvatarAppearancePacket(); appearance.ObjectData.TextureEntry = this.Avatar.Prim.Textures.GetBytes(); appearance.Sender.ID = this.ID; appearance.Sender.IsTrial = false; int count = this.Info.VisualParams != null ? this.Info.VisualParams.Length : 0; appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[count]; for (int i = 0; i < count; i++) { appearance.VisualParam[i] = new AvatarAppearancePacket.VisualParamBlock(); appearance.VisualParam[i].ParamValue = this.Info.VisualParams[i]; } if (count != 218) Logger.Log("Built an odd appearance packet with VisualParams.Length=" + count, Helpers.LogLevel.Warning); return appearance; }
private void SendAvatarAppearancePackets(QueuedInterestListEvent[] eventDatas, IScenePresence presence) { if (!(presence is LLAgent) || presence.InterestList == null) { return; } LLAgent agent = (LLAgent)presence; for (int i = 0; i < eventDatas.Length; i++) { IScenePresence curPresence = (IScenePresence)eventDatas[i].Event.State; if (curPresence == presence) { m_log.Warn("Attempted to send an AvatarAppearance packet to the controlling agent"); continue; } AvatarAppearancePacket appearance = new AvatarAppearancePacket(); appearance.Sender.ID = curPresence.ID; appearance.Sender.IsTrial = false; Primitive.TextureEntry textureEntry = null; byte[] visualParams = null; if (curPresence is LLAgent) { LLAgent curAgent = (LLAgent)curPresence; // If this agent has not set VisualParams yet, skip it if (curAgent.VisualParams == null) { continue; } textureEntry = curAgent.TextureEntry; visualParams = curAgent.VisualParams; } if (textureEntry == null) { // Use a default texture entry for this avatar textureEntry = DEFAULT_TEXTURE_ENTRY; } if (visualParams == null) { // Use default visual params for this avatar visualParams = DEFAULT_VISUAL_PARAMS; } appearance.ObjectData.TextureEntry = textureEntry.GetBytes(); appearance.VisualParam = new AvatarAppearancePacket.VisualParamBlock[visualParams.Length]; for (int j = 0; j < visualParams.Length; j++) { appearance.VisualParam[j] = new AvatarAppearancePacket.VisualParamBlock(); appearance.VisualParam[j].ParamValue = visualParams[j]; } m_udp.SendPacket(agent, appearance, ThrottleCategory.Task, false); } }
public Packet inClo(Packet packet, IPEndPoint sim) { AvatarAppearancePacket appearance = (AvatarAppearancePacket)packet; //Console.WriteLine("1"); if (avclients.ContainsKey(appearance.Sender.ID)) { if (avclients[appearance.Sender.ID] != "") { return(packet); } } //Console.WriteLine("2"); Primitive.TextureEntry te = new Primitive.TextureEntry(appearance.ObjectData.TextureEntry, 0, appearance.ObjectData.TextureEntry.Length); string client = ""; if (((te != null) && (te.FaceTextures != null)) && (te.FaceTextures.Length > 0)) { //Console.WriteLine("3"); for (int i = 0; i < te.FaceTextures.Length; i++) { string t = UUID.Zero.ToString(); try { t = te.FaceTextures[i].TextureID.ToString(); } catch (Exception) { } if (client == "") { if (uid2name.ContainsKey(new UUID(t))) { client = uid2name[new UUID(t)]; } } //Console.WriteLine("4"); } //Console.WriteLine("11"); if (avclients.ContainsKey(appearance.Sender.ID)) { //Console.WriteLine("41"); avclients[appearance.Sender.ID] = client; //writethis(".We found " + appearance.Sender.ID.ToString() + "'s client to be " + client, ConsoleColor.Red, ConsoleColor.White); } else { //Console.WriteLine("42"); avclients.Add(appearance.Sender.ID, client); //Console.WriteLine("5"); //writethis("We found " + appearance.Sender.ID.ToString() + "'s client to be " + client, ConsoleColor.Red, ConsoleColor.White); } if (blocks.ContainsKey(appearance.Sender.ID)) { ObjectUpdatePacket.ObjectDataBlock block; lock (blocks) { block = blocks[appearance.Sender.ID]; blocks.Remove(appearance.Sender.ID); } ObjectUpdatePacket oup = new ObjectUpdatePacket(); oup.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; oup.ObjectData[0] = modBlock(block); oup.RegionData = rb; oup.Header.Reliable = true; proxy.InjectPacket(oup, Direction.Incoming); } } updateList(); //Console.WriteLine("6"); return(appearance); }