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.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));

View File

@@ -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);

View File

@@ -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() {}

View File

@@ -612,11 +612,11 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
@Override
protected Optional<Map<String, String>> blockState(ComponentItemWrapper item) {
return Optional.empty();
return item.getJavaComponent(ComponentTypes.BLOCK_STATE);
}
@Override
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
protected Optional<Trim> trim(LegacyItemWrapper item) {
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.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();

View File

@@ -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),

View File

@@ -25,6 +25,8 @@ public interface BlockStateWrapper extends Comparable<BlockStateWrapper> {
String getAsString();
boolean isCustom();
@Override
default int compareTo(@NotNull BlockStateWrapper o) {
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;
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<I> implements SimpleNetworkItemDataModifier<I> {
@@ -62,10 +64,14 @@ public class BlockStateModifier<I> implements SimpleNetworkItemDataModifier<I> {
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<String, String> 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;
}

View File

@@ -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