public static void HandlePacketPlayerBlockPlacement(Client client, PlayerBlockPlacementPacket packet) { var baseBlockcoords = UniversalCoords.FromWorld(packet.X, packet.Y, packet.Z); var player = client.Owner; // Consume food, charge the bow etc if (packet.X == -1 && packet.Y == -1 && packet.Z == -1 && packet.Face == BlockFace.Held) { if (ItemHelper.IsVoid(player.Inventory.ActiveItem)) { return; } if (player.Inventory.ActiveItem is IItemConsumable) { var consumable = player.Inventory.ActiveItem as IItemConsumable; consumable.StartConsuming(); } return; } var chunk = player.World.GetChunk(baseBlockcoords) as Chunk; if (chunk == null) { return; } var baseBlockType = chunk.GetType(baseBlockcoords); // Get block being built against. byte baseBlockMeta = chunk.GetData(baseBlockcoords); var baseBlock = new StructBlock(baseBlockcoords, (byte)baseBlockType, baseBlockMeta, player.World); // Interaction with the blocks - chest, furnace, enchantment table etc if (BlockHelper.Instance.IsInteractive(baseBlockType)) { (BlockHelper.Instance.CreateBlockInstance(baseBlock.Type) as IBlockInteractive).Interact(client.Owner, baseBlock); return; } if (ItemHelper.IsVoid(player.Inventory.ActiveItem)) { return; } if (player.Inventory.ActiveItem is IItemUsable) { var consumable = player.Inventory.ActiveItem as IItemUsable; consumable.Use(baseBlock, packet.Face); //HandlePacketPlayerItemPlacement(client, packet); } if (player.Inventory.ActiveItem is IItemPlaceable) { var consumable = player.Inventory.ActiveItem as IItemPlaceable; consumable.Place(baseBlock, packet.Face); } }
public static void ReadPlayerBlockPlacement(Client client, PacketReader reader) { PlayerBlockPlacementPacket pb = new PlayerBlockPlacementPacket(); pb.Read(reader); if (!reader.Failed) { Client.HandlePacketPlayerBlockPlacement(client, pb); } }
/// <summary> /// Gets a packet from the server and returns it. /// </summary> /// <returns>The received packet.</returns> public Packet GetPacket() { var packetID = (byte)_stream.ReadByte(); //_log.Debug("Got packet ID: " + packetID); // Spammy debug message if (!Enum.IsDefined(typeof(PacketType), (int)packetID)) { return(null); } var type = (PacketType)packetID; Packet pack = null; switch (type) { case PacketType.KeepAlive: pack = new KeepAlivePacket(_tools.ReadInt32()); break; case PacketType.LoginRequest: pack = new LoginRequestPacketSC { EntityID = _tools.ReadInt32(), NotUsed = _tools.ReadString(), LevelType = _tools.ReadString(), Gamemode = _tools.ReadInt32(), Dimension = _tools.ReadInt32(), Difficulty = _tools.ReadSignedByte(), WorldHeight = _tools.ReadByte(), // Not Used MaxPlayers = _tools.ReadByte() }; break; case PacketType.Handshake: pack = new HandshakePacketSC(_tools.ReadString()); break; case PacketType.ChatMessage: pack = new ChatMessagePacket(_tools.ReadString()); break; case PacketType.TimeUpdate: pack = new TimeUpdatePacket(_tools.ReadInt32()); break; case PacketType.EntityEquipment: pack = new EntityEquipmentPacket(_tools.ReadInt32(), _tools.ReadInt16(), _tools.ReadInt16(), _tools.ReadInt16()); break; case PacketType.SpawnPosition: pack = new SpawnPositionPacket(_tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32()); break; case PacketType.UseEntity: pack = new UseEntityPacket(_tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadBoolean()); break; case PacketType.UpdateHealth: pack = new UpdateHealthPacket(_tools.ReadInt16(), _tools.ReadInt16(), _tools.ReadSingle()); break; case PacketType.Respawn: pack = new RespawnPacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadInt16(), _tools.ReadString()); break; case PacketType.Player: pack = new PlayerPacket(_tools.ReadBoolean()); break; case PacketType.PlayerPosition: pack = new PlayerPositionPacket(_tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadBoolean()); break; case PacketType.PlayerLook: pack = new PlayerLookPacket(_tools.ReadSingle(), _tools.ReadSingle(), _tools.ReadBoolean()); break; case PacketType.PlayerPositionAndLook: pack = new PlayerPositionAndLookPacket(_tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadSingle(), _tools.ReadSingle(), _tools.ReadBoolean()); break; case PacketType.PlayerDigging: pack = new PlayerDiggingPacket(_tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadSignedByte()); break; case PacketType.PlayerBlockPlacement: pack = new PlayerBlockPlacementPacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSlotData()); break; case PacketType.UseBed: pack = new UseBedPacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32()); break; case PacketType.Animation: pack = new AnimationPacket(_tools.ReadInt32(), _tools.ReadSignedByte()); break; case PacketType.NamedEntitySpawn: pack = new NamedEntitySpawnPacket(_tools.ReadInt32(), _tools.ReadString(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadInt16()); break; case PacketType.PickupSpawn: pack = new PickupSpawnPacket(_tools.ReadInt32(), _tools.ReadInt16(), _tools.ReadSignedByte(), _tools.ReadInt16(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.CollectItem: pack = new CollectItemPacket(_tools.ReadInt32(), _tools.ReadInt32()); break; case PacketType.AddObjectVehicle: pack = new AddObjectVehiclePacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32()); var ftEid = _tools.ReadInt32(); ((AddObjectVehiclePacket)pack).FireballThrowerID = ftEid; if (ftEid > 0) { var aovpPack = (AddObjectVehiclePacket)pack; aovpPack.SpeedX = _tools.ReadInt16(); aovpPack.SpeedY = _tools.ReadInt16(); aovpPack.SpeedZ = _tools.ReadInt16(); pack = aovpPack; } break; case PacketType.HoldingChange: pack = new HoldingChangePacket(_tools.ReadInt16()); break; case PacketType.MobSpawn: pack = new MobSpawnPacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadEntityMetadata()); break; case PacketType.EntityPainting: pack = new EntityPaintingPacket(_tools.ReadInt32(), _tools.ReadString(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32()); break; case PacketType.ExperienceOrb: pack = new ExperienceOrbPacket(_tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt16()); break; case PacketType.EntityVelocity: pack = new EntityVelocityPacket(_tools.ReadInt32(), _tools.ReadInt16(), _tools.ReadInt16(), _tools.ReadInt16()); break; case PacketType.DestroyEntity: pack = new DestroyEntityPacket(_tools.ReadInt32()); break; case PacketType.Entity: pack = new EntityPacket(_tools.ReadInt32()); break; case PacketType.EntityRelativeMove: pack = new EntityRelativeMovePacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.EntityLook: pack = new EntityLookPacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.EntityLookAndRelativeMove: pack = new EntityLookAndRelativeMovePacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.EntityTeleport: pack = new EntityTeleportPacket(_tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.EntityHeadLook: pack = new EntityHeadLookPacket(_tools.ReadInt32(), _tools.ReadSignedByte()); break; case PacketType.EntityStatus: pack = new EntityStatusPacket(_tools.ReadInt32(), _tools.ReadSignedByte()); break; case PacketType.AttachEntity: pack = new AttachEntityPacket(_tools.ReadInt32(), _tools.ReadInt32()); break; case PacketType.EntityMetadata: var entityMetadataPacket = new EntityMetadataPacket(_tools.ReadInt32()); var metaData = new List <sbyte>(); var b = true; while (b) { var value = _tools.ReadSignedByte(); if (value == 127) { b = false; } metaData.Add(value); } entityMetadataPacket.Metadata = metaData.ToArray(); break; case PacketType.EntityEffect: pack = new EntityEffectPacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadInt16()); break; case PacketType.RemoveEntityEffect: pack = new RemoveEntityEffectPacket(_tools.ReadInt32(), _tools.ReadSignedByte()); break; case PacketType.Experience: pack = new ExperiencePacket(_tools.ReadSingle(), _tools.ReadInt16(), _tools.ReadInt16()); break; case PacketType.PreChunk: pack = new PreChunkPacket(_tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadBoolean()); break; case PacketType.MapChunk: var mapChunkPacket = new MapChunkPacket(_tools.ReadInt32(), _tools.ReadInt16(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); mapChunkPacket.CompressedSize = _tools.ReadInt32(); mapChunkPacket.CompressedData = _tools.ReadSignedBytes(mapChunkPacket.CompressedSize); pack = mapChunkPacket; break; case PacketType.MultiBlockChange: var multiBlockChangePacket = new MultiBlockChangePacket(_tools.ReadInt32(), _tools.ReadInt32()); var arraySize = _tools.ReadInt16(); multiBlockChangePacket.ArraySize = arraySize; var coordinates = new short[arraySize, 3]; for (short i = 0; i < arraySize; i++) { coordinates[i, 0] = _tools.ReadInt16(); coordinates[i, 1] = _tools.ReadInt16(); coordinates[i, 2] = _tools.ReadInt16(); } multiBlockChangePacket.Coordinates = coordinates; var types = new sbyte[arraySize]; for (short i = 0; i < arraySize; i++) { types[i] = _tools.ReadSignedByte(); } multiBlockChangePacket.Types = types; var metadata = new sbyte[arraySize]; for (short i = 0; i < arraySize; i++) { metadata[i] = _tools.ReadSignedByte(); } multiBlockChangePacket.Metadata = metadata; pack = multiBlockChangePacket; break; case PacketType.BlockChange: pack = new BlockChangePacket(_tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.BlockAction: pack = new BlockActionPacket(_tools.ReadInt32(), _tools.ReadInt16(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.Explosion: var explosionPacket = new ExplosionPacket(_tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadDouble(), _tools.ReadSingle()); var recordCount = _tools.ReadInt32(); explosionPacket.Count = recordCount; var records = new sbyte[recordCount, 3]; for (var i = 0; i < recordCount; i++) { records[i, 0] = _tools.ReadSignedByte(); records[i, 1] = _tools.ReadSignedByte(); records[i, 2] = _tools.ReadSignedByte(); } explosionPacket.Records = records; pack = explosionPacket; break; case PacketType.SoundParticleEffect: pack = new SoundParticleEffectPacket(_tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadSignedByte(), _tools.ReadInt32(), _tools.ReadInt32()); break; case PacketType.NewInvalidState: pack = new NewInvalidStatePacket(_tools.ReadSignedByte(), _tools.ReadSignedByte()); break; case PacketType.Thunderbolt: pack = new ThunderboltPacket(_tools.ReadInt32(), _tools.ReadBoolean(), _tools.ReadInt32(), _tools.ReadInt32(), _tools.ReadInt32()); break; case PacketType.OpenWindow: pack = new OpenWindowPacket(_tools.ReadSignedByte(), _tools.ReadSignedByte(), _tools.ReadString(), _tools.ReadSignedByte()); break; case PacketType.CloseWindow: pack = new CloseWindowPacket(_tools.ReadSignedByte()); break; case PacketType.SetSlot: pack = new SetSlotPacket(_tools.ReadSignedByte(), _tools.ReadInt16(), _tools.ReadSlotData()); break; case PacketType.WindowItems: var windowItemsPacket = new WindowItemsPacket(_tools.ReadSignedByte()); var count = _tools.ReadInt16(); windowItemsPacket.Count = count; var slotData = new SlotData[count]; for (short i = 0; i < count; i++) { slotData[i] = _tools.ReadSlotData(); } windowItemsPacket.SlotData = slotData; pack = windowItemsPacket; break; case PacketType.UpdateWindowProperty: pack = new UpdateWindowPropertyPacket(_tools.ReadSignedByte(), _tools.ReadInt16(), _tools.ReadInt16()); break; case PacketType.Transaction: pack = new TransactionPacket(_tools.ReadSignedByte(), _tools.ReadInt16(), _tools.ReadBoolean()); break; case PacketType.CreativeInventoryAction: pack = new CreativeInventoryActionPacket(_tools.ReadInt16(), _tools.ReadSlotData()); break; case PacketType.UpdateSign: pack = new UpdateSignPacket(_tools.ReadInt32(), _tools.ReadInt16(), _tools.ReadInt32(), _tools.ReadString(), _tools.ReadString(), _tools.ReadString(), _tools.ReadString()); break; case PacketType.ItemData: pack = new ItemDataPacket(_tools.ReadInt16(), _tools.ReadInt16()); byte len = _tools.ReadByte(); ((ItemDataPacket)pack).Length = len; ((ItemDataPacket)pack).Text = _tools.ReadSignedBytes(len); break; case PacketType.IncrementStatistic: pack = new IncrementStatisticPacket(_tools.ReadInt32(), _tools.ReadSignedByte()); break; case PacketType.PlayerListItem: pack = new PlayerListItemPacket(_tools.ReadString(), _tools.ReadBoolean(), _tools.ReadInt16()); break; case PacketType.PluginMessage: pack = new PluginMessagePacket(_tools.ReadString()); var length = _tools.ReadInt16(); ((PluginMessagePacket)pack).Length = length; ((PluginMessagePacket)pack).Data = _tools.ReadSignedBytes(length); break; case PacketType.DisconnectKick: pack = new DisconnectKickPacket(_tools.ReadString()); break; } return(pack); }
private void HandlePlayerBlockPlacement(Client client, PlayerBlockPlacementPacket packet) { // TODO: Check if player is close enough to place the block; check if player is placing on top of another block, etc. if (packet.Amount >= 0 && packet.BlockID > 0 && packet.BlockID <= 121) { int placeX = packet.X; int placeY = packet.Y; int placeZ = packet.Z; switch (packet.Direction) { case 0: placeY--; break; case 1: placeY++; break; case 2: placeZ--; break; case 3: placeZ++; break; case 4: placeX--; break; case 5: placeX++; break; } WorldLocation bLoc = new WorldLocation(placeX, placeY, placeZ); Nullable<Block> nb = Server.GetWorldManager().GetWorld(0).GetBlock(bLoc); if (nb != null) { Block b = (Block)nb; b.SetBlockType((BlockType)packet.BlockID); Server.OnBlockChange(b); } } }
public static void HandlePacketPlayerBlockPlacement(Client client, PlayerBlockPlacementPacket packet) { /* * Scenarios: * * 1) using an item against a block (e.g. stone and flint) * 2) placing a new block * 3) using a block: e.g. open/close door, open chest, open workbench, open furnace * * */ // if (!Permissions.CanPlayerBuild(Username)) return; // Using activeslot provides current item info wtihout having to maintain ActiveItem UniversalCoords coords = UniversalCoords.FromWorld(packet.X, packet.Y, packet.Z); if (packet.X == -1 && packet.Y == -1 && packet.Z == -1 && packet.Face == BlockFace.Held) { // TODO: Implement item usage - food etc return; } Player player = client.Owner; Chunk chunk = player.World.GetChunk(coords) as Chunk; if (chunk == null) { return; } BlockData.Blocks type = chunk.GetType(coords); // Get block being built against. byte metadata = chunk.GetData(coords); StructBlock facingBlock = new StructBlock(coords, (byte)type, metadata, player.World); UniversalCoords coordsFromFace = player.World.FromFace(coords, packet.Face); if (BlockHelper.Instance.CreateBlockInstance((byte)type) is IBlockInteractive) { (BlockHelper.Instance.CreateBlockInstance((byte)type) as IBlockInteractive).Interact(player, facingBlock); return; } if (player.Inventory.Slots[player.Inventory.ActiveSlot].Type <= 0 || player.Inventory.Slots[player.Inventory.ActiveSlot].Count < 1) { return; } // TODO: Neaten this out, or address via handler? if (player.Inventory.Slots[player.Inventory.ActiveSlot].Type > 255 || packet.Face == BlockFace.Held) // Client is using an Item. { HandlePacketPlayerItemPlacement(client, packet); return; } // Built Block Info byte bType = (byte)player.Inventory.Slots[player.Inventory.ActiveSlot].Type; byte bMetaData = (byte)player.Inventory.Slots[player.Inventory.ActiveSlot].Durability; StructBlock bBlock = new StructBlock(coordsFromFace, bType, bMetaData, player.World); BlockHelper.Instance.CreateBlockInstance(bType).Place(player, bBlock, facingBlock, packet.Face); }
public static void HandlePacketPlayerItemPlacement(Client client, PlayerBlockPlacementPacket packet) { Player player = client.Owner; // if(!Permissions.CanPlayerBuild(Username)) return; if (player.Inventory.Slots[player.Inventory.ActiveSlot].Type <= 255) { return; } UniversalCoords baseBlockCoords = UniversalCoords.FromWorld(packet.X, packet.Y, packet.Z); Chunk chunk = player.World.GetChunk(baseBlockCoords) as Chunk; if (chunk == null) { return; } BlockData.Blocks baseBlockType = chunk.GetType(baseBlockCoords); // Get block being built against. byte baseBlockData = chunk.GetData(baseBlockCoords); StructBlock baseBlock = new StructBlock(baseBlockCoords, (byte)baseBlockType, (byte)baseBlockData, player.World); // Placed Item Info short pType = player.Inventory.Slots[player.Inventory.ActiveSlot].Type; short pMetaData = player.Inventory.Slots[player.Inventory.ActiveSlot].Durability; UniversalCoords newBlockCoords = player.World.FromFace(baseBlockCoords, packet.Face); StructBlock newBlock; byte newBlockId = 0; switch (packet.Face) { case BlockFace.Held: return; // TODO: Process buckets, food, etc. } switch (baseBlockType) { case BlockData.Blocks.Air: case BlockData.Blocks.Water: case BlockData.Blocks.Lava: case BlockData.Blocks.Still_Water: case BlockData.Blocks.Still_Lava: return; } switch ((BlockData.Items)pType) { case BlockData.Items.Diamond_Hoe: case BlockData.Items.Gold_Hoe: case BlockData.Items.Iron_Hoe: case BlockData.Items.Stone_Hoe: case BlockData.Items.Wooden_Hoe: if (baseBlockType == BlockData.Blocks.Dirt || baseBlockType == BlockData.Blocks.Grass) { // Think the client has a Notch bug where hoe's durability is not updated properly. BlockHelper.Instance.CreateBlockInstance((byte)BlockData.Blocks.Soil).Spawn(baseBlock); } return; case BlockData.Items.Ink_Sack: if (pMetaData != 15) { return; } if (baseBlockType == BlockData.Blocks.Red_Mushroom || baseBlockType == BlockData.Blocks.Brown_Mushroom) { BlockBaseMushroom baseMushroom = (BlockBaseMushroom)BlockHelper.Instance.CreateBlockInstance((byte)baseBlockType); baseMushroom.Fertilize(player, baseBlock); } return; case BlockData.Items.Minecart: case BlockData.Items.Boat: case BlockData.Items.Storage_Minecart: case BlockData.Items.Powered_Minecart: // TODO: Create new object break; case BlockData.Items.Sign: if (packet.Face == BlockFace.Up) { newBlockId = (byte)BlockData.Blocks.Sign_Post; } else { newBlockId = (byte)BlockData.Blocks.Wall_Sign; } break; case BlockData.Items.Seeds: newBlockId = (byte)BlockData.Blocks.Crops; break; case BlockData.Items.Reeds: newBlockId = (byte)BlockData.Blocks.Reed; break; case BlockData.Items.Redstone: newBlockId = (byte)BlockData.Blocks.Redstone_Wire; break; case BlockData.Items.Iron_Door: newBlockId = (byte)BlockData.Blocks.Iron_Door; break; case BlockData.Items.Wooden_Door: newBlockId = (byte)BlockData.Blocks.Wooden_Door; break; } if (newBlockId != 0) { newBlock = new StructBlock(newBlockCoords, newBlockId, 0, player.World); BlockHelper.Instance.CreateBlockInstance(newBlockId).Place(player, newBlock, baseBlock, packet.Face); } }