From b6ab34f23bf575d70f46b648f230396f4c5ea9cc Mon Sep 17 00:00:00 2001 From: TomyLobo Date: Sun, 17 Nov 2013 21:21:36 +0100 Subject: [PATCH 1/2] Attachments for the 21st century! --- .../com/sk89q/worldedit/blocks/BlockType.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java index a165166af..b20af455d 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java +++ b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java @@ -1610,7 +1610,7 @@ public enum BlockType { nonDataAttachments.put(BlockID.DETECTOR_RAIL, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.LONG_GRASS, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.DEAD_BUSH, PlayerDirection.DOWN); - for (int offset = 0; offset <= 8; offset += 8) { + for (int offset = 0; offset < 16; offset += 8) { dataAttachments.put(typeDataKey(BlockID.PISTON_EXTENSION, offset + 0), PlayerDirection.UP); dataAttachments.put(typeDataKey(BlockID.PISTON_EXTENSION, offset + 1), PlayerDirection.DOWN); addCardinals(BlockID.PISTON_EXTENSION, offset + 2, offset + 5, offset + 3, offset + 4); @@ -1620,7 +1620,8 @@ public enum BlockType { nonDataAttachments.put(BlockID.BROWN_MUSHROOM, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.RED_MUSHROOM, PlayerDirection.DOWN); for (int blockId : new int[] { BlockID.TORCH, BlockID.REDSTONE_TORCH_ON, BlockID.REDSTONE_TORCH_OFF }) { - dataAttachments.put(typeDataKey(blockId, 5), PlayerDirection.DOWN); + dataAttachments.put(typeDataKey(blockId, 0), PlayerDirection.DOWN); + dataAttachments.put(typeDataKey(blockId, 5), PlayerDirection.DOWN); // According to the minecraft wiki, this one is history. Keeping both, for now... addCardinals(blockId, 4, 1, 3, 2); } nonDataAttachments.put(BlockID.REDSTONE_WIRE, PlayerDirection.DOWN); @@ -1630,16 +1631,18 @@ public enum BlockType { addCardinals(BlockID.LADDER, 2, 5, 3, 4); nonDataAttachments.put(BlockID.MINECART_TRACKS, PlayerDirection.DOWN); addCardinals(BlockID.WALL_SIGN, 2, 5, 3, 4); - for (int offset = 0; offset <= 8; offset += 8) { + for (int offset = 0; offset < 16; offset += 8) { addCardinals(BlockID.LEVER, offset + 4, offset + 1, offset + 3, offset + 2); dataAttachments.put(typeDataKey(BlockID.LEVER, offset + 5), PlayerDirection.DOWN); dataAttachments.put(typeDataKey(BlockID.LEVER, offset + 6), PlayerDirection.DOWN); + dataAttachments.put(typeDataKey(BlockID.LEVER, offset + 7), PlayerDirection.UP); + dataAttachments.put(typeDataKey(BlockID.LEVER, offset + 0), PlayerDirection.UP); } nonDataAttachments.put(BlockID.STONE_PRESSURE_PLATE, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.IRON_DOOR, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.WOODEN_PRESSURE_PLATE, PlayerDirection.DOWN); // redstone torches: see torches - for (int offset = 0; offset <= 8; offset += 8) { + for (int offset = 0; offset < 16; offset += 8) { addCardinals(BlockID.STONE_BUTTON, offset + 4, offset + 1, offset + 3, offset + 2); addCardinals(BlockID.WOODEN_BUTTON, offset + 4, offset + 1, offset + 3, offset + 2); } @@ -1648,7 +1651,7 @@ public enum BlockType { nonDataAttachments.put(BlockID.CAKE_BLOCK, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.REDSTONE_REPEATER_OFF, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.REDSTONE_REPEATER_ON, PlayerDirection.DOWN); - for (int offset = 0; offset <= 4; offset += 4) { + for (int offset = 0; offset < 16; offset += 4) { addCardinals(BlockID.TRAP_DOOR, offset + 0, offset + 3, offset + 1, offset + 2); } nonDataAttachments.put(BlockID.PUMPKIN_STEM, PlayerDirection.DOWN); @@ -1657,10 +1660,10 @@ public enum BlockType { dataAttachments.put(typeDataKey(BlockID.VINE, 0), PlayerDirection.UP); addCardinals(BlockID.VINE, 1, 2, 4, 8); nonDataAttachments.put(BlockID.NETHER_WART, PlayerDirection.DOWN); - for (int offset = 0; offset <= 4; offset += 4) { + for (int offset = 0; offset < 16; offset += 4) { addCardinals(BlockID.COCOA_PLANT, offset + 0, offset + 1, offset + 2, offset + 3); } - for (int offset = 0; offset <= 4; offset += 4) { + for (int offset = 0; offset < 16; offset += 4) { addCardinals(BlockID.TRIPWIRE_HOOK, offset + 2, offset + 3, offset + 0, offset + 1); } nonDataAttachments.put(BlockID.TRIPWIRE, PlayerDirection.DOWN); From 3fa9a4e3093fdc3699a8dc5036a6596e1f68f557 Mon Sep 17 00:00:00 2001 From: TomyLobo Date: Sun, 17 Nov 2013 22:03:37 +0100 Subject: [PATCH 2/2] Attached ascending rails to the block they're ascending towards, in addition to the block below them. --- src/main/java/com/sk89q/worldedit/EditSession.java | 13 +++++++++++++ .../java/com/sk89q/worldedit/blocks/BlockType.java | 13 +++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sk89q/worldedit/EditSession.java b/src/main/java/com/sk89q/worldedit/EditSession.java index 0a1b49d61..a026077c5 100644 --- a/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/src/main/java/com/sk89q/worldedit/EditSession.java @@ -766,6 +766,19 @@ public class EditSession { walked.addFirst(upperBlock); } } + break; + + case BlockID.MINECART_TRACKS: + case BlockID.POWERED_RAIL: + case BlockID.DETECTOR_RAIL: + case BlockID.ACTIVATOR_RAIL: + // Here, rails are hardcoded to be attached to the block below them. + // They're also attached to the block they're ascending towards via BlockType.getAttachment. + BlockVector lowerBlock = current.add(0, -1, 0).toBlockVector(); + if (blocks.contains(lowerBlock) && !walked.contains(lowerBlock)) { + walked.addFirst(lowerBlock); + } + break; } final PlayerDirection attachment = BlockType.getAttachment(type, data); diff --git a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java index b20af455d..8e99003c4 100644 --- a/src/main/java/com/sk89q/worldedit/blocks/BlockType.java +++ b/src/main/java/com/sk89q/worldedit/blocks/BlockType.java @@ -1606,8 +1606,6 @@ public enum BlockType { private static final Map nonDataAttachments = new HashMap(); static { nonDataAttachments.put(BlockID.SAPLING, PlayerDirection.DOWN); - nonDataAttachments.put(BlockID.POWERED_RAIL, PlayerDirection.DOWN); - nonDataAttachments.put(BlockID.DETECTOR_RAIL, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.LONG_GRASS, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.DEAD_BUSH, PlayerDirection.DOWN); for (int offset = 0; offset < 16; offset += 8) { @@ -1629,7 +1627,6 @@ public enum BlockType { nonDataAttachments.put(BlockID.SIGN_POST, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.WOODEN_DOOR, PlayerDirection.DOWN); addCardinals(BlockID.LADDER, 2, 5, 3, 4); - nonDataAttachments.put(BlockID.MINECART_TRACKS, PlayerDirection.DOWN); addCardinals(BlockID.WALL_SIGN, 2, 5, 3, 4); for (int offset = 0; offset < 16; offset += 8) { addCardinals(BlockID.LEVER, offset + 4, offset + 1, offset + 3, offset + 2); @@ -1675,8 +1672,16 @@ public enum BlockType { nonDataAttachments.put(BlockID.PRESSURE_PLATE_HEAVY, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.COMPARATOR_OFF, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.COMPARATOR_ON, PlayerDirection.DOWN); - nonDataAttachments.put(BlockID.ACTIVATOR_RAIL, PlayerDirection.DOWN); nonDataAttachments.put(BlockID.CARPET, PlayerDirection.DOWN); + + // Rails are hardcoded to be attached to the block below them. + // In addition to that, let's attach ascending rails to the block they're ascending towards. + for (int offset = 0; offset < 16; offset += 8) { + addCardinals(BlockID.POWERED_RAIL, offset + 3, offset + 4, offset + 2, offset + 5); + addCardinals(BlockID.DETECTOR_RAIL, offset + 3, offset + 4, offset + 2, offset + 5); + addCardinals(BlockID.MINECART_TRACKS, offset + 3, offset + 4, offset + 2, offset + 5); + addCardinals(BlockID.ACTIVATOR_RAIL, offset + 3, offset + 4, offset + 2, offset + 5); + } } /**