Skip to content

Commit

Permalink
feat: adapting terra 6.5.1 (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
smartcmd committed Oct 14, 2024
1 parent 1496f2c commit 61ed302
Show file tree
Hide file tree
Showing 23 changed files with 95 additions and 519,530 deletions.
12 changes: 5 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

# Terra (Allay Platform)

This fork adds support for allay
This fork adds support for allay, and if you want to build it, here are some files you may need:

if you want to build it, here are some files you may need:

- `mapping/biomes.json` from GeyserMC/mappings
- `mapping/items.json` from GeyserMC/mappings
- `mapping/blocks.json` you should generate it using GeyserMC/mappings-generator, and it's origin name is `generator_blocks.json`
- `je_block_default_state` converted from https://zh.minecraft.wiki/w/Module:Block_state_values currently
- `mapping/biomes_JE_1_21_to_BE_1_21_30.json` from GeyserMC/mappings
- `mapping/items_JE_1_21_to_BE_1_21_30.json` from GeyserMC/mappings
- `mapping/blocks_JE_1_21_to_BE_1_21_30.json` you should generate it using GeyserMC/mappings-generator, and it's origin name is `generator_blocks.json`
- `je_block_default_states_1_21.json` converted from https://zh.minecraft.wiki/w/Module:Block_state_values currently

Terra is a modern world generation modding platform, primarily for Minecraft.
Terra allows complete customization of world generation with an advanced API,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public AllayPlatform() {

@Override
public boolean reload() {
// TODO: Implement reload
// TODO: implement reload
return false;
}

Expand Down
102 changes: 49 additions & 53 deletions platforms/allay/src/main/java/org/allaymc/terra/allay/Mapping.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.item.type.ItemType;
import org.allaymc.api.item.type.ItemTypeSafeGetter;
import org.allaymc.api.registry.Registries;
import org.allaymc.api.utils.HashUtils;
import org.allaymc.api.utils.JSONUtils;
import org.allaymc.updater.block.BlockStateUpdaters;
import org.allaymc.updater.item.ItemStateUpdaters;
import org.cloudburstmc.nbt.NbtMap;

import java.io.IOException;
import java.util.List;
Expand All @@ -28,6 +23,7 @@
*/
@Slf4j
public final class Mapping {

private static final Map<String, Map<String, String>> JE_BLOCK_DEFAULT_PROPERTIES = new Object2ObjectOpenHashMap<>();
private static final Map<BlockState, JeBlockState> BLOCK_STATE_BE_TO_JE = new Object2ObjectOpenHashMap<>();
private static final Map<Integer, BlockState> BLOCK_STATE_JE_HASH_TO_BE = new Int2ObjectOpenHashMap<>();
Expand All @@ -42,12 +38,52 @@ public static void init() {
if(!initBiomeMapping()) error();
}

public static JeBlockState blockStateBeToJe(BlockState beBlockState) {
return BLOCK_STATE_BE_TO_JE.get(beBlockState);
}

public static BlockState blockStateJeToBe(JeBlockState jeBlockState) {
var result = BLOCK_STATE_JE_HASH_TO_BE.get(jeBlockState.getHash());
if(result == null) {
log.warn("Failed to find be block state for {}", jeBlockState);
return BE_AIR_STATE;
}
return result;
}

public static ItemType<?> itemIdJeToBe(String jeItemId) {
return ITEM_ID_JE_TO_BE.get(jeItemId);
}

// Enchantment identifiers are same in both versions

public static String enchantmentIdBeToJe(String beEnchantmentId) {
return beEnchantmentId;
}

public static String enchantmentIdJeToBe(String jeEnchantmentId) {
return jeEnchantmentId;
}

public static int biomeIdJeToBe(String jeBiomeId) {
return BIOME_ID_JE_TO_BE.get(jeBiomeId);
}

public static Map<String, String> 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;
}

private static void error() {
throw new RuntimeException("Mapping not initialized");
}

private static boolean initBiomeMapping() {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/biomes_JE_1_20_4_TO_BE_1_20_0.json")) {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/biomes_JE_1_21_to_BE_1_21_30.json")) {
if (stream == null) {
log.error("biomes mapping not found");
return false;
Expand All @@ -57,14 +93,14 @@ private static boolean initBiomeMapping() {
BIOME_ID_JE_TO_BE.put(mapping.getKey(), mapping.getValue().get("bedrock_id"));
}
} catch(IOException e) {
log.error("Failed to load mapping", e);
log.error("Failed to load biomes mapping", e);
return false;
}
return true;
}

private static boolean initItemMapping() {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/items_JE_1_20_4_TO_BE_1_20_0.json")) {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/items_JE_1_21_to_BE_1_21_30.json")) {
if (stream == null) {
log.error("items mapping not found");
return false;
Expand All @@ -73,19 +109,19 @@ private static boolean initItemMapping() {
for(var mapping : mappings) {
var item = ItemTypeSafeGetter
.name((String) mapping.getValue().get("bedrock_identifier"))
// NOTICE: Should be cast to double
// NOTICE: should be cast to double
.meta(((Double) mapping.getValue().get("bedrock_data")).intValue())
.itemType();
ITEM_ID_JE_TO_BE.put(mapping.getKey(), item);
}
} catch(IOException e) {
log.error("Failed to load mapping", e);
log.error("Failed to load items mapping", e);
}
return true;
}

private static boolean initBlockStateMapping() {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/blocks_JE_1_20_4_TO_BE_1_20_0.json")) {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/blocks_JE_1_21_to_BE_1_21_30.json")) {
if (stream == null) {
log.error("blocks mapping not found");
return false;
Expand All @@ -99,13 +135,13 @@ private static boolean initBlockStateMapping() {
BLOCK_STATE_JE_HASH_TO_BE.put(jeState.getHash(), beState);
}
} catch(IOException e) {
log.error("Failed to load mapping", e);
log.error("Failed to load blocks mapping", e);
}
return true;
}

private static boolean initJeBlockDefaultProperties() {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("je_block_default_states_1_20_4.json")) {
try (var stream = Mapping.class.getClassLoader().getResourceAsStream("je_block_default_states_1_21.json")) {
if (stream == null) {
log.error("je_block_default_states.json not found");
return false;
Expand Down Expand Up @@ -150,44 +186,4 @@ private static JeBlockState createJeBlockState(Map<String, Object> data) {
// noinspection unchecked
return JeBlockState.create(identifier, new TreeMap<>((Map<String, String>) data.getOrDefault("Properties", Map.of())));
}

public static JeBlockState blockStateBeToJe(BlockState beBlockState) {
return BLOCK_STATE_BE_TO_JE.get(beBlockState);
}

public static BlockState blockStateJeToBe(JeBlockState jeBlockState) {
var result = BLOCK_STATE_JE_HASH_TO_BE.get(jeBlockState.getHash());
if(result == null) {
log.warn("Failed to find be block state for {}", jeBlockState);
return BlockTypes.AIR.getDefaultState();
}
return result;
}

public static ItemType<?> itemIdJeToBe(String jeItemId) {
return ITEM_ID_JE_TO_BE.get(jeItemId);
}

// Enchantment identifiers are same in both versions

public static String enchantmentIdBeToJe(String beEnchantmentId) {
return beEnchantmentId;
}

public static String enchantmentIdJeToBe(String jeEnchantmentId) {
return jeEnchantmentId;
}

public static int biomeIdJeToBe(String jeBiomeId) {
return BIOME_ID_JE_TO_BE.get(jeBiomeId);
}

public static Map<String, String> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.block.state.properties.Property;

import java.util.Objects;

/**
* @author daoge_cmd
*/
public final class AllayBlockState implements com.dfsek.terra.api.block.state.BlockState {

public static final AllayBlockState AIR = new AllayBlockState(BlockTypes.AIR.getDefaultState(),
JeBlockState.fromString("minecraft:air"));

private final BlockState allayBlockState;
private final JeBlockState jeBlockState;
private final boolean containsWater;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.allaymc.terra.allay.delegate;

import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockType;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.terra.allay.Mapping;

import com.dfsek.terra.api.block.state.BlockState;
Expand All @@ -22,7 +22,7 @@ public boolean isSolid() {

@Override
public boolean isWater() {
return allayBlockType == BlockTypes.WATER || allayBlockType == BlockTypes.FLOWING_WATER;
return allayBlockType.hasBlockTag(BlockTags.WATER);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.allaymc.terra.allay.delegate;

import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.chunk.Chunk;
import org.allaymc.terra.allay.Mapping;
Expand All @@ -14,18 +15,16 @@
*/
public record AllayChunk(ServerWorld world, Chunk allayChunk) implements com.dfsek.terra.api.world.chunk.Chunk {

private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(15));
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));

@Override
public void setBlock(int x, int y, int z, BlockState data, boolean physics) {
var allayBlockState = (AllayBlockState)data;
var containsWater = allayBlockState.containsWater();
if (!containsWater) {
var oldBlock = allayChunk.getBlockState(x, y, z);
containsWater = oldBlock == BlockTypes.WATER;
}
var allayBlockState = (AllayBlockState) data;
allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState());
if (containsWater) allayChunk.setBlockState(x, y, z, WATER, 1);
var containsWater = allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER);
if (containsWater) {
allayChunk.setBlockState(x, y, z, WATER, 1);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public boolean canEnchantItem(ItemStack itemStack) {

@Override
public boolean conflictsWith(Enchantment other) {
return ((AllayEnchantment)other).allayEnchantment.checkIncompatible(allayEnchantment);
return ((AllayEnchantment)other).allayEnchantment.isIncompatibleWith(allayEnchantment);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import com.dfsek.terra.api.world.ServerWorld;

/**
* NOTICE: Entity is not supported currently, and this is a fake implementation.
*
* @author daoge_cmd
*/
public final class AllayFakeEntity implements Entity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public void addEnchantment(Enchantment enchantment, int level) {
public Map<Enchantment, Integer> getEnchantments() {
Map<Enchantment, Integer> results = new HashMap<>();
for (var allayEnchantmentInstance : allayItemStack.getEnchantments()) {
results.put(new AllayEnchantment(allayEnchantmentInstance.getType()), (int) allayEnchantmentInstance.getLevel());
results.put(new AllayEnchantment(allayEnchantmentInstance.getType()), allayEnchantmentInstance.getLevel());
}
return results;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

import org.allaymc.api.item.data.ItemId;
import org.allaymc.api.item.type.ItemType;
import org.allaymc.api.registry.Registries;

import com.dfsek.terra.api.inventory.Item;

import org.allaymc.api.registry.Registries;


/**
* @author daoge_cmd
Expand Down Expand Up @@ -34,8 +33,4 @@ public double getMaxDurability() {
public ItemType<?> getHandle() {
return allayItemType;
}

public ItemType<?> allayItemType() {
return allayItemType;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.allaymc.terra.allay.delegate;

import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.chunk.UnsafeChunk;
import org.allaymc.terra.allay.Mapping;
Expand All @@ -14,7 +15,7 @@
*/
public record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk {

private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(15));
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));

@Override
public int getMaxHeight() {
Expand All @@ -23,14 +24,12 @@ public int getMaxHeight() {

@Override
public void setBlock(int x, int y, int z, @NotNull BlockState blockState) {
var allayBlockState = (AllayBlockState)blockState;
var containsWater = allayBlockState.containsWater();
if (!containsWater) {
var oldBlock = allayChunk.getBlockState(x, y, z);
containsWater = oldBlock == BlockTypes.WATER;
}
var allayBlockState = (AllayBlockState) blockState;
allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState());
if (containsWater) allayChunk.setBlockState(x, y, z, WATER, 1);
var containsWater = allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER);
if (containsWater) {
allayChunk.setBlockState(x, y, z, WATER, 1);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package org.allaymc.terra.allay.delegate;

import com.dfsek.terra.api.util.vector.Vector3;

import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.generator.context.OtherChunkAccessibleContext;
import org.allaymc.terra.allay.Mapping;
Expand All @@ -12,6 +11,7 @@
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
Expand All @@ -22,7 +22,7 @@
*/
public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAccessibleContext context) implements ProtoWorld {

private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(15));
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));

@Override
public int centerChunkX() {
Expand All @@ -42,11 +42,7 @@ public ServerWorld getWorld() {
@Override
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) {
var allayBlockState = (AllayBlockState)data;
var containsWater = allayBlockState.containsWater();
if (!containsWater) {
var oldBlock = context.getBlockState(x, y, z).getBlockType();
containsWater = oldBlock == BlockTypes.WATER;
}
var containsWater = allayBlockState.containsWater() || context.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER);
context.setBlockState(x, y, z, allayBlockState.allayBlockState());
if (containsWater) context.setBlockState(x, y, z, WATER, 1);
}
Expand Down
Loading

0 comments on commit 61ed302

Please sign in to comment.