9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

改进block-state

This commit is contained in:
XiaoMoMi
2025-10-08 20:20:23 +08:00
parent a254cf7e53
commit 3c63e02ee9
11 changed files with 53 additions and 8 deletions

View File

@@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.block;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.core.block.AbstractBlockStateWrapper; import net.momirealms.craftengine.core.block.AbstractBlockStateWrapper;
import net.momirealms.craftengine.core.block.BlockStateWrapper; 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.ImmutableBlockState;
import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.block.properties.Property;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
@@ -11,12 +12,22 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
public class BukkitCustomBlockStateWrapper extends AbstractBlockStateWrapper { public class BukkitCustomBlockStateWrapper extends AbstractBlockStateWrapper implements CustomBlockStateWrapper {
public BukkitCustomBlockStateWrapper(Object blockState, int registryId) { public BukkitCustomBlockStateWrapper(Object blockState, int registryId) {
super(blockState, registryId); super(blockState, registryId);
} }
@Override
public BlockStateWrapper visualBlockState() {
return getImmutableBlockState().map(ImmutableBlockState::vanillaBlockState).orElse(null);
}
@Override
public boolean isCustom() {
return true;
}
@Override @Override
public Key ownerId() { public Key ownerId() {
return getImmutableBlockState().map(state -> state.owner().value().id()).orElseGet(() -> BlockStateUtils.getBlockOwnerIdFromState(super.blockState)); return getImmutableBlockState().map(state -> state.owner().value().id()).orElseGet(() -> BlockStateUtils.getBlockOwnerIdFromState(super.blockState));

View File

@@ -18,6 +18,11 @@ public class BukkitVanillaBlockStateWrapper extends AbstractBlockStateWrapper {
this.accessor = FastNMS.INSTANCE.createStatePropertyAccessor(blockState); this.accessor = FastNMS.INSTANCE.createStatePropertyAccessor(blockState);
} }
@Override
public boolean isCustom() {
return false;
}
@Override @Override
public Key ownerId() { public Key ownerId() {
return BlockStateUtils.getBlockOwnerIdFromState(super.blockState); return BlockStateUtils.getBlockOwnerIdFromState(super.blockState);

View File

@@ -32,6 +32,7 @@ public class ComponentTypes {
public static final Object FIREWORK_EXPLOSION = getComponentType(ComponentKeys.FIREWORK_EXPLOSION); public static final Object FIREWORK_EXPLOSION = getComponentType(ComponentKeys.FIREWORK_EXPLOSION);
public static final Object BUNDLE_CONTENTS = getComponentType(ComponentKeys.BUNDLE_CONTENTS); public static final Object BUNDLE_CONTENTS = getComponentType(ComponentKeys.BUNDLE_CONTENTS);
public static final Object CONTAINER = getComponentType(ComponentKeys.CONTAINER); public static final Object CONTAINER = getComponentType(ComponentKeys.CONTAINER);
public static final Object BLOCK_STATE = getComponentType(ComponentKeys.BLOCK_STATE);
private ComponentTypes() {} private ComponentTypes() {}

View File

@@ -612,11 +612,11 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override @Override
protected Optional<Map<String, String>> blockState(ComponentItemWrapper item) { protected Optional<Map<String, String>> blockState(ComponentItemWrapper item) {
return Optional.empty(); return item.getJavaComponent(ComponentTypes.BLOCK_STATE);
} }
@Override @Override
protected void blockState(ComponentItemWrapper item, Map<String, String> state) { protected void blockState(ComponentItemWrapper item, Map<String, String> state) {
item.setJavaComponent(ComponentTypes.BLOCK_STATE, state);
} }
} }

View File

@@ -303,6 +303,18 @@ public class UniversalItemFactory extends BukkitItemFactory<LegacyItemWrapper> {
} }
} }
@Override
protected Optional<Map<String, String>> blockState(LegacyItemWrapper item) {
Map<String, String> state = item.getJavaTag("BlockStateTag");
if (state == null) return Optional.empty();
return Optional.of(state);
}
@Override
protected void blockState(LegacyItemWrapper item, Map<String, String> state) {
item.setTag(state, "BlockStateTag");
}
@Override @Override
protected Optional<Trim> trim(LegacyItemWrapper item) { protected Optional<Trim> trim(LegacyItemWrapper item) {
String material = item.getJavaTag("Trim", "material"); String material = item.getJavaTag("Trim", "material");

View File

@@ -108,6 +108,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.messaging.PluginMessageListener; import org.bukkit.plugin.messaging.PluginMessageListener;
import org.bukkit.util.RayTraceResult; import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@@ -156,7 +157,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
instance = this; instance = this;
this.s2cGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.CLIENTBOUND)]; this.s2cGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.CLIENTBOUND)];
this.c2sGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.SERVERBOUND)]; 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; this.plugin = plugin;
// set up packet id // set up packet id
this.packetIds = VersionHelper.isOrAbove1_20_5() ? new PacketIds1_20_5() : new PacketIds1_20(); this.packetIds = VersionHelper.isOrAbove1_20_5() ? new PacketIds1_20_5() : new PacketIds1_20();

View File

@@ -21,8 +21,8 @@ public enum AutoStateGroup {
LOWER_TRIPWIRE("lower_tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> w.getProperty("attached")), 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")), HIGHER_TRIPWIRE("higher_tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> !(boolean) w.getProperty("attached")),
NOTE_BLOCK("note_block", Set.of(BlockKeys.NOTE_BLOCK), (w) -> true), NOTE_BLOCK("note_block", Set.of(BlockKeys.NOTE_BLOCK), (w) -> true),
BROWN_MUSHROOM("brown_mushroom", Set.of(BlockKeys.BROWN_MUSHROOM_BLOCK), (w) -> true), BROWN_MUSHROOM("brown_mushroom_block", Set.of(BlockKeys.BROWN_MUSHROOM_BLOCK), (w) -> true),
RED_MUSHROOM("red_mushroom", Set.of(BlockKeys.RED_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), MUSHROOM_STEM("mushroom_stem", Set.of(BlockKeys.MUSHROOM_STEM), (w) -> true),
TRIPWIRE("tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> true), TRIPWIRE("tripwire", Set.of(BlockKeys.TRIPWIRE), (w) -> true),
SUGAR_CANE("sugar_cane", Set.of(BlockKeys.SUGAR_CANE), (w) -> true), SUGAR_CANE("sugar_cane", Set.of(BlockKeys.SUGAR_CANE), (w) -> true),

View File

@@ -25,6 +25,8 @@ public interface BlockStateWrapper extends Comparable<BlockStateWrapper> {
String getAsString(); String getAsString();
boolean isCustom();
@Override @Override
default int compareTo(@NotNull BlockStateWrapper o) { default int compareTo(@NotNull BlockStateWrapper o) {
return Integer.compare(registryId(), o.registryId()); return Integer.compare(registryId(), o.registryId());

View File

@@ -0,0 +1,6 @@
package net.momirealms.craftengine.core.block;
public interface CustomBlockStateWrapper {
BlockStateWrapper visualBlockState();
}

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.core.item.modifier; package net.momirealms.craftengine.core.item.modifier;
import net.momirealms.craftengine.core.block.BlockStateWrapper; 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.ComponentKeys;
import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.item.ItemBuildContext;
@@ -12,6 +13,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale;
import java.util.Map; import java.util.Map;
public class BlockStateModifier<I> implements SimpleNetworkItemDataModifier<I> { public class BlockStateModifier<I> implements SimpleNetworkItemDataModifier<I> {
@@ -62,10 +64,14 @@ public class BlockStateModifier<I> implements SimpleNetworkItemDataModifier<I> {
String stateString = arg.toString(); String stateString = arg.toString();
return new BlockStateModifier<>(LazyReference.lazyReference(() -> { return new BlockStateModifier<>(LazyReference.lazyReference(() -> {
BlockStateWrapper blockState = CraftEngine.instance().blockManager().createBlockState(stateString); BlockStateWrapper blockState = CraftEngine.instance().blockManager().createBlockState(stateString);
if (blockState instanceof CustomBlockStateWrapper customBlockStateWrapper) {
blockState = customBlockStateWrapper.visualBlockState();
}
if (blockState != null) { if (blockState != null) {
Map<String, String> properties = new HashMap<>(4); Map<String, String> properties = new HashMap<>(4);
for (String property : blockState.getPropertyNames()) { 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; return properties;
} }

View File

@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G
# Project settings # Project settings
# Rule: [major update].[feature update].[bug fix] # Rule: [major update].[feature update].[bug fix]
project_version=0.0.64.2 project_version=0.0.64.3
config_version=47 config_version=47
lang_version=34 lang_version=34
project_group=net.momirealms project_group=net.momirealms