From a3a175ab8cb76e336e40d29e63c633bf64b21226 Mon Sep 17 00:00:00 2001 From: Kenzie Togami Date: Wed, 20 Feb 2019 23:47:33 -0800 Subject: [PATCH] Initial attempt at binding state IDs --- .../worldedit/bukkit/BukkitBlockRegistry.java | 10 ++++++++ .../bukkit/adapter/BukkitImplAdapter.java | 12 ++++++++++ .../internal/block/BlockStateIdAcess.java | 24 +++++++++++++++++++ .../worldedit/world/block/BlockState.java | 19 +++++++++++++-- .../world/registry/BlockRegistry.java | 10 ++++++++ .../world/registry/BundledBlockRegistry.java | 7 ++++++ .../world/registry/BundledItemData.java | 2 +- .../sk89q/worldedit/forge/ForgeAdapter.java | 4 ++-- .../worldedit/forge/ForgeBlockRegistry.java | 9 +++++++ .../com/sk89q/worldedit/forge/ForgeWorld.java | 7 +++++- .../sk89q/worldedit/forge/ForgeWorldEdit.java | 3 +++ 11 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAcess.java diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java index 3400fd59f..43c3f330d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockRegistry.java @@ -21,6 +21,7 @@ package com.sk89q.worldedit.bukkit; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.registry.BundledBlockRegistry; import com.sk89q.worldedit.world.registry.PassthroughBlockMaterial; @@ -28,6 +29,7 @@ import org.bukkit.Material; import java.util.EnumMap; import java.util.Map; +import java.util.OptionalInt; import javax.annotation.Nullable; @@ -54,6 +56,14 @@ public class BukkitBlockRegistry extends BundledBlockRegistry { return super.getProperties(blockType); } + @Override + public OptionalInt getInternalBlockStateId(BlockState state) { + if (WorldEditPlugin.getInstance().getBukkitImplAdapter() != null) { + return WorldEditPlugin.getInstance().getBukkitImplAdapter().getInternalBlockStateId(state); + } + return super.getInternalBlockStateId(state); + } + public static class BukkitBlockMaterial extends PassthroughBlockMaterial { private final Material material; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 984c5ad2a..f21d0917a 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -38,6 +38,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.Map; +import java.util.OptionalInt; import javax.annotation.Nullable; @@ -160,4 +161,15 @@ public interface BukkitImplAdapter { * @return the WorldEdit BaseItemStack */ BaseItemStack adapt(ItemStack itemStack); + + + /** + * Retrieve the internal ID for a given state, if possible. + * + * @param state The block state + * @return the internal ID of the state + */ + default OptionalInt getInternalBlockStateId(BlockState state) { + return OptionalInt.empty(); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAcess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAcess.java new file mode 100644 index 000000000..766537776 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAcess.java @@ -0,0 +1,24 @@ +package com.sk89q.worldedit.internal.block; + +import com.sk89q.worldedit.world.block.BlockState; + +import java.util.OptionalInt; + +public class BlockStateIdAcess { + + public interface Provider { + + OptionalInt getBlockStateId(BlockState holder); + } + + private static Provider blockStateStateId; + + public static void setBlockStateStateId(Provider blockStateStateId) { + BlockStateIdAcess.blockStateStateId = blockStateStateId; + } + + public static OptionalInt getBlockStateId(BlockState holder) { + return blockStateStateId.getBlockStateId((BlockState) holder); + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index 5b276badb..7fed9efde 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -26,7 +26,10 @@ import com.google.common.collect.Maps; import com.google.common.collect.Table; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.internal.block.BlockStateIdAcess; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.world.registry.BlockRegistry; import java.util.Collections; import java.util.Comparator; @@ -35,6 +38,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.OptionalInt; import java.util.Set; /** @@ -42,9 +46,14 @@ import java.util.Set; */ @SuppressWarnings("unchecked") public class BlockState implements BlockStateHolder { + + static { + BlockStateIdAcess.setBlockStateStateId(x -> x.internalId); + } private final BlockType blockType; private final Map, Object> values; + private OptionalInt internalId = OptionalInt.empty(); private BaseBlock emptyBaseBlock; @@ -56,8 +65,14 @@ public class BlockState implements BlockStateHolder { this.values = new LinkedHashMap<>(); this.emptyBaseBlock = new BaseBlock(this); } + + BlockState initializeId(BlockRegistry registry) { + this.internalId = registry.getInternalBlockStateId(this); + return this; + } static Map, Object>, BlockState> generateStateMap(BlockType blockType) { + BlockRegistry registry = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getRegistries().getBlockRegistry(); Map, Object>, BlockState> stateMap = new LinkedHashMap<>(); List> properties = blockType.getProperties(); @@ -71,7 +86,7 @@ public class BlockState implements BlockStateHolder { List> valueLists = Lists.cartesianProduct(separatedValues); for (List valueList : valueLists) { Map, Object> valueMap = Maps.newTreeMap(Comparator.comparing(Property::getName)); - BlockState stateMaker = new BlockState(blockType); + BlockState stateMaker = new BlockState(blockType).initializeId(registry); for (int i = 0; i < valueList.size(); i++) { Property property = properties.get(i); Object value = valueList.get(i); @@ -84,7 +99,7 @@ public class BlockState implements BlockStateHolder { if (stateMap.isEmpty()) { // No properties. - stateMap.put(new LinkedHashMap<>(), new BlockState(blockType)); + stateMap.put(new LinkedHashMap<>(), new BlockState(blockType).initializeId(registry)); } for (BlockState state : stateMap.values()) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java index e33998a12..fb572f019 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BlockRegistry.java @@ -20,9 +20,11 @@ package com.sk89q.worldedit.world.registry; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import java.util.Map; +import java.util.OptionalInt; import javax.annotation.Nullable; @@ -57,4 +59,12 @@ public interface BlockRegistry { */ Map> getProperties(BlockType blockType); + /** + * Retrieve the internal ID for a given state, if possible. + * + * @param state The block state + * @return the internal ID of the state + */ + OptionalInt getInternalBlockStateId(BlockState state); + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java index 62c8b5c3a..0e5615475 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java @@ -20,10 +20,12 @@ package com.sk89q.worldedit.world.registry; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import java.util.Collections; import java.util.Map; +import java.util.OptionalInt; import javax.annotation.Nullable; @@ -52,4 +54,9 @@ public class BundledBlockRegistry implements BlockRegistry { return Collections.emptyMap(); // Oof } + @Override + public OptionalInt getInternalBlockStateId(BlockState state) { + return OptionalInt.empty(); + } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java index 4e1af0422..86bd253a7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java @@ -75,7 +75,7 @@ public class BundledItemData { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Vector3.class, new VectorAdapter()); Gson gson = gsonBuilder.create(); - URL url = ResourceLoader.getResource(BundledItemData.class,"items.json"); + URL url = ResourceLoader.getResource(BundledItemData.class,"items.json");F if (url == null) { throw new IOException("Could not find items.json"); } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java index bc6448636..3618093c8 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.forge; +import static com.google.common.base.Preconditions.checkNotNull; + import com.google.common.collect.ImmutableList; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; @@ -61,8 +63,6 @@ import java.util.Map; import java.util.TreeMap; import java.util.stream.Collectors; -import static com.google.common.base.Preconditions.checkNotNull; - public final class ForgeAdapter { private ForgeAdapter() { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockRegistry.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockRegistry.java index e918d3e52..a44b19e3c 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockRegistry.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockRegistry.java @@ -20,17 +20,20 @@ package com.sk89q.worldedit.forge; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.BundledBlockRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; import net.minecraft.state.IProperty; import net.minecraftforge.fml.loading.FMLLoader; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.OptionalInt; import java.util.TreeMap; import javax.annotation.Nullable; @@ -73,4 +76,10 @@ public class ForgeBlockRegistry extends BundledBlockRegistry { return map; } + @Override + public OptionalInt getInternalBlockStateId(BlockState state) { + IBlockState equivalent = ForgeAdapter.adaptState(state); + return OptionalInt.of(Block.getStateId(equivalent)); + } + } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java index 8361f9836..fe3abdee7 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java @@ -34,6 +34,7 @@ import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.internal.Constants; +import com.sk89q.worldedit.internal.block.BlockStateIdAcess; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; @@ -50,6 +51,7 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; +import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityType; @@ -94,6 +96,8 @@ import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.OptionalInt; import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadLocalRandom; @@ -173,7 +177,8 @@ public class ForgeWorld extends AbstractWorld { Chunk chunk = world.getChunk(x >> 4, z >> 4); BlockPos pos = new BlockPos(x, y, z); IBlockState old = chunk.getBlockState(pos); - IBlockState newState = ForgeAdapter.adapt(block.toImmutableState()); + OptionalInt stateId = BlockStateIdAcess.getBlockStateId(block.toImmutableState()); + IBlockState newState = stateId.isPresent() ? Block.getStateById(stateId.getAsInt()) : ForgeAdapter.adaptState(block.toImmutableState()); IBlockState successState = chunk.setBlockState(pos, newState, false); boolean successful = successState != null; diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java index e5628b03b..d681bafea 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java @@ -175,6 +175,9 @@ public class ForgeWorldEdit { ItemCategory.REGISTRY.register(name.toString(), new ItemCategory(name.toString())); } } + + config = new ForgeConfiguration(this); + config.load(); } @SubscribeEvent