Add Validator API & cleanup Fabric

This commit is contained in:
dfsek
2020-12-16 00:26:05 -07:00
parent 7a83584317
commit b12079694c
17 changed files with 110 additions and 59 deletions

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.api.translator;
package com.dfsek.terra.api.transform;
public class AttemptsFailedException extends RuntimeException {
public AttemptsFailedException() {

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.api.translator;
package com.dfsek.terra.api.transform;
import java.util.HashMap;
import java.util.Map;

View File

@@ -0,0 +1,8 @@
package com.dfsek.terra.api.transform;
public class NotNullValidator<T> implements Validator<T> {
@Override
public boolean validate(T value) {
return !(value == null);
}
}

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.api.translator;
package com.dfsek.terra.api.transform;
/**
* Interface to transform data from one type to another.

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.api.translator;
package com.dfsek.terra.api.transform;
public class TransformException extends Exception {
public TransformException() {

View File

@@ -1,7 +1,10 @@
package com.dfsek.terra.api.translator;
package com.dfsek.terra.api.transform;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Class to translate types from one style/platform to another.
@@ -10,10 +13,10 @@ import java.util.List;
* @param <T> Data type to transform to.
*/
public class Transformer<F, T> {
private final List<Transform<F, T>> transformer;
private final LinkedHashMap<Transform<F, T>, List<Validator<T>>> transformers;
private Transformer(List<Transform<F, T>> transformer) {
this.transformer = transformer;
private Transformer(LinkedHashMap<Transform<F, T>, List<Validator<T>>> transformer) {
this.transformers = transformer;
}
/**
@@ -24,9 +27,15 @@ public class Transformer<F, T> {
*/
public T translate(F from) {
List<Exception> exceptions = new ArrayList<>();
for(Transform<F, T> transform : transformer) {
for(Map.Entry<Transform<F, T>, List<Validator<T>>> transform : transformers.entrySet()) {
try {
return transform.transform(from);
T result = transform.getKey().transform(from);
for(Validator<T> validator : transform.getValue()) {
if(!validator.validate(result)) {
throw new TransformException("Failed to validate result: " + result.toString());
}
}
return result;
} catch(Exception exception) {
exceptions.add(exception);
}
@@ -45,15 +54,16 @@ public class Transformer<F, T> {
* @param <T>
* @param <F>
*/
public static class Builder<T, F> {
private final List<Transform<T, F>> transforms = new ArrayList<>();
public static final class Builder<F, T> {
private final LinkedHashMap<Transform<F, T>, List<Validator<T>>> transforms = new LinkedHashMap<>();
public Builder<T, F> addTransform(Transform<T, F> transform) {
transforms.add(transform);
@SafeVarargs
public final Builder<F, T> addTransform(Transform<F, T> transform, Validator<T>... validators) {
transforms.put(transform, Arrays.asList(validators));
return this;
}
public Transformer<T, F> build() {
public final Transformer<F, T> build() {
return new Transformer<>(transforms);
}
}

View File

@@ -0,0 +1,6 @@
package com.dfsek.terra.api.transform;
public interface Validator<T> {
boolean validate(T value) throws TransformException;
}

View File

@@ -35,7 +35,7 @@ public class OrePopulator implements TerraBlockPopulator {
Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed()));
int originX = ((chunk.getX() + cx) << 4);
int originZ = ((chunk.getZ() + cz) << 4);
Biome b = main.getWorld(world).getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE);
Biome b = tw.getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE);
BiomeTemplate config = ((UserDefinedBiome) b).getConfig();
int finalCx = cx;
int finalCz = cz;

View File

@@ -6,7 +6,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.api.translator.Transformer;
import com.dfsek.terra.api.transform.Transformer;
import com.dfsek.terra.bukkit.world.block.BukkitBlockData;
import com.dfsek.terra.bukkit.world.block.BukkitMaterialData;
import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing;

View File

@@ -12,8 +12,8 @@ import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.api.translator.MapTransform;
import com.dfsek.terra.api.translator.Transformer;
import com.dfsek.terra.api.transform.MapTransform;
import com.dfsek.terra.api.transform.Transformer;
import com.dfsek.terra.bukkit.command.command.TerraCommand;
import com.dfsek.terra.bukkit.command.command.structure.LocateCommand;
import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator;

View File

@@ -10,8 +10,10 @@ import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.api.translator.MapTransform;
import com.dfsek.terra.api.translator.Transformer;
import com.dfsek.terra.api.transform.MapTransform;
import com.dfsek.terra.api.transform.NotNullValidator;
import com.dfsek.terra.api.transform.Transformer;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.PluginConfig;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.fabric.inventory.FabricItemHandle;
@@ -29,9 +31,13 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeEffects;
import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.biome.SpawnSettings;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.DefaultBiomeFeatures;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.HugeMushroomFeature;
import net.minecraft.world.gen.feature.TreeFeature;
@@ -139,19 +145,42 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
}
}
Transformer<String, Biome> biomeFixer = new Transformer.Builder<String, Biome>()
.addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>())
.addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build();
@Override
public void register(TypeRegistry registry) {
genericLoaders.register(registry);
registry
.registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o))
.registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o))
.registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> {
String id = (String) o;
if(!id.contains(":")) id = "minecraft:" + id.toLowerCase();
Identifier identifier = new Identifier(id);
Biome biome = BuiltinRegistries.BIOME.get(identifier);
return new FabricBiome(biome);
});
.registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o)));
}
private Biome createBiome(UserDefinedBiome biome) {
SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder();
DefaultBiomeFeatures.addFarmAnimals(spawnSettings);
DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100);
GenerationSettings.Builder generationSettings = new GenerationSettings.Builder();
return (new Biome.Builder())
.precipitation(Biome.Precipitation.RAIN)
.category(Biome.Category.NONE)
.depth(0.125F)
.scale(0.05F)
.temperature(0.8F)
.downfall(0.4F)
.effects((new BiomeEffects.Builder())
.waterColor(0x3f76e4)
.waterFogColor(0x050533)
.fogColor(0xc0d8ff)
.skyColor(0x77adff)
.build())
.spawnSettings(spawnSettings.build())
.generationSettings(generationSettings.build())
.build();
}
@SuppressWarnings("unchecked")

View File

@@ -1,25 +0,0 @@
package com.dfsek.terra.fabric.mixin;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.world.CreateWorldScreen;
import net.minecraft.client.gui.screen.world.MoreOptionsDialog;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(MoreOptionsDialog.class)
public class MoreOptionsDialogMixin {
@Inject(at = @At("HEAD"), method = "method_28092(Lnet/minecraft/client/gui/screen/world/CreateWorldScreen;Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/font/TextRenderer;)V")
private void draw(final CreateWorldScreen parent, MinecraftClient client, TextRenderer textRenderer, CallbackInfo info) {
System.out.println("More options opened");
}
/*@Inject(at = @At("RETURN"), method = "setVisible(B)V")
private void setVisible(boolean visible, CallbackInfo info) {
System.out.println("redraw");
}
*/
}

View File

@@ -5,7 +5,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.api.translator.Transformer;
import com.dfsek.terra.api.transform.Transformer;
import com.dfsek.terra.fabric.world.block.FabricBlockData;
import com.dfsek.terra.fabric.world.block.FabricMaterialData;
import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing;

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.fabric.world.features;
import com.mojang.serialization.Codec;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import net.minecraft.world.gen.feature.Feature;
import java.util.Random;
public class FloraFeature extends Feature<DefaultFeatureConfig> {
public FloraFeature(Codec<DefaultFeatureConfig> codec) {
super(codec);
}
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
return false;
}
}

View File

@@ -8,7 +8,9 @@ import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.fabric.world.block.FabricBlock;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ServerWorldAccess;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.WorldAccess;
@@ -35,12 +37,12 @@ public class FabricWorldAccess implements World {
@Override
public ChunkGenerator getGenerator() {
return null;
return new FabricChunkGenerator(((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator());
}
@Override
public String getName() {
return delegate.toString();
return ((ServerWorldAccess) delegate).toServerWorld().worldProperties.getLevelName();
}
@Override

View File

@@ -1,4 +1,5 @@
accessWidener v1 named
extendable method net/minecraft/client/world/GeneratorType <init> (Ljava/lang/String;)V
accessible field net/minecraft/server/world/ServerWorld Lnet/minecraft/world/level/ServerWorldProperties worldProperties
accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties;
mutable field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties;

View File

@@ -5,8 +5,7 @@
"compatibilityLevel": "JAVA_8",
"mixins": [],
"client": [
"GeneratorTypeAccessor",
"MoreOptionsDialogMixin"
"GeneratorTypeAccessor"
],
"server": [],
"injectors": {