diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlockStateWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlockStateWrapper.java index d70727e34..b3370a11e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlockStateWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlockStateWrapper.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.block; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.AbstractBlockStateWrapper; import net.momirealms.craftengine.core.block.BlockStateWrapper; +import net.momirealms.craftengine.core.block.CustomBlockStateWrapper; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.util.Key; @@ -11,12 +12,22 @@ import java.util.Collection; import java.util.List; import java.util.Optional; -public class BukkitCustomBlockStateWrapper extends AbstractBlockStateWrapper { +public class BukkitCustomBlockStateWrapper extends AbstractBlockStateWrapper implements CustomBlockStateWrapper { public BukkitCustomBlockStateWrapper(Object blockState, int registryId) { super(blockState, registryId); } + @Override + public BlockStateWrapper visualBlockState() { + return getImmutableBlockState().map(ImmutableBlockState::vanillaBlockState).orElse(null); + } + + @Override + public boolean isCustom() { + return true; + } + @Override public Key ownerId() { return getImmutableBlockState().map(state -> state.owner().value().id()).orElseGet(() -> BlockStateUtils.getBlockOwnerIdFromState(super.blockState)); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitVanillaBlockStateWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitVanillaBlockStateWrapper.java index e03939e5e..b298f6d66 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitVanillaBlockStateWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitVanillaBlockStateWrapper.java @@ -18,6 +18,11 @@ public class BukkitVanillaBlockStateWrapper extends AbstractBlockStateWrapper { this.accessor = FastNMS.INSTANCE.createStatePropertyAccessor(blockState); } + @Override + public boolean isCustom() { + return false; + } + @Override public Key ownerId() { return BlockStateUtils.getBlockOwnerIdFromState(super.blockState); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java index f1e8c09b4..9eb500833 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentTypes.java @@ -32,6 +32,7 @@ public class ComponentTypes { public static final Object FIREWORK_EXPLOSION = getComponentType(ComponentKeys.FIREWORK_EXPLOSION); public static final Object BUNDLE_CONTENTS = getComponentType(ComponentKeys.BUNDLE_CONTENTS); public static final Object CONTAINER = getComponentType(ComponentKeys.CONTAINER); + public static final Object BLOCK_STATE = getComponentType(ComponentKeys.BLOCK_STATE); private ComponentTypes() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java index 93ffa8b96..ae8f607a1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java @@ -612,11 +612,11 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory> blockState(ComponentItemWrapper item) { - return Optional.empty(); + return item.getJavaComponent(ComponentTypes.BLOCK_STATE); } @Override protected void blockState(ComponentItemWrapper item, Map state) { - + item.setJavaComponent(ComponentTypes.BLOCK_STATE, state); } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index 83520ce08..a00c683a9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -303,6 +303,18 @@ public class UniversalItemFactory extends BukkitItemFactory { } } + @Override + protected Optional> blockState(LegacyItemWrapper item) { + Map state = item.getJavaTag("BlockStateTag"); + if (state == null) return Optional.empty(); + return Optional.of(state); + } + + @Override + protected void blockState(LegacyItemWrapper item, Map state) { + item.setTag(state, "BlockStateTag"); + } + @Override protected Optional trim(LegacyItemWrapper item) { String material = item.getJavaTag("Trim", "material"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 4cf2c974a..b35184958 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -108,6 +108,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.persistence.PersistentDataType; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.messaging.PluginMessageListener; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; @@ -156,7 +157,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes instance = this; this.s2cGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.CLIENTBOUND)]; this.c2sGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.SERVERBOUND)]; - this.hasModelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine") != null; + Plugin modelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine"); + this.hasModelEngine = modelEngine != null && modelEngine.getPluginMeta().getVersion().startsWith("R4"); this.plugin = plugin; // set up packet id this.packetIds = VersionHelper.isOrAbove1_20_5() ? new PacketIds1_20_5() : new PacketIds1_20(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AutoStateGroup.java b/core/src/main/java/net/momirealms/craftengine/core/block/AutoStateGroup.java index f917f72b4..3b2f2efda 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/AutoStateGroup.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AutoStateGroup.java @@ -21,8 +21,8 @@ public enum AutoStateGroup { LOWER_TRIPWIRE("lower_tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> w.getProperty("attached")), HIGHER_TRIPWIRE("higher_tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> !(boolean) w.getProperty("attached")), NOTE_BLOCK("note_block", Set.of(BlockKeys.NOTE_BLOCK), (w) -> true), - BROWN_MUSHROOM("brown_mushroom", Set.of(BlockKeys.BROWN_MUSHROOM_BLOCK), (w) -> true), - RED_MUSHROOM("red_mushroom", Set.of(BlockKeys.RED_MUSHROOM_BLOCK), (w) -> true), + BROWN_MUSHROOM("brown_mushroom_block", Set.of(BlockKeys.BROWN_MUSHROOM_BLOCK), (w) -> true), + RED_MUSHROOM("red_mushroom_block", Set.of(BlockKeys.RED_MUSHROOM_BLOCK), (w) -> true), MUSHROOM_STEM("mushroom_stem", Set.of(BlockKeys.MUSHROOM_STEM), (w) -> true), TRIPWIRE("tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> true), SUGAR_CANE("sugar_cane", Set.of(BlockKeys.SUGAR_CANE), (w) -> true), diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateWrapper.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateWrapper.java index 6c5ca4693..4b86c95c3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateWrapper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateWrapper.java @@ -25,6 +25,8 @@ public interface BlockStateWrapper extends Comparable { String getAsString(); + boolean isCustom(); + @Override default int compareTo(@NotNull BlockStateWrapper o) { return Integer.compare(registryId(), o.registryId()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlockStateWrapper.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlockStateWrapper.java new file mode 100644 index 000000000..3fad0021f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlockStateWrapper.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.block; + +public interface CustomBlockStateWrapper { + + BlockStateWrapper visualBlockState(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/BlockStateModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/BlockStateModifier.java index 47061fbfe..8cd170673 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/BlockStateModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/BlockStateModifier.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.item.modifier; import net.momirealms.craftengine.core.block.BlockStateWrapper; +import net.momirealms.craftengine.core.block.CustomBlockStateWrapper; import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; @@ -12,6 +13,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.HashMap; +import java.util.Locale; import java.util.Map; public class BlockStateModifier implements SimpleNetworkItemDataModifier { @@ -62,10 +64,14 @@ public class BlockStateModifier implements SimpleNetworkItemDataModifier { String stateString = arg.toString(); return new BlockStateModifier<>(LazyReference.lazyReference(() -> { BlockStateWrapper blockState = CraftEngine.instance().blockManager().createBlockState(stateString); + if (blockState instanceof CustomBlockStateWrapper customBlockStateWrapper) { + blockState = customBlockStateWrapper.visualBlockState(); + } if (blockState != null) { Map properties = new HashMap<>(4); for (String property : blockState.getPropertyNames()) { - properties.put(property, blockState.getProperty(property)); + Object value = blockState.getProperty(property); + properties.put(property, String.valueOf(value).toLowerCase(Locale.ROOT)); } return properties; } diff --git a/gradle.properties b/gradle.properties index f60be246d..0eec4a0b7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.64.2 +project_version=0.0.64.3 config_version=47 lang_version=34 project_group=net.momirealms