Skip to content

Commit

Permalink
Added support for grass/foliage resolver overrides from other mods
Browse files Browse the repository at this point in the history
  • Loading branch information
Adubbz committed Mar 23, 2024
1 parent 7acbaf8 commit 7c2c522
Showing 1 changed file with 50 additions and 28 deletions.
78 changes: 50 additions & 28 deletions common/src/main/java/sereneseasons/season/SeasonColorHandlers.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package sereneseasons.season;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BiomeColors;
import net.minecraft.core.BlockPos;
Expand All @@ -22,14 +24,22 @@
import sereneseasons.util.SeasonColorUtil;

import javax.annotation.Nullable;
import java.util.List;

public class SeasonColorHandlers
{
private static final Multimap<ResolverType, ColorOverride> resolverOverrides = HashMultimap.create();

public static void setup()
{
registerGrassAndFoliageColorHandlers();
}

public static void registerResolverOverride(ResolverType type, ColorOverride override)
{
resolverOverrides.put(type, override);
}

private static ColorResolver originalGrassColorResolver;
private static ColorResolver originalFoliageColorResolver;

Expand All @@ -38,42 +48,54 @@ private static void registerGrassAndFoliageColorHandlers()
originalGrassColorResolver = BiomeColors.GRASS_COLOR_RESOLVER;
originalFoliageColorResolver = BiomeColors.FOLIAGE_COLOR_RESOLVER;

BiomeColors.GRASS_COLOR_RESOLVER = (biome, x, z) ->
{
Minecraft minecraft = Minecraft.getInstance();
Level level = minecraft.level;
Registry<Biome> biomeRegistry = level.registryAccess().registryOrThrow(Registries.BIOME);
Holder<Biome> biomeHolder = biomeRegistry.getResourceKey(biome).flatMap(key -> biomeRegistry.getHolder(key)).orElse(null);
int originalColor = originalGrassColorResolver.getColor(biome, x, z);
BiomeColors.GRASS_COLOR_RESOLVER = (biome, x, z) -> resolveColors(ResolverType.GRASS, biome, x, z);
BiomeColors.FOLIAGE_COLOR_RESOLVER = (biome, x, z) -> resolveColors(ResolverType.FOLIAGE, biome, x, z);
}

if (biomeHolder != null)
{
ISeasonState calendar = SeasonHelper.getSeasonState(level);
ISeasonColorProvider colorProvider = biomeHolder.is(ModTags.Biomes.TROPICAL_BIOMES) ? calendar.getTropicalSeason() : calendar.getSubSeason();
private static int resolveColors(ResolverType type, Biome biome, double x, double z)
{
int originalColor = switch (type) {
case GRASS -> originalGrassColorResolver.getColor(biome, x, z);
case FOLIAGE -> originalFoliageColorResolver.getColor(biome, x, z);
};

return SeasonColorUtil.applySeasonalGrassColouring(colorProvider, biomeHolder, originalColor);
}
Minecraft minecraft = Minecraft.getInstance();
Level level = minecraft.level;

return originalColor;
};
if (level == null) return originalColor;

BiomeColors.FOLIAGE_COLOR_RESOLVER = (biome, x, z) ->
Registry<Biome> biomeRegistry = level.registryAccess().registryOrThrow(Registries.BIOME);
Holder<Biome> biomeHolder = biomeRegistry.getResourceKey(biome).flatMap(biomeRegistry::getHolder).orElse(null);

if (biomeHolder != null)
{
Minecraft minecraft = Minecraft.getInstance();
Level level = minecraft.level;
Registry<Biome> biomeRegistry = level.registryAccess().registryOrThrow(Registries.BIOME);
Holder<Biome> biomeHolder = biomeRegistry.getResourceKey(biome).flatMap(key -> biomeRegistry.getHolder(key)).orElse(null);
int originalColor = originalFoliageColorResolver.getColor(biome, x, z);
ISeasonState calendar = SeasonHelper.getSeasonState(level);
ISeasonColorProvider colorProvider = biomeHolder.is(ModTags.Biomes.TROPICAL_BIOMES) ? calendar.getTropicalSeason() : calendar.getSubSeason();

if (biomeHolder != null)
{
ISeasonState calendar = SeasonHelper.getSeasonState(level);
ISeasonColorProvider colorProvider = biomeHolder.is(ModTags.Biomes.TROPICAL_BIOMES) ? calendar.getTropicalSeason() : calendar.getSubSeason();
int seasonalColor = switch (type) {
case GRASS -> SeasonColorUtil.applySeasonalGrassColouring(colorProvider, biomeHolder, originalColor);
case FOLIAGE -> SeasonColorUtil.applySeasonalFoliageColouring(colorProvider, biomeHolder, originalColor);
};

return SeasonColorUtil.applySeasonalFoliageColouring(colorProvider, biomeHolder, originalColor);
int currentColor = seasonalColor;
for (ColorOverride override : resolverOverrides.get(type))
{
currentColor = override.apply(originalColor, seasonalColor, currentColor, biomeHolder, x, z);
}

return originalColor;
};
return currentColor;
}

return originalColor;
}

public interface ColorOverride
{
int apply(int originalColor, int seasonalColor, int currentColor, Holder<Biome> biome, double x, double z);
}

public enum ResolverType
{
GRASS, FOLIAGE
}
}

0 comments on commit 7c2c522

Please sign in to comment.