From e42107557eb42c18a79d070b1e6aff8b90eb0b42 Mon Sep 17 00:00:00 2001 From: Kenzie Togami Date: Fri, 17 Jun 2016 16:59:41 -0700 Subject: [PATCH] [Forge] Make DefaultBlockParser behave more like vanilla. --- .../extension/factory/DefaultBlockParser.java | 35 ++++++++++++++++--- .../sk89q/worldedit/forge/ForgePlatform.java | 4 +-- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java index beb9bc5d7..cda4c0093 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/DefaultBlockParser.java @@ -55,12 +55,37 @@ class DefaultBlockParser extends InputParser { } @Override - public BaseBlock parseFromInput(String input, ParserContext context) throws InputParseException { - // TODO: Rewrite this entire method to use BaseBlocks and ignore BlockType, as well as to properly handle mod:name IDs + public BaseBlock parseFromInput(String input, ParserContext context) + throws InputParseException { + // TODO: Rewrite this entire method to use BaseBlocks and ignore + // BlockType, as well as to properly handle mod:name IDs - BlockType blockType; + String originalInput = input; input = input.replace("_", " "); input = input.replace(";", "|"); + Exception suppressed = null; + try { + BaseBlock modified = parseLogic(input, context); + if (modified != null) { + return modified; + } + } catch (Exception e) { + suppressed = e; + } + try { + return parseLogic(originalInput, context); + } catch (Exception e) { + if (suppressed != null) { + e.addSuppressed(suppressed); + } + throw e; + } + } + + private BaseBlock parseLogic(String input, ParserContext context) + throws InputParseException, NoMatchException, + DisallowedUsageException { + BlockType blockType; String[] blockAndExtraData = input.split("\\|"); String[] blockLocator = blockAndExtraData[0].split(":", 3); String[] typeAndData; @@ -118,12 +143,12 @@ class DefaultBlockParser extends InputParser { blockType = BlockType.lookup(testId); if (blockType == null) { int t = worldEdit.getServer().resolveItem(testId); - if (t > 0) { + if (t >= 0) { blockType = BlockType.fromID(t); // Could be null blockId = t; } else if (blockLocator.length == 2) { // Block IDs in MC 1.7 and above use mod:name t = worldEdit.getServer().resolveItem(blockAndExtraData[0]); - if (t > 0) { + if (t >= 0) { blockType = BlockType.fromID(t); // Could be null blockId = t; typeAndData = new String[] { blockAndExtraData[0] }; diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java index 5adab0ec0..e4f78cf36 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java @@ -69,7 +69,7 @@ class ForgePlatform extends AbstractPlatform implements MultiUserPlatform { int index = name.indexOf(':'); - if (index != -1 && index != 0 && index != name.length() - 1) { + if (index != 0 && index != name.length() - 1) { Block block = Block.getBlockFromName(name); if (block != null) { return Block.getIdFromBlock(block); @@ -87,7 +87,7 @@ class ForgePlatform extends AbstractPlatform implements MultiUserPlatform { } if (item.getUnlocalizedName().equalsIgnoreCase(name)) return Item.getIdFromItem(item); } - return 0; + return -1; } @Override