From a286e266569fd93a24abad9460d56fa1e2a250bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB?= Date: Mon, 11 Jul 2022 14:57:43 -0700 Subject: [PATCH] Bukkit --- .../com/dfsek/terra/bukkit/BukkitAddon.java | 17 +- .../com/dfsek/terra/bukkit/PlatformImpl.java | 2 +- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 6 +- .../bukkit/config/VanillaBiomeProperties.java | 58 ------ .../dfsek/terra/bukkit/nms/Initializer.java | 41 +++-- .../bukkit/nms/v1_18_R2/NMSBiomeInjector.java | 1 - .../bukkit/nms/v1_19_R1/AwfulBukkitHacks.java | 77 ++++---- .../terra/bukkit/nms/v1_19_R1/NMSAddon.java | 28 +++ .../bukkit/nms/v1_19_R1/NMSBiomeInjector.java | 99 +++++----- .../bukkit/nms/v1_19_R1/NMSInitializer.java | 15 -- .../bukkit/nms/v1_19_R1/NMSPlatform.java | 94 ++++++++++ .../terra/bukkit/nms/v1_19_R1/Reflection.java | 17 ++ .../config/BiomeAdditionsSoundTemplate.java | 27 +++ .../config/BiomeMoodSoundTemplate.java | 35 ++++ .../config/BiomeParticleConfigTemplate.java | 33 ++++ .../v1_19_R1/config/EntityTypeTemplate.java | 20 ++ .../v1_19_R1/config/MusicSoundTemplate.java | 35 ++++ .../v1_19_R1/config/SoundEventTemplate.java | 29 +++ .../nms/v1_19_R1/config/SpawnCostConfig.java | 38 ++++ .../v1_19_R1/config/SpawnEntryTemplate.java | 31 ++++ .../config/SpawnSettingsTemplate.java | 43 +++++ .../nms/v1_19_R1/config/SpawnTypeConfig.java | 32 ++++ .../config/VanillaBiomeProperties.java | 174 ++++++++++++++++++ .../v1_19_R1/config/VillagerTypeTemplate.java | 20 ++ 24 files changed, 774 insertions(+), 198 deletions(-) delete mode 100644 platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSAddon.java delete mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSPlatform.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeAdditionsSoundTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeMoodSoundTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeParticleConfigTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/EntityTypeTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/MusicSoundTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SoundEventTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnCostConfig.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnEntryTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnSettingsTemplate.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnTypeConfig.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java create mode 100644 platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VillagerTypeTemplate.java diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java index ac215b83e..a0fa8362d 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java @@ -7,31 +7,18 @@ import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; public class BukkitAddon implements BaseAddon { private static final Version VERSION = Versions.getVersion(1, 0, 0); - private final PlatformImpl terraBukkitPlugin; + protected final PlatformImpl terraBukkitPlugin; public BukkitAddon(PlatformImpl terraBukkitPlugin) { this.terraBukkitPlugin = terraBukkitPlugin; } - @Override - public void initialize() { - terraBukkitPlugin.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(this, ConfigurationLoadEvent.class) - .then(event -> { - if(event.is(Biome.class)) { - event.getLoadedObject(Biome.class).getContext().put(event.load(new VanillaBiomeProperties())); - } - }) - .global(); - } - + @Override public Version getVersion() { return VERSION; diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index bba0e1bc1..f802fcac5 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -117,7 +117,7 @@ public class PlatformImpl extends AbstractPlatform { } - private BukkitPlatformBiome parseBiome(String id, DepthTracker depthTracker) throws LoadException { + protected BukkitPlatformBiome parseBiome(String id, DepthTracker depthTracker) throws LoadException { if(!id.startsWith("minecraft:")) throw new LoadException("Invalid biome identifier " + id, depthTracker); return new BukkitPlatformBiome(org.bukkit.block.Biome.valueOf(id.toUpperCase(Locale.ROOT).substring(10))); } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 6390444f2..b3d8c1d36 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -47,7 +47,7 @@ import com.dfsek.terra.bukkit.world.BukkitAdapter; public class TerraBukkitPlugin extends JavaPlugin { private static final Logger logger = LoggerFactory.getLogger(TerraBukkitPlugin.class); - private final PlatformImpl platform = new PlatformImpl(this); + private PlatformImpl platform; private final Map generatorMap = new HashMap<>(); @Override @@ -56,6 +56,8 @@ public class TerraBukkitPlugin extends JavaPlugin { return; } + platform = Initializer.init(this); + platform.getEventManager().callEvent(new PlatformInitializationEvent()); @@ -91,8 +93,6 @@ public class TerraBukkitPlugin extends JavaPlugin { Bukkit.getPluginManager().registerEvents(new CommonListener(), this); // Register master event listener PaperUtil.checkPaper(this); - - Initializer.init(platform); } public PlatformImpl getPlatform() { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java deleted file mode 100644 index 8b2d77e50..000000000 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/config/VanillaBiomeProperties.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dfsek.terra.bukkit.config; - -import com.dfsek.tectonic.api.config.template.ConfigTemplate; -import com.dfsek.tectonic.api.config.template.annotations.Default; -import com.dfsek.tectonic.api.config.template.annotations.Value; - -import com.dfsek.terra.api.properties.Properties; - - -public class VanillaBiomeProperties implements ConfigTemplate, Properties { - @Value("colors.grass") - @Default - private Integer grassColor = null; - - @Value("colors.fog") - @Default - private Integer fogColor = null; - - @Value("colors.water") - @Default - private Integer waterColor = null; - - @Value("colors.water-fog") - @Default - private Integer waterFogColor = null; - - @Value("colors.foliage") - @Default - private Integer foliageColor = null; - - @Value("colors.sky") - @Default - private Integer skyColor = null; - - public Integer getFogColor() { - return fogColor; - } - - public Integer getFoliageColor() { - return foliageColor; - } - - public Integer getGrassColor() { - return grassColor; - } - - public Integer getWaterColor() { - return waterColor; - } - - public Integer getWaterFogColor() { - return waterFogColor; - } - - public Integer getSkyColor() { - return skyColor; - } -} diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java index 2c8f1c211..8b7085f86 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/nms/Initializer.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit.nms; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; + import org.bukkit.Bukkit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,30 +13,35 @@ public interface Initializer { String NMS = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; String TERRA_PACKAGE = Initializer.class.getPackageName(); - static void init(PlatformImpl platform) { + static PlatformImpl init(TerraBukkitPlugin plugin) { Logger logger = LoggerFactory.getLogger(Initializer.class); try { - Class initializerClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSInitializer"); + Class initializerClass = Class.forName(TERRA_PACKAGE + "." + NMS + ".NMSPlatform"); try { - Initializer initializer = (Initializer) initializerClass.getConstructor().newInstance(); - initializer.initialize(platform); + return (PlatformImpl) initializerClass.getConstructor().newInstance(plugin); } catch(ReflectiveOperationException e) { throw new RuntimeException("Error initializing NMS bindings. Report this to Terra.", e); } } catch(ClassNotFoundException e) { - logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); - logger.error("This is usually due to running Terra on an unsupported Minecraft version."); - logger.error(""); - logger.error(""); - for(int i = 0; i < 20; i++) { - logger.error("PROCEEDING WITH AN EXISTING TERRA WORLD WILL RESULT IN CORRUPTION!!!"); - } - logger.error(""); - logger.error(""); - logger.error("NMS bindings for version {} do not exist. Support for this version is limited.", NMS); - logger.error("This is usually due to running Terra on an unsupported Minecraft version."); + Runnable runnable = () -> { // scary big block of text + logger.error("NMS bindings for version {} do not exist.", NMS); + logger.error("This is usually due to running Terra on an unsupported Minecraft version."); + logger.error("Terra will now be DISABLED."); + logger.error(""); + logger.error(""); + for(int i = 0; i < 20; i++) { + logger.error("PROCEEDING WITH AN EXISTING TERRA WORLD WILL RESULT IN CORRUPTION!!!"); + } + logger.error(""); + logger.error(""); + logger.error("NMS bindings for version {} do not exist.", NMS); + logger.error("This is usually due to running Terra on an unsupported Minecraft version."); + logger.error("Terra will now be DISABLED."); + }; + runnable.run(); + Bukkit.getScheduler().scheduleAsyncDelayedTask(plugin, runnable, 200L); + Bukkit.getPluginManager().disablePlugin(plugin); } + return null; } - - void initialize(PlatformImpl plugin); } diff --git a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java index 6271e4632..2fa3b8f43 100644 --- a/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_18_R2/src/main/java/com/dfsek/terra/bukkit/nms/v1_18_R2/NMSBiomeInjector.java @@ -11,7 +11,6 @@ import java.util.Objects; import java.util.Optional; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; public class NMSBiomeInjector { diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java index 3bce51cdd..851333a4c 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/AwfulBukkitHacks.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit.nms.v1_19_R1; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.VanillaBiomeProperties; + import com.google.common.collect.ImmutableMap; import com.mojang.serialization.Lifecycle; import net.minecraft.core.Holder; @@ -10,8 +12,8 @@ import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.npc.VillagerType; import net.minecraft.world.level.biome.Biome; -import org.bukkit.NamespacedKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -28,7 +31,8 @@ import com.dfsek.terra.registry.master.ConfigRegistry; public class AwfulBukkitHacks { private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class); - private static final Map> terraBiomeMap = new HashMap<>(); + public static final Map, List> + TERRA_BIOME_TAG_MAP = new HashMap<>(); public static void registerBiomes(ConfigRegistry configRegistry) { try { @@ -40,22 +44,27 @@ public class AwfulBukkitHacks { 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 delegateKey = ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key))); - + + VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); + + Biome platform = NMSBiomeInjector.createBiome(vanillaBiomeProperties); + 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()); + Map villagerMap = Reflection.VILLAGER_TYPE.getByBiome(); + + villagerMap.put(ResourceKey.create(Registry.BIOME_REGISTRY, delegateKey.location()), + Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(), VillagerType.PLAINS)); + + for(ResourceLocation tag : vanillaBiomeProperties.getTags()) { + TERRA_BIOME_TAG_MAP.getOrDefault(TagKey.create(Registry.BIOME_REGISTRY, tag), new ArrayList<>()).add(delegateKey.location()); + } LOGGER.debug("Registered biome: " + delegateKey); } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { @@ -64,47 +73,25 @@ public class AwfulBukkitHacks { })); Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) - - LOGGER.info("Doing tag garbage...."); + + LOGGER.info("Doing data-driven biome tag garbage...."); + LOGGER.info("who let this data drive?"); Map, List>> 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))); + + TERRA_BIOME_TAG_MAP.forEach((tag, biomeList) -> { + collect.getOrDefault(tag, new ArrayList<>()) + .addAll(biomeList.stream() + .map(biomeRegistry::getOptional) + .filter(Optional::isPresent) + .map(Optional::get) + .map(Holder::direct) + .toList()); + }); biomeRegistry.resetTags(); biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSAddon.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSAddon.java new file mode 100644 index 000000000..a66bd9804 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSAddon.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1; + +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.bukkit.BukkitAddon; +import com.dfsek.terra.bukkit.PlatformImpl; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.VanillaBiomeProperties; + + +public class NMSAddon extends BukkitAddon { + public NMSAddon(PlatformImpl terraBukkitPlugin) { + super(terraBukkitPlugin); + } + + @Override + public void initialize() { + terraBukkitPlugin.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigurationLoadEvent.class) + .then(event -> { + if(event.is(Biome.class)) { + event.getLoadedObject(Biome.class).getContext().put(event.load(new VanillaBiomeProperties())); + } + }) + .global(); + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java index 8a5d56c35..78e99db0e 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSBiomeInjector.java @@ -1,9 +1,13 @@ package com.dfsek.terra.bukkit.nms.v1_19_R1; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.VanillaBiomeProperties; + import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeBuilder; +import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.BiomeSpecialEffects; import java.util.Locale; @@ -11,7 +15,6 @@ import java.util.Objects; import java.util.Optional; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; public class NMSBiomeInjector { @@ -22,54 +25,64 @@ public class NMSBiomeInjector { .map(registry::getOrCreateHolderOrThrow); } - public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) + public static Biome createBiome(VanillaBiomeProperties vanillaBiomeProperties) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); - - builder - .precipitation(vanilla.getPrecipitation()) - .downfall(vanilla.getDownfall()) - .temperature(vanilla.getBaseTemperature()) - .mobSpawnSettings(vanilla.getMobSettings()) - .generationSettings(vanilla.getGenerationSettings()); - - + + BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); + BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); - - effects.grassColorModifier(vanilla.getSpecialEffects().getGrassColorModifier()); - - VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - - effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor())) - - .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor())) - - .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor())) - - .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor())); - - if(vanillaBiomeProperties.getFoliageColor() == null) { - vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride); - } else { + + net.minecraft.world.level.biome.Biome.BiomeBuilder builder = new BiomeBuilder(); + + effects.waterColor(Objects.requireNonNull(vanillaBiomeProperties.getWaterColor())) + .waterFogColor(Objects.requireNonNull(vanillaBiomeProperties.getWaterFogColor())) + .fogColor(Objects.requireNonNull(vanillaBiomeProperties.getFogColor())) + .skyColor(Objects.requireNonNull(vanillaBiomeProperties.getSkyColor())) + .grassColorModifier( + Objects.requireNonNull(vanillaBiomeProperties.getGrassColorModifier())); + + if(vanillaBiomeProperties.getFoliageColor() != null) { effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor()); } - - if(vanillaBiomeProperties.getGrassColor() == null) { - vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride); - } else { - // grass + + if(vanillaBiomeProperties.getGrassColor() != null) { effects.grassColorOverride(vanillaBiomeProperties.getGrassColor()); } - - vanilla.getAmbientLoop().ifPresent(effects::ambientLoopSound); - vanilla.getAmbientAdditions().ifPresent(effects::ambientAdditionsSound); - vanilla.getAmbientMood().ifPresent(effects::ambientMoodSound); - vanilla.getBackgroundMusic().ifPresent(effects::backgroundMusic); - vanilla.getAmbientParticle().ifPresent(effects::ambientParticle); - - builder.specialEffects(effects.build()); - - return builder.build(); + + if(vanillaBiomeProperties.getParticleConfig() != null) { + effects.ambientParticle(vanillaBiomeProperties.getParticleConfig()); + } + + if(vanillaBiomeProperties.getLoopSound() != null) { + effects.ambientLoopSound(vanillaBiomeProperties.getLoopSound()); + } + + if(vanillaBiomeProperties.getMoodSound() != null) { + effects.ambientMoodSound(vanillaBiomeProperties.getMoodSound()); + } + + if(vanillaBiomeProperties.getAdditionsSound() != null) { + effects.ambientAdditionsSound(vanillaBiomeProperties.getAdditionsSound()); + } + + if(vanillaBiomeProperties.getMusic() != null) { + effects.backgroundMusic(vanillaBiomeProperties.getMusic()); + } + + builder.precipitation(Objects.requireNonNull(vanillaBiomeProperties.getPrecipitation())); + + builder.temperature(Objects.requireNonNull(vanillaBiomeProperties.getTemperature())); + + builder.downfall(Objects.requireNonNull(vanillaBiomeProperties.getDownfall())); + + builder.temperatureAdjustment(Objects.requireNonNull(vanillaBiomeProperties.getTemperatureModifier())); + + builder.mobSpawnSettings(Objects.requireNonNull(vanillaBiomeProperties.getSpawnSettings())); + + return builder + .specialEffects(effects.build()) + .generationSettings(generationSettings.build()) + .build(); } public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java deleted file mode 100644 index 82a293cd1..000000000 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSInitializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dfsek.terra.bukkit.nms.v1_19_R1; - -import org.bukkit.Bukkit; - -import com.dfsek.terra.bukkit.PlatformImpl; -import com.dfsek.terra.bukkit.nms.Initializer; - - -public class NMSInitializer implements Initializer { - @Override - public void initialize(PlatformImpl platform) { - AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); - Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); - } -} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSPlatform.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSPlatform.java new file mode 100644 index 000000000..a43c271ef --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/NMSPlatform.java @@ -0,0 +1,94 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1; + +import com.dfsek.tectonic.api.TypeRegistry; +import com.dfsek.tectonic.api.exception.LoadException; + +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.world.biome.PlatformBiome; +import com.dfsek.terra.bukkit.BukkitAddon; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; + +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.BiomeAdditionsSoundTemplate; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.BiomeMoodSoundTemplate; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.BiomeParticleConfigTemplate; + +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.EntityTypeTemplate; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.MusicSoundTemplate; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.SoundEventTemplate; + +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.SpawnCostConfig; + +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.SpawnEntryTemplate; + +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.SpawnSettingsTemplate; +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.SpawnTypeConfig; + +import com.dfsek.terra.bukkit.nms.v1_19_R1.config.VillagerTypeTemplate; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.npc.VillagerType; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; +import net.minecraft.world.level.biome.AmbientMoodSettings; +import net.minecraft.world.level.biome.AmbientParticleSettings; +import net.minecraft.world.level.biome.Biome.Precipitation; +import net.minecraft.world.level.biome.Biome.TemperatureModifier; +import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import org.bukkit.Bukkit; + +import com.dfsek.terra.bukkit.PlatformImpl; + +import java.util.List; +import java.util.Locale; + + +public class NMSPlatform extends PlatformImpl { + + public NMSPlatform(TerraBukkitPlugin plugin) { + super(plugin); + AwfulBukkitHacks.registerBiomes(getRawConfigRegistry()); + Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), plugin); + } + + @Override + public void register(TypeRegistry registry) { + super.register(registry); + registry.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker)) + .registerLoader(ResourceLocation.class, (type, o, loader, depthTracker) -> { + ResourceLocation identifier = ResourceLocation.tryParse((String) o); + if(identifier == null) + throw new LoadException("Invalid identifier: " + o, depthTracker); + return identifier; + }) + .registerLoader(Precipitation.class, (type, o, loader, depthTracker) -> Precipitation.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, + (type, o, loader, depthTracker) -> GrassColorModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(GrassColorModifier.class, + (type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase( + Locale.ROOT))) + .registerLoader(MobCategory.class, (type, o, loader, depthTracker) -> MobCategory.valueOf((String) o)) + .registerLoader(AmbientParticleSettings.class, BiomeParticleConfigTemplate::new) + .registerLoader(SoundEvent.class, SoundEventTemplate::new) + .registerLoader(AmbientMoodSettings.class, BiomeMoodSoundTemplate::new) + .registerLoader(AmbientAdditionsSettings.class, BiomeAdditionsSoundTemplate::new) + .registerLoader(Music.class, MusicSoundTemplate::new) + .registerLoader(EntityType.class, EntityTypeTemplate::new) + .registerLoader(SpawnCostConfig.class, SpawnCostConfig::new) + .registerLoader(SpawnerData.class, SpawnEntryTemplate::new) + .registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new) + .registerLoader(MobSpawnSettings.class, SpawnSettingsTemplate::new) + .registerLoader(VillagerType.class, VillagerTypeTemplate::new); + } + + @Override + protected Iterable platformAddon() { + return List.of(new NMSAddon(this)); + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java index 8fa9a0b01..fa35491db 100644 --- a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/Reflection.java @@ -1,21 +1,31 @@ package com.dfsek.terra.bukkit.nms.v1_19_R1; import net.minecraft.core.MappedRegistry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.npc.VillagerType; +import net.minecraft.world.level.biome.Biome; import xyz.jpenilla.reflectionremapper.ReflectionRemapper; import xyz.jpenilla.reflectionremapper.proxy.ReflectionProxyFactory; +import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldGetter; import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; +import xyz.jpenilla.reflectionremapper.proxy.annotation.Static; + +import java.util.Map; public class Reflection { public static final MappedRegistryProxy MAPPED_REGISTRY; + public static final VillagerTypeProxy VILLAGER_TYPE; + static { ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, Reflection.class.getClassLoader()); MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); + VILLAGER_TYPE = reflectionProxyFactory.reflectionProxy(VillagerTypeProxy.class); } @@ -24,4 +34,11 @@ public class Reflection { @FieldSetter("frozen") void setFrozen(MappedRegistry instance, boolean frozen); } + + @Proxies(VillagerTypeProxy.class) + public interface VillagerTypeProxy { + @Static + @FieldGetter("BY_BIOME") + Map, VillagerType> getByBiome(); + } } diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeAdditionsSoundTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeAdditionsSoundTemplate.java new file mode 100644 index 000000000..fe9b970aa --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeAdditionsSoundTemplate.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.sounds.SoundEvent; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; + + +public class BiomeAdditionsSoundTemplate implements ObjectTemplate { + @Value("sound") + @Default + private SoundEvent sound = null; + + @Value("sound-chance") + @Default + private Double soundChance = null; + + @Override + public AmbientAdditionsSettings get() { + if(sound == null || soundChance == null) { + return null; + } else { + return new AmbientAdditionsSettings(sound, soundChance); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeMoodSoundTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeMoodSoundTemplate.java new file mode 100644 index 000000000..842dc052c --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeMoodSoundTemplate.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.sounds.SoundEvent; +import net.minecraft.world.level.biome.AmbientMoodSettings; + + +public class BiomeMoodSoundTemplate implements ObjectTemplate { + @Value("sound") + @Default + private SoundEvent sound = null; + + @Value("cultivation-ticks") + @Default + private Integer soundCultivationTicks = null; + + @Value("spawn-range") + @Default + private Integer soundSpawnRange = null; + + @Value("extra-distance") + @Default + private Double soundExtraDistance = null; + + @Override + public AmbientMoodSettings get() { + if(sound == null || soundCultivationTicks == null || soundSpawnRange == null || soundExtraDistance == null) { + return null; + } else { + return new AmbientMoodSettings(sound, soundCultivationTicks, soundSpawnRange, soundExtraDistance); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeParticleConfigTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeParticleConfigTemplate.java new file mode 100644 index 000000000..42988da4e --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/BiomeParticleConfigTemplate.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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 com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.arguments.ParticleArgument; +import net.minecraft.world.level.biome.AmbientParticleSettings; + + +public class BiomeParticleConfigTemplate implements ObjectTemplate { + @Value("particle") + @Default + private String particle = null; + + @Value("probability") + @Default + private Integer probability = null; + + @Override + public AmbientParticleSettings get() { + if(particle == null || probability == null) { + return null; + } + + try { + return new AmbientParticleSettings(ParticleArgument.readParticle(new StringReader(particle)), probability); + } catch(CommandSyntaxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/EntityTypeTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/EntityTypeTemplate.java new file mode 100644 index 000000000..44fffa6ab --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/EntityTypeTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; + + +public class EntityTypeTemplate implements ObjectTemplate> { + @Value("id") + @Default + private ResourceLocation id = null; + + @Override + public EntityType get() { + return Registry.ENTITY_TYPE.get(id); + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/MusicSoundTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/MusicSoundTemplate.java new file mode 100644 index 000000000..0e8594a53 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/MusicSoundTemplate.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.sounds.Music; +import net.minecraft.sounds.SoundEvent; + + +public class MusicSoundTemplate implements ObjectTemplate { + @Value("sound") + @Default + private SoundEvent sound = null; + + @Value("min-delay") + @Default + private Integer minDelay = null; + + @Value("max-delay") + @Default + private Integer maxDelay = null; + + @Value("replace-current-music") + @Default + private Boolean replaceCurrentMusic = null; + + @Override + public Music get() { + if(sound == null || minDelay == null || maxDelay == null || replaceCurrentMusic == null) { + return null; + } else { + return new Music(sound, minDelay, maxDelay, replaceCurrentMusic); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SoundEventTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SoundEventTemplate.java new file mode 100644 index 000000000..382d56541 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SoundEventTemplate.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; + + +public class SoundEventTemplate implements ObjectTemplate { + @Value("id") + @Default + private ResourceLocation id = null; + + @Value("distance-to-travel") + @Default + private Float distanceToTravel = null; + + @Override + public SoundEvent get() { + if(id == null) { + return null; + } else if(distanceToTravel == null) { + return new SoundEvent(id); + } else { + return new SoundEvent(id, distanceToTravel); + } + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnCostConfig.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnCostConfig.java new file mode 100644 index 000000000..26cbcf8bc --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnCostConfig.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.world.entity.EntityType; + + +public class SpawnCostConfig implements ObjectTemplate { + @Value("type") + @Default + private EntityType type = null; + + @Value("mass") + @Default + private Double mass = null; + + @Value("gravity") + @Default + private Double gravity = null; + + public EntityType getType() { + return type; + } + + public Double getMass() { + return mass; + } + + public Double getGravity() { + return gravity; + } + + @Override + public SpawnCostConfig get() { + return this; + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnEntryTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnEntryTemplate.java new file mode 100644 index 000000000..8809349f9 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnEntryTemplate.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.world.entity.EntityType; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; + + +public class SpawnEntryTemplate implements ObjectTemplate { + @Value("type") + @Default + private EntityType type = null; + + @Value("weight") + @Default + private Integer weight = null; + + @Value("min-group-size") + @Default + private Integer minGroupSize = null; + + @Value("max-group-size") + @Default + private Integer maxGroupSize = null; + + @Override + public SpawnerData get() { + return new SpawnerData(type, weight, minGroupSize, maxGroupSize); + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnSettingsTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnSettingsTemplate.java new file mode 100644 index 000000000..6f088fdab --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnSettingsTemplate.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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 java.util.List; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; + + +public class SpawnSettingsTemplate implements ObjectTemplate { + @Value("spawns") + @Default + private List spawns = null; + + @Value("costs") + @Default + private List costs = null; + + @Value("probability") + @Default + private Float probability = null; + + @Override + public MobSpawnSettings get() { + MobSpawnSettings.Builder builder = new MobSpawnSettings.Builder(); + for(SpawnTypeConfig spawn : spawns) { + MobCategory group = spawn.getGroup(); + for (SpawnerData entry : spawn.getEntry()) { + builder.addSpawn(group, entry); + } + } + for(SpawnCostConfig cost : costs) { + builder.addMobCharge(cost.getType(), cost.getMass(), cost.getGravity()); + } + if(probability != null) { + builder.creatureGenerationProbability(probability); + } + + return builder.build(); + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnTypeConfig.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnTypeConfig.java new file mode 100644 index 000000000..a98956405 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/SpawnTypeConfig.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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 java.util.List; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; + + +public class SpawnTypeConfig implements ObjectTemplate { + @Value("group") + @Default + private MobCategory group = null; + + @Value("entries") + @Default + private List entry = null; + + public MobCategory getGroup() { + return group; + } + + public List getEntry() { + return entry; + } + + @Override + public SpawnTypeConfig get() { + return this; + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java new file mode 100644 index 000000000..bc3e10930 --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VanillaBiomeProperties.java @@ -0,0 +1,174 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.config; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import java.util.List; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.npc.VillagerType; +import net.minecraft.world.level.biome.AmbientAdditionsSettings; +import net.minecraft.world.level.biome.AmbientMoodSettings; +import net.minecraft.world.level.biome.AmbientParticleSettings; +import net.minecraft.world.level.biome.Biome.Precipitation; +import net.minecraft.world.level.biome.Biome.TemperatureModifier; +import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier; +import net.minecraft.world.level.biome.MobSpawnSettings; +import com.dfsek.terra.api.properties.Properties; + + +public class VanillaBiomeProperties implements ConfigTemplate, Properties { + + @Value("minecraft.tags") + @Default + private List tags = null; + + @Value("minecraft.colors.grass") + @Default + private Integer grassColor = null; + + @Value("minecraft.colors.fog") + @Default + private Integer fogColor = null; + + @Value("minecraft.colors.water") + @Default + private Integer waterColor = null; + + @Value("minecraft.colors.water-fog") + @Default + private Integer waterFogColor = null; + + @Value("minecraft.colors.foliage") + @Default + private Integer foliageColor = null; + + @Value("minecraft.colors.sky") + @Default + private Integer skyColor = null; + + @Value("minecraft.colors.modifier") + @Default + private GrassColorModifier grassColorModifier = null; + + @Value("minecraft.particles") + @Default + private AmbientParticleSettings particleConfig = null; + + @Value("minecraft.climate.precipitation") + @Default + private Precipitation precipitation = null; + + @Value("minecraft.climate.temperature") + @Default + private Float temperature = null; + + @Value("minecraft.climate.temperature-modifier") + @Default + private TemperatureModifier temperatureModifier = null; + + @Value("minecraft.climate.downfall") + @Default + private Float downfall = null; + + @Value("minecraft.sound.loop-sound.sound") + @Default + private SoundEvent loopSound = null; + + @Value("minecraft.sound.mood-sound") + @Default + private AmbientMoodSettings moodSound = null; + + @Value("minecraft.sound.additions-sound") + @Default + private AmbientAdditionsSettings additionsSound = null; + + @Value("minecraft.sound.music") + @Default + private Music music = null; + + @Value("minecraft.spawning") + @Default + private MobSpawnSettings spawnSettings = null; + + @Value("minecraft.villager-type") + @Default + private VillagerType villagerType = null; + + public List getTags() { + return tags; + } + + public Integer getGrassColor() { + return grassColor; + } + + public Integer getFogColor() { + return fogColor; + } + + public Integer getWaterColor() { + return waterColor; + } + + public Integer getWaterFogColor() { + return waterFogColor; + } + + public Integer getFoliageColor() { + return foliageColor; + } + + public Integer getSkyColor() { + return skyColor; + } + + public GrassColorModifier getGrassColorModifier() { + return grassColorModifier; + } + + public AmbientParticleSettings getParticleConfig() { + return particleConfig; + } + + public Precipitation getPrecipitation() { + return precipitation; + } + + public Float getTemperature() { + return temperature; + } + + public TemperatureModifier getTemperatureModifier() { + return temperatureModifier; + } + + public Float getDownfall() { + return downfall; + } + + public SoundEvent getLoopSound() { + return loopSound; + } + + public AmbientMoodSettings getMoodSound() { + return moodSound; + } + + public AmbientAdditionsSettings getAdditionsSound() { + return additionsSound; + } + + public Music getMusic() { + return music; + } + + public MobSpawnSettings getSpawnSettings() { + return spawnSettings; + } + + public VillagerType getVillagerType() { + return villagerType; + } +} diff --git a/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VillagerTypeTemplate.java b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VillagerTypeTemplate.java new file mode 100644 index 000000000..1de0ea0cb --- /dev/null +++ b/platforms/bukkit/nms/v1_19_R1/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R1/config/VillagerTypeTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R1.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.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.npc.VillagerType; + + +public class VillagerTypeTemplate implements ObjectTemplate { + @Value("id") + @Default + private ResourceLocation id = null; + + @Override + public VillagerType get() { + return Registry.VILLAGER_TYPE.get(id); + } +}