From d861d3e8499d3f69b1b297079e210d87f0bbecb2 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 16 Jun 2024 15:48:18 +0800 Subject: [PATCH] feat: more works --- .../org/allaymc/terra/allay/JeBlockState.java | 12 +++ .../java/org/allaymc/terra/allay/Mapping.java | 95 ++++++++++++++----- .../terra/allay/delegate/AllayProtoWorld.java | 4 +- 3 files changed, 84 insertions(+), 27 deletions(-) diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java index 7d959b860..3db3e051b 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/JeBlockState.java @@ -34,6 +34,18 @@ public class JeBlockState { properties.put(tmp.substring(0, index), tmp.substring(index + 1)); } } + completeMissingProperties(); + } + + private void completeMissingProperties() { + var defaultProperties = Mapping.getJeBlockDefaultProperties(identifier); + if(properties.size() == defaultProperties.size()) { + return; + } + for (var entry : defaultProperties.entrySet()) { + if (properties.containsKey(entry.getKey())) continue; + properties.put(entry.getKey(), entry.getValue()); + } } private JeBlockState(String identifier, TreeMap properties) { diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/Mapping.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/Mapping.java index 592c0affc..d6e010b66 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/Mapping.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/Mapping.java @@ -26,16 +26,62 @@ import java.util.TreeMap; @Slf4j public final class Mapping { + private static final Map> JE_BLOCK_DEFAULT_PROPERTIES = new Object2ObjectOpenHashMap<>(); private static final Map BLOCK_STATE_BE_TO_JE = new Object2ObjectOpenHashMap<>(); private static final Map BLOCK_STATE_JE_HASH_TO_BE = new Int2ObjectOpenHashMap<>(); private static final Map ITEM_ID_JE_TO_BE = new Object2ObjectOpenHashMap<>(); private static final Map BIOME_ID_JE_TO_BE = new Object2IntOpenHashMap<>(); + private static final BlockState BE_AIR_STATE = BlockTypes.AIR_TYPE.getDefaultState(); public static void init() { + if(!initBlockStateMapping()) error(); + if (!initJeBlockDefaultProperties()) error(); + if(!initItemMapping()) error(); + if(!initBiomeMapping()) error(); + } + + private static void error() { + throw new RuntimeException("Mapping not initialized"); + } + + private static boolean initBiomeMapping() { + try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/biomes.json")) { + if (stream == null) { + log.error("biomes.json not found"); + return false; + } + var mappings = JSONUtils.from(stream, new TypeToken>>(){}).entrySet(); + for(var mapping : mappings) { + BIOME_ID_JE_TO_BE.put(mapping.getKey(), mapping.getValue().get("bedrock_id")); + } + } catch(IOException e) { + log.error("Failed to load mapping", e); + return false; + } + return true; + } + + private static boolean initItemMapping() { + try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/items.json")) { + if (stream == null) { + log.error("items.json not found"); + return false; + } + var mappings = JSONUtils.from(stream, new TypeToken>>(){}).entrySet(); + for(var mapping : mappings) { + ITEM_ID_JE_TO_BE.put(mapping.getKey(), (String) mapping.getValue().get("bedrock_identifier")); + } + } catch(IOException e) { + log.error("Failed to load mapping", e); + } + return true; + } + + private static boolean initBlockStateMapping() { try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/blocks.json")) { if (stream == null) { log.error("blocks.json not found"); - return; + return false; } var mappings = (List>>) JSONUtils.from(stream, new TypeToken>(){}).get("mappings"); for(var mapping : mappings) { @@ -47,30 +93,20 @@ public final class Mapping { } catch(IOException e) { log.error("Failed to load mapping", e); } - try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/items.json")) { - if (stream == null) { - log.error("items.json not found"); - return; + return true; + } + + private static boolean initJeBlockDefaultProperties() { + for (var beBlockType : BlockTypeRegistry.getRegistry().getContent().values()) { + var defaultBeBlockState = beBlockType.getDefaultState(); + var defaultJeBlockState = blockStateBeToJe(defaultBeBlockState); + if (defaultJeBlockState == null) { + log.warn("Failed to find JE block state for {}", defaultBeBlockState); + continue; } - var mappings = JSONUtils.from(stream, new TypeToken>>(){}).entrySet(); - for(var mapping : mappings) { - ITEM_ID_JE_TO_BE.put(mapping.getKey(), (String) mapping.getValue().get("bedrock_identifier")); - } - } catch(IOException e) { - log.error("Failed to load mapping", e); - } - try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/biomes.json")) { - if (stream == null) { - log.error("biomes.json not found"); - return; - } - var mappings = JSONUtils.from(stream, new TypeToken>>(){}).entrySet(); - for(var mapping : mappings) { - BIOME_ID_JE_TO_BE.put(mapping.getKey(), mapping.getValue().get("bedrock_id")); - } - } catch(IOException e) { - log.error("Failed to load mapping", e); + JE_BLOCK_DEFAULT_PROPERTIES.put(defaultJeBlockState.identifier, defaultJeBlockState.properties); } + return true; } private static BlockState createBeBlockState(Map data) { @@ -88,13 +124,13 @@ public final class Mapping { var propertyType = blockType.getProperties().get(propertyName); if (propertyType == null) { log.warn("Unknown property type: {}", propertyName); - return null; + return BlockTypes.AIR_TYPE.getDefaultState(); } try { propertyValues[index] = propertyType.tryCreateValue(entry.getValue()); } catch (IllegalArgumentException e) { log.warn("Failed to create property value for {}: {}", propertyName, entry.getValue()); - return null; + return BE_AIR_STATE; } } return blockType.ofState(propertyValues); @@ -136,4 +172,13 @@ public final class Mapping { public static int biomeIdJeToBe(String jeBiomeId) { return BIOME_ID_JE_TO_BE.get(jeBiomeId); } + + public static Map getJeBlockDefaultProperties(String jeBlockIdentifier) { + var defaultProperties = JE_BLOCK_DEFAULT_PROPERTIES.get(jeBlockIdentifier); + if( defaultProperties == null) { + log.warn("Failed to find default properties for {}", jeBlockIdentifier); + return Map.of(); + } + return defaultProperties; + } } diff --git a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java index 9df965a8a..bfb6eef33 100644 --- a/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java +++ b/platforms/allay/src/main/java/org/allaymc/terra/allay/delegate/AllayProtoWorld.java @@ -101,8 +101,8 @@ public record AllayProtoWorld(AllayServerWorld allayServerWorld, UnsafeChunk cen private boolean isInRegin(int x, int y, int z) { return - x >= centerChunkX() && x < centerChunkX() + 16 && - z >= centerChunkZ() && z < centerChunkZ() + 16 && + x >= centerChunkX() * 16 && x < centerChunkX() * 16 + 16 && + z >= centerChunkZ() * 16 && z < centerChunkZ() * 16 + 16 && y >= getMinHeight() && y <= getMaxHeight(); } } \ No newline at end of file