mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
Add Validator API & cleanup Fabric
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package com.dfsek.terra.api.translator;
|
||||
package com.dfsek.terra.api.transform;
|
||||
|
||||
public class AttemptsFailedException extends RuntimeException {
|
||||
public AttemptsFailedException() {
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.dfsek.terra.api.translator;
|
||||
package com.dfsek.terra.api.transform;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.dfsek.terra.api.translator;
|
||||
package com.dfsek.terra.api.transform;
|
||||
|
||||
public class TransformException extends Exception {
|
||||
public TransformException() {
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.dfsek.terra.api.transform;
|
||||
|
||||
|
||||
public interface Validator<T> {
|
||||
boolean validate(T value) throws TransformException;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
*/
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -5,8 +5,7 @@
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"mixins": [],
|
||||
"client": [
|
||||
"GeneratorTypeAccessor",
|
||||
"MoreOptionsDialogMixin"
|
||||
"GeneratorTypeAccessor"
|
||||
],
|
||||
"server": [],
|
||||
"injectors": {
|
||||
|
||||
Reference in New Issue
Block a user