mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 14:21:08 +00:00
Merge remote-tracking branch 'origin/master' into ver/6.0.0
# Conflicts: # build.gradle.kts # common/src/main/java/com/dfsek/terra/api/TerraPlugin.java # common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java # common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java # common/src/main/java/com/dfsek/terra/profiler/Profiler.java # common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java # common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java # common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java # common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java # common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java # common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java # common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java # common/src/test/java/biome/DistributionTest.java # common/src/test/java/biome/ImageTest.java # platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java # platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java # platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java
This commit is contained in:
+1
-1
@@ -342,6 +342,6 @@ ij_json_wrap_long_lines = false
|
|||||||
indent_size = 2
|
indent_size = 2
|
||||||
ij_yaml_keep_indents_on_empty_lines = true
|
ij_yaml_keep_indents_on_empty_lines = true
|
||||||
ij_yaml_keep_line_breaks = true
|
ij_yaml_keep_line_breaks = true
|
||||||
ij_yaml_space_before_colon = true
|
ij_yaml_space_before_colon = false
|
||||||
ij_yaml_spaces_within_braces = true
|
ij_yaml_spaces_within_braces = true
|
||||||
ij_yaml_spaces_within_brackets = true
|
ij_yaml_spaces_within_brackets = true
|
||||||
|
|||||||
@@ -7,20 +7,36 @@ to your specifications, with no knowledge of Java required.
|
|||||||
|
|
||||||
* Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/)
|
* Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/)
|
||||||
* Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
|
* Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
|
||||||
|
* Forge: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator)
|
||||||
|
|
||||||
## Building and running Terra
|
## Building and Running Terra
|
||||||
|
|
||||||
To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will produce a jar in `build/libs`
|
To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will build all platforms, and
|
||||||
called `Terra-[CURRENT VERSION].jar`. You can put this right into your plugins dir, along with the correct Gaea version.
|
produce JARs in `platforms/<platform>/build/libs`
|
||||||
|
|
||||||
If you would like to test it with a default server config, just run `./gradlew setupServer` or
|
### Production JARs:
|
||||||
`./gradlew.bat setupServer` to set up the server, then `./gradlew testWithPaper` or `gradlew.bat testWithPaper` to run the server. If you
|
* Bukkit: `Terra-<version>-shaded.jar`
|
||||||
want a clean installation of the server, re-run the `setupServer` task. This will download a default server config
|
* Fabric: `Terra-<version>-shaded-mapped.jar`
|
||||||
from [here](https://github.com/PolyhedralDev/WorldGenTestServer)
|
* Forge: `Terra-<version>-shaded.jar`
|
||||||
and install the server in the `target/server` directory, along with all the needed plugins.
|
|
||||||
|
|
||||||
**Note: You will need to adjust the `NAME` variable `bukkit.yml` of the test server if you are not using the default Terra config.**
|
### Building a Specific Platform
|
||||||
|
To build a specific platform, run `gradlew :platforms:<platform>:build`.
|
||||||
|
|
||||||
|
JARs are produced in `platforms/<platform>/build/libs`.
|
||||||
|
|
||||||
|
### Running Minecraft in the IDE
|
||||||
|
To run Minecraft with Terra in the IDE (for testing) use the following tasks:
|
||||||
|
* Bukkit
|
||||||
|
* `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test server. (Only needs to be run once).
|
||||||
|
* `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) test server. (Only needs to be run once).
|
||||||
|
* `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously).
|
||||||
|
* `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously).
|
||||||
|
* Fabric
|
||||||
|
* `runClient` - Run a Minecraft client with Terra installed.
|
||||||
|
* `runServer` - Run a Minecraft server with Terra installed.
|
||||||
|
* Forge
|
||||||
|
* `runClient` - Run a Minecraft client with Terra installed.
|
||||||
|
* `runServer` - Run a Minecraft server with Terra installed.
|
||||||
## Contributing
|
## Contributing
|
||||||
Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and
|
Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and
|
||||||
submit a PR!
|
submit a PR!
|
||||||
|
|||||||
@@ -5,6 +5,23 @@ val versionObj = Version("6", "0", "0", true)
|
|||||||
allprojects {
|
allprojects {
|
||||||
version = versionObj
|
version = versionObj
|
||||||
group = "com.dfsek.terra"
|
group = "com.dfsek.terra"
|
||||||
|
|
||||||
|
tasks.withType<JavaCompile>().configureEach {
|
||||||
|
options.isFork = true
|
||||||
|
options.isIncremental = true
|
||||||
|
}
|
||||||
|
tasks.withType<Test>().configureEach {
|
||||||
|
useJUnitPlatform()
|
||||||
|
|
||||||
|
maxHeapSize = "2G"
|
||||||
|
ignoreFailures = false
|
||||||
|
failFast = true
|
||||||
|
maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1
|
||||||
|
|
||||||
|
reports.html.isEnabled = false
|
||||||
|
reports.junitXml.isEnabled = false
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Version class that does version stuff.
|
* Version class that does version stuff.
|
||||||
|
|||||||
@@ -7,26 +7,11 @@ import org.gradle.kotlin.dsl.withType
|
|||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
|
|
||||||
fun Project.configureCommon() {
|
fun Project.configureCommon() {
|
||||||
apply(plugin = "java-library")
|
|
||||||
apply(plugin = "maven-publish")
|
|
||||||
apply(plugin = "idea")
|
|
||||||
|
|
||||||
configureDependencies()
|
configureDependencies()
|
||||||
configureCompilation()
|
configureCompilation()
|
||||||
configureDistribution()
|
configureDistribution()
|
||||||
|
|
||||||
version = rootProject.version
|
version = rootProject.version
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
tasks.withType<Test>().configureEach {
|
|
||||||
useJUnitPlatform()
|
|
||||||
|
|
||||||
maxHeapSize = "2G"
|
|
||||||
ignoreFailures = false
|
|
||||||
failFast = true
|
|
||||||
maxParallelForks = 12
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Project.getGitHash(): String {
|
fun Project.getGitHash(): String {
|
||||||
|
|||||||
@@ -3,14 +3,16 @@ package com.dfsek.terra
|
|||||||
import org.gradle.api.JavaVersion
|
import org.gradle.api.JavaVersion
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.plugins.JavaPluginConvention
|
import org.gradle.api.plugins.JavaPluginConvention
|
||||||
|
import org.gradle.api.tasks.bundling.Jar
|
||||||
import org.gradle.api.tasks.compile.JavaCompile
|
import org.gradle.api.tasks.compile.JavaCompile
|
||||||
import org.gradle.api.tasks.javadoc.Javadoc
|
import org.gradle.api.tasks.javadoc.Javadoc
|
||||||
import org.gradle.kotlin.dsl.configure
|
import org.gradle.kotlin.dsl.*
|
||||||
import org.gradle.kotlin.dsl.filter
|
|
||||||
import org.gradle.kotlin.dsl.withType
|
|
||||||
import org.gradle.language.jvm.tasks.ProcessResources
|
import org.gradle.language.jvm.tasks.ProcessResources
|
||||||
|
|
||||||
fun Project.configureCompilation() {
|
fun Project.configureCompilation() {
|
||||||
|
apply(plugin = "maven-publish")
|
||||||
|
apply(plugin = "idea")
|
||||||
|
|
||||||
configure<JavaPluginConvention> {
|
configure<JavaPluginConvention> {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
@@ -19,7 +21,7 @@ fun Project.configureCompilation() {
|
|||||||
tasks.withType<JavaCompile> {
|
tasks.withType<JavaCompile> {
|
||||||
options.encoding = "UTF-8"
|
options.encoding = "UTF-8"
|
||||||
doFirst {
|
doFirst {
|
||||||
options.compilerArgs = mutableListOf("-Xlint:all")
|
options.compilerArgs.add("-Xlint:all")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,4 +37,19 @@ fun Project.configureCompilation() {
|
|||||||
tasks.withType<Javadoc> {
|
tasks.withType<Javadoc> {
|
||||||
options.encoding = "UTF-8"
|
options.encoding = "UTF-8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.withType<Jar> {
|
||||||
|
archiveBaseName.set("Terra-${archiveBaseName.get()}")
|
||||||
|
from("../LICENSE", "../../LICENSE")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register<Jar>("sourcesJar") {
|
||||||
|
archiveClassifier.set("sources")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register<Jar>("javadocJar") {
|
||||||
|
dependsOn("javadoc")
|
||||||
|
archiveClassifier.set("javadoc")
|
||||||
|
from(tasks.getByName<Javadoc>("javadoc").destinationDir)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,27 @@
|
|||||||
package com.dfsek.terra
|
package com.dfsek.terra
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.kotlin.dsl.apply
|
||||||
import org.gradle.kotlin.dsl.dependencies
|
import org.gradle.kotlin.dsl.dependencies
|
||||||
|
import org.gradle.kotlin.dsl.invoke
|
||||||
import org.gradle.kotlin.dsl.repositories
|
import org.gradle.kotlin.dsl.repositories
|
||||||
|
|
||||||
fun Project.configureDependencies() {
|
fun Project.configureDependencies() {
|
||||||
|
apply(plugin = "java")
|
||||||
|
apply(plugin = "java-library")
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
val shaded = create("shaded")
|
||||||
|
val shadedApi = create("shadedApi")
|
||||||
|
shaded.extendsFrom(shadedApi)
|
||||||
|
getByName("api").extendsFrom(shadedApi)
|
||||||
|
val shadedImplementation = create("shadedImplementation")
|
||||||
|
shaded.extendsFrom(shadedImplementation)
|
||||||
|
getByName("implementation").extendsFrom(shadedImplementation)
|
||||||
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven { url = uri("http://maven.enginehub.org/repo/") }
|
maven { url = uri("https://maven.enginehub.org/repo/") }
|
||||||
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
|
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
|
||||||
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
|
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
|
||||||
maven { url = uri("https://maven.fabricmc.net/") }
|
maven { url = uri("https://maven.fabricmc.net/") }
|
||||||
@@ -19,6 +33,6 @@ fun Project.configureDependencies() {
|
|||||||
dependencies {
|
dependencies {
|
||||||
"testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0")
|
"testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0")
|
||||||
"testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0")
|
"testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0")
|
||||||
"compileOnly"("org.jetbrains:annotations:20.1.0")
|
"api"("org.jetbrains:annotations:20.1.0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,17 +14,6 @@ fun Project.configureDistribution() {
|
|||||||
apply(plugin = "java-library")
|
apply(plugin = "java-library")
|
||||||
apply(plugin = "com.github.johnrengelman.shadow")
|
apply(plugin = "com.github.johnrengelman.shadow")
|
||||||
|
|
||||||
configurations {
|
|
||||||
val shaded = create("shaded")
|
|
||||||
getByName("compile").extendsFrom(shaded)
|
|
||||||
val shadedApi = create("shadedApi")
|
|
||||||
shaded.extendsFrom(shadedApi)
|
|
||||||
getByName("api").extendsFrom(shadedApi)
|
|
||||||
val shadedImplementation = create("shadedImplementation")
|
|
||||||
shaded.extendsFrom(shadedImplementation)
|
|
||||||
getByName("implementation").extendsFrom(shadedImplementation)
|
|
||||||
}
|
|
||||||
|
|
||||||
val downloadDefaultPacks = tasks.create("downloadDefaultPacks") {
|
val downloadDefaultPacks = tasks.create("downloadDefaultPacks") {
|
||||||
group = "terra"
|
group = "terra"
|
||||||
doFirst {
|
doFirst {
|
||||||
@@ -38,21 +27,6 @@ fun Project.configureDistribution() {
|
|||||||
}
|
}
|
||||||
tasks["processResources"].dependsOn(downloadDefaultPacks)
|
tasks["processResources"].dependsOn(downloadDefaultPacks)
|
||||||
|
|
||||||
tasks.withType<Jar> {
|
|
||||||
archiveBaseName.set("Terra-${archiveBaseName.get()}")
|
|
||||||
from("../LICENSE", "../../LICENSE")
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register<Jar>("sourcesJar") {
|
|
||||||
archiveClassifier.set("sources")
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register<Jar>("javadocJar") {
|
|
||||||
dependsOn("javadoc")
|
|
||||||
archiveClassifier.set("javadoc")
|
|
||||||
from(tasks.getByName<Javadoc>("javadoc").destinationDir)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<ShadowJar>("shadowJar") {
|
tasks.named<ShadowJar>("shadowJar") {
|
||||||
// Tell shadow to download the packs
|
// Tell shadow to download the packs
|
||||||
dependsOn(downloadDefaultPacks)
|
dependsOn(downloadDefaultPacks)
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
import com.dfsek.terra.configureCommon
|
import com.dfsek.terra.configureCompilation
|
||||||
|
import com.dfsek.terra.configureDependencies
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
`java-library`
|
`java-library`
|
||||||
`maven-publish`
|
`maven-publish`
|
||||||
|
idea
|
||||||
}
|
}
|
||||||
|
|
||||||
configureCommon()
|
configureCompilation()
|
||||||
|
configureDependencies()
|
||||||
|
|
||||||
group = "com.dfsek.terra.common"
|
group = "com.dfsek.terra.common"
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.dfsek.terra.api.platform.handle.WorldHandle;
|
|||||||
import com.dfsek.terra.api.platform.world.World;
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
import com.dfsek.terra.api.registry.CheckedRegistry;
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
import com.dfsek.terra.api.registry.LockedRegistry;
|
import com.dfsek.terra.api.registry.LockedRegistry;
|
||||||
|
import com.dfsek.terra.api.util.JarUtil;
|
||||||
import com.dfsek.terra.api.util.logging.DebugLogger;
|
import com.dfsek.terra.api.util.logging.DebugLogger;
|
||||||
import com.dfsek.terra.api.util.logging.Logger;
|
import com.dfsek.terra.api.util.logging.Logger;
|
||||||
import com.dfsek.terra.config.PluginConfig;
|
import com.dfsek.terra.config.PluginConfig;
|
||||||
@@ -16,6 +17,9 @@ import com.dfsek.terra.profiler.Profiler;
|
|||||||
import com.dfsek.terra.world.TerraWorld;
|
import com.dfsek.terra.world.TerraWorld;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a Terra mod/plugin instance.
|
* Represents a Terra mod/plugin instance.
|
||||||
@@ -67,4 +71,8 @@ public interface TerraPlugin extends LoaderRegistrar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Profiler getProfiler();
|
Profiler getProfiler();
|
||||||
|
|
||||||
|
default JarFile getModJar() throws URISyntaxException, IOException {
|
||||||
|
return JarUtil.getJarFile();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class TerraCommandManager implements CommandManager {
|
|||||||
return;
|
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.");
|
sender.sendMessage("Command must be executed in a Terra world.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.dfsek.terra.api.platform.inventory;
|
package com.dfsek.terra.api.platform.inventory;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.Handle;
|
import com.dfsek.terra.api.platform.Handle;
|
||||||
|
import com.dfsek.terra.api.platform.inventory.item.Damageable;
|
||||||
import com.dfsek.terra.api.platform.inventory.item.ItemMeta;
|
import com.dfsek.terra.api.platform.inventory.item.ItemMeta;
|
||||||
|
|
||||||
public interface ItemStack extends Handle {
|
public interface ItemStack extends Handle {
|
||||||
@@ -13,4 +14,8 @@ public interface ItemStack extends Handle {
|
|||||||
ItemMeta getItemMeta();
|
ItemMeta getItemMeta();
|
||||||
|
|
||||||
void setItemMeta(ItemMeta meta);
|
void setItemMeta(ItemMeta meta);
|
||||||
|
|
||||||
|
default boolean isDamageable() {
|
||||||
|
return getItemMeta() instanceof Damageable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.Entity;
|
||||||
import com.dfsek.terra.api.platform.entity.EntityType;
|
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.ChunkGenerator;
|
||||||
|
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
|
||||||
|
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -17,20 +19,12 @@ public interface World extends Handle {
|
|||||||
|
|
||||||
ChunkGenerator getGenerator();
|
ChunkGenerator getGenerator();
|
||||||
|
|
||||||
String getName();
|
|
||||||
|
|
||||||
UUID getUID();
|
|
||||||
|
|
||||||
boolean isChunkGenerated(int x, int z);
|
|
||||||
|
|
||||||
Chunk getChunkAt(int x, int z);
|
Chunk getChunkAt(int x, int z);
|
||||||
|
|
||||||
default Chunk getChunkAt(Location location) {
|
default Chunk getChunkAt(Location location) {
|
||||||
return getChunkAt(location.getBlockX() >> 4, location.getBlockZ() >> 4);
|
return getChunkAt(location.getBlockX() >> 4, location.getBlockZ() >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
File getWorldFolder();
|
|
||||||
|
|
||||||
Block getBlockAt(int x, int y, int z);
|
Block getBlockAt(int x, int y, int z);
|
||||||
|
|
||||||
default Block getBlockAt(Location l) {
|
default Block getBlockAt(Location l) {
|
||||||
@@ -40,4 +34,12 @@ public interface World extends Handle {
|
|||||||
Entity spawnEntity(Location location, EntityType entityType);
|
Entity spawnEntity(Location location, EntityType entityType);
|
||||||
|
|
||||||
int getMinHeight();
|
int getMinHeight();
|
||||||
|
|
||||||
|
default boolean isTerraWorld() {
|
||||||
|
return getGenerator().getHandle() instanceof GeneratorWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
default TerraChunkGenerator getTerraGenerator() {
|
||||||
|
return ((GeneratorWrapper) getGenerator().getHandle()).getHandle();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -34,8 +34,8 @@ public class DamageFunction implements LootFunction {
|
|||||||
@Override
|
@Override
|
||||||
public ItemStack apply(ItemStack original, Random r) {
|
public ItemStack apply(ItemStack original, Random r) {
|
||||||
if(original == null) return null;
|
if(original == null) return null;
|
||||||
|
if(!original.isDamageable()) return original;
|
||||||
ItemMeta meta = original.getItemMeta();
|
ItemMeta meta = original.getItemMeta();
|
||||||
if(!(meta instanceof Damageable)) return original;
|
|
||||||
double itemDurability = (r.nextDouble() * (max - min)) + min;
|
double itemDurability = (r.nextDouble() * (max - min)) + min;
|
||||||
Damageable damage = (Damageable) meta;
|
Damageable damage = (Damageable) meta;
|
||||||
damage.setDamage((int) (original.getType().getMaxDurability() - (itemDurability / 100) * original.getType().getMaxDurability()));
|
damage.setDamage((int) (original.getType().getMaxDurability() - (itemDurability / 100) * original.getType().getMaxDurability()));
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ import com.dfsek.terra.api.structures.structure.buffer.Buffer;
|
|||||||
import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer;
|
import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer;
|
||||||
import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer;
|
import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer;
|
||||||
import com.dfsek.terra.profiler.ProfileFrame;
|
import com.dfsek.terra.profiler.ProfileFrame;
|
||||||
|
import com.dfsek.terra.registry.config.FunctionRegistry;
|
||||||
|
import com.dfsek.terra.registry.config.LootRegistry;
|
||||||
|
import com.dfsek.terra.registry.config.ScriptRegistry;
|
||||||
import com.google.common.cache.Cache;
|
import com.google.common.cache.Cache;
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
@@ -89,6 +92,12 @@ public class StructureScript {
|
|||||||
.registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> FastMath.ceil(number.doubleValue())))
|
.registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> FastMath.ceil(number.doubleValue())))
|
||||||
.registerFunction("log", new UnaryNumberFunctionBuilder(number -> FastMath.log(number.doubleValue())))
|
.registerFunction("log", new UnaryNumberFunctionBuilder(number -> FastMath.log(number.doubleValue())))
|
||||||
.registerFunction("round", new UnaryNumberFunctionBuilder(number -> FastMath.round(number.doubleValue())))
|
.registerFunction("round", new UnaryNumberFunctionBuilder(number -> FastMath.round(number.doubleValue())))
|
||||||
|
.registerFunction("sin", new UnaryNumberFunctionBuilder(number -> FastMath.sin(number.doubleValue())))
|
||||||
|
.registerFunction("cos", new UnaryNumberFunctionBuilder(number -> FastMath.cos(number.doubleValue())))
|
||||||
|
.registerFunction("tan", new UnaryNumberFunctionBuilder(number -> FastMath.tan(number.doubleValue())))
|
||||||
|
.registerFunction("asin", new UnaryNumberFunctionBuilder(number -> FastMath.asin(number.doubleValue())))
|
||||||
|
.registerFunction("acos", new UnaryNumberFunctionBuilder(number -> FastMath.acos(number.doubleValue())))
|
||||||
|
.registerFunction("atan", new UnaryNumberFunctionBuilder(number -> FastMath.atan(number.doubleValue())))
|
||||||
.registerFunction("max", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue())))
|
.registerFunction("max", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue())))
|
||||||
.registerFunction("min", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue())));
|
.registerFunction("min", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue())));
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -19,6 +19,6 @@ public class BufferedEntity implements BufferedItem {
|
|||||||
@Override
|
@Override
|
||||||
public void paste(Location origin) {
|
public void paste(Location origin) {
|
||||||
Entity entity = origin.clone().add(0.5, 0, 0.5).getWorld().spawnEntity(origin, type);
|
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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -32,7 +32,7 @@ public class BufferedLootApplication implements BufferedItem {
|
|||||||
}
|
}
|
||||||
Container container = (Container) data;
|
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);
|
main.getEventManager().callEvent(event);
|
||||||
if(event.isCancelled()) return;
|
if(event.isCancelled()) return;
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ public class BufferedLootApplication implements BufferedItem {
|
|||||||
data.update(false);
|
data.update(false);
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
main.logger().warning("Could not apply loot at " + origin + ": " + e.getMessage());
|
main.logger().warning("Could not apply loot at " + origin + ": " + e.getMessage());
|
||||||
main.getDebugLogger().stack(e);
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ public class BufferedStateManipulator implements BufferedItem {
|
|||||||
state.update(false);
|
state.update(false);
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
main.logger().warning("Could not apply BlockState at " + origin + ": " + e.getMessage());
|
main.logger().warning("Could not apply BlockState at " + origin + ": " + e.getMessage());
|
||||||
main.getDebugLogger().stack(e);
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package com.dfsek.terra.api.util;
|
package com.dfsek.terra.api.util;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
@@ -32,4 +36,12 @@ public class JarUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static JarFile getJarFile() throws URISyntaxException, IOException {
|
||||||
|
return new JarFile(new File(getJarURL().toURI()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static URL getJarURL() {
|
||||||
|
return TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,12 +69,12 @@ public class PluginConfig implements ConfigTemplate {
|
|||||||
ConfigLoader loader = new ConfigLoader();
|
ConfigLoader loader = new ConfigLoader();
|
||||||
loader.load(this, file);
|
loader.load(this, file);
|
||||||
if(dumpDefaultConfig) { // Don't dump default config if already loaded.
|
if(dumpDefaultConfig) { // Don't dump default config if already loaded.
|
||||||
try(JarFile jar = new JarFile(new File(TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) {
|
try(JarFile jar = main.getModJar()) {
|
||||||
JarUtil.copyResourcesToDirectory(jar, "packs", new File(main.getDataFolder(), "packs").toString());
|
JarUtil.copyResourcesToDirectory(jar, "packs", new File(main.getDataFolder(), "packs").toString());
|
||||||
} catch(IOException | URISyntaxException e) {
|
} catch(IOException | URISyntaxException e) {
|
||||||
main.getDebugLogger().error("Failed to dump default config files!");
|
main.getDebugLogger().error("Failed to dump default config files!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
main.getDebugLogger().error("Report this to Terra!");
|
main.getDebugLogger().error("Either you're on Forge, or this is a bug. If it's the latter, report this to Terra!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(ConfigException | IOException e) {
|
} catch(ConfigException | IOException e) {
|
||||||
|
|||||||
@@ -9,9 +9,6 @@ import com.dfsek.terra.api.platform.world.World;
|
|||||||
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
|
import com.dfsek.terra.api.platform.world.generator.ChunkGenerator;
|
||||||
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
|
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class DummyWorld implements World {
|
public class DummyWorld implements World {
|
||||||
@Override
|
@Override
|
||||||
public Object getHandle() {
|
public Object getHandle() {
|
||||||
@@ -33,31 +30,11 @@ public class DummyWorld implements World {
|
|||||||
return () -> (GeneratorWrapper) () -> null;
|
return () -> (GeneratorWrapper) () -> null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "DUMMY";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public UUID getUID() {
|
|
||||||
return UUID.randomUUID();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isChunkGenerated(int x, int z) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Chunk getChunkAt(int x, int z) {
|
public Chunk getChunkAt(int x, int z) {
|
||||||
throw new UnsupportedOperationException("Cannot get chunk in DummyWorld");
|
throw new UnsupportedOperationException("Cannot get chunk in DummyWorld");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public File getWorldFolder() {
|
|
||||||
throw new UnsupportedOperationException("Cannot get folder of DummyWorld");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Block getBlockAt(int x, int y, int z) {
|
public Block getBlockAt(int x, int y, int z) {
|
||||||
throw new UnsupportedOperationException("Cannot get block in DummyWorld");
|
throw new UnsupportedOperationException("Cannot get block in DummyWorld");
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.dfsek.terra.config.fileloaders;
|
package com.dfsek.terra.config.fileloaders;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.config.Configuration;
|
||||||
import com.dfsek.tectonic.exception.ConfigException;
|
import com.dfsek.tectonic.exception.ConfigException;
|
||||||
import com.dfsek.terra.api.util.GlueList;
|
import com.dfsek.terra.api.util.GlueList;
|
||||||
|
|
||||||
@@ -18,8 +19,12 @@ public abstract class Loader {
|
|||||||
*
|
*
|
||||||
* @param consumer Something to do with the streams.
|
* @param consumer Something to do with the streams.
|
||||||
*/
|
*/
|
||||||
public Loader then(ExceptionalConsumer<List<InputStream>> consumer) throws ConfigException {
|
public Loader then(ExceptionalConsumer<List<Configuration>> consumer) throws ConfigException {
|
||||||
consumer.accept(new GlueList<>(streams.values()));
|
List<Configuration> list = new GlueList<>();
|
||||||
|
streams.forEach((id, stream) -> {
|
||||||
|
list.add(new Configuration(stream, id));
|
||||||
|
});
|
||||||
|
consumer.accept(list);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public final class LangUtil {
|
|||||||
public static void load(String langID, TerraPlugin main) {
|
public static void load(String langID, TerraPlugin main) {
|
||||||
Logger logger = main.logger();
|
Logger logger = main.logger();
|
||||||
File file = new File(main.getDataFolder(), "lang");
|
File file = new File(main.getDataFolder(), "lang");
|
||||||
try(JarFile jar = new JarFile(new File(TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) {
|
try(JarFile jar = main.getModJar()) {
|
||||||
copyResourcesToDirectory(jar, "lang", file.toString());
|
copyResourcesToDirectory(jar, "lang", file.toString());
|
||||||
} catch(IOException | URISyntaxException e) {
|
} catch(IOException | URISyntaxException e) {
|
||||||
main.getDebugLogger().error("Failed to dump language files!");
|
main.getDebugLogger().error("Failed to dump language files!");
|
||||||
|
|||||||
@@ -3,22 +3,54 @@ package com.dfsek.terra.profiler;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface Profiler {
|
public interface Profiler {
|
||||||
|
/**
|
||||||
|
* Push a frame to this profiler.
|
||||||
|
*
|
||||||
|
* @param frame ID of frame.
|
||||||
|
*/
|
||||||
void push(String frame);
|
void push(String frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pop a frame from this profiler.
|
||||||
|
*
|
||||||
|
* @param frame ID of frame. Must match ID
|
||||||
|
* at the top of the profiler stack.
|
||||||
|
*/
|
||||||
void pop(String frame);
|
void pop(String frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start profiling.
|
||||||
|
*/
|
||||||
void start();
|
void start();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop profiling.
|
||||||
|
*/
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the profiler data.
|
||||||
|
*
|
||||||
|
* @return Profiler data.
|
||||||
|
*/
|
||||||
Map<String, Timings> getTimings();
|
Map<String, Timings> getTimings();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a {@link AutoCloseable} implementation that
|
||||||
|
* may be used in a try-with-resources statement for
|
||||||
|
* more intuitive profiling, with auto-push/pop.
|
||||||
|
*
|
||||||
|
* @param frame ID of frame.
|
||||||
|
* @return {@link AutoCloseable} implementation for use
|
||||||
|
* in try-with-resources.
|
||||||
|
*/
|
||||||
default ProfileFrame profile(String frame) {
|
default ProfileFrame profile(String frame) {
|
||||||
push(frame);
|
push(frame);
|
||||||
return new ProfileFrame(() -> pop(frame));
|
return new ProfileFrame(() -> pop(frame));
|
||||||
}
|
}
|
||||||
|
|
||||||
default void reset() {
|
/**
|
||||||
// todo: impl
|
* Clear the profiler data.
|
||||||
}
|
*/
|
||||||
|
void reset();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,4 +83,9 @@ public class ProfilerImpl implements Profiler {
|
|||||||
}));
|
}));
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
accessibleThreadMaps.forEach(Map::clear);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,10 +68,4 @@ public class FloraRegistry extends OpenRegistry<Flora> {
|
|||||||
private BlockData data(String s) {
|
private BlockData data(String s) {
|
||||||
return main.getWorldHandle().createBlockData(s);
|
return main.getWorldHandle().createBlockData(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Flora get(String identifier) {
|
|
||||||
return super.get(identifier);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class TerraWorld {
|
|||||||
|
|
||||||
|
|
||||||
public TerraWorld(World w, ConfigPack c, TerraPlugin main) {
|
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;
|
this.world = w;
|
||||||
config = c.toWorldConfig(this);
|
config = c.toWorldConfig(this);
|
||||||
this.provider = config.getProvider();
|
this.provider = config.getProvider();
|
||||||
@@ -34,17 +34,11 @@ public class TerraWorld {
|
|||||||
safe = true;
|
safe = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTerraWorld(World w) {
|
|
||||||
return w.getGenerator().getHandle() instanceof GeneratorWrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
public World getWorld() {
|
public World getWorld() {
|
||||||
return world;
|
return world;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TerraChunkGenerator getGenerator() {
|
|
||||||
return ((GeneratorWrapper) world.getGenerator().getHandle()).getHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeProvider getBiomeProvider() {
|
public BiomeProvider getBiomeProvider() {
|
||||||
return provider;
|
return provider;
|
||||||
|
|||||||
+16
-13
@@ -50,7 +50,6 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
|
|
||||||
private final Carver carver;
|
private final Carver carver;
|
||||||
|
|
||||||
|
|
||||||
public DefaultChunkGenerator3D(ConfigPack c, TerraPlugin main) {
|
public DefaultChunkGenerator3D(ConfigPack c, TerraPlugin main) {
|
||||||
this.configPack = c;
|
this.configPack = c;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
@@ -104,9 +103,10 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
@Override
|
@Override
|
||||||
@SuppressWarnings({"try"})
|
@SuppressWarnings({"try"})
|
||||||
public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) {
|
public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) {
|
||||||
TerraWorld tw = main.getWorld(world);
|
|
||||||
BiomeProvider grid = tw.getBiomeProvider();
|
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_3d")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_3d")) {
|
||||||
|
TerraWorld tw = main.getWorld(world);
|
||||||
|
BiomeProvider grid = tw.getBiomeProvider();
|
||||||
|
|
||||||
if(!tw.isSafe()) return chunk;
|
if(!tw.isSafe()) return chunk;
|
||||||
int xOrig = (chunkX << 4);
|
int xOrig = (chunkX << 4);
|
||||||
int zOrig = (chunkZ << 4);
|
int zOrig = (chunkZ << 4);
|
||||||
@@ -120,7 +120,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
int cx = xOrig + x;
|
int cx = xOrig + x;
|
||||||
int cz = zOrig + z;
|
int cz = zOrig + z;
|
||||||
|
|
||||||
TerraBiome b = grid.getBiome(xOrig + x, zOrig + z);
|
TerraBiome b = grid.getBiome(cx, cz);
|
||||||
BiomeTemplate c = ((UserDefinedBiome) b).getConfig();
|
BiomeTemplate c = ((UserDefinedBiome) b).getConfig();
|
||||||
|
|
||||||
int sea = c.getSeaLevel();
|
int sea = c.getSeaLevel();
|
||||||
@@ -227,17 +227,20 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"try"})
|
||||||
static void biomes(@NotNull World world, int chunkX, int chunkZ, @NotNull BiomeGrid biome, TerraPlugin main) {
|
static void biomes(@NotNull World world, int chunkX, int chunkZ, @NotNull BiomeGrid biome, TerraPlugin main) {
|
||||||
int xOrig = (chunkX << 4);
|
try(ProfileFrame ignore = main.getProfiler().profile("biomes")) {
|
||||||
int zOrig = (chunkZ << 4);
|
int xOrig = (chunkX << 4);
|
||||||
BiomeProvider grid = main.getWorld(world).getBiomeProvider();
|
int zOrig = (chunkZ << 4);
|
||||||
for(int x = 0; x < 4; x++) {
|
BiomeProvider grid = main.getWorld(world).getBiomeProvider();
|
||||||
for(int z = 0; z < 4; z++) {
|
for(int x = 0; x < 4; x++) {
|
||||||
int cx = xOrig + (x << 2);
|
for(int z = 0; z < 4; z++) {
|
||||||
int cz = zOrig + (z << 2);
|
int cx = xOrig + (x << 2);
|
||||||
TerraBiome b = grid.getBiome(cx, cz);
|
int cz = zOrig + (z << 2);
|
||||||
|
TerraBiome b = grid.getBiome(cx, cz);
|
||||||
|
|
||||||
biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator(world).getBiomeNoise(), cx, 0, cz));
|
biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator(world).getBiomeNoise(), cx, 0, cz));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class SamplerCache {
|
|||||||
public Sampler load(@NotNull Long key) {
|
public Sampler load(@NotNull Long key) {
|
||||||
int cx = (int) (key >> 32);
|
int cx = (int) (key >> 32);
|
||||||
int cz = (int) key.longValue();
|
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());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class FloraPopulator implements TerraBlockPopulator {
|
|||||||
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
||||||
TerraWorld tw = main.getWorld(world);
|
TerraWorld tw = main.getWorld(world);
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
|
||||||
if(tw.getConfig().getTemplate().disableCarvers()) return;
|
if(tw.getConfig().getTemplate().disableFlora()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
if(!tw.isSafe()) return;
|
||||||
BiomeProvider provider = tw.getBiomeProvider();
|
BiomeProvider provider = tw.getBiomeProvider();
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class OrePopulator implements TerraBlockPopulator {
|
|||||||
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
||||||
TerraWorld tw = main.getWorld(world);
|
TerraWorld tw = main.getWorld(world);
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("ore")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("ore")) {
|
||||||
if(tw.getConfig().getTemplate().disableCarvers()) return;
|
if(tw.getConfig().getTemplate().disableOres()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
if(!tw.isSafe()) return;
|
||||||
for(int cx = -1; cx <= 1; cx++) {
|
for(int cx = -1; cx <= 1; cx++) {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class StructurePopulator implements TerraBlockPopulator, Chunkified {
|
|||||||
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
||||||
TerraWorld tw = main.getWorld(world);
|
TerraWorld tw = main.getWorld(world);
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("structure")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("structure")) {
|
||||||
if(tw.getConfig().getTemplate().disableCarvers()) return;
|
if(tw.getConfig().getTemplate().disableStructures()) return;
|
||||||
|
|
||||||
int cx = (chunk.getX() << 4);
|
int cx = (chunk.getX() << 4);
|
||||||
int cz = (chunk.getZ() << 4);
|
int cz = (chunk.getZ() << 4);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class TreePopulator implements TerraBlockPopulator {
|
|||||||
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
||||||
TerraWorld tw = main.getWorld(world);
|
TerraWorld tw = main.getWorld(world);
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("tree")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("tree")) {
|
||||||
if(tw.getConfig().getTemplate().disableCarvers()) return;
|
if(tw.getConfig().getTemplate().disableTrees()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
if(!tw.isSafe()) return;
|
||||||
BiomeProvider provider = tw.getBiomeProvider();
|
BiomeProvider provider = tw.getBiomeProvider();
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# Magic options for more perf
|
||||||
|
org.gradle.jvmargs=-Xmx2048M -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC
|
||||||
|
org.gradle.vfs.watch=true
|
||||||
|
kapt.use.worker.api=true
|
||||||
|
kapt.include.compile.classpath=false
|
||||||
|
org.gradle.parallel=true
|
||||||
|
org.gradle.caching=true
|
||||||
|
org.gradle.warning.mode=all
|
||||||
|
#org.gradle.logging.level=info
|
||||||
|
org.gradle.configureondemand=true
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
org.gradle.jvmargs=-Xmx4096m
|
org.gradle.jvmargs=-Xmx4096m
|
||||||
@@ -70,8 +70,8 @@ fun installServer(dir: String) {
|
|||||||
// Cloning test setup.
|
// Cloning test setup.
|
||||||
gitClone("https://github.com/PolyhedralDev/WorldGenTestServer")
|
gitClone("https://github.com/PolyhedralDev/WorldGenTestServer")
|
||||||
// Copying plugins
|
// Copying plugins
|
||||||
Files.move(Paths.get("WorldGenTestServer/plugins"),
|
Files.move(file("WorldGenTestServer/plugins").toPath(),
|
||||||
Paths.get("$testDir/$dir/plugins"),
|
file("$testDir/$dir/plugins").toPath(),
|
||||||
StandardCopyOption.REPLACE_EXISTING)
|
StandardCopyOption.REPLACE_EXISTING)
|
||||||
// Copying config
|
// Copying config
|
||||||
val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText()
|
val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText()
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import com.dfsek.terra.bukkit.listeners.SpigotListener;
|
|||||||
import com.dfsek.terra.bukkit.listeners.TerraListener;
|
import com.dfsek.terra.bukkit.listeners.TerraListener;
|
||||||
import com.dfsek.terra.bukkit.util.PaperUtil;
|
import com.dfsek.terra.bukkit.util.PaperUtil;
|
||||||
import com.dfsek.terra.bukkit.world.BukkitBiome;
|
import com.dfsek.terra.bukkit.world.BukkitBiome;
|
||||||
|
import com.dfsek.terra.bukkit.world.BukkitWorld;
|
||||||
import com.dfsek.terra.commands.CommandUtil;
|
import com.dfsek.terra.commands.CommandUtil;
|
||||||
import com.dfsek.terra.config.GenericLoaders;
|
import com.dfsek.terra.config.GenericLoaders;
|
||||||
import com.dfsek.terra.config.PluginConfig;
|
import com.dfsek.terra.config.PluginConfig;
|
||||||
@@ -268,14 +269,15 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
|
|||||||
return checkedRegistry;
|
return checkedRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TerraWorld getWorld(World w) {
|
public TerraWorld getWorld(World world) {
|
||||||
if(!TerraWorld.isTerraWorld(w))
|
BukkitWorld w = (BukkitWorld) world;
|
||||||
|
if(!w.isTerraWorld())
|
||||||
throw new IllegalArgumentException("Not a Terra world! " + w.getGenerator());
|
throw new IllegalArgumentException("Not a Terra world! " + w.getGenerator());
|
||||||
if(!worlds.containsKey(w.getName())) {
|
if(!worlds.containsKey(w.getName())) {
|
||||||
getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\"");
|
getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\"");
|
||||||
return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator().getHandle()).getConfigPack(), this);
|
return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator().getHandle()).getConfigPack(), this);
|
||||||
}
|
}
|
||||||
return worldMap.computeIfAbsent(w, world -> new TerraWorld(w, worlds.get(w.getName()), this));
|
return worldMap.computeIfAbsent(w, w2 -> new TerraWorld(w, worlds.get(w.getName()), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
-1
@@ -52,7 +52,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void fixChunk(Chunk c) {
|
public static synchronized void fixChunk(Chunk c) {
|
||||||
if(!TerraWorld.isTerraWorld(c.getWorld())) throw new IllegalArgumentException();
|
if(!c.getWorld().isTerraWorld()) throw new IllegalArgumentException();
|
||||||
popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld());
|
popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class CommonListener implements Listener {
|
|||||||
public void onSaplingGrow(StructureGrowEvent e) {
|
public void onSaplingGrow(StructureGrowEvent e) {
|
||||||
if(e.isCancelled()) return;
|
if(e.isCancelled()) return;
|
||||||
World bukkit = BukkitAdapter.adapt(e.getWorld());
|
World bukkit = BukkitAdapter.adapt(e.getWorld());
|
||||||
if(!TerraWorld.isTerraWorld(bukkit)) return;
|
if(!bukkit.isTerraWorld()) return;
|
||||||
TerraWorld tw = main.getWorld(bukkit);
|
TerraWorld tw = main.getWorld(bukkit);
|
||||||
WorldConfig c = tw.getConfig();
|
WorldConfig c = tw.getConfig();
|
||||||
if(c.getTemplate().isDisableSaplings()) return;
|
if(c.getTemplate().isDisableSaplings()) return;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class PaperListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onStructureLocate(StructureLocateEvent e) {
|
public void onStructureLocate(StructureLocateEvent e) {
|
||||||
if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getWorld()))) return;
|
if(!BukkitAdapter.adapt(e.getWorld()).isTerraWorld()) return;
|
||||||
e.setResult(null); // Assume no result.
|
e.setResult(null); // Assume no result.
|
||||||
String name = "minecraft:" + e.getType().getName();
|
String name = "minecraft:" + e.getType().getName();
|
||||||
main.getDebugLogger().info("Overriding structure location for \"" + name + "\"");
|
main.getDebugLogger().info("Overriding structure location for \"" + name + "\"");
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public class SpigotListener implements Listener {
|
|||||||
Entity entity = e.getEntity();
|
Entity entity = e.getEntity();
|
||||||
if(e.getEntityType().equals(EntityType.ENDER_SIGNAL)) {
|
if(e.getEntityType().equals(EntityType.ENDER_SIGNAL)) {
|
||||||
main.getDebugLogger().info("Detected Ender Signal...");
|
main.getDebugLogger().info("Detected Ender Signal...");
|
||||||
if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return;
|
if(!BukkitAdapter.adapt(e.getEntity().getWorld()).isTerraWorld()) return;
|
||||||
TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getEntity().getWorld()));
|
TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getEntity().getWorld()));
|
||||||
EnderSignal signal = (EnderSignal) entity;
|
EnderSignal signal = (EnderSignal) entity;
|
||||||
TerraStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD"));
|
TerraStructure config = tw.getConfig().getRegistry(TerraStructure.class).get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD"));
|
||||||
@@ -53,7 +53,7 @@ public class SpigotListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onCartographerChange(VillagerAcquireTradeEvent e) {
|
public void onCartographerChange(VillagerAcquireTradeEvent e) {
|
||||||
if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return;
|
if(!BukkitAdapter.adapt(e.getEntity().getWorld()).isTerraWorld()) return;
|
||||||
if(!(e.getEntity() instanceof Villager)) return;
|
if(!(e.getEntity() instanceof Villager)) return;
|
||||||
if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER)) {
|
if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER)) {
|
||||||
main.logger().severe("Prevented server crash by stopping Cartographer villager from spawning.");
|
main.logger().severe("Prevented server crash by stopping Cartographer villager from spawning.");
|
||||||
@@ -65,7 +65,7 @@ public class SpigotListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onCartographerLevel(VillagerCareerChangeEvent e) {
|
public void onCartographerLevel(VillagerCareerChangeEvent e) {
|
||||||
if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return;
|
if(!BukkitAdapter.adapt(e.getEntity().getWorld()).isTerraWorld()) return;
|
||||||
if(e.getProfession().equals(Villager.Profession.CARTOGRAPHER)) {
|
if(e.getProfession().equals(Villager.Profession.CARTOGRAPHER)) {
|
||||||
main.logger().severe("Prevented server crash by stopping Cartographer villager from spawning.");
|
main.logger().severe("Prevented server crash by stopping Cartographer villager from spawning.");
|
||||||
main.logger().severe("Please upgrade to Paper, which has a StructureLocateEvent that fixes this issue");
|
main.logger().severe("Please upgrade to Paper, which has a StructureLocateEvent that fixes this issue");
|
||||||
|
|||||||
+2
-1
@@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.population;
|
|||||||
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.world.Chunk;
|
import com.dfsek.terra.api.platform.world.Chunk;
|
||||||
|
import com.dfsek.terra.bukkit.world.BukkitWorld;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -21,7 +22,7 @@ public class ChunkCoordinate implements Serializable {
|
|||||||
public ChunkCoordinate(Chunk c) {
|
public ChunkCoordinate(Chunk c) {
|
||||||
this.x = c.getX();
|
this.x = c.getX();
|
||||||
this.z = c.getZ();
|
this.z = c.getZ();
|
||||||
this.worldID = c.getWorld().getUID();
|
this.worldID = ((BukkitWorld) c.getWorld()).getUID();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID getWorldID() {
|
public UUID getWorldID() {
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.dfsek.terra.bukkit.population;
|
|
||||||
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.world.World;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
public class Gaea {
|
|
||||||
private static boolean debug;
|
|
||||||
|
|
||||||
public static File getGaeaFolder(World w) {
|
|
||||||
File f = new File(w.getWorldFolder(), "gaea");
|
|
||||||
f.mkdirs();
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isDebug() {
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+12
-4
@@ -9,6 +9,7 @@ import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
|||||||
import com.dfsek.terra.bukkit.TerraBukkitPlugin;
|
import com.dfsek.terra.bukkit.TerraBukkitPlugin;
|
||||||
import com.dfsek.terra.bukkit.world.BukkitAdapter;
|
import com.dfsek.terra.bukkit.world.BukkitAdapter;
|
||||||
import com.dfsek.terra.profiler.ProfileFrame;
|
import com.dfsek.terra.profiler.ProfileFrame;
|
||||||
|
import com.dfsek.terra.bukkit.world.BukkitWorld;
|
||||||
import org.bukkit.generator.BlockPopulator;
|
import org.bukkit.generator.BlockPopulator;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -32,21 +33,28 @@ public class PopulationManager extends BlockPopulator {
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public synchronized void saveBlocks(World w) throws IOException {
|
public synchronized void saveBlocks(World w) throws IOException {
|
||||||
File f = new File(Gaea.getGaeaFolder(w), "chunks.bin");
|
File f = new File(getDataFolder(w), "chunks.bin");
|
||||||
f.createNewFile();
|
f.createNewFile();
|
||||||
SerializationUtil.toFile((HashSet<ChunkCoordinate>) needsPop.clone(), f);
|
SerializationUtil.toFile((HashSet<ChunkCoordinate>) needsPop.clone(), f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public synchronized void loadBlocks(World w) throws IOException, ClassNotFoundException {
|
public synchronized void loadBlocks(World w) throws IOException, ClassNotFoundException {
|
||||||
File f = new File(Gaea.getGaeaFolder(w), "chunks.bin");
|
File f = new File(getDataFolder(w), "chunks.bin");
|
||||||
needsPop.addAll((HashSet<ChunkCoordinate>) SerializationUtil.fromFile(f));
|
needsPop.addAll((HashSet<ChunkCoordinate>) SerializationUtil.fromFile(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static File getDataFolder(World w) {
|
||||||
|
File f = new File(((BukkitWorld) w).getWorldFolder(), "gaea");
|
||||||
|
f.mkdirs();
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Synchronize to prevent chunks from being queued for population multiple times.
|
// Synchronize to prevent chunks from being queued for population multiple times.
|
||||||
public synchronized void checkNeighbors(int x, int z, World w) {
|
public synchronized void checkNeighbors(int x, int z, World world) {
|
||||||
ChunkCoordinate c = new ChunkCoordinate(x, z, w.getUID());
|
BukkitWorld w = (BukkitWorld) world;
|
||||||
|
ChunkCoordinate c = new ChunkCoordinate(x, z, (w).getUID());
|
||||||
if(w.isChunkGenerated(x + 1, z)
|
if(w.isChunkGenerated(x + 1, z)
|
||||||
&& w.isChunkGenerated(x - 1, z)
|
&& w.isChunkGenerated(x - 1, z)
|
||||||
&& w.isChunkGenerated(x, z + 1)
|
&& w.isChunkGenerated(x, z + 1)
|
||||||
|
|||||||
@@ -37,17 +37,14 @@ public class BukkitWorld implements World {
|
|||||||
return new BukkitChunkGenerator(delegate.getGenerator());
|
return new BukkitChunkGenerator(delegate.getGenerator());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return delegate.getName();
|
return delegate.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public UUID getUID() {
|
public UUID getUID() {
|
||||||
return delegate.getUID();
|
return delegate.getUID();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isChunkGenerated(int x, int z) {
|
public boolean isChunkGenerated(int x, int z) {
|
||||||
return delegate.isChunkGenerated(x, z);
|
return delegate.isChunkGenerated(x, z);
|
||||||
}
|
}
|
||||||
@@ -57,7 +54,6 @@ public class BukkitWorld implements World {
|
|||||||
return BukkitAdapter.adapt(delegate.getChunkAt(x, z));
|
return BukkitAdapter.adapt(delegate.getChunkAt(x, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public File getWorldFolder() {
|
public File getWorldFolder() {
|
||||||
return delegate.getWorldFolder();
|
return delegate.getWorldFolder();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ dependencies {
|
|||||||
|
|
||||||
configure<LoomGradleExtension> {
|
configure<LoomGradleExtension> {
|
||||||
accessWidener("src/main/resources/terra.accesswidener")
|
accessWidener("src/main/resources/terra.accesswidener")
|
||||||
|
refmapName = "terra-refmap.json"
|
||||||
}
|
}
|
||||||
|
|
||||||
val remapped = tasks.register<RemapJarTask>("remapShadedJar") {
|
val remapped = tasks.register<RemapJarTask>("remapShadedJar") {
|
||||||
@@ -46,12 +47,12 @@ val remapped = tasks.register<RemapJarTask>("remapShadedJar") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tasks.register<TaskModrinthUpload>("publishModrinth") {
|
tasks.register<TaskModrinthUpload>("publishModrinthFabric") {
|
||||||
dependsOn("remapShadedJar")
|
dependsOn("remapShadedJar")
|
||||||
group = "fabric"
|
group = "fabric"
|
||||||
token = System.getenv("MODRINTH_SECRET")
|
token = System.getenv("MODRINTH_SECRET")
|
||||||
projectId = "FIlZB9L0"
|
projectId = "FIlZB9L0"
|
||||||
versionNumber = project.version.toString()
|
versionNumber = "${project.version}-fabric"
|
||||||
uploadFile = remapped.get().archiveFile.get().asFile
|
uploadFile = remapped.get().archiveFile.get().asFile
|
||||||
releaseType = "beta"
|
releaseType = "beta"
|
||||||
addGameVersion("1.16.4")
|
addGameVersion("1.16.4")
|
||||||
|
|||||||
@@ -0,0 +1,224 @@
|
|||||||
|
package com.dfsek.terra.fabric;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Vector3;
|
||||||
|
import com.dfsek.terra.api.platform.block.Axis;
|
||||||
|
import com.dfsek.terra.api.platform.block.BlockFace;
|
||||||
|
import com.dfsek.terra.api.platform.block.data.Bisected;
|
||||||
|
import com.dfsek.terra.api.platform.block.data.Slab;
|
||||||
|
import com.dfsek.terra.api.platform.block.data.Stairs;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.Container;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.MobSpawner;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.Sign;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricDirectional;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricMultipleFacing;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricOrientable;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricRotatable;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricSlab;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricStairs;
|
||||||
|
import com.dfsek.terra.fabric.block.data.FabricWaterlogged;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
||||||
|
import net.minecraft.block.entity.MobSpawnerBlockEntity;
|
||||||
|
import net.minecraft.block.entity.SignBlockEntity;
|
||||||
|
import net.minecraft.block.enums.BlockHalf;
|
||||||
|
import net.minecraft.block.enums.SlabType;
|
||||||
|
import net.minecraft.block.enums.StairShape;
|
||||||
|
import net.minecraft.state.property.Properties;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.minecraft.world.WorldAccess;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public final class FabricAdapter {
|
||||||
|
public static BlockPos adapt(Vector3 v) {
|
||||||
|
return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector3 adapt(BlockPos pos) {
|
||||||
|
return new Vector3(pos.getX(), pos.getY(), pos.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FabricBlockData adapt(BlockState state) {
|
||||||
|
if(state.contains(Properties.STAIR_SHAPE)) return new FabricStairs(state);
|
||||||
|
|
||||||
|
if(state.contains(Properties.SLAB_TYPE)) return new FabricSlab(state);
|
||||||
|
|
||||||
|
if(state.contains(Properties.AXIS)) return new FabricOrientable(state, Properties.AXIS);
|
||||||
|
if(state.contains(Properties.HORIZONTAL_AXIS)) return new FabricOrientable(state, Properties.HORIZONTAL_AXIS);
|
||||||
|
|
||||||
|
if(state.contains(Properties.ROTATION)) return new FabricRotatable(state);
|
||||||
|
|
||||||
|
if(state.contains(Properties.FACING)) return new FabricDirectional(state, Properties.FACING);
|
||||||
|
if(state.contains(Properties.HOPPER_FACING)) return new FabricDirectional(state, Properties.HOPPER_FACING);
|
||||||
|
if(state.contains(Properties.HORIZONTAL_FACING)) return new FabricDirectional(state, Properties.HORIZONTAL_FACING);
|
||||||
|
|
||||||
|
if(state.getProperties().containsAll(Arrays.asList(Properties.NORTH, Properties.SOUTH, Properties.EAST, Properties.WEST)))
|
||||||
|
return new FabricMultipleFacing(state);
|
||||||
|
if(state.contains(Properties.WATERLOGGED)) return new FabricWaterlogged(state);
|
||||||
|
return new FabricBlockData(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Direction adapt(BlockFace face) {
|
||||||
|
switch(face) {
|
||||||
|
case NORTH:
|
||||||
|
return Direction.NORTH;
|
||||||
|
case WEST:
|
||||||
|
return Direction.WEST;
|
||||||
|
case SOUTH:
|
||||||
|
return Direction.SOUTH;
|
||||||
|
case EAST:
|
||||||
|
return Direction.EAST;
|
||||||
|
case UP:
|
||||||
|
return Direction.UP;
|
||||||
|
case DOWN:
|
||||||
|
return Direction.DOWN;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Illegal direction: " + face);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static com.dfsek.terra.api.platform.block.state.BlockState adapt(com.dfsek.terra.api.platform.block.Block block) {
|
||||||
|
WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld();
|
||||||
|
|
||||||
|
BlockEntity entity = worldAccess.getBlockEntity(adapt(block.getLocation().toVector()));
|
||||||
|
if(entity instanceof SignBlockEntity) {
|
||||||
|
return (Sign) entity;
|
||||||
|
} else if(entity instanceof MobSpawnerBlockEntity) {
|
||||||
|
return (MobSpawner) entity;
|
||||||
|
} else if(entity instanceof LootableContainerBlockEntity) {
|
||||||
|
return (Container) entity;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Stairs.Shape adapt(StairShape shape) {
|
||||||
|
switch(shape) {
|
||||||
|
case OUTER_RIGHT:
|
||||||
|
return Stairs.Shape.OUTER_RIGHT;
|
||||||
|
case INNER_RIGHT:
|
||||||
|
return Stairs.Shape.INNER_RIGHT;
|
||||||
|
case OUTER_LEFT:
|
||||||
|
return Stairs.Shape.OUTER_LEFT;
|
||||||
|
case INNER_LEFT:
|
||||||
|
return Stairs.Shape.INNER_LEFT;
|
||||||
|
case STRAIGHT:
|
||||||
|
return Stairs.Shape.STRAIGHT;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Bisected.Half adapt(BlockHalf half) {
|
||||||
|
switch(half) {
|
||||||
|
case BOTTOM:
|
||||||
|
return Bisected.Half.BOTTOM;
|
||||||
|
case TOP:
|
||||||
|
return Bisected.Half.TOP;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockFace adapt(Direction direction) {
|
||||||
|
switch(direction) {
|
||||||
|
case DOWN:
|
||||||
|
return BlockFace.DOWN;
|
||||||
|
case UP:
|
||||||
|
return BlockFace.UP;
|
||||||
|
case WEST:
|
||||||
|
return BlockFace.WEST;
|
||||||
|
case EAST:
|
||||||
|
return BlockFace.EAST;
|
||||||
|
case NORTH:
|
||||||
|
return BlockFace.NORTH;
|
||||||
|
case SOUTH:
|
||||||
|
return BlockFace.SOUTH;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Slab.Type adapt(SlabType type) {
|
||||||
|
switch(type) {
|
||||||
|
case BOTTOM:
|
||||||
|
return Slab.Type.BOTTOM;
|
||||||
|
case TOP:
|
||||||
|
return Slab.Type.TOP;
|
||||||
|
case DOUBLE:
|
||||||
|
return Slab.Type.DOUBLE;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static StairShape adapt(Stairs.Shape shape) {
|
||||||
|
switch(shape) {
|
||||||
|
case STRAIGHT:
|
||||||
|
return StairShape.STRAIGHT;
|
||||||
|
case INNER_LEFT:
|
||||||
|
return StairShape.INNER_LEFT;
|
||||||
|
case OUTER_LEFT:
|
||||||
|
return StairShape.OUTER_LEFT;
|
||||||
|
case INNER_RIGHT:
|
||||||
|
return StairShape.INNER_RIGHT;
|
||||||
|
case OUTER_RIGHT:
|
||||||
|
return StairShape.OUTER_RIGHT;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockHalf adapt(Bisected.Half half) {
|
||||||
|
switch(half) {
|
||||||
|
case TOP:
|
||||||
|
return BlockHalf.TOP;
|
||||||
|
case BOTTOM:
|
||||||
|
return BlockHalf.BOTTOM;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SlabType adapt(Slab.Type type) {
|
||||||
|
switch(type) {
|
||||||
|
case DOUBLE:
|
||||||
|
return SlabType.DOUBLE;
|
||||||
|
case TOP:
|
||||||
|
return SlabType.TOP;
|
||||||
|
case BOTTOM:
|
||||||
|
return SlabType.BOTTOM;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Axis adapt(Direction.Axis axis) {
|
||||||
|
switch(axis) {
|
||||||
|
case X:
|
||||||
|
return Axis.X;
|
||||||
|
case Y:
|
||||||
|
return Axis.Y;
|
||||||
|
case Z:
|
||||||
|
return Axis.Z;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Direction.Axis adapt(Axis axis) {
|
||||||
|
switch(axis) {
|
||||||
|
case Z:
|
||||||
|
return Direction.Axis.Z;
|
||||||
|
case Y:
|
||||||
|
return Direction.Axis.Y;
|
||||||
|
case X:
|
||||||
|
return Direction.Axis.X;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ import com.dfsek.terra.api.event.annotations.Priority;
|
|||||||
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
|
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
|
||||||
import com.dfsek.terra.api.platform.CommandSender;
|
import com.dfsek.terra.api.platform.CommandSender;
|
||||||
import com.dfsek.terra.api.platform.block.BlockData;
|
import com.dfsek.terra.api.platform.block.BlockData;
|
||||||
|
import com.dfsek.terra.api.platform.entity.Entity;
|
||||||
import com.dfsek.terra.api.platform.handle.ItemHandle;
|
import com.dfsek.terra.api.platform.handle.ItemHandle;
|
||||||
import com.dfsek.terra.api.platform.handle.WorldHandle;
|
import com.dfsek.terra.api.platform.handle.WorldHandle;
|
||||||
import com.dfsek.terra.api.platform.world.Tree;
|
import com.dfsek.terra.api.platform.world.Tree;
|
||||||
@@ -48,12 +49,22 @@ import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
|
|||||||
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
|
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
|
||||||
import com.dfsek.terra.profiler.Profiler;
|
import com.dfsek.terra.profiler.Profiler;
|
||||||
import com.dfsek.terra.profiler.ProfilerImpl;
|
import com.dfsek.terra.profiler.ProfilerImpl;
|
||||||
|
import com.dfsek.terra.fabric.handle.FabricItemHandle;
|
||||||
|
import com.dfsek.terra.fabric.handle.FabricWorldHandle;
|
||||||
|
import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor;
|
||||||
|
import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor;
|
||||||
|
import com.dfsek.terra.fabric.generation.TerraBiomeSource;
|
||||||
|
import com.dfsek.terra.fabric.generation.PopulatorFeature;
|
||||||
|
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
||||||
|
import com.dfsek.terra.profiler.Profiler;
|
||||||
|
import com.dfsek.terra.profiler.ProfilerImpl;
|
||||||
import com.dfsek.terra.registry.exception.DuplicateEntryException;
|
import com.dfsek.terra.registry.exception.DuplicateEntryException;
|
||||||
import com.dfsek.terra.registry.master.AddonRegistry;
|
import com.dfsek.terra.registry.master.AddonRegistry;
|
||||||
import com.dfsek.terra.registry.master.ConfigRegistry;
|
import com.dfsek.terra.registry.master.ConfigRegistry;
|
||||||
import com.dfsek.terra.world.TerraWorld;
|
import com.dfsek.terra.world.TerraWorld;
|
||||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
||||||
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||||
import net.fabricmc.api.EnvType;
|
import net.fabricmc.api.EnvType;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
|
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
|
||||||
@@ -77,7 +88,6 @@ import net.minecraft.world.gen.decorator.Decorator;
|
|||||||
import net.minecraft.world.gen.decorator.NopeDecoratorConfig;
|
import net.minecraft.world.gen.decorator.NopeDecoratorConfig;
|
||||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||||
import net.minecraft.world.gen.feature.ConfiguredFeatures;
|
import net.minecraft.world.gen.feature.ConfiguredFeatures;
|
||||||
import net.minecraft.world.gen.feature.DefaultBiomeFeatures;
|
|
||||||
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
||||||
import net.minecraft.world.gen.feature.FeatureConfig;
|
import net.minecraft.world.gen.feature.FeatureConfig;
|
||||||
import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder;
|
import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder;
|
||||||
@@ -158,10 +168,16 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
public TerraWorld getWorld(World world) {
|
public TerraWorld getWorld(World world) {
|
||||||
return worldMap.computeIfAbsent(world.getSeed(), w -> {
|
return worldMap.computeIfAbsent(world.getSeed(), w -> {
|
||||||
logger.info("Loading world " + 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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TerraWorld getWorld(long seed) {
|
||||||
|
TerraWorld world = worldMap.get(seed);
|
||||||
|
if(world == null) throw new IllegalArgumentException("No world exists with seed " + seed);
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Logger logger() {
|
public Logger logger() {
|
||||||
return logger;
|
return logger;
|
||||||
@@ -243,41 +259,37 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
genericLoaders.register(registry);
|
genericLoaders.register(registry);
|
||||||
registry
|
registry
|
||||||
.registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o))
|
.registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o))
|
||||||
.registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o)));
|
.registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> biomeFixer.translate((String) o));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Biome createBiome(BiomeBuilder biome) {
|
private Biome createBiome(BiomeBuilder biome) {
|
||||||
SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder();
|
|
||||||
DefaultBiomeFeatures.addFarmAnimals(spawnSettings);
|
|
||||||
DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100);
|
|
||||||
|
|
||||||
BiomeTemplate template = biome.getTemplate();
|
BiomeTemplate template = biome.getTemplate();
|
||||||
Map<String, Integer> colors = template.getColors();
|
Map<String, Integer> colors = template.getColors();
|
||||||
|
|
||||||
Biome vanilla = ((FabricBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle();
|
Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle();
|
||||||
|
|
||||||
GenerationSettings.Builder generationSettings = new GenerationSettings.Builder();
|
GenerationSettings.Builder generationSettings = new GenerationSettings.Builder();
|
||||||
generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it.
|
generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it.
|
||||||
generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE);
|
generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE);
|
||||||
|
|
||||||
|
|
||||||
|
BiomeEffectsAccessor accessor = (BiomeEffectsAccessor) vanilla.getEffects();
|
||||||
BiomeEffects.Builder effects = new BiomeEffects.Builder()
|
BiomeEffects.Builder effects = new BiomeEffects.Builder()
|
||||||
.waterColor(colors.getOrDefault("water", vanilla.getEffects().waterColor))
|
.waterColor(colors.getOrDefault("water", accessor.getWaterColor()))
|
||||||
.waterFogColor(colors.getOrDefault("water-fog", vanilla.getEffects().waterFogColor))
|
.waterFogColor(colors.getOrDefault("water-fog", accessor.getWaterFogColor()))
|
||||||
.fogColor(colors.getOrDefault("fog", vanilla.getEffects().fogColor))
|
.fogColor(colors.getOrDefault("fog", accessor.getFogColor()))
|
||||||
.skyColor(colors.getOrDefault("sky", vanilla.getEffects().skyColor))
|
.skyColor(colors.getOrDefault("sky", accessor.getSkyColor()))
|
||||||
.grassColorModifier(vanilla.getEffects().grassColorModifier);
|
.grassColorModifier(accessor.getGrassColorModifier());
|
||||||
|
|
||||||
if(colors.containsKey("grass")) {
|
if(colors.containsKey("grass")) {
|
||||||
effects.grassColor(colors.get("grass"));
|
effects.grassColor(colors.get("grass"));
|
||||||
} else {
|
} else {
|
||||||
vanilla.getEffects().grassColor.ifPresent(effects::grassColor);
|
accessor.getGrassColor().ifPresent(effects::grassColor);
|
||||||
}
|
}
|
||||||
vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor);
|
|
||||||
if(colors.containsKey("foliage")) {
|
if(colors.containsKey("foliage")) {
|
||||||
effects.foliageColor(colors.get("foliage"));
|
effects.foliageColor(colors.get("foliage"));
|
||||||
} else {
|
} else {
|
||||||
vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor);
|
accessor.getFoliageColor().ifPresent(effects::foliageColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Biome.Builder()
|
return new Biome.Builder()
|
||||||
@@ -288,7 +300,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
.temperature(vanilla.getTemperature())
|
.temperature(vanilla.getTemperature())
|
||||||
.downfall(vanilla.getDownfall())
|
.downfall(vanilla.getDownfall())
|
||||||
.effects(effects.build())
|
.effects(effects.build())
|
||||||
.spawnSettings(spawnSettings.build())
|
.spawnSettings(vanilla.getSpawnSettings())
|
||||||
.generationSettings(generationSettings.build())
|
.generationSettings(generationSettings.build())
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
@@ -330,7 +342,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
};
|
};
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
((GeneratorTypeAccessor) generatorType).setTranslationKey(new LiteralText("Terra:" + pack.getTemplate().getID()));
|
((GeneratorTypeAccessor) generatorType).setTranslationKey(new LiteralText("Terra:" + pack.getTemplate().getID()));
|
||||||
GeneratorTypeAccessor.getVALUES().add(generatorType);
|
GeneratorTypeAccessor.getValues().add(generatorType);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,7 +374,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
private RequiredArgumentBuilder<ServerCommandSource, String> assemble(RequiredArgumentBuilder<ServerCommandSource, String> in, CommandManager manager) {
|
private RequiredArgumentBuilder<ServerCommandSource, String> assemble(RequiredArgumentBuilder<ServerCommandSource, String> in, CommandManager manager) {
|
||||||
return in.suggests((context, builder) -> {
|
return in.suggests((context, builder) -> {
|
||||||
List<String> args = parseCommand(context.getInput());
|
List<String> args = parseCommand(context.getInput());
|
||||||
CommandSender sender = FabricAdapter.adapt(context.getSource());
|
CommandSender sender = (CommandSender) context.getSource();
|
||||||
|
try {
|
||||||
|
sender = (Entity) context.getSource().getEntityOrThrow();
|
||||||
|
} catch(CommandSyntaxException ignore) {
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest);
|
manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest);
|
||||||
} catch(CommandException e) {
|
} catch(CommandException e) {
|
||||||
@@ -371,8 +387,13 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
return builder.buildFuture();
|
return builder.buildFuture();
|
||||||
}).executes(context -> {
|
}).executes(context -> {
|
||||||
List<String> args = parseCommand(context.getInput());
|
List<String> args = parseCommand(context.getInput());
|
||||||
|
CommandSender sender = (CommandSender) context.getSource();
|
||||||
try {
|
try {
|
||||||
manager.execute(args.remove(0), FabricAdapter.adapt(context.getSource()), args);
|
sender = (Entity) context.getSource().getEntityOrThrow();
|
||||||
|
} catch(CommandSyntaxException ignore) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
manager.execute(args.remove(0), sender, args);
|
||||||
} catch(CommandException e) {
|
} catch(CommandException e) {
|
||||||
context.getSource().sendError(new LiteralText(e.getMessage()));
|
context.getSource().sendError(new LiteralText(e.getMessage()));
|
||||||
}
|
}
|
||||||
@@ -443,7 +464,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
|
|||||||
|
|
||||||
private void injectTree(CheckedRegistry<Tree> registry, String id, ConfiguredFeature<?, ?> tree) {
|
private void injectTree(CheckedRegistry<Tree> registry, String id, ConfiguredFeature<?, ?> tree) {
|
||||||
try {
|
try {
|
||||||
registry.add(id, new FabricTree(tree));
|
registry.add(id, (Tree) tree);
|
||||||
} catch(DuplicateEntryException ignore) {
|
} catch(DuplicateEntryException ignore) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-6
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.fabric.world.block;
|
package com.dfsek.terra.fabric.block;
|
||||||
|
|
||||||
import com.dfsek.terra.api.math.vector.Location;
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
import com.dfsek.terra.api.platform.block.Block;
|
import com.dfsek.terra.api.platform.block.Block;
|
||||||
@@ -6,9 +6,8 @@ import com.dfsek.terra.api.platform.block.BlockData;
|
|||||||
import com.dfsek.terra.api.platform.block.BlockFace;
|
import com.dfsek.terra.api.platform.block.BlockFace;
|
||||||
import com.dfsek.terra.api.platform.block.BlockType;
|
import com.dfsek.terra.api.platform.block.BlockType;
|
||||||
import com.dfsek.terra.api.platform.block.state.BlockState;
|
import com.dfsek.terra.api.platform.block.state.BlockState;
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
import com.dfsek.terra.fabric.world.block.state.FabricBlockState;
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess;
|
|
||||||
import net.minecraft.block.FluidBlock;
|
import net.minecraft.block.FluidBlock;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.WorldAccess;
|
import net.minecraft.world.WorldAccess;
|
||||||
@@ -35,7 +34,7 @@ public class FabricBlock implements Block {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getState() {
|
public BlockState getState() {
|
||||||
return FabricBlockState.newInstance(this);
|
return FabricAdapter.adapt(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -51,7 +50,7 @@ public class FabricBlock implements Block {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Location getLocation() {
|
public Location getLocation() {
|
||||||
return FabricAdapter.adapt(delegate.position).toLocation(new FabricWorldAccess(delegate.worldAccess));
|
return FabricAdapter.adapt(delegate.position).toLocation((World) delegate.worldAccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
+4
-5
@@ -1,11 +1,10 @@
|
|||||||
package com.dfsek.terra.fabric.world.block;
|
package com.dfsek.terra.fabric.block;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockData;
|
import com.dfsek.terra.api.platform.block.BlockData;
|
||||||
import com.dfsek.terra.api.platform.block.BlockType;
|
import com.dfsek.terra.api.platform.block.BlockType;
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
import com.dfsek.terra.fabric.mixin.access.StateAccessor;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.state.State;
|
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -19,7 +18,7 @@ public class FabricBlockData implements BlockData {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockType getBlockType() {
|
public BlockType getBlockType() {
|
||||||
return FabricAdapter.adapt(delegate.getBlock());
|
return (BlockType) delegate.getBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -41,7 +40,7 @@ public class FabricBlockData implements BlockData {
|
|||||||
StringBuilder data = new StringBuilder(Registry.BLOCK.getId(delegate.getBlock()).toString());
|
StringBuilder data = new StringBuilder(Registry.BLOCK.getId(delegate.getBlock()).toString());
|
||||||
if(!delegate.getEntries().isEmpty()) {
|
if(!delegate.getEntries().isEmpty()) {
|
||||||
data.append('[');
|
data.append('[');
|
||||||
data.append(delegate.getEntries().entrySet().stream().map(State.PROPERTY_MAP_PRINTER).collect(Collectors.joining(",")));
|
data.append(delegate.getEntries().entrySet().stream().map(StateAccessor.getPropertyMapPrinter()).collect(Collectors.joining(",")));
|
||||||
data.append(']');
|
data.append(']');
|
||||||
}
|
}
|
||||||
return data.toString();
|
return data.toString();
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.data.AnaloguePowerable;
|
import com.dfsek.terra.api.platform.block.data.AnaloguePowerable;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockFace;
|
import com.dfsek.terra.api.platform.block.BlockFace;
|
||||||
import com.dfsek.terra.api.platform.block.data.Directional;
|
import com.dfsek.terra.api.platform.block.data.Directional;
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.DirectionProperty;
|
import net.minecraft.state.property.DirectionProperty;
|
||||||
|
|
||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockFace;
|
import com.dfsek.terra.api.platform.block.BlockFace;
|
||||||
import com.dfsek.terra.api.platform.block.data.MultipleFacing;
|
import com.dfsek.terra.api.platform.block.data.MultipleFacing;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.Properties;
|
import net.minecraft.state.property.Properties;
|
||||||
|
|
||||||
+5
-4
@@ -1,8 +1,9 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.Axis;
|
import com.dfsek.terra.api.platform.block.Axis;
|
||||||
import com.dfsek.terra.api.platform.block.data.Orientable;
|
import com.dfsek.terra.api.platform.block.data.Orientable;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.EnumProperty;
|
import net.minecraft.state.property.EnumProperty;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
@@ -26,11 +27,11 @@ public class FabricOrientable extends FabricBlockData implements Orientable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Axis getAxis() {
|
public Axis getAxis() {
|
||||||
return FabricEnumAdapter.adapt(getHandle().get(property));
|
return FabricAdapter.adapt(getHandle().get(property));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAxis(Axis axis) {
|
public void setAxis(Axis axis) {
|
||||||
delegate = delegate.with(property, FabricEnumAdapter.adapt(axis));
|
delegate = delegate.with(property, FabricAdapter.adapt(axis));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockFace;
|
import com.dfsek.terra.api.platform.block.BlockFace;
|
||||||
import com.dfsek.terra.api.platform.block.data.Rotatable;
|
import com.dfsek.terra.api.platform.block.data.Rotatable;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.Properties;
|
import net.minecraft.state.property.Properties;
|
||||||
|
|
||||||
+4
-3
@@ -1,6 +1,7 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.data.Slab;
|
import com.dfsek.terra.api.platform.block.data.Slab;
|
||||||
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.Properties;
|
import net.minecraft.state.property.Properties;
|
||||||
|
|
||||||
@@ -11,11 +12,11 @@ public class FabricSlab extends FabricWaterlogged implements Slab {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getType() {
|
public Type getType() {
|
||||||
return FabricEnumAdapter.adapt(delegate.get(Properties.SLAB_TYPE));
|
return FabricAdapter.adapt(delegate.get(Properties.SLAB_TYPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setType(Type type) {
|
public void setType(Type type) {
|
||||||
delegate = delegate.with(Properties.SLAB_TYPE, FabricEnumAdapter.adapt(type));
|
delegate = delegate.with(Properties.SLAB_TYPE, FabricAdapter.adapt(type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+8
-7
@@ -1,7 +1,8 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockFace;
|
import com.dfsek.terra.api.platform.block.BlockFace;
|
||||||
import com.dfsek.terra.api.platform.block.data.Stairs;
|
import com.dfsek.terra.api.platform.block.data.Stairs;
|
||||||
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.Properties;
|
import net.minecraft.state.property.Properties;
|
||||||
|
|
||||||
@@ -12,31 +13,31 @@ public class FabricStairs extends FabricWaterlogged implements Stairs {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Shape getShape() {
|
public Shape getShape() {
|
||||||
return FabricEnumAdapter.adapt(getHandle().get(Properties.STAIR_SHAPE));
|
return FabricAdapter.adapt(getHandle().get(Properties.STAIR_SHAPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setShape(Shape shape) {
|
public void setShape(Shape shape) {
|
||||||
super.delegate = getHandle().with(Properties.STAIR_SHAPE, FabricEnumAdapter.adapt(shape));
|
super.delegate = getHandle().with(Properties.STAIR_SHAPE, FabricAdapter.adapt(shape));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Half getHalf() {
|
public Half getHalf() {
|
||||||
return FabricEnumAdapter.adapt(getHandle().get(Properties.BLOCK_HALF));
|
return FabricAdapter.adapt(getHandle().get(Properties.BLOCK_HALF));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setHalf(Half half) {
|
public void setHalf(Half half) {
|
||||||
super.delegate = getHandle().with(Properties.BLOCK_HALF, FabricEnumAdapter.adapt(half));
|
super.delegate = getHandle().with(Properties.BLOCK_HALF, FabricAdapter.adapt(half));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockFace getFacing() {
|
public BlockFace getFacing() {
|
||||||
return FabricEnumAdapter.adapt(getHandle().get(Properties.HORIZONTAL_FACING));
|
return FabricAdapter.adapt(getHandle().get(Properties.HORIZONTAL_FACING));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFacing(BlockFace facing) {
|
public void setFacing(BlockFace facing) {
|
||||||
super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, FabricEnumAdapter.adapt(facing));
|
super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, FabricAdapter.adapt(facing));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.data;
|
package com.dfsek.terra.fabric.block.data;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.data.Waterlogged;
|
import com.dfsek.terra.api.platform.block.data.Waterlogged;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.state.property.Properties;
|
import net.minecraft.state.property.Properties;
|
||||||
|
|
||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.command;
|
|
||||||
|
|
||||||
public class FabricCommandAdapter {
|
|
||||||
public static void register() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.command;
|
|
||||||
|
|
||||||
import com.mojang.brigadier.StringReader;
|
|
||||||
import com.mojang.brigadier.arguments.ArgumentType;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class StringListArgumentType implements ArgumentType<List<String>> {
|
|
||||||
@Override
|
|
||||||
public List<String> parse(StringReader reader) {
|
|
||||||
final String text = reader.getRemaining();
|
|
||||||
reader.setCursor(reader.getTotalLength());
|
|
||||||
return new ArrayList<>(Arrays.asList(text.split(" ")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+53
-11
@@ -1,25 +1,29 @@
|
|||||||
package com.dfsek.terra.fabric.world.generator;
|
package com.dfsek.terra.fabric.generation;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
|
import com.dfsek.terra.api.platform.world.generator.ChunkData;
|
||||||
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
|
import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper;
|
||||||
import com.dfsek.terra.api.util.FastRandom;
|
import com.dfsek.terra.api.util.FastRandom;
|
||||||
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
||||||
|
import com.dfsek.terra.api.world.locate.AsyncStructureFinder;
|
||||||
import com.dfsek.terra.config.pack.ConfigPack;
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
||||||
import com.dfsek.terra.fabric.world.TerraBiomeSource;
|
import com.dfsek.terra.world.TerraWorld;
|
||||||
import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess;
|
|
||||||
import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D;
|
import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D;
|
||||||
import com.dfsek.terra.world.population.CavePopulator;
|
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
||||||
import com.dfsek.terra.world.population.FloraPopulator;
|
import com.dfsek.terra.world.population.items.TerraStructure;
|
||||||
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.Codec;
|
||||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
|
import net.jafama.FastMath;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.structure.StructureManager;
|
import net.minecraft.structure.StructureManager;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.util.registry.DynamicRegistryManager;
|
import net.minecraft.util.registry.DynamicRegistryManager;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.world.BlockView;
|
import net.minecraft.world.BlockView;
|
||||||
import net.minecraft.world.ChunkRegion;
|
import net.minecraft.world.ChunkRegion;
|
||||||
import net.minecraft.world.Heightmap;
|
import net.minecraft.world.Heightmap;
|
||||||
@@ -31,6 +35,12 @@ import net.minecraft.world.gen.StructureAccessor;
|
|||||||
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
||||||
import net.minecraft.world.gen.chunk.StructuresConfig;
|
import net.minecraft.world.gen.chunk.StructuresConfig;
|
||||||
import net.minecraft.world.gen.chunk.VerticalBlockSample;
|
import net.minecraft.world.gen.chunk.VerticalBlockSample;
|
||||||
|
import net.minecraft.world.gen.feature.StructureFeature;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
public class FabricChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper {
|
public class FabricChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper {
|
||||||
private final long seed;
|
private final long seed;
|
||||||
@@ -77,6 +87,28 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public BlockPos locateStructure(ServerWorld world, StructureFeature<?> feature, BlockPos center, int radius, boolean skipExistingChunks) {
|
||||||
|
String name = Objects.requireNonNull(Registry.STRUCTURE_FEATURE.getId(feature)).toString();
|
||||||
|
TerraWorld terraWorld = TerraFabricPlugin.getInstance().getWorld((World) world);
|
||||||
|
TerraStructure located = pack.getStructure(pack.getTemplate().getLocatable().get(name));
|
||||||
|
if(located != null) {
|
||||||
|
CompletableFuture<BlockPos> result = new CompletableFuture<>();
|
||||||
|
AsyncStructureFinder finder = new AsyncStructureFinder(terraWorld.getBiomeProvider(), located, FabricAdapter.adapt(center).toLocation((World) world), 0, 500, location -> {
|
||||||
|
result.complete(FabricAdapter.adapt(location));
|
||||||
|
}, TerraFabricPlugin.getInstance());
|
||||||
|
finder.run(); // Do this synchronously.
|
||||||
|
try {
|
||||||
|
return result.get();
|
||||||
|
} catch(InterruptedException | ExecutionException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TerraFabricPlugin.getInstance().logger().warning("No overrides are defined for \"" + name + "\"");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateFeatures(ChunkRegion region, StructureAccessor accessor) {
|
public void generateFeatures(ChunkRegion region, StructureAccessor accessor) {
|
||||||
super.generateFeatures(region, accessor);
|
super.generateFeatures(region, accessor);
|
||||||
@@ -84,8 +116,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) {
|
public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) {
|
||||||
FabricSeededWorldAccess worldAccess = new FabricSeededWorldAccess(world, seed, this);
|
delegate.generateChunkData((World) world, new FastRandom(), chunk.getPos().x, chunk.getPos().z, (ChunkData) chunk);
|
||||||
delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricChunkData(chunk));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -107,7 +138,18 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getHeight(int x, int z, Heightmap.Type heightmapType) {
|
public int getHeight(int x, int z, Heightmap.Type heightmapType) {
|
||||||
return 0;
|
TerraWorld world = TerraFabricPlugin.getInstance().getWorld(seed);
|
||||||
|
Sampler sampler = world.getConfig().getSamplerCache().getChunk(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16));
|
||||||
|
int cx = FastMath.floorMod(x, 16);
|
||||||
|
int cz = FastMath.floorMod(z, 16);
|
||||||
|
|
||||||
|
int height = world.getWorld().getMaxHeight();
|
||||||
|
|
||||||
|
while (height >= 0 && sampler.sample(cx, height - 1, cz) < 0) {
|
||||||
|
height--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
+5
-9
@@ -1,10 +1,8 @@
|
|||||||
package com.dfsek.terra.fabric.world.features;
|
package com.dfsek.terra.fabric.generation;
|
||||||
|
|
||||||
import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator;
|
import com.dfsek.terra.api.platform.world.Chunk;
|
||||||
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
import com.dfsek.terra.fabric.world.handles.FabricWorld;
|
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
||||||
import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess;
|
|
||||||
import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess;
|
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.Codec;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.StructureWorldAccess;
|
import net.minecraft.world.StructureWorldAccess;
|
||||||
@@ -25,9 +23,7 @@ public class PopulatorFeature extends Feature<DefaultFeatureConfig> {
|
|||||||
@Override
|
@Override
|
||||||
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
|
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
|
||||||
FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator;
|
FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator;
|
||||||
FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4);
|
gen.getHandle().getPopulators().forEach(populator -> populator.populate((World) world, (Chunk) world));
|
||||||
FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator));
|
|
||||||
gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, chunk));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.fabric.world;
|
package com.dfsek.terra.fabric.generation;
|
||||||
|
|
||||||
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
||||||
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
||||||
+4
-5
@@ -1,9 +1,8 @@
|
|||||||
package com.dfsek.terra.fabric.inventory;
|
package com.dfsek.terra.fabric.handle;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.handle.ItemHandle;
|
import com.dfsek.terra.api.platform.handle.ItemHandle;
|
||||||
import com.dfsek.terra.api.platform.inventory.Item;
|
import com.dfsek.terra.api.platform.inventory.Item;
|
||||||
import com.dfsek.terra.api.platform.inventory.item.Enchantment;
|
import com.dfsek.terra.api.platform.inventory.item.Enchantment;
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
|
||||||
import com.mojang.brigadier.StringReader;
|
import com.mojang.brigadier.StringReader;
|
||||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||||
import net.minecraft.command.argument.ItemStackArgumentType;
|
import net.minecraft.command.argument.ItemStackArgumentType;
|
||||||
@@ -18,7 +17,7 @@ public class FabricItemHandle implements ItemHandle {
|
|||||||
@Override
|
@Override
|
||||||
public Item createItem(String data) {
|
public Item createItem(String data) {
|
||||||
try {
|
try {
|
||||||
return FabricAdapter.adapt(new ItemStackArgumentType().parse(new StringReader(data)).getItem());
|
return (Item) new ItemStackArgumentType().parse(new StringReader(data)).getItem();
|
||||||
} catch(CommandSyntaxException e) {
|
} catch(CommandSyntaxException e) {
|
||||||
throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e);
|
throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e);
|
||||||
}
|
}
|
||||||
@@ -26,11 +25,11 @@ public class FabricItemHandle implements ItemHandle {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enchantment getEnchantment(String id) {
|
public Enchantment getEnchantment(String id) {
|
||||||
return FabricAdapter.adapt(Registry.ENCHANTMENT.get(Identifier.tryParse(id)));
|
return (Enchantment) (Registry.ENCHANTMENT.get(Identifier.tryParse(id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Enchantment> getEnchantments() {
|
public Set<Enchantment> getEnchantments() {
|
||||||
return Registry.ENCHANTMENT.stream().map(FabricAdapter::adapt).collect(Collectors.toSet());
|
return Registry.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-3
@@ -1,8 +1,9 @@
|
|||||||
package com.dfsek.terra.fabric.world;
|
package com.dfsek.terra.fabric.handle;
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.entity.EntityType;
|
import com.dfsek.terra.api.platform.entity.EntityType;
|
||||||
import com.dfsek.terra.api.platform.handle.WorldHandle;
|
import com.dfsek.terra.api.platform.handle.WorldHandle;
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
import com.mojang.brigadier.StringReader;
|
import com.mojang.brigadier.StringReader;
|
||||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
@@ -30,6 +31,6 @@ public class FabricWorldHandle implements WorldHandle {
|
|||||||
public EntityType getEntity(String id) {
|
public EntityType getEntity(String id) {
|
||||||
Identifier identifier = Identifier.tryParse(id);
|
Identifier identifier = Identifier.tryParse(id);
|
||||||
if(identifier == null) identifier = Identifier.tryParse("minecraft:" + id.toLowerCase(Locale.ROOT));
|
if(identifier == null) identifier = Identifier.tryParse("minecraft:" + id.toLowerCase(Locale.ROOT));
|
||||||
return FabricAdapter.adapt(Registry.ENTITY_TYPE.get(identifier));
|
return (EntityType) Registry.ENTITY_TYPE.get(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.inventory;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.inventory.Inventory;
|
|
||||||
import com.dfsek.terra.api.platform.inventory.ItemStack;
|
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
|
||||||
import net.minecraft.item.Items;
|
|
||||||
|
|
||||||
public class FabricInventory implements Inventory {
|
|
||||||
private final net.minecraft.inventory.Inventory delegate;
|
|
||||||
|
|
||||||
public FabricInventory(net.minecraft.inventory.Inventory delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public net.minecraft.inventory.Inventory getHandle() {
|
|
||||||
return delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
|
||||||
return delegate.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack getItem(int slot) {
|
|
||||||
net.minecraft.item.ItemStack itemStack = delegate.getStack(slot);
|
|
||||||
return itemStack.getItem() == Items.AIR ? null : FabricAdapter.adapt(itemStack);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setItem(int slot, ItemStack newStack) {
|
|
||||||
delegate.setStack(slot, FabricAdapter.adapt(newStack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+8
-7
@@ -2,8 +2,8 @@ package com.dfsek.terra.fabric.mixin;
|
|||||||
|
|
||||||
import com.dfsek.terra.config.pack.ConfigPack;
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
||||||
import com.dfsek.terra.fabric.world.TerraBiomeSource;
|
import com.dfsek.terra.fabric.generation.TerraBiomeSource;
|
||||||
import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper;
|
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import net.minecraft.util.registry.DynamicRegistryManager;
|
import net.minecraft.util.registry.DynamicRegistryManager;
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
@@ -13,16 +13,17 @@ import net.minecraft.world.dimension.DimensionOptions;
|
|||||||
import net.minecraft.world.dimension.DimensionType;
|
import net.minecraft.world.dimension.DimensionType;
|
||||||
import net.minecraft.world.gen.GeneratorOptions;
|
import net.minecraft.world.gen.GeneratorOptions;
|
||||||
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
|
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
|
||||||
|
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.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
// Mixins commented out until loom fixes multi-project builds.
|
@Mixin(GeneratorOptions.class)
|
||||||
|
public abstract class GeneratorOptionsMixin {
|
||||||
//@Mixin(GeneratorOptions.class)
|
@Inject(method = "fromProperties(Lnet/minecraft/util/registry/DynamicRegistryManager;Ljava/util/Properties;)Lnet/minecraft/world/gen/GeneratorOptions;", at = @At("HEAD"), cancellable = true)
|
||||||
public class MixinGeneratorOptions {
|
|
||||||
//@Inject(method = "fromProperties(Lnet/minecraft/util/registry/DynamicRegistryManager;Ljava/util/Properties;)Lnet/minecraft/world/gen/GeneratorOptions;", at = @At("HEAD"), cancellable = true)
|
|
||||||
private static void fromProperties(DynamicRegistryManager dynamicRegistryManager, Properties properties, CallbackInfoReturnable<GeneratorOptions> cir) {
|
private static void fromProperties(DynamicRegistryManager dynamicRegistryManager, Properties properties, CallbackInfoReturnable<GeneratorOptions> cir) {
|
||||||
if(properties.get("level-type") == null) {
|
if(properties.get("level-type") == null) {
|
||||||
return;
|
return;
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.access;
|
||||||
|
|
||||||
|
import net.minecraft.world.biome.BiomeEffects;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Mixin(BiomeEffects.class)
|
||||||
|
public interface BiomeEffectsAccessor {
|
||||||
|
@Accessor("fogColor")
|
||||||
|
int getFogColor();
|
||||||
|
|
||||||
|
@Accessor("waterColor")
|
||||||
|
int getWaterColor();
|
||||||
|
|
||||||
|
@Accessor("waterFogColor")
|
||||||
|
int getWaterFogColor();
|
||||||
|
|
||||||
|
@Accessor("skyColor")
|
||||||
|
int getSkyColor();
|
||||||
|
|
||||||
|
@Accessor("foliageColor")
|
||||||
|
Optional<Integer> getFoliageColor();
|
||||||
|
|
||||||
|
@Accessor("grassColor")
|
||||||
|
Optional<Integer> getGrassColor();
|
||||||
|
|
||||||
|
@Accessor("grassColorModifier")
|
||||||
|
BiomeEffects.GrassColorModifier getGrassColorModifier();
|
||||||
|
}
|
||||||
+4
-4
@@ -1,4 +1,4 @@
|
|||||||
package com.dfsek.terra.fabric.mixin;
|
package com.dfsek.terra.fabric.mixin.access;
|
||||||
|
|
||||||
import net.minecraft.client.world.GeneratorType;
|
import net.minecraft.client.world.GeneratorType;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
@@ -10,12 +10,12 @@ import java.util.List;
|
|||||||
|
|
||||||
@Mixin(GeneratorType.class)
|
@Mixin(GeneratorType.class)
|
||||||
public interface GeneratorTypeAccessor {
|
public interface GeneratorTypeAccessor {
|
||||||
@Accessor
|
@Accessor("VALUES")
|
||||||
static List<GeneratorType> getVALUES() {
|
static List<GeneratorType> getValues() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mutable
|
@Mutable
|
||||||
@Accessor
|
@Accessor("translationKey")
|
||||||
void setTranslationKey(Text translationKey);
|
void setTranslationKey(Text translationKey);
|
||||||
}
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.access;
|
||||||
|
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.world.MobSpawnerLogic;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
|
|
||||||
|
@Mixin(MobSpawnerLogic.class)
|
||||||
|
public interface MobSpawnerLogicAccessor {
|
||||||
|
@Invoker("getEntityId")
|
||||||
|
Identifier callGetEntityId();
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.access;
|
||||||
|
|
||||||
|
import net.minecraft.state.State;
|
||||||
|
import net.minecraft.state.property.Property;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Mixin(State.class)
|
||||||
|
public interface StateAccessor {
|
||||||
|
@Accessor("PROPERTY_MAP_PRINTER")
|
||||||
|
static Function<Map.Entry<Property<?>, Comparable<?>>, String> getPropertyMapPrinter() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations;
|
||||||
|
|
||||||
|
import net.minecraft.world.biome.Biome;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
@Mixin(Biome.class)
|
||||||
|
@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.Biome.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class BiomeMixin {
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations;
|
||||||
|
|
||||||
|
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 = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ChunkGeneratorMixin {
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations;
|
||||||
|
|
||||||
|
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.profiler.ProfileFrame;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
|
import net.minecraft.world.StructureWorldAccess;
|
||||||
|
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
||||||
|
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@Mixin(ConfiguredFeature.class)
|
||||||
|
@Implements(@Interface(iface = Tree.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ConfiguredFeatureMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos);
|
||||||
|
|
||||||
|
@SuppressWarnings({"ConstantConditions", "try"})
|
||||||
|
public boolean terra$plant(Location l, Random r) {
|
||||||
|
String id = BuiltinRegistries.CONFIGURED_FEATURE.getId((ConfiguredFeature<?, ?>) (Object) this).toString();
|
||||||
|
try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) {
|
||||||
|
StructureWorldAccess fabricWorldAccess = ((StructureWorldAccess) l.getWorld());
|
||||||
|
ChunkGenerator generatorWrapper = (ChunkGenerator) l.getWorld().getGenerator();
|
||||||
|
return generate(fabricWorldAccess, generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MaterialSet terra$getSpawnable() {
|
||||||
|
return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:grass_block"),
|
||||||
|
TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:podzol"),
|
||||||
|
TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:mycelium"));
|
||||||
|
}
|
||||||
|
}
|
||||||
+60
@@ -0,0 +1,60 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.block;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.block.Block;
|
||||||
|
import com.dfsek.terra.api.platform.block.BlockData;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.BlockState;
|
||||||
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlock;
|
||||||
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(BlockEntity.class)
|
||||||
|
@Implements(@Interface(iface = BlockState.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class BlockEntityMixin {
|
||||||
|
@Shadow
|
||||||
|
protected BlockPos pos;
|
||||||
|
@Shadow
|
||||||
|
@Nullable
|
||||||
|
protected World world;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract net.minecraft.block.BlockState getCachedState();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean hasWorld();
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Block terra$getBlock() {
|
||||||
|
return new FabricBlock(pos, world);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getX() {
|
||||||
|
return pos.getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getY() {
|
||||||
|
return pos.getY();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getZ() {
|
||||||
|
return pos.getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockData terra$getBlockData() {
|
||||||
|
return FabricAdapter.adapt(getCachedState());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean terra$update(boolean applyPhysics) {
|
||||||
|
if(hasWorld()) world.getChunk(pos).setBlockEntity(pos, (BlockEntity) (Object) this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.block;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.block.BlockData;
|
||||||
|
import com.dfsek.terra.api.platform.block.BlockType;
|
||||||
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(Block.class)
|
||||||
|
@Implements(@Interface(iface = BlockType.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class BlockMixin {
|
||||||
|
@Shadow
|
||||||
|
private BlockState defaultState;
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockData terra$getDefaultData() {
|
||||||
|
return FabricAdapter.adapt(defaultState);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean terra$isSolid() {
|
||||||
|
return defaultState.isOpaque();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
public boolean terra$isWater() {
|
||||||
|
return ((Object) this) == Blocks.WATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.block.state;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.block.state.Container;
|
||||||
|
import com.dfsek.terra.api.platform.inventory.Inventory;
|
||||||
|
import com.dfsek.terra.fabric.mixin.implementations.block.BlockEntityMixin;
|
||||||
|
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
@Mixin(LootableContainerBlockEntity.class)
|
||||||
|
@Implements(@Interface(iface = Container.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class LootableContainerBlockEntityMixin extends BlockEntityMixin {
|
||||||
|
public Inventory terra$getInventory() {
|
||||||
|
return (Inventory) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+119
@@ -0,0 +1,119 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.block.state;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.block.state.MobSpawner;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.SerialState;
|
||||||
|
import com.dfsek.terra.api.platform.entity.EntityType;
|
||||||
|
import com.dfsek.terra.fabric.TerraFabricPlugin;
|
||||||
|
import com.dfsek.terra.fabric.mixin.access.MobSpawnerLogicAccessor;
|
||||||
|
import net.minecraft.block.entity.MobSpawnerBlockEntity;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import net.minecraft.world.MobSpawnerLogic;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(MobSpawnerBlockEntity.class)
|
||||||
|
@Implements(@Interface(iface = MobSpawner.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class MobSpawnerBlockEntityMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract MobSpawnerLogic getLogic();
|
||||||
|
|
||||||
|
public EntityType terra$getSpawnedType() {
|
||||||
|
return (EntityType) Registry.ENTITY_TYPE.get(((MobSpawnerLogicAccessor) getLogic()).callGetEntityId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setSpawnedType(@NotNull EntityType creatureType) {
|
||||||
|
getLogic().setEntityId((net.minecraft.entity.EntityType<?>) creatureType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getDelay() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setDelay(int delay) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getMinSpawnDelay() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setMinSpawnDelay(int delay) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getMaxSpawnDelay() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setMaxSpawnDelay(int delay) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getSpawnCount() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setSpawnCount(int spawnCount) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getMaxNearbyEntities() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setMaxNearbyEntities(int maxNearbyEntities) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getRequiredPlayerRange() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setRequiredPlayerRange(int requiredPlayerRange) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getSpawnRange() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setSpawnRange(int spawnRange) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$applyState(String state) {
|
||||||
|
SerialState.parse(state).forEach((k, v) -> {
|
||||||
|
switch(k) {
|
||||||
|
case "type":
|
||||||
|
terra$setSpawnedType(TerraFabricPlugin.getInstance().getWorldHandle().getEntity(v));
|
||||||
|
return;
|
||||||
|
case "delay":
|
||||||
|
terra$setDelay(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
case "min_delay":
|
||||||
|
terra$setMinSpawnDelay(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
case "max_delay":
|
||||||
|
terra$setMaxSpawnDelay(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
case "spawn_count":
|
||||||
|
terra$setSpawnCount(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
case "spawn_range":
|
||||||
|
terra$setSpawnRange(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
case "max_nearby":
|
||||||
|
terra$setMaxNearbyEntities(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
case "required_player_range":
|
||||||
|
terra$setRequiredPlayerRange(Integer.parseInt(v));
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Invalid property: " + k);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.block.state;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.block.state.SerialState;
|
||||||
|
import com.dfsek.terra.api.platform.block.state.Sign;
|
||||||
|
import net.minecraft.block.entity.SignBlockEntity;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(SignBlockEntity.class)
|
||||||
|
@Implements(@Interface(iface = Sign.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class SignBlockEntityMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract void setTextOnRow(int row, Text text);
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private Text[] text;
|
||||||
|
|
||||||
|
public @NotNull String[] terra$getLines() {
|
||||||
|
String[] lines = new String[text.length];
|
||||||
|
for(int i = 0; i < text.length; i++) {
|
||||||
|
lines[i] = text[i].asString();
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull String terra$getLine(int index) throws IndexOutOfBoundsException {
|
||||||
|
return text[index].asString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setLine(int index, @NotNull String line) throws IndexOutOfBoundsException {
|
||||||
|
setTextOnRow(index, new LiteralText(line));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$applyState(String state) {
|
||||||
|
SerialState.parse(state).forEach((k, v) -> {
|
||||||
|
if(!k.startsWith("text")) throw new IllegalArgumentException("Invalid property: " + k);
|
||||||
|
terra$setLine(Integer.parseInt(k.substring(4)), v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.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.block.FabricBlock;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.ChunkRegion;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ChunkRegion.class)
|
||||||
|
@Implements(@Interface(iface = Chunk.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ChunkRegionMixin {
|
||||||
|
@Final
|
||||||
|
@Shadow
|
||||||
|
private int centerChunkX;
|
||||||
|
|
||||||
|
@Final
|
||||||
|
@Shadow
|
||||||
|
private int centerChunkZ;
|
||||||
|
|
||||||
|
public int terra$getX() {
|
||||||
|
return centerChunkX;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getZ() {
|
||||||
|
return centerChunkZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public World terra$getWorld() {
|
||||||
|
return (World) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Block terra$getBlock(int x, int y, int z) {
|
||||||
|
BlockPos pos = new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4));
|
||||||
|
return new FabricBlock(pos, (ChunkRegion) (Object) this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull BlockData terra$getBlockData(int x, int y, int z) {
|
||||||
|
return terra$getBlock(x, y, z).getBlockData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setBlock(int x, int y, int z, @NotNull BlockData blockData) {
|
||||||
|
((ChunkRegion) (Object) this).setBlockState(new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4)), ((FabricBlockData) blockData).getHandle(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.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.block.FabricBlock;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.chunk.WorldChunk;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(WorldChunk.class)
|
||||||
|
@Implements(@Interface(iface = Chunk.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class WorldChunkMixin {
|
||||||
|
@Final
|
||||||
|
@Shadow
|
||||||
|
private net.minecraft.world.World world;
|
||||||
|
|
||||||
|
public int terra$getX() {
|
||||||
|
return ((net.minecraft.world.chunk.Chunk) this).getPos().x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getZ() {
|
||||||
|
return ((net.minecraft.world.chunk.Chunk) this).getPos().z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public World terra$getWorld() {
|
||||||
|
return (World) world;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Block terra$getBlock(int x, int y, int z) {
|
||||||
|
BlockPos pos = new BlockPos(x + (terra$getX() << 4), y, z + (terra$getZ() << 4));
|
||||||
|
return new FabricBlock(pos, world);
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull BlockData terra$getBlockData(int x, int y, int z) {
|
||||||
|
return terra$getBlock(x, y, z).getBlockData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setBlock(int x, int y, int z, @NotNull BlockData blockData) {
|
||||||
|
((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.chunk.data;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.block.BlockData;
|
||||||
|
import com.dfsek.terra.api.platform.world.generator.ChunkData;
|
||||||
|
import com.dfsek.terra.fabric.block.FabricBlockData;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.chunk.ProtoChunk;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ProtoChunk.class)
|
||||||
|
@Implements(@Interface(iface = ChunkData.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ProtoChunkMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract BlockState getBlockState(BlockPos pos);
|
||||||
|
|
||||||
|
public @NotNull BlockData terra$getBlockData(int x, int y, int z) {
|
||||||
|
return new FabricBlockData(getBlockState(new BlockPos(x, y, z)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setBlock(int x, int y, int z, @NotNull BlockData blockData) {
|
||||||
|
((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getMaxHeight() {
|
||||||
|
return 255; // TODO: 1.17 - Implement dynamic height.
|
||||||
|
}
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.entity;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
|
import com.dfsek.terra.fabric.FabricAdapter;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Mixin(Entity.class)
|
||||||
|
@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.Entity.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class EntityMixin {
|
||||||
|
@Shadow
|
||||||
|
public net.minecraft.world.World world;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
private BlockPos blockPos;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract void teleport(double destX, double destY, double destZ);
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract void sendSystemMessage(Text message, UUID senderUuid);
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location terra$getLocation() {
|
||||||
|
return new Location((World) world, FabricAdapter.adapt(blockPos));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setLocation(Location location) {
|
||||||
|
teleport(location.getX(), location.getY(), location.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public World terra$getWorld() {
|
||||||
|
return (World) world;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$sendMessage(String message) {
|
||||||
|
sendSystemMessage(new LiteralText(message), UUID.randomUUID()); // TODO: look into how this actually works and make it less jank
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.entity;
|
||||||
|
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
@Mixin(EntityType.class)
|
||||||
|
@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class EntityTypeMixin {
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.entity;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.entity.Player;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
@Mixin(PlayerEntity.class)
|
||||||
|
@Implements(@Interface(iface = Player.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class PlayerEntityMixin extends EntityMixin {
|
||||||
|
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.entity;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.CommandSender;
|
||||||
|
import net.minecraft.server.command.ServerCommandSource;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ServerCommandSource.class)
|
||||||
|
@Implements(@Interface(iface = CommandSender.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ServerCommandSourceMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract void sendFeedback(Text message, boolean broadcastToOps);
|
||||||
|
|
||||||
|
public void terra$sendMessage(String message) {
|
||||||
|
sendFeedback(new LiteralText(message), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.inventory;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.inventory.Inventory;
|
||||||
|
import com.dfsek.terra.api.platform.inventory.ItemStack;
|
||||||
|
import net.minecraft.block.entity.LockableContainerBlockEntity;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
@Mixin(LockableContainerBlockEntity.class)
|
||||||
|
@Implements(@Interface(iface = Inventory.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public class LockableContainerBlockEntityMixin {
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getSize() {
|
||||||
|
return ((LockableContainerBlockEntity) (Object) this).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
public ItemStack terra$getItem(int slot) {
|
||||||
|
net.minecraft.item.ItemStack itemStack = ((LockableContainerBlockEntity) (Object) this).getStack(slot);
|
||||||
|
return itemStack.getItem() == Items.AIR ? null : (ItemStack) (Object) itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
public void terra$setItem(int slot, ItemStack newStack) {
|
||||||
|
((LockableContainerBlockEntity) (Object) this).setStack(slot, (net.minecraft.item.ItemStack) (Object) newStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.inventory.item;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.inventory.ItemStack;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(Item.class)
|
||||||
|
@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.Item.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ItemMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract int getMaxDamage();
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
public ItemStack terra$newItemStack(int amount) {
|
||||||
|
return (ItemStack) (Object) new net.minecraft.item.ItemStack((Item) (Object) this, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double terra$getMaxDurability() {
|
||||||
|
return getMaxDamage();
|
||||||
|
}
|
||||||
|
}
|
||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.inventory.item;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.inventory.Item;
|
||||||
|
import com.dfsek.terra.api.platform.inventory.item.ItemMeta;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Intrinsic;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ItemStack.class)
|
||||||
|
@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.ItemStack.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ItemStackMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract int getCount();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract void setCount(int count);
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract net.minecraft.item.Item getItem();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean isDamageable();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract void setTag(@Nullable CompoundTag tag);
|
||||||
|
|
||||||
|
public int terra$getAmount() {
|
||||||
|
return getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$setAmount(int i) {
|
||||||
|
setCount(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Item terra$getType() {
|
||||||
|
return (Item) getItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemMeta terra$getItemMeta() {
|
||||||
|
return (ItemMeta) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
public void terra$setItemMeta(ItemMeta meta) {
|
||||||
|
setTag(((ItemStack) (Object) meta).getTag());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Intrinsic
|
||||||
|
public boolean terra$isDamageable() {
|
||||||
|
return isDamageable();
|
||||||
|
}
|
||||||
|
}
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.inventory.meta;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.inventory.ItemStack;
|
||||||
|
import net.minecraft.enchantment.Enchantment;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@Mixin(Enchantment.class)
|
||||||
|
@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.item.Enchantment.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class EnchantmentMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack);
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean canCombine(Enchantment other);
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
public boolean terra$canEnchantItem(ItemStack itemStack) {
|
||||||
|
return isAcceptableItem((net.minecraft.item.ItemStack) (Object) itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String terra$getID() {
|
||||||
|
return Objects.requireNonNull(Registry.ENCHANTMENT.getId((Enchantment) (Object) this)).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean terra$conflictsWith(com.dfsek.terra.api.platform.inventory.item.Enchantment other) {
|
||||||
|
return !canCombine((Enchantment) other);
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.inventory.meta;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.inventory.item.Damageable;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Intrinsic;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ItemStack.class)
|
||||||
|
@Implements(@Interface(iface = Damageable.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ItemStackDamageableMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean isDamaged();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract int getDamage();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract void setDamage(int damage);
|
||||||
|
|
||||||
|
public boolean terra$hasDamage() {
|
||||||
|
return isDamaged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Intrinsic
|
||||||
|
public void terra$setDamage(int damage) {
|
||||||
|
setDamage(damage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Intrinsic
|
||||||
|
public int terra$getDamage() {
|
||||||
|
return getDamage();
|
||||||
|
}
|
||||||
|
}
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.inventory.meta;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.platform.inventory.item.Enchantment;
|
||||||
|
import com.dfsek.terra.api.platform.inventory.item.ItemMeta;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.ListTag;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Intrinsic;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Mixin(ItemStack.class)
|
||||||
|
@Implements(@Interface(iface = ItemMeta.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ItemStackMetaMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract boolean hasEnchantments();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract ListTag getEnchantments();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public abstract void addEnchantment(net.minecraft.enchantment.Enchantment enchantment, int level);
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Intrinsic(displace = true)
|
||||||
|
public Map<Enchantment, Integer> terra$getEnchantments() {
|
||||||
|
if(!hasEnchantments()) return Collections.emptyMap();
|
||||||
|
Map<Enchantment, Integer> map = new HashMap<>();
|
||||||
|
|
||||||
|
getEnchantments().forEach(enchantment -> {
|
||||||
|
CompoundTag eTag = (CompoundTag) enchantment;
|
||||||
|
map.put((Enchantment) Registry.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl"));
|
||||||
|
});
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void terra$addEnchantment(Enchantment enchantment, int level) {
|
||||||
|
addEnchantment((net.minecraft.enchantment.Enchantment) enchantment, level);
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
/**
|
||||||
|
* Mixins in this package implement Terra
|
||||||
|
* interfaces in Minecraft classes.
|
||||||
|
*/
|
||||||
|
package com.dfsek.terra.fabric.mixin.implementations;
|
||||||
+109
@@ -0,0 +1,109 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.world;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
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.Chunk;
|
||||||
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
|
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 com.dfsek.terra.fabric.block.FabricBlock;
|
||||||
|
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.ChunkRegion;
|
||||||
|
import net.minecraft.world.ServerWorldAccess;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Intrinsic;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ChunkRegion.class)
|
||||||
|
@Implements(@Interface(iface = World.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ChunkRegionMixin {
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private ServerWorld world;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private long seed;
|
||||||
|
|
||||||
|
public int terra$getMaxHeight() {
|
||||||
|
return ((ChunkRegion) (Object) this).getDimensionHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public ChunkGenerator terra$getGenerator() {
|
||||||
|
return (ChunkGenerator) ((ChunkRegion) (Object) this).toServerWorld().getChunkManager().getChunkGenerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Chunk terra$getChunkAt(int x, int z) {
|
||||||
|
return (Chunk) ((ChunkRegion) (Object) this).getChunk(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Block terra$getBlockAt(int x, int y, int z) {
|
||||||
|
return new FabricBlock(new BlockPos(x, y, z), ((ChunkRegion) (Object) this));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public Entity terra$spawnEntity(Location location, EntityType entityType) {
|
||||||
|
net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((ChunkRegion) (Object) this).toServerWorld());
|
||||||
|
entity.setPos(location.getX(), location.getY(), location.getZ());
|
||||||
|
((ChunkRegion) (Object) this).spawnEntity(entity);
|
||||||
|
return (Entity) entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Intrinsic
|
||||||
|
public long terra$getSeed() {
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getMinHeight() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean terra$isTerraWorld() {
|
||||||
|
return terra$getGenerator() instanceof GeneratorWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TerraChunkGenerator terra$getTerraGenerator() {
|
||||||
|
return ((FabricChunkGeneratorWrapper) terra$getGenerator()).getHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We need regions delegating to the same world
|
||||||
|
* to have the same hashcode. This
|
||||||
|
* minimizes cache misses.
|
||||||
|
* <p>
|
||||||
|
* This is sort of jank, but shouldn't(tm)
|
||||||
|
* break any other mods, unless they're doing
|
||||||
|
* something they really shouldn't, since
|
||||||
|
* ChunkRegions are not supposed to persist.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return world.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overridden in the same manner as {@link #hashCode()}
|
||||||
|
*
|
||||||
|
* @param other Another object
|
||||||
|
* @return Whether this world is the same as other.
|
||||||
|
* @see #hashCode()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if(!(other instanceof ServerWorldAccess)) return false;
|
||||||
|
return world.equals(((ServerWorldAccess) other).toServerWorld());
|
||||||
|
}
|
||||||
|
}
|
||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
package com.dfsek.terra.fabric.mixin.implementations.world;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Location;
|
||||||
|
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.Chunk;
|
||||||
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
|
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 com.dfsek.terra.fabric.block.FabricBlock;
|
||||||
|
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.ServerWorldAccess;
|
||||||
|
import org.spongepowered.asm.mixin.Implements;
|
||||||
|
import org.spongepowered.asm.mixin.Interface;
|
||||||
|
import org.spongepowered.asm.mixin.Intrinsic;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(ServerWorld.class)
|
||||||
|
@Implements(@Interface(iface = World.class, prefix = "terra$", remap = Interface.Remap.NONE))
|
||||||
|
public abstract class ServerWorldMixin {
|
||||||
|
@Shadow
|
||||||
|
public abstract long getSeed();
|
||||||
|
|
||||||
|
public int terra$getMaxHeight() {
|
||||||
|
return ((ServerWorld) (Object) this).getDimensionHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChunkGenerator terra$getGenerator() {
|
||||||
|
return (ChunkGenerator) ((ServerWorld) (Object) this).getChunkManager().getChunkGenerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Chunk terra$getChunkAt(int x, int z) {
|
||||||
|
return (Chunk) ((ServerWorld) (Object) this).getChunk(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Block terra$getBlockAt(int x, int y, int z) {
|
||||||
|
return new FabricBlock(new BlockPos(x, y, z), ((ServerWorld) (Object) this));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity terra$spawnEntity(Location location, EntityType entityType) {
|
||||||
|
net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((ServerWorld) (Object) this));
|
||||||
|
entity.setPos(location.getX(), location.getY(), location.getZ());
|
||||||
|
((ServerWorld) (Object) this).spawnEntity(entity);
|
||||||
|
return (Entity) entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Intrinsic
|
||||||
|
public long terra$getSeed() {
|
||||||
|
return getSeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int terra$getMinHeight() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object terra$getHandle() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean terra$isTerraWorld() {
|
||||||
|
return terra$getGenerator() instanceof GeneratorWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TerraChunkGenerator terra$getTerraGenerator() {
|
||||||
|
return ((FabricChunkGeneratorWrapper) terra$getGenerator()).getHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overridden in the same manner as {@link ChunkRegionMixin#hashCode()}
|
||||||
|
*
|
||||||
|
* @param other Another object
|
||||||
|
* @return Whether this world is the same as other.
|
||||||
|
* @see ChunkRegionMixin#hashCode()
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if(!(other instanceof ServerWorldAccess)) return false;
|
||||||
|
return (ServerWorldAccess) this == (((ServerWorldAccess) other).toServerWorld());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.world;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.math.vector.Vector3;
|
|
||||||
import com.dfsek.terra.api.platform.CommandSender;
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockFace;
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockType;
|
|
||||||
import com.dfsek.terra.api.platform.entity.EntityType;
|
|
||||||
import com.dfsek.terra.api.platform.inventory.item.Enchantment;
|
|
||||||
import com.dfsek.terra.fabric.inventory.FabricEnchantment;
|
|
||||||
import com.dfsek.terra.fabric.inventory.FabricItem;
|
|
||||||
import com.dfsek.terra.fabric.inventory.FabricItemStack;
|
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockData;
|
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlockType;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricDirectional;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricOrientable;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricRotatable;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricSlab;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricStairs;
|
|
||||||
import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged;
|
|
||||||
import com.dfsek.terra.fabric.world.entity.FabricCommandSender;
|
|
||||||
import com.dfsek.terra.fabric.world.entity.FabricEntityType;
|
|
||||||
import com.dfsek.terra.fabric.world.entity.FabricPlayer;
|
|
||||||
import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle;
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.BlockState;
|
|
||||||
import net.minecraft.entity.Entity;
|
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.server.command.ServerCommandSource;
|
|
||||||
import net.minecraft.state.property.Properties;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.Direction;
|
|
||||||
import net.minecraft.world.WorldAccess;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public final class FabricAdapter {
|
|
||||||
public static BlockPos adapt(Vector3 v) {
|
|
||||||
return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vector3 adapt(BlockPos pos) {
|
|
||||||
return new Vector3(pos.getX(), pos.getY(), pos.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static FabricBlockData adapt(BlockState state) {
|
|
||||||
if(state.contains(Properties.STAIR_SHAPE)) return new FabricStairs(state);
|
|
||||||
|
|
||||||
if(state.contains(Properties.SLAB_TYPE)) return new FabricSlab(state);
|
|
||||||
|
|
||||||
if(state.contains(Properties.AXIS)) return new FabricOrientable(state, Properties.AXIS);
|
|
||||||
if(state.contains(Properties.HORIZONTAL_AXIS)) return new FabricOrientable(state, Properties.HORIZONTAL_AXIS);
|
|
||||||
|
|
||||||
if(state.contains(Properties.ROTATION)) return new FabricRotatable(state);
|
|
||||||
|
|
||||||
if(state.contains(Properties.FACING)) return new FabricDirectional(state, Properties.FACING);
|
|
||||||
if(state.contains(Properties.HOPPER_FACING)) return new FabricDirectional(state, Properties.HOPPER_FACING);
|
|
||||||
if(state.contains(Properties.HORIZONTAL_FACING)) return new FabricDirectional(state, Properties.HORIZONTAL_FACING);
|
|
||||||
|
|
||||||
if(state.getProperties().containsAll(Arrays.asList(Properties.NORTH, Properties.SOUTH, Properties.EAST, Properties.WEST)))
|
|
||||||
return new FabricMultipleFacing(state);
|
|
||||||
if(state.contains(Properties.WATERLOGGED)) return new FabricWaterlogged(state);
|
|
||||||
return new FabricBlockData(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CommandSender adapt(ServerCommandSource serverCommandSource) {
|
|
||||||
if(serverCommandSource.getEntity() instanceof PlayerEntity) return new FabricPlayer((PlayerEntity) serverCommandSource.getEntity());
|
|
||||||
return new FabricCommandSender(serverCommandSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Direction adapt(BlockFace face) {
|
|
||||||
switch(face) {
|
|
||||||
case NORTH:
|
|
||||||
return Direction.NORTH;
|
|
||||||
case WEST:
|
|
||||||
return Direction.WEST;
|
|
||||||
case SOUTH:
|
|
||||||
return Direction.SOUTH;
|
|
||||||
case EAST:
|
|
||||||
return Direction.EAST;
|
|
||||||
case UP:
|
|
||||||
return Direction.UP;
|
|
||||||
case DOWN:
|
|
||||||
return Direction.DOWN;
|
|
||||||
default:
|
|
||||||
throw new IllegalArgumentException("Illegal direction: " + face);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BlockType adapt(Block block) {
|
|
||||||
return new FabricBlockType(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EntityType adapt(net.minecraft.entity.EntityType<?> entityType) {
|
|
||||||
return new FabricEntityType(entityType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static net.minecraft.entity.EntityType<? extends Entity> adapt(EntityType entityType) {
|
|
||||||
return ((FabricEntityType) entityType).getHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ItemStack adapt(com.dfsek.terra.api.platform.inventory.ItemStack itemStack) {
|
|
||||||
return ((FabricItemStack) itemStack).getHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static com.dfsek.terra.api.platform.inventory.ItemStack adapt(ItemStack itemStack) {
|
|
||||||
return new FabricItemStack(itemStack);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static com.dfsek.terra.api.platform.inventory.Item adapt(Item item) {
|
|
||||||
return new FabricItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Enchantment adapt(net.minecraft.enchantment.Enchantment enchantment) {
|
|
||||||
return new FabricEnchantment(enchantment);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static net.minecraft.enchantment.Enchantment adapt(Enchantment enchantment) {
|
|
||||||
return ((FabricEnchantment) enchantment).getHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldAccess adapt(FabricWorldHandle worldHandle) {
|
|
||||||
return worldHandle.getWorld();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.world;
|
|
||||||
|
|
||||||
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;
|
|
||||||
import net.minecraft.world.StructureWorldAccess;
|
|
||||||
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
|
||||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
public class FabricTree implements Tree {
|
|
||||||
private final ConfiguredFeature<?, ?> delegate;
|
|
||||||
|
|
||||||
public FabricTree(ConfiguredFeature<?, ?> delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean plant(Location l, Random r) {
|
|
||||||
try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + delegate.toString().toLowerCase(Locale.ROOT))) {
|
|
||||||
FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld());
|
|
||||||
ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle();
|
|
||||||
return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MaterialSet getSpawnable() {
|
|
||||||
return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:grass_block"),
|
|
||||||
TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:podzol"),
|
|
||||||
TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:mycelium"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
-73
@@ -1,73 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.state;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.Block;
|
|
||||||
import com.dfsek.terra.api.platform.block.BlockData;
|
|
||||||
import com.dfsek.terra.api.platform.block.state.BlockState;
|
|
||||||
import com.dfsek.terra.fabric.world.FabricAdapter;
|
|
||||||
import com.dfsek.terra.fabric.world.block.FabricBlock;
|
|
||||||
import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle;
|
|
||||||
import net.minecraft.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
|
||||||
import net.minecraft.block.entity.MobSpawnerBlockEntity;
|
|
||||||
import net.minecraft.block.entity.SignBlockEntity;
|
|
||||||
import net.minecraft.world.WorldAccess;
|
|
||||||
|
|
||||||
public class FabricBlockState implements BlockState {
|
|
||||||
protected final BlockEntity blockEntity;
|
|
||||||
private final WorldAccess worldAccess;
|
|
||||||
|
|
||||||
public FabricBlockState(BlockEntity blockEntity, WorldAccess worldAccess) {
|
|
||||||
this.blockEntity = blockEntity;
|
|
||||||
this.worldAccess = worldAccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static FabricBlockState newInstance(Block block) {
|
|
||||||
WorldAccess worldAccess = ((FabricWorldHandle) block.getLocation().getWorld()).getWorld();
|
|
||||||
|
|
||||||
BlockEntity entity = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector()));
|
|
||||||
if(entity instanceof SignBlockEntity) {
|
|
||||||
return new FabricSign((SignBlockEntity) entity, worldAccess);
|
|
||||||
} else if(entity instanceof MobSpawnerBlockEntity) {
|
|
||||||
return new FabricMobSpawner((MobSpawnerBlockEntity) entity, worldAccess);
|
|
||||||
} else if(entity instanceof LootableContainerBlockEntity) {
|
|
||||||
return new FabricContainer((LootableContainerBlockEntity) entity, worldAccess);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockEntity getHandle() {
|
|
||||||
return blockEntity;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Block getBlock() {
|
|
||||||
return new FabricBlock(blockEntity.getPos(), blockEntity.getWorld());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getX() {
|
|
||||||
return blockEntity.getPos().getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getY() {
|
|
||||||
return blockEntity.getPos().getY();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getZ() {
|
|
||||||
return blockEntity.getPos().getZ();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockData getBlockData() {
|
|
||||||
return FabricAdapter.adapt(blockEntity.getCachedState());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean update(boolean applyPhysics) {
|
|
||||||
worldAccess.getChunk(blockEntity.getPos()).setBlockEntity(blockEntity.getPos(), blockEntity);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-18
@@ -1,18 +0,0 @@
|
|||||||
package com.dfsek.terra.fabric.world.block.state;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.block.state.Container;
|
|
||||||
import com.dfsek.terra.api.platform.inventory.Inventory;
|
|
||||||
import com.dfsek.terra.fabric.inventory.FabricInventory;
|
|
||||||
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
|
||||||
import net.minecraft.world.WorldAccess;
|
|
||||||
|
|
||||||
public class FabricContainer extends FabricBlockState implements Container {
|
|
||||||
public FabricContainer(LootableContainerBlockEntity blockEntity, WorldAccess worldAccess) {
|
|
||||||
super(blockEntity, worldAccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getInventory() {
|
|
||||||
return new FabricInventory(((LootableContainerBlockEntity) blockEntity));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user