예제 #1
0
 private void HandleGameObjects(HPacket packet, bool isOutgoing)
 {
     packet.Position = 0;
     if (!isOutgoing)
     {
         if (packet.Id == In.Users)
         {
             HEntity[] entities = HEntity.Parse(packet);
             foreach (HEntity entity in entities)
             {
                 _entities[entity.Index] = entity;
             }
             _container.OnEntitiesLoaded(entities.Length);
         }
         else if (packet.Id == In.Items)
         {
             HWallItem[] wallItems = HWallItem.Parse(packet);
             foreach (HWallItem wallItem in wallItems)
             {
                 _wallItems[wallItem.Id] = wallItem;
             }
             _container.OnWallItemsLoaded(wallItems.Length);
         }
         else if (packet.Id == In.Objects)
         {
             HFloorItem[] floorItems = HFloorItem.Parse(packet);
             foreach (HFloorItem floorItem in floorItems)
             {
                 _floorItems[floorItem.Id] = floorItem;
             }
             _container.OnFloorItemsLoaded(floorItems.Length);
         }
         else if (packet.Id == In.FloorHeightMap)
         {
             _entities.Clear();
             _wallItems.Clear();
             _floorItems.Clear();
         }
     }
     packet.Position = 0;
 }
예제 #2
0
        private object[] CreateValues(DataInterceptedEventArgs args)
        {
            ParameterInfo[] parameters = Method.GetParameters();
            var             values     = new object[parameters.Length];

            int position = 0;

            for (int i = 0; i < values.Length; i++)
            {
                ParameterInfo parameter = parameters[i];
                switch (Type.GetTypeCode(parameter.ParameterType))
                {
                case TypeCode.UInt16:
                {
                    if (parameter.Name.Equals("id", StringComparison.OrdinalIgnoreCase))
                    {
                        values[i] = args.Packet.Id;
                    }
                    else
                    {
                        values[i] = args.Packet.ReadUInt16(ref position);
                    }
                    break;
                }

                case TypeCode.Int32:
                    values[i] = args.Packet.ReadInt32(ref position);
                    break;

                case TypeCode.Boolean:
                    values[i] = args.Packet.ReadBoolean(ref position);
                    break;

                case TypeCode.Byte:
                    values[i] = args.Packet.ReadByte(ref position);
                    break;

                case TypeCode.String:
                    values[i] = args.Packet.ReadUTF8(ref position);
                    break;

                case TypeCode.Double:
                    values[i] = args.Packet.ReadDouble(ref position);
                    break;

                case TypeCode.Object:
                {
                    if (parameter.ParameterType == typeof(DataInterceptedEventArgs))
                    {
                        values[i] = args;
                    }
                    else if (parameter.ParameterType == typeof(HPacket))
                    {
                        values[i] = args.Packet;
                    }
                    else if (parameter.ParameterType == typeof(HPoint))
                    {
                        values[i] = new HPoint(args.Packet.ReadInt32(ref position), args.Packet.ReadInt32(ref position));
                    }
                    else if (parameter.ParameterType == typeof(byte[]))
                    {
                        int length = args.Packet.ReadInt32(ref position);
                        values[i] = args.Packet.ReadBytes(length, ref position);
                    }
                    else if (typeof(IList <HEntity>).IsAssignableFrom(parameter.ParameterType))
                    {
                        args.Packet.Position = 0;
                        values[i]            = HEntity.Parse(args.Packet);
                    }
                    else if (typeof(IList <HFloorItem>).IsAssignableFrom(parameter.ParameterType))
                    {
                        args.Packet.Position = 0;
                        values[i]            = HFloorItem.Parse(args.Packet);
                    }
                    else if (typeof(IList <HWallItem>).IsAssignableFrom(parameter.ParameterType))
                    {
                        args.Packet.Position = 0;
                        values[i]            = HWallItem.Parse(args.Packet);
                    }
                    break;
                }
                }
            }
            return(values);
        }