Flora and ores on Fabric

This commit is contained in:
dfsek
2020-12-14 01:27:28 -07:00
parent 6db4755109
commit 1dded41311
11 changed files with 64 additions and 30 deletions
@@ -298,7 +298,7 @@ public class Vector3 implements Cloneable {
public Vector3 subtract(int x, int y, int z) { public Vector3 subtract(int x, int y, int z) {
this.x -= x; this.x -= x;
this.y -= y; this.y -= y;
this.z = -z; this.z -= z;
return this; return this;
} }
@@ -85,7 +85,7 @@ public class CavePopulator implements TerraBlockPopulator {
Location mut = l.clone(); Location mut = l.clone();
MaterialData orig = handle.getType(l.getBlock()); MaterialData orig = handle.getType(l.getBlock());
do mut.subtract(0, 1, 0); do mut.subtract(0, 1, 0);
while(handle.getType(mut.getBlock()).equals(orig)); while(mut.getY() > 0 && handle.getType(mut.getBlock()).equals(orig));
try { try {
if(template.getShift().get(entry.getValue()).contains(mut.getBlock().getType())) { if(template.getShift().get(entry.getValue()).contains(mut.getBlock().getType())) {
handle.setBlockData(mut.getBlock(), shiftStorage.computeIfAbsent(entry.getValue(), MaterialData::createBlockData), false); handle.setBlockData(mut.getBlock(), shiftStorage.computeIfAbsent(entry.getValue(), MaterialData::createBlockData), false);
@@ -15,14 +15,17 @@ import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.inventory.FabricItemHandle;
import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor;
import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricBiome;
import com.dfsek.terra.fabric.world.FabricMaterialData;
import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.FabricWorldHandle;
import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.TerraBiomeSource;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec;
import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.registry.ConfigRegistry;
import com.dfsek.terra.util.MaterialSet;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Blocks;
import net.minecraft.client.world.GeneratorType; import net.minecraft.client.world.GeneratorType;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.BuiltinRegistries;
@@ -133,6 +136,18 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
@Override @Override
public void onInitialize() { public void onInitialize() {
MaterialSet set = new MaterialSet();
set.add(new FabricMaterialData(Blocks.STONE));
set.add(new FabricMaterialData(Blocks.DIRT));
System.out.println("Contains: " + set.contains(new FabricMaterialData(Blocks.AIR)));
System.out.println("Contains: " + set.contains(new FabricMaterialData(Blocks.STONE)));
System.out.println("Matches: " + new FabricMaterialData(Blocks.STONE).matches(new FabricMaterialData(Blocks.STONE)));
System.out.println("Matches: " + new FabricMaterialData(Blocks.STONE).matches(new FabricMaterialData(Blocks.DIRT)));
instance = this; instance = this;
plugin.load(this); plugin.load(this);
config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra");
@@ -14,7 +14,7 @@ public class FabricBlock implements Block {
private final Handle delegate; private final Handle delegate;
public FabricBlock(BlockState state, BlockPos position, WorldAccess worldAccess) { public FabricBlock(BlockState state, BlockPos position, WorldAccess worldAccess) {
this.delegate = new Handle(state, position, worldAccess); this.delegate = new Handle(position, worldAccess);
} }
@Override @Override
@@ -34,12 +34,13 @@ public class FabricBlock implements Block {
@Override @Override
public Block getRelative(BlockFace face, int len) { public Block getRelative(BlockFace face, int len) {
return new FabricBlock(delegate.state, delegate.position.add(face.getModX(), face.getModY(), face.getModZ()), delegate.worldAccess); BlockPos newPos = delegate.position.add(face.getModX() * len, face.getModY() * len, face.getModZ() * len);
return new FabricBlock(delegate.worldAccess.getBlockState(newPos), newPos, delegate.worldAccess);
} }
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
return delegate.state.isAir(); return getBlockData().getMaterial().isAir();
} }
@Override @Override
@@ -49,7 +50,7 @@ public class FabricBlock implements Block {
@Override @Override
public MaterialData getType() { public MaterialData getType() {
return new FabricMaterialData(delegate.state.getMaterial()); return getBlockData().getMaterial();
} }
@Override @Override
@@ -69,7 +70,7 @@ public class FabricBlock implements Block {
@Override @Override
public boolean isPassable() { public boolean isPassable() {
return delegate.state.isAir(); return isEmpty();
} }
@Override @Override
@@ -78,12 +79,10 @@ public class FabricBlock implements Block {
} }
public static final class Handle { public static final class Handle {
private final BlockState state;
private final BlockPos position; private final BlockPos position;
private final WorldAccess worldAccess; private final WorldAccess worldAccess;
public Handle(BlockState state, BlockPos position, WorldAccess worldAccess) { public Handle(BlockPos position, WorldAccess worldAccess) {
this.state = state;
this.position = position; this.position = position;
this.worldAccess = worldAccess; this.worldAccess = worldAccess;
} }
@@ -13,17 +13,21 @@ public class FabricBlockData implements BlockData {
@Override @Override
public MaterialData getMaterial() { public MaterialData getMaterial() {
return null; return new FabricMaterialData(delegate.getBlock());
} }
@Override @Override
public boolean matches(MaterialData materialData) { public boolean matches(MaterialData materialData) {
return false; return ((FabricMaterialData) materialData).getHandle().is(delegate.getBlock());
} }
@Override @Override
public BlockData clone() { public BlockData clone() {
return null; try {
return (BlockData) super.clone();
} catch(CloneNotSupportedException e) {
throw new Error(e);
}
} }
@Override @Override
@@ -2,12 +2,13 @@ package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.block.MaterialData;
import net.minecraft.block.Material; import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
public class FabricMaterialData implements MaterialData { public class FabricMaterialData implements MaterialData {
private final Material delegate; private final Block delegate;
public FabricMaterialData(Material delegate) { public FabricMaterialData(Block delegate) {
this.delegate = delegate; this.delegate = delegate;
} }
@@ -23,12 +24,12 @@ public class FabricMaterialData implements MaterialData {
@Override @Override
public boolean isSolid() { public boolean isSolid() {
return delegate.isSolid(); return !delegate.is(Blocks.AIR);
} }
@Override @Override
public boolean isAir() { public boolean isAir() {
return delegate.blocksMovement(); // TODO: better impl return delegate.is(Blocks.AIR); // TODO: better impl
} }
@Override @Override
@@ -38,21 +39,25 @@ public class FabricMaterialData implements MaterialData {
@Override @Override
public BlockData createBlockData() { public BlockData createBlockData() {
return null; return new FabricBlockData(delegate.getDefaultState());
} }
@Override @Override
public Material getHandle() { public Block getHandle() {
return delegate; return delegate;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return delegate.hashCode(); return delegate.asItem().hashCode();
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
return delegate.equals(obj); if(obj instanceof FabricMaterialData) {
return ((FabricMaterialData) obj).matches(this);
}
return false;
} }
} }
@@ -37,7 +37,7 @@ public class FabricWorldHandle implements WorldHandle {
@Override @Override
public MaterialData createMaterialData(String data) { public MaterialData createMaterialData(String data) {
return new FabricMaterialData(createBlockData(data).getHandle().getMaterial()); return new FabricMaterialData(createBlockData(data).getHandle().getBlock());
} }
@Override @Override
@@ -11,6 +11,7 @@ import com.dfsek.terra.fabric.world.handles.world.FabricWorldChunkRegion;
import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.generation.TerraChunkGenerator;
import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.CavePopulator;
import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.FloraPopulator;
import com.dfsek.terra.population.OrePopulator;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -40,6 +41,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl
.apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new)));
private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance());
private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance());
private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance());
public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) { public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) {
super(biomeSource, new StructuresConfig(false)); super(biomeSource, new StructuresConfig(false));
@@ -87,8 +89,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl
FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this); FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this);
FabricChunkRegionChunk regionChunk = new FabricChunkRegionChunk(region); FabricChunkRegionChunk regionChunk = new FabricChunkRegionChunk(region);
cavePopulator.populate(chunkRegion, pop, regionChunk); cavePopulator.populate(chunkRegion, pop, regionChunk);
orePopulator.populate(chunkRegion, pop, regionChunk);
floraPopulator.populate(chunkRegion, pop, regionChunk); floraPopulator.populate(chunkRegion, pop, regionChunk);
// Nope
} }
@Override @Override
@@ -7,7 +7,9 @@ import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.fabric.world.FabricBlock;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldAccess;
import java.io.File; import java.io.File;
@@ -64,12 +66,13 @@ public class FabricSeededWorldAccess implements World {
@Override @Override
public Block getBlockAt(int x, int y, int z) { public Block getBlockAt(int x, int y, int z) {
return null; BlockPos pos = new BlockPos(x, y, z);
return new FabricBlock(handle.worldAccess.getBlockState(pos), pos, handle.worldAccess);
} }
@Override @Override
public Block getBlockAt(Location l) { public Block getBlockAt(Location l) {
return null; return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ());
} }
@Override @Override
@@ -7,6 +7,8 @@ import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.fabric.world.FabricBlock;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldAccess;
import java.io.File; import java.io.File;
@@ -62,12 +64,13 @@ public class FabricWorldAccess implements World {
@Override @Override
public Block getBlockAt(int x, int y, int z) { public Block getBlockAt(int x, int y, int z) {
return null; BlockPos pos = new BlockPos(x, y, z);
return new FabricBlock(delegate.getBlockState(pos), pos, delegate);
} }
@Override @Override
public Block getBlockAt(Location l) { public Block getBlockAt(Location l) {
return null; return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ());
} }
@Override @Override
@@ -7,7 +7,9 @@ import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.fabric.world.FabricBlock;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkRegion; import net.minecraft.world.ChunkRegion;
import java.io.File; import java.io.File;
@@ -63,12 +65,13 @@ public class FabricWorldChunkRegion implements World {
@Override @Override
public Block getBlockAt(int x, int y, int z) { public Block getBlockAt(int x, int y, int z) {
return null; BlockPos pos = new BlockPos(x, y, z);
return new FabricBlock(delegate.chunk.getBlockState(pos), pos, delegate.chunk);
} }
@Override @Override
public Block getBlockAt(Location l) { public Block getBlockAt(Location l) {
return null; return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ());
} }
@Override @Override