/// <summary> /// Passed a packet sent by a server to the packet listeners /// </summary> /// <param name="args"> A PacketReceivedEventArgs object containing information about the packet </param> public void ApplyServerPacket(PacketReceivedEventArgs args) { var removeListener = new List<IPacketListener> (); foreach (IPacketListener item in _packetListener) { bool handled = args.Handled; try { item.ServerPacketReceived(args); } catch (OperationCanceledException) { throw; } catch (Exception ex) { args.Handled = handled; //reset value if plugin failed _logger.Error( string.Format("Could not pass server packet {0} to {1}, removing packet listener.", args.Packet, item), ex); removeListener.Add(item); } } _packetListener.RemoveAll(a => removeListener.Contains(a)); }
public async void ServerPacketReceived(PacketReceivedEventArgs e) { var packet = e.Packet as DisconnectPacket; if (packet != null) { Exception exception = null; try { Match result = endPointRegex.Match(packet.Reason); if (result.Success) { e.Handled = true; int version = 0; if (result.Groups["version"].Success) version = int.Parse(result.Groups["version"].Value); var info = new RemoteServerInfo(result.ToString (), new IPEndPoint(await FindAddress(result.Groups["ip"].Value), result.Groups["port"].Success ? int.Parse(result.Groups["port"].Value) : 25565), version); IProxyConnection connection = e.Connection; Packet pa = await connection.InitializeServerAsync(info); if (pa is DisconnectPacket) { await e.Connection.ClientEndPoint.SendPacketAsync(pa); return; } var logonResponse = pa as LogOnResponse; //Add entity id mapping Plugin.EntityIDMapping.AddOrUpdate(e.Connection, new Tuple<int, int>(e.Connection.EntityID, logonResponse.EntityId), (a, b) => b); var state = new InvalidState {Reason = 2}; // Stop raining await connection.ClientEndPoint.SendPacketAsync(state); var respawn = new Respawn { World = logonResponse.Dimension == 0 ? -1 : 0, //Force chunk and entity unload on client CreativeMode = (byte) logonResponse.ServerMode, Difficulty = logonResponse.Difficulty, Generator = logonResponse.Generator, //for compatibility MapSeed = logonResponse.MapSeed, //for compatibility WorldHeight = (short) logonResponse.WorldHeight }; await connection.ClientEndPoint.SendPacketAsync(respawn); //now send the correct world respawn.World = logonResponse.Dimension; await connection.ClientEndPoint.SendPacketAsync(respawn); await Task.Delay(500); // I don't like this too :( connection.StartServerListening (); Plugin.Logger.InfoFormat("{0} got transferred to {1}", e.Connection.Username, info.EndPoint); return; } } catch (Exception ex) { _logger.Error(ex); exception = ex; } if (exception != null) await e.Connection.KickUserAsync(exception.Message); } ApplyServerEntityIDFixes(e); }
public void ClientPacketReceived(PacketReceivedEventArgs e) { ApplyClientEntityIDFixes(e); }
private void ApplyClientEntityIDFixes(PacketReceivedEventArgs e) { Tuple<int, int> mapping; if (!Plugin.EntityIDMapping.TryGetValue(e.Connection, out mapping)) return; Packet packet = e.Packet; if (packet.Code == 0x05) { var entityEquipment = (EntityEquipment) packet; entityEquipment.EntityId = entityEquipment.EntityId == mapping.Item1 ? mapping.Item2 : entityEquipment.EntityId; entityEquipment.Changed = true; } else if (packet.Code == 0x05) { var useEntity = (UseEntity) packet; useEntity.UserEntity = useEntity.UserEntity == mapping.Item1 ? mapping.Item2 : useEntity.UserEntity; useEntity.Changed = true; } else if (packet.Code == 0x1C) { var entityVelocity = (EntityVelocity) packet; entityVelocity.EntityId = entityVelocity.EntityId == mapping.Item1 ? mapping.Item2 : entityVelocity.EntityId; entityVelocity.Changed = true; } else if (packet.Code == 0x1F) { var entityRelativeMove = (EntityRelativeMove) packet; entityRelativeMove.EntityId = entityRelativeMove.EntityId == mapping.Item1 ? mapping.Item2 : entityRelativeMove.EntityId; entityRelativeMove.Changed = true; } else if (packet.Code == 0x20) { var entityLook = (EntityLook) packet; entityLook.EntityId = entityLook.EntityId == mapping.Item1 ? mapping.Item2 : entityLook.EntityId; entityLook.Changed = true; } else if (packet.Code == 0x21) { var entityLookAndRelativeMove = (EntityLookAndRelativeMove) packet; entityLookAndRelativeMove.EntityId = entityLookAndRelativeMove.EntityId == mapping.Item1 ? mapping.Item2 : entityLookAndRelativeMove.EntityId; entityLookAndRelativeMove.Changed = true; } else if (packet.Code == 0x22) { var entityTeleport = (EntityTeleport) packet; entityTeleport.EntityId = entityTeleport.EntityId == mapping.Item1 ? mapping.Item2 : entityTeleport.EntityId; entityTeleport.Changed = true; } else if (packet.Code == 0x26) { var entityStatus = (EntityStatus) packet; entityStatus.EntityId = entityStatus.EntityId == mapping.Item1 ? mapping.Item2 : entityStatus.EntityId; entityStatus.Changed = true; } else if (packet.Code == 0x27) { var attachEntity = (AttachEntity) packet; attachEntity.EntityId = attachEntity.EntityId == mapping.Item1 ? mapping.Item2 : attachEntity.EntityId; attachEntity.Changed = true; } else if (packet.Code == 0x28) { var entityMetadata = (EntityMetadata) packet; entityMetadata.EntityId = entityMetadata.EntityId == mapping.Item1 ? mapping.Item2 : entityMetadata.EntityId; entityMetadata.Changed = true; } else if (packet.Code == 0x29) { var entityEffect = (EntityEffect) packet; entityEffect.EntityId = entityEffect.EntityId == mapping.Item1 ? mapping.Item2 : entityEffect.EntityId; entityEffect.Changed = true; } else if (packet.Code == 0x2A) { var removeEntityEffect = (RemoveEntityEffect) packet; removeEntityEffect.EntityId = removeEntityEffect.EntityId == mapping.Item1 ? mapping.Item2 : removeEntityEffect.EntityId; removeEntityEffect.Changed = true; } }
private async void ServerPacketReceived(object sender, PacketReceivedEventArgs args) { Trace.WriteLine("S->C: " + args.Packet); if (args.Packet is ChatPacket) return; string kickMessage = null; try { args.Connection = this; _server.PluginManager.ApplyServerPacket(args); if (!args.Handled) ClientEndPoint.SendPacketQueued(args.Packet); } catch (OperationCanceledException ex) { kickMessage = ex.Message; } if (kickMessage != null) await KickUserAsync(kickMessage); }