mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-10-26 05:50:08 +00:00
Merge pull request #335 from duplexsystem/dev/enviroment
make villager biome types work and also quilt
This commit is contained in:
31 files changed
+481
-278
No files matched your search
+1
-2
@@ -247,6 +247,5 @@ nbdist/
|
|||||||
|
|
||||||
**/testDir/
|
**/testDir/
|
||||||
|
|
||||||
platforms/fabric/run/**
|
platforms/**/run/**
|
||||||
|
|
||||||
platforms/forge/run/**
|
|
||||||
@@ -45,6 +45,9 @@ fun Project.configureDependencies() {
|
|||||||
maven ("https://maven.quiltmc.org/repository/release/") {
|
maven ("https://maven.quiltmc.org/repository/release/") {
|
||||||
name = "Quilt"
|
name = "Quilt"
|
||||||
}
|
}
|
||||||
|
maven("https://jitpack.io") {
|
||||||
|
name = "JitPack"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -18,32 +18,32 @@ object Versions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object Fabric {
|
object Fabric {
|
||||||
const val fabricLoader = "0.14.2"
|
const val fabricLoader = "0.14.8"
|
||||||
const val fabricAPI = "0.56.0+1.19"
|
const val fabricAPI = "0.57.0+1.19"
|
||||||
const val mixin = "0.11.2+mixin.0.8.5"
|
|
||||||
const val loom = "0.12-SNAPSHOT"
|
|
||||||
const val minotaur = "1.1.0"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Quilt {
|
object Quilt {
|
||||||
const val quiltLoader = "0.17.0"
|
const val quiltLoader = "0.17.0"
|
||||||
const val loom = "0.12.+"
|
const val fabricApi = "2.0.0-beta.4+0.57.0-1.19"
|
||||||
const val fabricApi = "2.0.0-alpha.2+0.55.3-1.19"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Mod {
|
object Mod {
|
||||||
|
const val mixin = "0.11.2+mixin.0.8.5"
|
||||||
|
|
||||||
const val minecraft = "1.19"
|
const val minecraft = "1.19"
|
||||||
const val yarn = "$minecraft+build.1"
|
const val yarn = "$minecraft+build.1"
|
||||||
const val fabricLoader = "0.14.2"
|
const val fabricLoader = "0.14.2"
|
||||||
|
|
||||||
const val architecuryLoom = "0.12.0-SNAPSHOT"
|
const val architecuryLoom = "0.12.0-SNAPSHOT"
|
||||||
const val architectutyPlugin = "3.4-SNAPSHOT"
|
const val architecturyPlugin = "3.4-SNAPSHOT"
|
||||||
|
|
||||||
const val loomQuiltflower = "1.7.1"
|
const val loomQuiltflower = "1.7.1"
|
||||||
|
|
||||||
|
const val lazyDfu = "0.1.2"
|
||||||
}
|
}
|
||||||
|
|
||||||
object Forge {
|
object Forge {
|
||||||
const val forge = "${Mod.minecraft}-41.0.38"
|
const val forge = "${Mod.minecraft}-41.0.63"
|
||||||
const val burningwave = "12.53.0"
|
const val burningwave = "12.53.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,5 +64,6 @@ object Versions {
|
|||||||
const val nbt = "6.1"
|
const val nbt = "6.1"
|
||||||
const val logback = "1.2.9"
|
const val logback = "1.2.9"
|
||||||
const val commonsIO = "2.7"
|
const val commonsIO = "2.7"
|
||||||
|
const val guava = "31.0.1-jre"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,10 +2,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
|||||||
|
|
||||||
version = version("1.0.0")
|
version = version("1.0.0")
|
||||||
|
|
||||||
repositories {
|
|
||||||
maven { url = uri("https://jitpack.io/") }
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api("commons-io:commons-io:2.7")
|
api("commons-io:commons-io:2.7")
|
||||||
api("com.github.Querz:NBT:6.1")
|
api("com.github.Querz:NBT:6.1")
|
||||||
|
|||||||
+106
@@ -0,0 +1,106 @@
|
|||||||
|
package com.dfsek.terra.bukkit.nms.v1_18_R2;
|
||||||
|
|
||||||
|
import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
|
||||||
|
import com.dfsek.terra.registry.master.ConfigRegistry;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.mojang.serialization.Lifecycle;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.core.MappedRegistry;
|
||||||
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.core.WritableRegistry;
|
||||||
|
import net.minecraft.data.BuiltinRegistries;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.tags.TagKey;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public class AwfulBukkitHacks {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class);
|
||||||
|
private static final Map<ResourceLocation, List<ResourceLocation>> terraBiomeMap = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
public static void registerBiomes(ConfigRegistry configRegistry) {
|
||||||
|
try {
|
||||||
|
LOGGER.info("Hacking biome registry...");
|
||||||
|
WritableRegistry<Biome> biomeRegistry = (WritableRegistry<Biome>) Registries.biomeRegistry();
|
||||||
|
|
||||||
|
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, false);
|
||||||
|
|
||||||
|
configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
|
||||||
|
try {
|
||||||
|
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
|
||||||
|
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
|
||||||
|
ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey());
|
||||||
|
Biome platform = NMSBiomeInjector.createBiome(
|
||||||
|
biome,
|
||||||
|
biomeRegistry.get(vanillaMinecraftKey) // get
|
||||||
|
);
|
||||||
|
|
||||||
|
ResourceKey<Biome> delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)));
|
||||||
|
|
||||||
|
BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform);
|
||||||
|
biomeRegistry.register(delegateKey, platform, Lifecycle.stable());
|
||||||
|
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
|
||||||
|
|
||||||
|
terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());
|
||||||
|
|
||||||
|
LOGGER.debug("Registered biome: " + delegateKey);
|
||||||
|
} catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, true); // freeze registry again :)
|
||||||
|
|
||||||
|
LOGGER.info("Doing tag garbage....");
|
||||||
|
Map<TagKey<Biome>, List<Holder<Biome>>> collect = biomeRegistry
|
||||||
|
.getTags() // streamKeysAndEntries
|
||||||
|
.collect(HashMap::new,
|
||||||
|
(map, pair) ->
|
||||||
|
map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())),
|
||||||
|
HashMap::putAll);
|
||||||
|
|
||||||
|
terraBiomeMap
|
||||||
|
.forEach((vb, terraBiomes) ->
|
||||||
|
NMSBiomeInjector.getEntry(biomeRegistry, vb)
|
||||||
|
.ifPresentOrElse(
|
||||||
|
vanilla -> terraBiomes
|
||||||
|
.forEach(tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb)
|
||||||
|
.ifPresentOrElse(
|
||||||
|
terra -> {
|
||||||
|
LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() +
|
||||||
|
" (vanilla for " +
|
||||||
|
terra.unwrapKey().orElseThrow().location() +
|
||||||
|
": " +
|
||||||
|
vanilla.tags().toList());
|
||||||
|
|
||||||
|
vanilla.tags()
|
||||||
|
.forEach(
|
||||||
|
tag -> collect
|
||||||
|
.computeIfAbsent(tag,
|
||||||
|
t -> new ArrayList<>())
|
||||||
|
.add(terra));
|
||||||
|
},
|
||||||
|
() -> LOGGER.error(
|
||||||
|
"No such biome: {}",
|
||||||
|
tb))),
|
||||||
|
() -> LOGGER.error("No vanilla biome: {}", vb)));
|
||||||
|
|
||||||
|
biomeRegistry.resetTags(); // clearTags
|
||||||
|
biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); // populateTags
|
||||||
|
|
||||||
|
} catch(SecurityException | IllegalArgumentException exception) {
|
||||||
|
throw new RuntimeException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-79
@@ -31,84 +31,6 @@ import com.dfsek.terra.registry.master.ConfigRegistry;
|
|||||||
|
|
||||||
|
|
||||||
public class NMSBiomeInjector {
|
public class NMSBiomeInjector {
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class);
|
|
||||||
private static final Map<ResourceLocation, List<ResourceLocation>> terraBiomeMap = new HashMap<>();
|
|
||||||
|
|
||||||
|
|
||||||
public static void registerBiomes(ConfigRegistry configRegistry) {
|
|
||||||
try {
|
|
||||||
LOGGER.info("Hacking biome registry...");
|
|
||||||
WritableRegistry<Biome> biomeRegistry = (WritableRegistry<Biome>) Registries.biomeRegistry();
|
|
||||||
|
|
||||||
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, false);
|
|
||||||
|
|
||||||
configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
|
|
||||||
try {
|
|
||||||
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
|
|
||||||
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
|
|
||||||
ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey());
|
|
||||||
Biome platform = createBiome(
|
|
||||||
biome,
|
|
||||||
biomeRegistry.get(vanillaMinecraftKey) // get
|
|
||||||
);
|
|
||||||
|
|
||||||
ResourceKey<Biome> delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", createBiomeID(pack, key)));
|
|
||||||
|
|
||||||
BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform);
|
|
||||||
biomeRegistry.register(delegateKey, platform, Lifecycle.stable());
|
|
||||||
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
|
|
||||||
|
|
||||||
terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());
|
|
||||||
|
|
||||||
LOGGER.debug("Registered biome: " + delegateKey);
|
|
||||||
} catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, true); // freeze registry again :)
|
|
||||||
|
|
||||||
LOGGER.info("Doing tag garbage....");
|
|
||||||
Map<TagKey<Biome>, List<Holder<Biome>>> collect = biomeRegistry
|
|
||||||
.getTags() // streamKeysAndEntries
|
|
||||||
.collect(HashMap::new,
|
|
||||||
(map, pair) ->
|
|
||||||
map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())),
|
|
||||||
HashMap::putAll);
|
|
||||||
|
|
||||||
terraBiomeMap
|
|
||||||
.forEach((vb, terraBiomes) ->
|
|
||||||
getEntry(biomeRegistry, vb)
|
|
||||||
.ifPresentOrElse(
|
|
||||||
vanilla -> terraBiomes
|
|
||||||
.forEach(tb -> getEntry(biomeRegistry, tb)
|
|
||||||
.ifPresentOrElse(
|
|
||||||
terra -> {
|
|
||||||
LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() +
|
|
||||||
" (vanilla for " +
|
|
||||||
terra.unwrapKey().orElseThrow().location() +
|
|
||||||
": " +
|
|
||||||
vanilla.tags().toList());
|
|
||||||
|
|
||||||
vanilla.tags()
|
|
||||||
.forEach(
|
|
||||||
tag -> collect
|
|
||||||
.computeIfAbsent(tag,
|
|
||||||
t -> new ArrayList<>())
|
|
||||||
.add(terra));
|
|
||||||
},
|
|
||||||
() -> LOGGER.error(
|
|
||||||
"No such biome: {}",
|
|
||||||
tb))),
|
|
||||||
() -> LOGGER.error("No vanilla biome: {}", vb)));
|
|
||||||
|
|
||||||
biomeRegistry.resetTags(); // clearTags
|
|
||||||
biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); // populateTags
|
|
||||||
|
|
||||||
} catch(SecurityException | IllegalArgumentException exception) {
|
|
||||||
throw new RuntimeException(exception);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> Optional<Holder<T>> getEntry(Registry<T> registry, ResourceLocation identifier) {
|
public static <T> Optional<Holder<T>> getEntry(Registry<T> registry, ResourceLocation identifier) {
|
||||||
return registry.getOptional(identifier)
|
return registry.getOptional(identifier)
|
||||||
@@ -116,7 +38,7 @@ public class NMSBiomeInjector {
|
|||||||
.map(registry::getOrCreateHolder);
|
.map(registry::getOrCreateHolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla)
|
public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla)
|
||||||
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
|
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
|
||||||
Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); // Builder
|
Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); // Builder
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import com.dfsek.terra.bukkit.nms.Initializer;
|
|||||||
public class NMSInitializer implements Initializer {
|
public class NMSInitializer implements Initializer {
|
||||||
@Override
|
@Override
|
||||||
public void initialize(PlatformImpl platform) {
|
public void initialize(PlatformImpl platform) {
|
||||||
NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry());
|
AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry());
|
||||||
Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin());
|
Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+102
@@ -0,0 +1,102 @@
|
|||||||
|
package com.dfsek.terra.bukkit.nms.v1_19_R1;
|
||||||
|
|
||||||
|
import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
|
||||||
|
import com.dfsek.terra.registry.master.ConfigRegistry;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.mojang.serialization.Lifecycle;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.core.MappedRegistry;
|
||||||
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.core.WritableRegistry;
|
||||||
|
import net.minecraft.data.BuiltinRegistries;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.tags.TagKey;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class AwfulBukkitHacks {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class);
|
||||||
|
|
||||||
|
private static final Map<ResourceLocation, List<ResourceLocation>> terraBiomeMap = new HashMap<>();
|
||||||
|
|
||||||
|
public static void registerBiomes(ConfigRegistry configRegistry) {
|
||||||
|
try {
|
||||||
|
LOGGER.info("Hacking biome registry...");
|
||||||
|
WritableRegistry<Biome> biomeRegistry = (WritableRegistry<Biome>) Registries.biomeRegistry();
|
||||||
|
|
||||||
|
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, false);
|
||||||
|
|
||||||
|
configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
|
||||||
|
try {
|
||||||
|
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
|
||||||
|
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
|
||||||
|
ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey());
|
||||||
|
Biome platform = NMSBiomeInjector.createBiome(
|
||||||
|
biome,
|
||||||
|
Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey)) // get
|
||||||
|
);
|
||||||
|
|
||||||
|
ResourceKey<Biome> delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY,
|
||||||
|
new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)));
|
||||||
|
|
||||||
|
BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform);
|
||||||
|
biomeRegistry.register(delegateKey, platform, Lifecycle.stable());
|
||||||
|
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
|
||||||
|
|
||||||
|
terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());
|
||||||
|
|
||||||
|
LOGGER.debug("Registered biome: " + delegateKey);
|
||||||
|
} catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, true); // freeze registry again :)
|
||||||
|
|
||||||
|
LOGGER.info("Doing tag garbage....");
|
||||||
|
Map<TagKey<Biome>, List<Holder<Biome>>> collect = biomeRegistry
|
||||||
|
.getTags() // streamKeysAndEntries
|
||||||
|
.collect(HashMap::new,
|
||||||
|
(map, pair) ->
|
||||||
|
map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())),
|
||||||
|
HashMap::putAll);
|
||||||
|
|
||||||
|
terraBiomeMap
|
||||||
|
.forEach((vb, terraBiomes) ->
|
||||||
|
NMSBiomeInjector.getEntry(biomeRegistry, vb)
|
||||||
|
.ifPresentOrElse(
|
||||||
|
vanilla -> terraBiomes
|
||||||
|
.forEach(tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb)
|
||||||
|
.ifPresentOrElse(
|
||||||
|
terra -> {
|
||||||
|
LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() +
|
||||||
|
" (vanilla for " +
|
||||||
|
terra.unwrapKey().orElseThrow().location() +
|
||||||
|
": " +
|
||||||
|
vanilla.tags().toList());
|
||||||
|
|
||||||
|
vanilla.tags()
|
||||||
|
.forEach(
|
||||||
|
tag -> collect
|
||||||
|
.computeIfAbsent(tag,
|
||||||
|
t -> new ArrayList<>())
|
||||||
|
.add(terra));
|
||||||
|
},
|
||||||
|
() -> LOGGER.error(
|
||||||
|
"No such biome: {}",
|
||||||
|
tb))),
|
||||||
|
() -> LOGGER.error("No vanilla biome: {}", vb)));
|
||||||
|
|
||||||
|
biomeRegistry.resetTags();
|
||||||
|
biomeRegistry.bindTags(ImmutableMap.copyOf(collect));
|
||||||
|
|
||||||
|
} catch(SecurityException | IllegalArgumentException exception) {
|
||||||
|
throw new RuntimeException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-80
@@ -31,85 +31,6 @@ import com.dfsek.terra.registry.master.ConfigRegistry;
|
|||||||
|
|
||||||
|
|
||||||
public class NMSBiomeInjector {
|
public class NMSBiomeInjector {
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(NMSBiomeInjector.class);
|
|
||||||
private static final Map<ResourceLocation, List<ResourceLocation>> terraBiomeMap = new HashMap<>();
|
|
||||||
|
|
||||||
|
|
||||||
public static void registerBiomes(ConfigRegistry configRegistry) {
|
|
||||||
try {
|
|
||||||
LOGGER.info("Hacking biome registry...");
|
|
||||||
WritableRegistry<Biome> biomeRegistry = (WritableRegistry<Biome>) Registries.biomeRegistry();
|
|
||||||
|
|
||||||
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, false);
|
|
||||||
|
|
||||||
configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
|
|
||||||
try {
|
|
||||||
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
|
|
||||||
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
|
|
||||||
ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey());
|
|
||||||
Biome platform = createBiome(
|
|
||||||
biome,
|
|
||||||
Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey)) // get
|
|
||||||
);
|
|
||||||
|
|
||||||
ResourceKey<Biome> delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY,
|
|
||||||
new ResourceLocation("terra", createBiomeID(pack, key)));
|
|
||||||
|
|
||||||
BuiltinRegistries.register(BuiltinRegistries.BIOME, delegateKey, platform);
|
|
||||||
biomeRegistry.register(delegateKey, platform, Lifecycle.stable());
|
|
||||||
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
|
|
||||||
|
|
||||||
terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());
|
|
||||||
|
|
||||||
LOGGER.debug("Registered biome: " + delegateKey);
|
|
||||||
} catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry<?>) biomeRegistry, true); // freeze registry again :)
|
|
||||||
|
|
||||||
LOGGER.info("Doing tag garbage....");
|
|
||||||
Map<TagKey<Biome>, List<Holder<Biome>>> collect = biomeRegistry
|
|
||||||
.getTags() // streamKeysAndEntries
|
|
||||||
.collect(HashMap::new,
|
|
||||||
(map, pair) ->
|
|
||||||
map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())),
|
|
||||||
HashMap::putAll);
|
|
||||||
|
|
||||||
terraBiomeMap
|
|
||||||
.forEach((vb, terraBiomes) ->
|
|
||||||
getEntry(biomeRegistry, vb)
|
|
||||||
.ifPresentOrElse(
|
|
||||||
vanilla -> terraBiomes
|
|
||||||
.forEach(tb -> getEntry(biomeRegistry, tb)
|
|
||||||
.ifPresentOrElse(
|
|
||||||
terra -> {
|
|
||||||
LOGGER.debug(vanilla.unwrapKey().orElseThrow().location() +
|
|
||||||
" (vanilla for " +
|
|
||||||
terra.unwrapKey().orElseThrow().location() +
|
|
||||||
": " +
|
|
||||||
vanilla.tags().toList());
|
|
||||||
|
|
||||||
vanilla.tags()
|
|
||||||
.forEach(
|
|
||||||
tag -> collect
|
|
||||||
.computeIfAbsent(tag,
|
|
||||||
t -> new ArrayList<>())
|
|
||||||
.add(terra));
|
|
||||||
},
|
|
||||||
() -> LOGGER.error(
|
|
||||||
"No such biome: {}",
|
|
||||||
tb))),
|
|
||||||
() -> LOGGER.error("No vanilla biome: {}", vb)));
|
|
||||||
|
|
||||||
biomeRegistry.resetTags();
|
|
||||||
biomeRegistry.bindTags(ImmutableMap.copyOf(collect));
|
|
||||||
|
|
||||||
} catch(SecurityException | IllegalArgumentException exception) {
|
|
||||||
throw new RuntimeException(exception);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> Optional<Holder<T>> getEntry(Registry<T> registry, ResourceLocation identifier) {
|
public static <T> Optional<Holder<T>> getEntry(Registry<T> registry, ResourceLocation identifier) {
|
||||||
return registry.getOptional(identifier)
|
return registry.getOptional(identifier)
|
||||||
@@ -117,7 +38,7 @@ public class NMSBiomeInjector {
|
|||||||
.map(registry::getOrCreateHolderOrThrow);
|
.map(registry::getOrCreateHolderOrThrow);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla)
|
public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla)
|
||||||
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
|
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
|
||||||
Biome.BiomeBuilder builder = new Biome.BiomeBuilder();
|
Biome.BiomeBuilder builder = new Biome.BiomeBuilder();
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ import com.dfsek.terra.bukkit.nms.Initializer;
|
|||||||
public class NMSInitializer implements Initializer {
|
public class NMSInitializer implements Initializer {
|
||||||
@Override
|
@Override
|
||||||
public void initialize(PlatformImpl platform) {
|
public void initialize(PlatformImpl platform) {
|
||||||
NMSBiomeInjector.registerBiomes(platform.getRawConfigRegistry());
|
AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry());
|
||||||
Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin());
|
Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,18 +2,15 @@ plugins {
|
|||||||
application
|
application
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
|
||||||
maven { url = uri("https://jitpack.io/") }
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaMainClass = "com.dfsek.terra.cli.TerraCLI"
|
val javaMainClass = "com.dfsek.terra.cli.TerraCLI"
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
shadedApi("commons-io:commons-io:${Versions.CLI.commonsIO}")
|
|
||||||
shadedApi("com.github.Querz:NBT:${Versions.CLI.nbt}")
|
|
||||||
shadedApi(project(":common:implementation:base"))
|
shadedApi(project(":common:implementation:base"))
|
||||||
|
|
||||||
shadedImplementation("com.google.guava:guava:31.0.1-jre")
|
shadedApi("commons-io:commons-io:${Versions.CLI.commonsIO}")
|
||||||
|
shadedApi("com.github.Querz:NBT:${Versions.CLI.nbt}")
|
||||||
|
|
||||||
|
shadedImplementation("com.google.guava:guava:${Versions.CLI.guava}")
|
||||||
|
|
||||||
shadedImplementation("ch.qos.logback:logback-classic:${Versions.CLI.logback}")
|
shadedImplementation("ch.qos.logback:logback-classic:${Versions.CLI.logback}")
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,22 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("fabric-loom") version Versions.Fabric.loom
|
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
||||||
id("architectury-plugin") version Versions.Mod.architectutyPlugin
|
id("architectury-plugin") version Versions.Mod.architecturyPlugin
|
||||||
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
||||||
}
|
}
|
||||||
|
|
||||||
|
architectury {
|
||||||
configurations {
|
platformSetupLoomIde()
|
||||||
val common by creating
|
loader("fabric")
|
||||||
compileClasspath.get().extendsFrom(common)
|
|
||||||
runtimeClasspath.get().extendsFrom(common)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
shadedApi(project(":common:implementation:base"))
|
shadedApi(project(":common:implementation:base"))
|
||||||
|
|
||||||
compileOnly("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}")
|
implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}")
|
"developmentFabric"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
annotationProcessor("net.fabricmc:fabric-loom:${Versions.Fabric.loom}")
|
|
||||||
|
|
||||||
"common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
|
||||||
shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionFabric")) { isTransitive = false }
|
shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionFabric")) { isTransitive = false }
|
||||||
"common"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false }
|
implementation(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false }
|
||||||
|
"developmentFabric"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false }
|
||||||
shaded(project(path = ":platforms:mixin-lifecycle", configuration = "transformProductionFabric")) { isTransitive = false }
|
shaded(project(path = ":platforms:mixin-lifecycle", configuration = "transformProductionFabric")) { isTransitive = false }
|
||||||
|
|
||||||
|
|
||||||
@@ -37,15 +33,25 @@ dependencies {
|
|||||||
|
|
||||||
modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
||||||
include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
||||||
|
|
||||||
|
modLocalRuntime("com.github.astei:lazydfu:${Versions.Mod.lazyDfu}")
|
||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener"))
|
accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener"))
|
||||||
|
|
||||||
mixin {
|
mixin {
|
||||||
defaultRefmapName.set("terra.fabric.refmap.json")
|
defaultRefmapName.set("terra.fabric.refmap.json")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
launches {
|
||||||
|
named("client") {
|
||||||
|
property("fabric.log.level", "debug")
|
||||||
|
}
|
||||||
|
named("server") {
|
||||||
|
property("fabric.log.level", "debug")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -57,11 +63,8 @@ tasks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
remapJar {
|
remapJar {
|
||||||
|
injectAccessWidener.set(true)
|
||||||
inputFile.set(shadowJar.get().archiveFile)
|
inputFile.set(shadowJar.get().archiveFile)
|
||||||
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
|
||||||
from(project(":platforms:mixin-common").file("terra.accesswidener"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
loom.platform=fabric
|
||||||
@@ -29,6 +29,5 @@
|
|||||||
"fabricloader": ">=0.14.2",
|
"fabricloader": ">=0.14.2",
|
||||||
"java": ">=17",
|
"java": ">=17",
|
||||||
"minecraft": "1.19.x"
|
"minecraft": "1.19.x"
|
||||||
},
|
}
|
||||||
"accessWidener": "terra.accesswidener"
|
|
||||||
}
|
}
|
||||||
@@ -1,31 +1,21 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
||||||
id("architectury-plugin") version Versions.Mod.architectutyPlugin
|
id("architectury-plugin") version Versions.Mod.architecturyPlugin
|
||||||
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
||||||
}
|
}
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
platformSetupLoomIde()
|
platformSetupLoomIde()
|
||||||
forge()
|
loader("forge")
|
||||||
}
|
|
||||||
|
|
||||||
configurations {
|
|
||||||
val common by creating
|
|
||||||
compileClasspath.get().extendsFrom(common)
|
|
||||||
runtimeClasspath.get().extendsFrom(common)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
shadedApi(project(":common:implementation:base"))
|
shadedApi(project(":common:implementation:base"))
|
||||||
"forgeRuntimeLibrary"(project(":common:implementation:base"))
|
"forgeRuntimeLibrary"(project(":common:implementation:base"))
|
||||||
|
|
||||||
|
implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
"common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
"developmentForge"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionForge")) { isTransitive = false }
|
shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionForge")) { isTransitive = false }
|
||||||
"developmentForge"(project(path = ":platforms:mixin-common", configuration = "namedElements")) {
|
|
||||||
isTransitive = false
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
forge(group = "net.minecraftforge", name = "forge", version = Versions.Forge.forge)
|
forge(group = "net.minecraftforge", name = "forge", version = Versions.Forge.forge)
|
||||||
|
|
||||||
@@ -38,12 +28,21 @@ dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener"))
|
accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener"))
|
||||||
|
|
||||||
mixin {
|
mixin {
|
||||||
defaultRefmapName.set("terra.forge.refmap.json")
|
defaultRefmapName.set("terra.forge.refmap.json")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
launches {
|
||||||
|
named("client") {
|
||||||
|
property("fabric.log.level", "debug")
|
||||||
|
}
|
||||||
|
named("server") {
|
||||||
|
property("fabric.log.level", "debug")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
forge {
|
forge {
|
||||||
convertAccessWideners.set(true)
|
convertAccessWideners.set(true)
|
||||||
mixinConfig("terra.common.mixins.json")
|
mixinConfig("terra.common.mixins.json")
|
||||||
@@ -67,16 +66,8 @@ tasks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shadowJar {
|
|
||||||
exclude("fabric.mod.json")
|
|
||||||
}
|
|
||||||
|
|
||||||
remapJar {
|
remapJar {
|
||||||
inputFile.set(shadowJar.get().archiveFile)
|
inputFile.set(shadowJar.get().archiveFile)
|
||||||
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
|
||||||
from(project(":platforms:mixin-common").file("terra.accesswidener"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,21 @@
|
|||||||
package com.dfsek.terra.forge.util;
|
package com.dfsek.terra.forge.util;
|
||||||
|
|
||||||
|
import com.dfsek.terra.mod.config.VanillaBiomeProperties;
|
||||||
|
import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor;
|
||||||
|
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.registry.BuiltinRegistries;
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
import net.minecraftforge.registries.ForgeRegistries;
|
||||||
import net.minecraftforge.registries.RegisterEvent.RegisterHelper;
|
import net.minecraftforge.registries.RegisterEvent.RegisterHelper;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
@@ -45,13 +52,15 @@ public final class BiomeUtil {
|
|||||||
*/
|
*/
|
||||||
private static void registerBiome(Biome biome, ConfigPack pack,
|
private static void registerBiome(Biome biome, ConfigPack pack,
|
||||||
com.dfsek.terra.api.registry.key.RegistryKey id, RegisterHelper<net.minecraft.world.biome.Biome> helper) {
|
com.dfsek.terra.api.registry.key.RegistryKey id, RegisterHelper<net.minecraft.world.biome.Biome> helper) {
|
||||||
RegistryKey<net.minecraft.world.biome.Biome> vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(BuiltinRegistries.BIOME);
|
RegistryKey<net.minecraft.world.biome.Biome> vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()) .get(BuiltinRegistries.BIOME);
|
||||||
|
|
||||||
|
|
||||||
if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) {
|
if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) {
|
||||||
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla);
|
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla);
|
||||||
} else {
|
} else {
|
||||||
net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla).value());
|
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
|
||||||
|
|
||||||
|
net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, ForgeRegistries.BIOMES.getDelegateOrThrow(vanilla).value(), vanillaBiomeProperties);
|
||||||
|
|
||||||
Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id));
|
Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id));
|
||||||
|
|
||||||
@@ -62,6 +71,10 @@ public final class BiomeUtil {
|
|||||||
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier).orElseThrow().getKey().orElseThrow());
|
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(ForgeRegistries.BIOMES.getHolder(identifier).orElseThrow().getKey().orElseThrow());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap();
|
||||||
|
|
||||||
|
villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS)));
|
||||||
|
|
||||||
MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier);
|
MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
||||||
id("architectury-plugin") version Versions.Mod.architectutyPlugin
|
id("architectury-plugin") version Versions.Mod.architecturyPlugin
|
||||||
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
accessWidenerPath.set(file("terra.accesswidener"))
|
accessWidenerPath.set(file("src/main/resources/terra.accesswidener"))
|
||||||
|
|
||||||
mixin {
|
mixin {
|
||||||
defaultRefmapName.set("terra.common.refmap.json")
|
defaultRefmapName.set("terra.common.refmap.json")
|
||||||
@@ -15,7 +15,8 @@ loom {
|
|||||||
dependencies {
|
dependencies {
|
||||||
shadedApi(project(":common:implementation:base"))
|
shadedApi(project(":common:implementation:base"))
|
||||||
|
|
||||||
modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}")
|
compileOnly("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
|
||||||
|
annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
|
||||||
|
|
||||||
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
||||||
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import com.dfsek.terra.mod.handle.MinecraftItemHandle;
|
|||||||
|
|
||||||
import com.dfsek.terra.mod.handle.MinecraftWorldHandle;
|
import com.dfsek.terra.mod.handle.MinecraftWorldHandle;
|
||||||
|
|
||||||
|
import com.dfsek.terra.mod.config.VillagerTypeTemplate;
|
||||||
|
|
||||||
import net.minecraft.entity.EntityType;
|
import net.minecraft.entity.EntityType;
|
||||||
import net.minecraft.entity.SpawnGroup;
|
import net.minecraft.entity.SpawnGroup;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
@@ -21,6 +23,7 @@ import net.minecraft.sound.MusicSound;
|
|||||||
import net.minecraft.sound.SoundEvent;
|
import net.minecraft.sound.SoundEvent;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.registry.BuiltinRegistries;
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
import net.minecraft.world.biome.Biome.Precipitation;
|
import net.minecraft.world.biome.Biome.Precipitation;
|
||||||
import net.minecraft.world.biome.Biome.TemperatureModifier;
|
import net.minecraft.world.biome.Biome.TemperatureModifier;
|
||||||
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
|
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
|
||||||
@@ -89,7 +92,8 @@ public abstract class ModPlatform extends AbstractPlatform {
|
|||||||
.registerLoader(SpawnEntry.class, SpawnEntryTemplate::new)
|
.registerLoader(SpawnEntry.class, SpawnEntryTemplate::new)
|
||||||
.registerLoader(SpawnGroup.class, SpawnGroupTemplate::new)
|
.registerLoader(SpawnGroup.class, SpawnGroupTemplate::new)
|
||||||
.registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new)
|
.registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new)
|
||||||
.registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new);
|
.registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new)
|
||||||
|
.registerLoader(VillagerType.class, VillagerTypeTemplate::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException {
|
private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException {
|
||||||
|
|||||||
+9
@@ -7,6 +7,7 @@ import net.minecraft.sound.BiomeAdditionsSound;
|
|||||||
import net.minecraft.sound.BiomeMoodSound;
|
import net.minecraft.sound.BiomeMoodSound;
|
||||||
import net.minecraft.sound.MusicSound;
|
import net.minecraft.sound.MusicSound;
|
||||||
import net.minecraft.sound.SoundEvent;
|
import net.minecraft.sound.SoundEvent;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
import net.minecraft.world.biome.Biome.Precipitation;
|
import net.minecraft.world.biome.Biome.Precipitation;
|
||||||
import net.minecraft.world.biome.Biome.TemperatureModifier;
|
import net.minecraft.world.biome.Biome.TemperatureModifier;
|
||||||
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
|
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
|
||||||
@@ -85,6 +86,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
|
|||||||
@Default
|
@Default
|
||||||
private SpawnSettings spawnSettings = null;
|
private SpawnSettings spawnSettings = null;
|
||||||
|
|
||||||
|
@Value("villager-type")
|
||||||
|
@Default
|
||||||
|
private VillagerType villagerType = null;
|
||||||
|
|
||||||
public Integer getGrassColor() {
|
public Integer getGrassColor() {
|
||||||
return grassColor;
|
return grassColor;
|
||||||
}
|
}
|
||||||
@@ -152,4 +157,8 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
|
|||||||
public SpawnSettings getSpawnSettings() {
|
public SpawnSettings getSpawnSettings() {
|
||||||
return spawnSettings;
|
return spawnSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public VillagerType getVillagerType() {
|
||||||
|
return villagerType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
package com.dfsek.terra.mod.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
|
|
||||||
|
|
||||||
|
public class VillagerTypeTemplate implements ObjectTemplate<VillagerType> {
|
||||||
|
@Value("id")
|
||||||
|
@Default
|
||||||
|
private Identifier id = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VillagerType get() {
|
||||||
|
return Registry.VILLAGER_TYPE.get(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package com.dfsek.terra.mod.mixin.access;
|
||||||
|
|
||||||
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
|
import net.minecraft.world.biome.Biome;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Mixin(VillagerType.class)
|
||||||
|
public interface VillagerTypeAccessor {
|
||||||
|
@Accessor("BIOME_TO_TYPE")
|
||||||
|
static Map<RegistryKey<Biome>, VillagerType> getBiomeTypeToIdMap() {
|
||||||
|
throw new AssertionError("Untransformed Accessor!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.dfsek.terra.mod.util;
|
package com.dfsek.terra.mod.util;
|
||||||
|
|
||||||
|
import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor;
|
||||||
|
|
||||||
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
import net.minecraft.block.entity.LootableContainerBlockEntity;
|
||||||
import net.minecraft.block.entity.MobSpawnerBlockEntity;
|
import net.minecraft.block.entity.MobSpawnerBlockEntity;
|
||||||
import net.minecraft.block.entity.SignBlockEntity;
|
import net.minecraft.block.entity.SignBlockEntity;
|
||||||
@@ -8,6 +10,7 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.util.registry.RegistryEntry;
|
import net.minecraft.util.registry.RegistryEntry;
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
import net.minecraft.world.WorldAccess;
|
import net.minecraft.world.WorldAccess;
|
||||||
import net.minecraft.world.biome.Biome;
|
import net.minecraft.world.biome.Biome;
|
||||||
import net.minecraft.world.biome.Biome.Builder;
|
import net.minecraft.world.biome.Biome.Builder;
|
||||||
@@ -89,15 +92,13 @@ public final class MinecraftUtil {
|
|||||||
return RegistryKey.of(Registry.BIOME_KEY, identifier);
|
return RegistryKey.of(Registry.BIOME_KEY, identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) {
|
public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla, VanillaBiomeProperties vanillaBiomeProperties) {
|
||||||
GenerationSettings.Builder generationSettings = new GenerationSettings.Builder();
|
GenerationSettings.Builder generationSettings = new GenerationSettings.Builder();
|
||||||
|
|
||||||
BiomeEffects.Builder effects = new BiomeEffects.Builder();
|
BiomeEffects.Builder effects = new BiomeEffects.Builder();
|
||||||
|
|
||||||
net.minecraft.world.biome.Biome.Builder builder = new Builder();
|
net.minecraft.world.biome.Biome.Builder builder = new Builder();
|
||||||
|
|
||||||
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
|
|
||||||
|
|
||||||
effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
|
effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
|
||||||
.waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor()))
|
.waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor()))
|
||||||
.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor()))
|
.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor()))
|
||||||
|
|||||||
File renamed without changes.
@@ -8,6 +8,7 @@
|
|||||||
"access.MobSpawnerLogicAccessor",
|
"access.MobSpawnerLogicAccessor",
|
||||||
"access.StateAccessor",
|
"access.StateAccessor",
|
||||||
"access.StructureAccessorAccessor",
|
"access.StructureAccessorAccessor",
|
||||||
|
"access.VillagerTypeAccessor",
|
||||||
"fix.BeeMoveGoalsUnsynchronizedRandomAccessFix",
|
"fix.BeeMoveGoalsUnsynchronizedRandomAccessFix",
|
||||||
"fix.NetherFossilOptimization",
|
"fix.NetherFossilOptimization",
|
||||||
"implementations.compat.GenerationSettingsFloraFeaturesMixin",
|
"implementations.compat.GenerationSettingsFloraFeaturesMixin",
|
||||||
|
|||||||
@@ -1,31 +1,40 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
||||||
id("architectury-plugin") version Versions.Mod.architectutyPlugin
|
id("architectury-plugin") version Versions.Mod.architecturyPlugin
|
||||||
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
shadedApi(project(":common:implementation:base"))
|
||||||
|
|
||||||
|
compileOnly("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
|
||||||
|
annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
|
||||||
|
|
||||||
|
implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
|
|
||||||
|
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
||||||
|
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
||||||
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener"))
|
accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener"))
|
||||||
|
|
||||||
mixin {
|
mixin {
|
||||||
defaultRefmapName.set("terra.lifecycle.refmap.json")
|
defaultRefmapName.set("terra.lifecycle.refmap.json")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
tasks {
|
||||||
shadedApi(project(":common:implementation:base"))
|
compileJava {
|
||||||
|
options.release.set(17)
|
||||||
|
}
|
||||||
|
|
||||||
modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}")
|
remapJar {
|
||||||
compileOnly("net.fabricmc:sponge-mixin:${Versions.Fabric.mixin}")
|
inputFile.set(shadowJar.get().archiveFile)
|
||||||
|
}
|
||||||
compileOnly(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
|
||||||
|
|
||||||
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
|
||||||
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
common("fabric", "quilt")
|
common("fabric", "quilt")
|
||||||
minecraft = Versions.Mod.minecraft
|
minecraft = Versions.Mod.minecraft
|
||||||
}
|
}
|
||||||
|
|
||||||
+14
-1
@@ -1,13 +1,20 @@
|
|||||||
package com.dfsek.terra.lifecycle.util;
|
package com.dfsek.terra.lifecycle.util;
|
||||||
|
|
||||||
|
import com.dfsek.terra.mod.config.VanillaBiomeProperties;
|
||||||
|
|
||||||
|
import com.dfsek.terra.mod.mixin.access.VillagerTypeAccessor;
|
||||||
|
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.registry.BuiltinRegistries;
|
import net.minecraft.util.registry.BuiltinRegistries;
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
|
import net.minecraft.village.VillagerType;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
@@ -49,7 +56,9 @@ public final class BiomeUtil {
|
|||||||
if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) {
|
if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) {
|
||||||
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla);
|
((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(vanilla);
|
||||||
} else {
|
} else {
|
||||||
net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla));
|
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
|
||||||
|
|
||||||
|
net.minecraft.world.biome.Biome minecraftBiome = MinecraftUtil.createBiome(biome, registry.get(vanilla), vanillaBiomeProperties);
|
||||||
|
|
||||||
Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id));
|
Identifier identifier = new Identifier("terra", MinecraftUtil.createBiomeID(pack, id));
|
||||||
|
|
||||||
@@ -64,6 +73,10 @@ public final class BiomeUtil {
|
|||||||
minecraftBiome).getKey().orElseThrow());
|
minecraftBiome).getKey().orElseThrow());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map villagerMap = VillagerTypeAccessor.getBiomeTypeToIdMap();
|
||||||
|
|
||||||
|
villagerMap.put(RegistryKey.of(Registry.BIOME_KEY, identifier), Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), villagerMap.getOrDefault(vanilla, VillagerType.PLAINS)));
|
||||||
|
|
||||||
MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier);
|
MinecraftUtil.TERRA_BIOME_MAP.computeIfAbsent(vanilla.getValue(), i -> new ArrayList<>()).add(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,53 +1,61 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("org.quiltmc.loom") version Versions.Quilt.loom
|
id("dev.architectury.loom") version Versions.Mod.architecuryLoom
|
||||||
id("architectury-plugin") version Versions.Mod.architectutyPlugin
|
id("architectury-plugin") version Versions.Mod.architecturyPlugin
|
||||||
|
id("io.github.juuxel.loom-quiltflower") version Versions.Mod.loomQuiltflower
|
||||||
}
|
}
|
||||||
|
|
||||||
|
architectury {
|
||||||
configurations {
|
platformSetupLoomIde()
|
||||||
val common by creating
|
loader("quilt")
|
||||||
compileClasspath.get().extendsFrom(common)
|
|
||||||
runtimeClasspath.get().extendsFrom(common)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
shadedApi(project(":common:implementation:base"))
|
shadedApi(project(":common:implementation:base"))
|
||||||
|
|
||||||
"common"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
|
"developmentQuilt"(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }
|
||||||
shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionQuilt")) { isTransitive = false }
|
shaded(project(path = ":platforms:mixin-common", configuration = "transformProductionQuilt")) { isTransitive = false }
|
||||||
"common"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false }
|
implementation(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false }
|
||||||
|
"developmentQuilt"(project(path = ":platforms:mixin-lifecycle", configuration = "namedElements")) { isTransitive = false }
|
||||||
shaded(project(path = ":platforms:mixin-lifecycle", configuration = "transformProductionQuilt")) { isTransitive = false }
|
shaded(project(path = ":platforms:mixin-lifecycle", configuration = "transformProductionQuilt")) { isTransitive = false }
|
||||||
|
|
||||||
|
|
||||||
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
|
||||||
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
|
||||||
|
|
||||||
modImplementation("org.quiltmc:quilt-loader:${Versions.Quilt.quiltLoader}")
|
modImplementation("org.quiltmc:quilt-loader:${Versions.Quilt.quiltLoader}")
|
||||||
|
|
||||||
modApi("org.quiltmc.quilted-fabric-api:quilted-fabric-api:${Versions.Quilt.fabricApi}")
|
modImplementation("org.quiltmc.quilted-fabric-api:quilted-fabric-api:${Versions.Quilt.fabricApi}")
|
||||||
|
|
||||||
setOf(
|
modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) {
|
||||||
"fabric-lifecycle-events-v1",
|
exclude("net.fabricmc")
|
||||||
"fabric-resource-loader-v0",
|
exclude("net.fabricmc.fabric-api")
|
||||||
"fabric-api-base",
|
}
|
||||||
"fabric-command-api-v2",
|
include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud) {
|
||||||
"fabric-networking-api-v1"
|
exclude("net.fabricmc")
|
||||||
).forEach { apiModule ->
|
exclude("net.fabricmc.fabric-api")
|
||||||
val module = fabricApi.module(apiModule, Versions.Fabric.fabricAPI)
|
|
||||||
modImplementation(module)
|
|
||||||
include(module)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
modImplementation("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
modLocalRuntime("com.github.astei:lazydfu:${Versions.Mod.lazyDfu}") {
|
||||||
include("cloud.commandframework", "cloud-fabric", Versions.Libraries.cloud)
|
exclude("net.fabricmc")
|
||||||
|
exclude("net.fabricmc.fabric-api")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loom {
|
loom {
|
||||||
accessWidenerPath.set(project(":platforms:mixin-common").file("terra.accesswidener"))
|
accessWidenerPath.set(project(":platforms:mixin-common").file("src/main/resources/terra.accesswidener"))
|
||||||
|
|
||||||
mixin {
|
mixin {
|
||||||
defaultRefmapName.set("terra.quilt.refmap.json")
|
defaultRefmapName.set("terra.quilt.refmap.json")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
launches {
|
||||||
|
named("client") {
|
||||||
|
property("fabric.log.level", "debug")
|
||||||
|
}
|
||||||
|
named("server") {
|
||||||
|
property("fabric.log.level", "debug")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -59,11 +67,8 @@ tasks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
remapJar {
|
remapJar {
|
||||||
|
injectAccessWidener.set(true)
|
||||||
inputFile.set(shadowJar.get().archiveFile)
|
inputFile.set(shadowJar.get().archiveFile)
|
||||||
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
archiveFileName.set("${rootProject.name.capitalize()}-${project.version}.jar")
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
|
||||||
from(project(":platforms:mixin-common").file("terra.accesswidener"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
loom.platform=quilt
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.dfsek.terra.quilt;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* So you want to Mixin into Authlib/Brigadier/DataFixerUpper, on Fabric you'll need this guy.
|
||||||
|
*
|
||||||
|
* <p>YOU SHOULD ONLY USE THIS CLASS DURING "preLaunch" and ONLY TARGET A CLASS WHICH IS NOT ANY CLASS YOU MIXIN TO.
|
||||||
|
*
|
||||||
|
* This will likely not work on Gson because FabricLoader has some special logic related to Gson.
|
||||||
|
*/
|
||||||
|
public final class AwfulQuiltHacks {
|
||||||
|
private AwfulQuiltHacks() {}
|
||||||
|
|
||||||
|
private static final ClassLoader KNOT_CLASSLOADER = Thread.currentThread().getContextClassLoader();
|
||||||
|
private static final Method ADD_URL_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Method tempAddUrlMethod = null;
|
||||||
|
try {
|
||||||
|
tempAddUrlMethod = KNOT_CLASSLOADER.getClass().getMethod("addURL", URL.class);
|
||||||
|
tempAddUrlMethod.setAccessible(true);
|
||||||
|
} catch (ReflectiveOperationException e) {
|
||||||
|
throw new RuntimeException("Failed to load Classloader fields", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_URL_METHOD = tempAddUrlMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hackily load the package which a mixin may exist within.
|
||||||
|
*
|
||||||
|
* YOU SHOULD NOT TARGET A CLASS WHICH YOU MIXIN TO.
|
||||||
|
*
|
||||||
|
* @param pathOfAClass The path of any class within the package.
|
||||||
|
*/
|
||||||
|
public static void hackilyLoadForMixin(String pathOfAClass) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException {
|
||||||
|
URL url = Class.forName(pathOfAClass).getProtectionDomain().getCodeSource().getLocation();
|
||||||
|
ADD_URL_METHOD.invoke(KNOT_CLASSLOADER, url);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.dfsek.terra.quilt;
|
||||||
|
|
||||||
|
import cloud.commandframework.brigadier.BrigadierMappingBuilder;
|
||||||
|
import org.quiltmc.loader.api.ModContainer;
|
||||||
|
import org.quiltmc.loader.api.QuiltLoader;
|
||||||
|
import org.quiltmc.loader.api.entrypoint.PreLaunchEntrypoint;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
|
||||||
|
public class QuiltPreLaunchEntryPoint implements PreLaunchEntrypoint {
|
||||||
|
@Override
|
||||||
|
public void onPreLaunch(ModContainer mod) {
|
||||||
|
if (QuiltLoader.isDevelopmentEnvironment()) {
|
||||||
|
try {
|
||||||
|
AwfulQuiltHacks.hackilyLoadForMixin(BrigadierMappingBuilder.class.getName());
|
||||||
|
} catch(ClassNotFoundException | InvocationTargetException | IllegalAccessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,9 @@
|
|||||||
"entrypoints": {
|
"entrypoints": {
|
||||||
"init": [
|
"init": [
|
||||||
"com.dfsek.terra.quilt.QuiltEntryPoint"
|
"com.dfsek.terra.quilt.QuiltEntryPoint"
|
||||||
|
],
|
||||||
|
"pre_launch": [
|
||||||
|
"com.dfsek.terra.quilt.QuiltPreLaunchEntryPoint"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"depends": [
|
"depends": [
|
||||||
@@ -48,6 +51,5 @@
|
|||||||
"terra.quilt.mixins.json",
|
"terra.quilt.mixins.json",
|
||||||
"terra.lifecycle.mixins.json",
|
"terra.lifecycle.mixins.json",
|
||||||
"terra.common.mixins.json"
|
"terra.common.mixins.json"
|
||||||
],
|
]
|
||||||
"accessWidener": "terra.accesswidener"
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user