Super basic Fabric stuff

This commit is contained in:
dfsek 2020-12-12 01:44:56 -07:00
parent 27dbd494bd
commit d84dd3a526
22 changed files with 642 additions and 2 deletions

2
.gitignore vendored
View File

@ -137,3 +137,5 @@ build
!lib/*.jar
.idea/Terra.iml
/run/
/run/

View File

@ -27,6 +27,9 @@ repositories {
maven { url = uri("http://maven.enginehub.org/repo/") }
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
maven { url = uri("https://maven.fabricmc.net/") }
gradlePluginPortal()
jcenter()
}
java {

View File

@ -2,6 +2,8 @@ plugins {
java
maven
idea
id("fabric-loom").version("0.5-SNAPSHOT")
id("com.github.johnrengelman.shadow")
}
group = "com.dfsek.terra.bukkit"
@ -11,6 +13,17 @@ repositories {
maven { url = uri("http://maven.enginehub.org/repo/") }
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
jcenter()
maven {
name = "Fabric"
url = uri("https://maven.fabricmc.net/")
}
gradlePluginPortal()
}
minecraft {
accessWidener("src/main/resources/terra.accesswidener")
}
dependencies {
@ -29,4 +42,24 @@ dependencies {
implementation("com.google.guava:guava:30.0-jre")
compileOnly("org.jetbrains:annotations:20.1.0")
// To change the versions see the gradle.properties file
minecraft("com.mojang:minecraft:1.16.4")
mappings("net.fabricmc:yarn:1.16.4+build.6:v2")
modImplementation("net.fabricmc:fabric-loader:0.10.6+build.214")
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation("net.fabricmc.fabric-api:fabric-api:0.25.1+build.416-1.16")
}
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
archiveClassifier.set("")
archiveBaseName.set("Terra")
setVersion(project.version)
relocate("org.apache.commons", "com.dfsek.terra.lib.commons")
relocate("parsii", "com.dfsek.terra.lib.parsii")
relocate("net.jafama", "com.dfsek.terra.lib.jafama")
relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic")
minimize()
}

View File

@ -8,12 +8,39 @@ import com.dfsek.terra.api.generic.inventory.ItemHandle;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.config.base.PluginConfig;
import com.dfsek.terra.fabric.inventory.FabricItemHandle;
import com.dfsek.terra.registry.ConfigRegistry;
import net.fabricmc.api.ModInitializer;
import net.minecraft.client.world.GeneratorType;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
import net.minecraft.world.gen.chunk.FlatChunkGenerator;
import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig;
import net.minecraft.world.gen.chunk.StructuresConfig;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
public class TerraFabricPlugin implements TerraPlugin {
public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
private static final GeneratorType TERRA = new GeneratorType("terra") {
@Override
protected ChunkGenerator getChunkGenerator(Registry<Biome> biomeRegistry, Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry, long seed) {
FlatChunkGeneratorConfig config = new FlatChunkGeneratorConfig(
new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry);
config.updateLayerBlocks();
return new FlatChunkGenerator(config);
}
};
private final Logger logger = Logger.getLogger("Terra");
private final ItemHandle itemHandle = new FabricItemHandle();
@Override
public WorldHandle getWorldHandle() {
return null;
@ -31,7 +58,7 @@ public class TerraFabricPlugin implements TerraPlugin {
@Override
public Logger getLogger() {
return null;
return logger;
}
@Override
@ -73,4 +100,25 @@ public class TerraFabricPlugin implements TerraPlugin {
public void register(TypeRegistry registry) {
}
@SuppressWarnings("unchecked")
@Override
public void onInitialize() {
logger.info("Initializing Terra...");
Class<GeneratorType> generatorTypeClass = GeneratorType.class;
try {
Field values = generatorTypeClass.getDeclaredField("VALUES");
values.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(values, values.getModifiers() & ~Modifier.FINAL);
((List<GeneratorType>) values.get(null)).add(TERRA); // TODO: This is incredibly yucky and should be replaced by Mixin as soon as possible.
} catch(NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,12 @@
package com.dfsek.terra.fabric.inventory;
import com.dfsek.terra.api.generic.inventory.ItemHandle;
import com.dfsek.terra.api.generic.inventory.ItemStack;
import com.dfsek.terra.api.generic.world.block.MaterialData;
public class FabricItemHandle implements ItemHandle {
@Override
public ItemStack newItemStack(MaterialData material, int amount) {
return null;
}
}

View File

@ -0,0 +1,44 @@
package com.dfsek.terra.fabric.inventory;
import com.dfsek.terra.api.generic.inventory.ItemStack;
import com.dfsek.terra.api.generic.inventory.item.ItemMeta;
import com.dfsek.terra.api.generic.world.block.MaterialData;
public class FabricItemStack implements ItemStack {
net.minecraft.item.ItemStack delegate;
@Override
public int getAmount() {
return delegate.getCount();
}
@Override
public void setAmount(int i) {
delegate.setCount(i);
}
@Override
public MaterialData getType() {
return null;
}
@Override
public ItemStack clone() {
return null;
}
@Override
public ItemMeta getItemMeta() {
return null;
}
@Override
public void setItemMeta(ItemMeta meta) {
}
@Override
public Object getHandle() {
return delegate;
}
}

View File

@ -0,0 +1,15 @@
package com.dfsek.terra.fabric.mixin;
import net.minecraft.client.world.GeneratorType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
@Mixin(GeneratorType.class)
public class GeneratorAccessor {
@Accessor("VALUES")
public static List<GeneratorType> getValues() {
throw new AssertionError();
}
}

View File

@ -0,0 +1,29 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.world.vector.Location;
import net.minecraft.block.Block;
import net.minecraft.world.World;
public class BlockStorage {
private final Block block;
private final Location location;
public BlockStorage(Block block, Location location) {
this.block = block;
this.location = location;
}
public Block getBlock() {
return block;
}
public Location getLocation() {
return location;
}
public World getWorld() {
return ((FabricWorld) location.getWorld()).getHandle();
}
}

View File

@ -0,0 +1,10 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import net.minecraft.util.math.BlockPos;
public final class FabricAdapters {
public static BlockPos fromVector(Vector3 v) {
return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ());
}
}

View File

@ -0,0 +1,75 @@
package com.dfsek.terra.fabric.world;
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.BlockFace;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.api.generic.world.vector.Location;
public class FabricBlock implements Block {
private final BlockStorage delegate;
public FabricBlock(BlockStorage block) {
this.delegate = block;
}
@Override
public void setBlockData(BlockData data, boolean physics) {
delegate.getWorld().setBlockState(FabricAdapters.fromVector(delegate.getLocation().getVector()), ((FabricBlockData) data).getHandle(), 0, 0);
}
@Override
public BlockData getBlockData() {
return null;
}
@Override
public Block getRelative(BlockFace face) {
return null;
}
@Override
public Block getRelative(BlockFace face, int len) {
return null;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public Location getLocation() {
return delegate.getLocation();
}
@Override
public MaterialData getType() {
return null;
}
@Override
public int getX() {
return delegate.getLocation().getBlockX();
}
@Override
public int getZ() {
return delegate.getLocation().getBlockZ();
}
@Override
public int getY() {
return delegate.getLocation().getBlockY();
}
@Override
public boolean isPassable() {
return false;
}
@Override
public BlockStorage getHandle() {
return delegate;
}
}

View File

@ -0,0 +1,33 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import net.minecraft.block.BlockState;
public class FabricBlockData implements BlockData {
private final BlockState delegate;
public FabricBlockData(BlockState delegate) {
this.delegate = delegate;
}
@Override
public MaterialData getMaterial() {
return null;
}
@Override
public boolean matches(MaterialData materialData) {
return false;
}
@Override
public BlockData clone() {
return null;
}
@Override
public BlockState getHandle() {
return delegate;
}
}

View File

@ -0,0 +1,38 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block;
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;
}
}

View File

@ -0,0 +1,48 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import net.minecraft.block.Material;
public class FabricMaterialData implements MaterialData {
private final Material delegate;
public FabricMaterialData(Material delegate) {
this.delegate = delegate;
}
@Override
public boolean matches(MaterialData other) {
return delegate.equals(((FabricMaterialData) other).getHandle());
}
@Override
public boolean matches(BlockData other) {
return delegate.equals(((FabricMaterialData) other.getMaterial()).getHandle());
}
@Override
public boolean isSolid() {
return delegate.isSolid();
}
@Override
public boolean isAir() {
return delegate.blocksMovement(); // TODO: better impl
}
@Override
public double getMaxDurability() {
return 0;
}
@Override
public BlockData createBlockData() {
return null;
}
@Override
public Material getHandle() {
return delegate;
}
}

View File

@ -0,0 +1,86 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.Entity;
import com.dfsek.terra.api.generic.Tree;
import com.dfsek.terra.api.generic.generator.ChunkGenerator;
import com.dfsek.terra.api.generic.world.Chunk;
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 java.io.File;
import java.util.UUID;
import java.util.function.Consumer;
public class FabricWorld implements World {
private final net.minecraft.world.World delegate;
public FabricWorld(net.minecraft.world.World delegate) {
this.delegate = delegate;
}
@Override
public long getSeed() {
return 1234;
}
@Override
public int getMaxHeight() {
return delegate.getDimensionHeight();
}
@Override
public ChunkGenerator getGenerator() {
return null;
}
@Override
public String getName() {
return delegate.toString();
}
@Override
public UUID getUID() {
return null;
}
@Override
public boolean isChunkGenerated(int x, int z) {
return false;
}
@Override
public Chunk getChunkAt(int x, int z) {
return null;
}
@Override
public File getWorldFolder() {
return null;
}
@Override
public Block getBlockAt(int x, int y, int z) {
return null;
}
@Override
public Block getBlockAt(Location l) {
return null;
}
@Override
public boolean generateTree(Location l, Tree vanillaTreeType) {
return false;
}
@Override
public void spawn(Location location, Class<Entity> entity, Consumer<Entity> consumer) {
}
@Override
public net.minecraft.world.World getHandle() {
return delegate;
}
}

View File

@ -0,0 +1,39 @@
package com.dfsek.terra.fabric.world;
import com.dfsek.terra.api.generic.Tree;
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;
public class FabricWorldHandle implements WorldHandle {
@Override
public void setBlockData(Block block, BlockData data, boolean physics) {
}
@Override
public BlockData getBlockData(Block block) {
return null;
}
@Override
public MaterialData getType(Block block) {
return null;
}
@Override
public BlockData createBlockData(String data) {
return null;
}
@Override
public MaterialData createMaterialData(String data) {
return null;
}
@Override
public Tree getTree(String id) {
return null;
}
}

View File

@ -0,0 +1,52 @@
package com.dfsek.terra.fabric.world.generator;
import com.mojang.serialization.Codec;
import net.minecraft.world.BlockView;
import net.minecraft.world.ChunkRegion;
import net.minecraft.world.Heightmap;
import net.minecraft.world.WorldAccess;
import net.minecraft.world.biome.source.BiomeSource;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.gen.StructureAccessor;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.chunk.StructuresConfig;
public class FabricChunkGenerator extends ChunkGenerator {
public FabricChunkGenerator(BiomeSource biomeSource, StructuresConfig structuresConfig) {
super(biomeSource, structuresConfig);
}
public FabricChunkGenerator(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) {
super(populationSource, biomeSource, structuresConfig, worldSeed);
}
@Override
protected Codec<? extends ChunkGenerator> getCodec() {
return null;
}
@Override
public ChunkGenerator withSeed(long seed) {
return null;
}
@Override
public void buildSurface(ChunkRegion region, Chunk chunk) {
}
@Override
public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) {
}
@Override
public int getHeight(int x, int z, Heightmap.Type heightmapType) {
return 0;
}
@Override
public BlockView getColumnSample(int x, int z) {
return null;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

@ -0,0 +1,4 @@
{
"generator.terra": "Terra"
}

View File

@ -0,0 +1,30 @@
{
"schemaVersion": 1,
"id": "terra",
"version": "@VERSION@",
"name": "Terra",
"description": "An insanely powerful free & open-source data-driven world generator.",
"authors": [
"dfsek"
],
"contact": {
"homepage": "https://github.com/PolyhedralDev/Terra/wiki",
"sources": "https://github.com/PolyhedralDev/Terra"
},
"license": "GPL-3.0",
"icon": "assets/terra/icon.png",
"environment": "*",
"entrypoints": {
"main": [
"com.dfsek.terra.fabric.TerraFabricPlugin"
]
},
"mixins": [
"terra.mixins.json"
],
"depends": {
"fabricloader": ">=0.7.4",
"fabric": "*",
"minecraft": "1.16.x"
}
}

View File

@ -0,0 +1,3 @@
accessWidener v1 named
extendable method net/minecraft/client/world/GeneratorType <init> (Ljava/lang/String;)V

View File

@ -0,0 +1,14 @@
{
"required": true,
"minVersion": "0.8",
"package": "com.dfsek.terra.fabric.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [],
"client": [],
"server": [
"GeneratorAccessor"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@ -11,3 +11,25 @@ rootProject.name = "Terra"
include("common")
include("platforms:bukkit")
include("platforms:fabric")
pluginManagement {
repositories {
maven(url = "http://maven.fabricmc.net") {
name = "Fabric"
}
gradlePluginPortal()
}
}
plugins {
id("com.gradle.enterprise") version "3.4.1"
}
gradleEnterprise {
buildScan {
termsOfServiceUrl = "https://gradle.com/terms-of-service"
termsOfServiceAgree = "yes"
// publishAlwaysIf(true)
}
}