create ChunkGeneratorMixin

This commit is contained in:
dfsek 2021-05-02 22:21:50 -07:00
parent 061d2b6493
commit 2c8cae9d45
19 changed files with 78 additions and 141 deletions

View File

@ -65,7 +65,7 @@ public class TerraCommandManager implements CommandManager {
return;
}
if(commandClass.isAnnotationPresent(WorldCommand.class) && (!(sender instanceof Player) || !TerraWorld.isTerraWorld(((Player) sender).getWorld()))) {
if(commandClass.isAnnotationPresent(WorldCommand.class) && (!(sender instanceof Player) || !(((Player) sender).getWorld()).isTerraWorld())) {
sender.sendMessage("Command must be executed in a Terra world.");
return;
}

View File

@ -6,6 +6,8 @@ import com.dfsek.terra.api.platform.block.Block;
import com.dfsek.terra.api.platform.entity.Entity;
import com.dfsek.terra.api.platform.entity.EntityType;
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
import java.io.File;
import java.util.UUID;
@ -34,4 +36,12 @@ public interface World extends Handle {
Entity spawnEntity(Location location, EntityType entityType);
int getMinHeight();
default boolean isTerraWorld() {
return getGenerator().getHandle() instanceof GeneratorWrapper;
}
default TerraChunkGenerator getTerraGenerator() {
return ((GeneratorWrapper) getGenerator().getHandle()).getHandle();
}
}

View File

@ -19,6 +19,6 @@ public class BufferedEntity implements BufferedItem {
@Override
public void paste(Location origin) {
Entity entity = origin.clone().add(0.5, 0, 0.5).getWorld().spawnEntity(origin, type);
main.getEventManager().callEvent(new EntitySpawnEvent(main.getWorld(entity.getWorld()).getGenerator().getConfigPack(), entity, entity.getLocation()));
main.getEventManager().callEvent(new EntitySpawnEvent(entity.getWorld().getTerraGenerator().getConfigPack(), entity, entity.getLocation()));
}
}

View File

@ -32,7 +32,7 @@ public class BufferedLootApplication implements BufferedItem {
}
Container container = (Container) data;
LootPopulateEvent event = new LootPopulateEvent(block, container, table, main.getWorld(block.getLocation().getWorld()).getGenerator().getConfigPack(), structure);
LootPopulateEvent event = new LootPopulateEvent(block, container, table, block.getLocation().getWorld().getTerraGenerator().getConfigPack(), structure);
main.getEventManager().callEvent(event);
if(event.isCancelled()) return;

View File

@ -25,7 +25,7 @@ public class TerraWorld {
public TerraWorld(World w, ConfigPack c, TerraPlugin main) {
if(!isTerraWorld(w)) throw new IllegalArgumentException("World " + w + " is not a Terra World!");
if(!w.isTerraWorld()) throw new IllegalArgumentException("World " + w + " is not a Terra World!");
this.world = w;
config = c.toWorldConfig(this);
this.provider = config.getProvider();
@ -34,17 +34,11 @@ public class TerraWorld {
safe = true;
}
public static boolean isTerraWorld(World w) {
return w.getGenerator().getHandle() instanceof GeneratorWrapper;
}
public World getWorld() {
return world;
}
public TerraChunkGenerator getGenerator() {
return ((GeneratorWrapper) world.getGenerator().getHandle()).getHandle();
}
public BiomeProvider getBiomeProvider() {
return provider;

View File

@ -25,7 +25,7 @@ public class SamplerCache {
public Sampler load(@NotNull Long key) {
int cx = (int) (key >> 32);
int cz = (int) key.longValue();
return world.getGenerator().createSampler(cx, cz, world.getBiomeProvider(), world.getWorld(), world.getConfig().getTemplate().getElevationBlend());
return world.getWorld().getTerraGenerator().createSampler(cx, cz, world.getBiomeProvider(), world.getWorld(), world.getConfig().getTemplate().getElevationBlend());
}
});
}

View File

@ -19,7 +19,6 @@ import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.platform.CommandSender;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.entity.Entity;
import com.dfsek.terra.api.platform.entity.Player;
import com.dfsek.terra.api.platform.handle.ItemHandle;
import com.dfsek.terra.api.platform.handle.WorldHandle;
import com.dfsek.terra.api.platform.world.Tree;
@ -30,6 +29,7 @@ import com.dfsek.terra.api.transform.NotNullValidator;
import com.dfsek.terra.api.transform.Transformer;
import com.dfsek.terra.api.util.logging.DebugLogger;
import com.dfsek.terra.api.util.logging.Logger;
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
import com.dfsek.terra.commands.CommandUtil;
import com.dfsek.terra.config.GenericLoaders;
import com.dfsek.terra.config.PluginConfig;
@ -40,13 +40,11 @@ import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.fabric.inventory.FabricItemHandle;
import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor;
import com.dfsek.terra.fabric.world.FabricAdapter;
import com.dfsek.terra.fabric.world.FabricBiome;
import com.dfsek.terra.fabric.world.FabricTree;
import com.dfsek.terra.fabric.world.FabricWorldHandle;
import com.dfsek.terra.fabric.world.TerraBiomeSource;
import com.dfsek.terra.fabric.world.features.PopulatorFeature;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import com.dfsek.terra.profiler.Profiler;
import com.dfsek.terra.profiler.ProfilerImpl;
@ -159,7 +157,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
public TerraWorld getWorld(World world) {
return worldMap.computeIfAbsent(world.getSeed(), w -> {
logger.info("Loading world " + w);
return new TerraWorld(world, ((FabricChunkGeneratorWrapper) ((FabricChunkGenerator) world.getGenerator()).getHandle()).getPack(), this);
return new TerraWorld(world, ((FabricChunkGeneratorWrapper) world.getGenerator()).getPack(), this);
});
}

View File

@ -0,0 +1,14 @@
package com.dfsek.terra.fabric.mixin.world;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import org.spongepowered.asm.mixin.Implements;
import org.spongepowered.asm.mixin.Interface;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(ChunkGenerator.class)
@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "vw$"))
public abstract class ChunkGeneratorMixin {
public Object vw$getHandle() {
return this;
}
}

View File

@ -4,14 +4,12 @@ import com.dfsek.terra.api.platform.block.Block;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
import com.dfsek.terra.fabric.world.block.FabricBlock;
import com.dfsek.terra.fabric.world.block.FabricBlockData;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import com.dfsek.terra.fabric.world.handles.FabricWorld;
import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkRegion;
import net.minecraft.world.chunk.WorldChunk;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Final;
@ -36,7 +34,7 @@ public abstract class WorldChunkMixin {
}
public World vw$getWorld() {
return new FabricWorld((ServerWorld) world, new FabricChunkGenerator(((ServerWorld) world).getChunkManager().getChunkGenerator()));
return new FabricWorld((ServerWorld) world, (ChunkGenerator) ((ServerWorld) world).getChunkManager().getChunkGenerator());
}
public Block vw$getBlock(int x, int y, int z) {

View File

@ -4,7 +4,6 @@ import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.platform.world.Tree;
import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.fabric.TerraFabricPlugin;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess;
import com.dfsek.terra.profiler.ProfileFrame;
import net.minecraft.util.math.BlockPos;
@ -29,7 +28,7 @@ public class FabricTree implements Tree {
public boolean plant(Location l, Random r) {
try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) {
FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld());
ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle();
ChunkGenerator generatorWrapper = (ChunkGenerator) fabricWorldAccess.getGenerator();
return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()));
}
}

View File

@ -1,7 +1,6 @@
package com.dfsek.terra.fabric.world.features;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.world.handles.FabricWorld;
import com.mojang.serialization.Codec;
@ -24,7 +23,7 @@ public class PopulatorFeature extends Feature<DefaultFeatureConfig> {
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator;
FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator));
FabricWorld world1 = new FabricWorld(world.toServerWorld(), (com.dfsek.terra.api.platform.world.generator.ChunkGenerator) chunkGenerator);
gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, (Chunk) world));
return true;
}

View File

@ -1,36 +0,0 @@
package com.dfsek.terra.fabric.world.generator;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.world.generator.ChunkData;
import com.dfsek.terra.fabric.world.block.FabricBlockData;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.Chunk;
import org.jetbrains.annotations.NotNull;
public class FabricChunkData implements ChunkData {
private final Chunk handle;
public FabricChunkData(Chunk handle) {
this.handle = handle;
}
@Override
public Chunk getHandle() {
return handle;
}
@Override
public int getMaxHeight() {
return handle.getHeight();
}
@Override
public void setBlock(int x, int y, int z, @NotNull BlockData blockData) {
handle.setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false);
}
@Override
public @NotNull BlockData getBlockData(int x, int y, int z) {
return new FabricBlockData(handle.getBlockState(new BlockPos(x, y, z)));
}
}

View File

@ -1,16 +0,0 @@
package com.dfsek.terra.fabric.world.generator;
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
public class FabricChunkGenerator implements ChunkGenerator {
private final net.minecraft.world.gen.chunk.ChunkGenerator delegate;
public FabricChunkGenerator(net.minecraft.world.gen.chunk.ChunkGenerator delegate) {
this.delegate = delegate;
}
@Override
public net.minecraft.world.gen.chunk.ChunkGenerator getHandle() {
return delegate;
}
}

View File

@ -11,11 +11,6 @@ import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess;
import com.dfsek.terra.world.TerraWorld;
import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D;
import com.dfsek.terra.world.generation.math.samplers.Sampler;
import com.dfsek.terra.world.population.CavePopulator;
import com.dfsek.terra.world.population.FloraPopulator;
import com.dfsek.terra.world.population.OrePopulator;
import com.dfsek.terra.world.population.StructurePopulator;
import com.dfsek.terra.world.population.TreePopulator;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.jafama.FastMath;

View File

@ -7,9 +7,10 @@ import com.dfsek.terra.api.platform.entity.EntityType;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
import com.dfsek.terra.fabric.world.FabricAdapter;
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
import com.dfsek.terra.fabric.world.block.FabricBlock;
import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
@ -46,7 +47,7 @@ public class FabricWorld implements World, FabricWorldHandle {
@Override
public Chunk getChunkAt(int x, int z) {
return new FabricChunk(delegate.world.getChunk(x, z));
return (Chunk) delegate.world.getChunk(x, z);
}
@Override
@ -106,4 +107,14 @@ public class FabricWorld implements World, FabricWorldHandle {
return world;
}
}
@Override
public boolean isTerraWorld() {
return delegate.generator instanceof GeneratorWrapper;
}
@Override
public TerraChunkGenerator getTerraGenerator() {
return ((FabricChunkGeneratorWrapper) delegate.generator).getHandle();
}
}

View File

@ -1,52 +0,0 @@
package com.dfsek.terra.fabric.world.handles.chunk;
import com.dfsek.terra.api.platform.block.Block;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.fabric.world.block.FabricBlockData;
import net.minecraft.util.math.BlockPos;
import org.jetbrains.annotations.NotNull;
public class FabricChunk implements Chunk {
private final net.minecraft.world.chunk.Chunk chunk;
public FabricChunk(net.minecraft.world.chunk.Chunk chunk) {
this.chunk = chunk;
}
@Override
public int getX() {
return chunk.getPos().x;
}
@Override
public int getZ() {
return chunk.getPos().z;
}
@Override
public World getWorld() {
return null;
}
@Override
public Block getBlock(int x, int y, int z) {
return null;
}
@Override
public net.minecraft.world.chunk.Chunk getHandle() {
return chunk;
}
@Override
public void setBlock(int x, int y, int z, @NotNull BlockData blockData) {
chunk.setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false);
}
@Override
public @NotNull BlockData getBlockData(int x, int y, int z) {
return getBlock(x, y, z).getBlockData();
}
}

View File

@ -7,9 +7,10 @@ import com.dfsek.terra.api.platform.entity.EntityType;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
import com.dfsek.terra.fabric.world.FabricAdapter;
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
import com.dfsek.terra.fabric.world.block.FabricBlock;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ServerWorldAccess;
@ -35,7 +36,7 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle {
@Override
public ChunkGenerator getGenerator() {
return new FabricChunkGenerator(handle.getGenerator());
return (ChunkGenerator) handle.getGenerator();
}
@Override
@ -111,4 +112,14 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle {
return worldAccess;
}
}
@Override
public boolean isTerraWorld() {
return handle.generator instanceof GeneratorWrapper;
}
@Override
public TerraChunkGenerator getTerraGenerator() {
return ((FabricChunkGeneratorWrapper) handle.generator).getHandle();
}
}

View File

@ -7,9 +7,10 @@ import com.dfsek.terra.api.platform.entity.EntityType;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
import com.dfsek.terra.fabric.world.FabricAdapter;
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
import com.dfsek.terra.fabric.world.block.FabricBlock;
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ServerWorldAccess;
import net.minecraft.world.StructureWorldAccess;
@ -34,7 +35,7 @@ public class FabricWorldAccess implements World, FabricWorldHandle {
@Override
public ChunkGenerator getGenerator() {
return new FabricChunkGenerator(((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator());
return (ChunkGenerator) ((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator();
}
@Override
@ -86,4 +87,14 @@ public class FabricWorldAccess implements World, FabricWorldHandle {
if(!(obj instanceof FabricWorldAccess)) return false;
return ((ServerWorldAccess) ((FabricWorldAccess) obj).delegate).toServerWorld().equals(((ServerWorldAccess) delegate).toServerWorld());
}
@Override
public boolean isTerraWorld() {
return getGenerator() instanceof GeneratorWrapper;
}
@Override
public TerraChunkGenerator getTerraGenerator() {
return ((FabricChunkGeneratorWrapper) getGenerator()).getHandle();
}
}

View File

@ -14,6 +14,7 @@
"inventory.ItemStackDamageableMixin",
"inventory.ItemStackMetaMixin",
"inventory.ItemStackMixin",
"world.ChunkGeneratorMixin",
"world.ChunkRegionMixin",
"world.ProtoChunkMixin",
"world.WorldChunkMixin"