Event data about a received packet
상속: System.EventArgs
 /// <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);
        }