diff --git a/src/main/java/net/zepalesque/zenith/Zenith.java b/src/main/java/net/zepalesque/zenith/Zenith.java index 7304993..bb77089 100644 --- a/src/main/java/net/zepalesque/zenith/Zenith.java +++ b/src/main/java/net/zepalesque/zenith/Zenith.java @@ -15,6 +15,11 @@ import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.loading.FMLPaths; import net.neoforged.neoforge.registries.DataPackRegistryEvent; +import net.neoforged.neoforge.registries.datamaps.DataMapEntry; +import net.neoforged.neoforge.registries.datamaps.DataMapType; +import net.neoforged.neoforge.registries.datamaps.RegisterDataMapTypesEvent; +import net.zepalesque.zenith.api.biometint.BiomeTint; +import net.zepalesque.zenith.api.biometint.BiomeTints; import net.zepalesque.zenith.api.condition.Condition; import net.zepalesque.zenith.api.condition.ConditionElements; import net.zepalesque.zenith.api.condition.ConfigCondition; @@ -40,9 +45,11 @@ public class Zenith public Zenith(IEventBus bus, Dist dist) { bus.addListener(this::commonSetup); + bus.addListener(this::registerDataMaps); bus.addListener(DataPackRegistryEvent.NewRegistry.class, event -> event.dataPackRegistry(Keys.CONDITION, Condition.ELEMENT_CODEC, Condition.ELEMENT_CODEC)); ConditionElements.ELEMENTS.register(bus); + BiomeTints.TINTS.register(bus); ZenithRecipeConditions.CODECS.register(bus); ZenithPlacementModifiers.FILTERS.register(bus); ZenithLootConditions.LOOT_CONDITIONS.register(bus); @@ -61,6 +68,10 @@ private void commonSetup(final FMLCommonSetupEvent event) { } + private void registerDataMaps(RegisterDataMapTypesEvent event) { + BiomeTint.MAPS.forEach(event::register); + } + @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public static class ClientModEvents { @@ -76,9 +87,10 @@ public static ResourceLocation loc(String path) { } public static class Keys { + public static final ResourceKey>>> CONDITION_ELEMENT = ResourceKey.createRegistryKey(Zenith.loc("condition_element")); public static final ResourceKey>> CONDITION = ResourceKey.createRegistryKey(Zenith.loc("condition")); - + public static final ResourceKey> BIOME_TINT = ResourceKey.createRegistryKey(Zenith.loc("biome_tint")); } diff --git a/src/main/java/net/zepalesque/zenith/api/biometint/BiomeTint.java b/src/main/java/net/zepalesque/zenith/api/biometint/BiomeTint.java new file mode 100644 index 0000000..c1b7d4f --- /dev/null +++ b/src/main/java/net/zepalesque/zenith/api/biometint/BiomeTint.java @@ -0,0 +1,59 @@ +package net.zepalesque.zenith.api.biometint; + +import com.mojang.serialization.Codec; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; +import net.neoforged.neoforge.registries.datamaps.DataMapType; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class BiomeTint { + + private final DataMapType dataMap; + private Map tints = null; + private final int defaultColor; + + public static Collection> MAPS = new ArrayList<>(); + + public BiomeTint(ResourceLocation loc, int defaultColor) { + DataMapType dataMap = createTintMap(loc); + MAPS.add(dataMap); + this.dataMap = dataMap; + this.defaultColor = defaultColor; + } + + private static DataMapType createTintMap(ResourceLocation location) { + return DataMapType.builder(location.withPrefix("tint/"), Registries.BIOME, Codec.INT).synced(Codec.INT, true).build(); + } + + public int getColor(Biome biome) { + if (this.tints == null) { + throw new UnsupportedOperationException("Biome tints have not been initialized yet!"); + } else { + return this.tints.getOrDefault(biome, defaultColor); + } + } + + public void clearTints() { + if (this.tints == null) { + this.tints = new HashMap<>(); + } else { + this.tints.clear(); + } + } + public void addTint(Biome biome, int color) { + if (this.tints == null) { + throw new UnsupportedOperationException("Biome tints have not been initialized yet!"); + } else { + this.tints.put(biome, color); + } + } + + public DataMapType getDataMap() { + return this.dataMap; + } +} diff --git a/src/main/java/net/zepalesque/zenith/api/biometint/BiomeTints.java b/src/main/java/net/zepalesque/zenith/api/biometint/BiomeTints.java new file mode 100644 index 0000000..34ce392 --- /dev/null +++ b/src/main/java/net/zepalesque/zenith/api/biometint/BiomeTints.java @@ -0,0 +1,20 @@ +package net.zepalesque.zenith.api.biometint; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Registry; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.RegistryBuilder; +import net.zepalesque.zenith.Zenith; +import net.zepalesque.zenith.api.condition.Condition; +import net.zepalesque.zenith.api.condition.ConfigCondition; + +public class BiomeTints { + + public static final DeferredRegister TINTS = DeferredRegister.create(Zenith.Keys.BIOME_TINT, Zenith.MODID); + public static final Registry TINT_REGISTRY = new RegistryBuilder<>(Zenith.Keys.BIOME_TINT).sync(true).create(); + + public static final DeferredHolder TEST = TINTS.register("test_tint", () -> new BiomeTint(Zenith.loc("test_tint"), 0xFFFFFF)); + + +} diff --git a/src/main/java/net/zepalesque/zenith/event/listener/BiomeTintListener.java b/src/main/java/net/zepalesque/zenith/event/listener/BiomeTintListener.java new file mode 100644 index 0000000..5f9cd62 --- /dev/null +++ b/src/main/java/net/zepalesque/zenith/event/listener/BiomeTintListener.java @@ -0,0 +1,32 @@ +package net.zepalesque.zenith.event.listener; + + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; +import net.neoforged.neoforge.registries.datamaps.DataMapType; +import net.zepalesque.zenith.Zenith; +import net.zepalesque.zenith.api.biometint.BiomeTints; + +import java.util.HashMap; +import java.util.Map; + +@Mod.EventBusSubscriber(modid = Zenith.MODID) +public class BiomeTintListener { + + @SubscribeEvent + public static void sendColors(ClientPlayerNetworkEvent.LoggingIn event) { + BiomeTints.TINT_REGISTRY.forEach(tint -> { + tint.clearTints(); + Registry registry = event.getPlayer().level().registryAccess().registryOrThrow(Registries.BIOME); + for (Map.Entry, Integer> entry : registry.getDataMap(tint.getDataMap()).entrySet()) { + Biome b = registry.get(entry.getKey()); + tint.addTint(b, entry.getValue()); + } + }); + } +}