correct some errors in carver and structure addons

This commit is contained in:
dfsek
2021-07-06 22:23:04 -07:00
parent 5c4ef3f23b
commit 25073199f0
24 changed files with 47 additions and 119 deletions

View File

@@ -1,8 +1,7 @@
package com.dfsek.terra.addons.carver;
import com.dfsek.terra.addons.carver.carving.Worm;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector3;
@@ -10,12 +9,12 @@ import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.carving.Worm;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
@@ -34,11 +33,11 @@ public class CarverCache {
int chunkX = (int) (key >> 32);
int chunkZ = (int) key.longValue();
BiomeProvider provider = main.getWorld(w).getBiomeProvider();
if(CarverCache.this.carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + CarverCache.this.carver.hashCode())))) {
if(CarverCache.this.carver.isChunkCarved(w, chunkX, chunkZ, new Random(PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + CarverCache.this.carver.hashCode())))) {
long seed = PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed());
Random r = new FastRandom(seed);
Random r = new Random(seed);
Worm carving = CarverCache.this.carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), CarverCache.this.carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16)));
List<Worm.WormPoint> points = new GlueList<>();
List<Worm.WormPoint> points = new ArrayList<>();
for(int i = 0; i < carving.getLength(); i++) {
carving.step();
TerraBiome biome = provider.getBiome(carving.getRunning());

View File

@@ -2,8 +2,8 @@ package com.dfsek.terra.addons.carver;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.util.collection.MaterialSet;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.MaterialSet;
import net.jafama.FastMath;
import java.util.Map;

View File

@@ -7,7 +7,7 @@ import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.config.AbstractableTemplate;
import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.util.collection.MaterialSet;
import java.util.HashMap;
import java.util.Map;

View File

@@ -13,8 +13,6 @@ import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.generator.Chunkified;
import com.dfsek.terra.api.world.generator.TerraBlockPopulator;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.templates.CarverTemplate;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;

View File

@@ -93,7 +93,7 @@ public class UserDefinedCarver extends Carver {
@Override
public Worm getWorm(long l, Vector3 vector) {
Random r = new FastRandom(l + hash);
Random r = new Random(l + hash);
return new UserDefinedWorm(length.get(r) / 2, r, vector, topCut, bottomCut, l);
}
@@ -131,7 +131,7 @@ public class UserDefinedCarver extends Carver {
public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) {
BiomeTemplate conf = ((UserDefinedBiome) main.getWorld(w).getBiomeProvider().getBiome((chunkX << 4) + 8, (chunkZ << 4) + 8)).getConfig();
if(conf.getCarvers().get(this) != null) {
return new FastRandom(random.nextLong() + hash).nextInt(100) < conf.getCarvers().get(this);
return new Random(random.nextLong() + hash).nextInt(100) < conf.getCarvers().get(this);
}
return false;
}

View File

@@ -8,6 +8,6 @@ import com.dfsek.terra.config.templates.StructureTemplate;
public class StructureFactory implements ConfigFactory<StructureTemplate, ConfiguredStructure> {
@Override
public ConfiguredStructure build(StructureTemplate config, TerraPlugin main) {
return new TerraStructure(config.getStructures(), config.getY(), config.getSpawn(), config);
return new TerraStructure(config.getStructures(), config.getY(), config.getSpawn());
}
}

View File

@@ -5,7 +5,6 @@ import com.dfsek.terra.api.config.WorldConfig;
import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.structure.ConfiguredStructure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
@@ -44,7 +43,7 @@ public class StructurePopulator implements TerraBlockPopulator, Chunkified {
if(!((UserDefinedBiome) provider.getBiome(spawn)).getConfig().getStructures().contains(conf))
continue;
Random random = new FastRandom(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed()));
Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed()));
conf.getStructure().get(random).generate(spawn.setY(conf.getSpawnStart().get(random)), world, chunk, random, Rotation.fromDegrees(90 * random.nextInt(4)));
}
}

View File

@@ -1,4 +1,4 @@
package com.dfsek.terra.config.templates;
package com.dfsek.terra.addons.structure;
import com.dfsek.tectonic.annotations.Abstractable;
import com.dfsek.tectonic.annotations.Default;
@@ -11,6 +11,7 @@ import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings({"unused", "FieldMayBeFinal"})
@@ -30,11 +31,6 @@ public class StructureTemplate implements AbstractableTemplate, ConfigTemplate {
@Abstractable
private StructureSpawn spawn;
@Value("features")
@Abstractable
@Default
private List<Void> features = new GlueList<>();
public String getID() {
return id;
}
@@ -47,10 +43,6 @@ public class StructureTemplate implements AbstractableTemplate, ConfigTemplate {
return y;
}
public List<Void> getFeatures() {
return features;
}
public StructureSpawn getSpawn() {
return spawn;
}

View File

@@ -5,23 +5,16 @@ import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.StructureSpawn;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.config.templates.StructureTemplate;
public class TerraStructure implements ConfiguredStructure {
private final ProbabilityCollection<Structure> structure;
private final Range spawnStart;
private final StructureSpawn spawn;
private final StructureTemplate template;
public TerraStructure(ProbabilityCollection<Structure> structures, Range spawnStart, StructureSpawn spawn, StructureTemplate template) {
public TerraStructure(ProbabilityCollection<Structure> structures, Range spawnStart, StructureSpawn spawn) {
this.structure = structures;
this.spawnStart = spawnStart;
this.spawn = spawn;
this.template = template;
}
public StructureTemplate getTemplate() {
return template;
}
@Override

View File

@@ -3,7 +3,6 @@ package com.dfsek.terra.addons.structure.command;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.structure.ConfiguredStructure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World;
@@ -30,7 +29,7 @@ public class AsyncStructureFinder extends AsyncFeatureFinder<ConfiguredStructure
public boolean isValid(int x, int z, ConfiguredStructure target) {
Vector3 spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed());
if(!((UserDefinedBiome) provider.getBiome(spawn)).getConfig().getStructures().contains(target)) return false;
Random random = new FastRandom(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed()));
Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed()));
return target.getStructure().get(random).test(spawn.setY(target.getSpawnStart().get(random)), world, random, Rotation.fromDegrees(90 * random.nextInt(4)));
}
}

View File

@@ -1,48 +0,0 @@
package com.dfsek.terra.addons.structure.command.structure;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.command.CommandTemplate;
import com.dfsek.terra.api.command.annotation.Command;
import com.dfsek.terra.api.command.annotation.type.DebugCommand;
import com.dfsek.terra.api.command.annotation.type.PlayerCommand;
import com.dfsek.terra.api.command.annotation.type.WorldCommand;
import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.addons.structure.structures.parser.lang.constants.NumericConstant;
import com.dfsek.terra.addons.structure.structures.script.TerraImplementationArguments;
import com.dfsek.terra.addons.structure.structures.script.functions.CheckFunction;
import com.dfsek.terra.addons.structure.structures.structure.buffer.StructureBuffer;
import com.dfsek.terra.addons.structure.structures.tokenizer.Position;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.vector.Vector3;
import java.util.HashMap;
@DebugCommand
@PlayerCommand
@WorldCommand
@Command(
usage = "/terra spawn"
)
public class SpawnCommand implements CommandTemplate {
@Inject
private TerraPlugin main;
@Override
public void execute(CommandSender sender) {
Player player = (Player) sender;
Vector3 p = player.position();
int x = p.getBlockX();
int y = p.getBlockY();
int z = p.getBlockZ();
Position dummy = new Position(0, 0);
String check = new CheckFunction(main, new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), dummy).apply(new TerraImplementationArguments(new StructureBuffer(
new Vector3(x, y, z)
), Rotation.NONE, new FastRandom(), player.world(), 0), new HashMap<>());
sender.sendMessage("Found: " + check);
}
}

View File

@@ -18,11 +18,6 @@ import com.dfsek.terra.config.lang.LangUtil;
value = "load",
aliases = "ld"
),
@Subcommand(
clazz = SpawnCommand.class,
value = "spawn",
aliases = "s"
),
@Subcommand(
clazz = StructureLocateCommand.class,
value = "locate",
@@ -34,6 +29,6 @@ import com.dfsek.terra.config.lang.LangUtil;
public class StructureCommand implements CommandTemplate {
@Override
public void execute(CommandSender sender) {
LangUtil.send("command.structure.main-menu", sender);
//LangUtil.send("command.structure.main-menu", sender);
}
}

View File

@@ -1,5 +1,8 @@
package com.dfsek.terra.addons.structure.command.structure;
import com.dfsek.terra.addons.structure.command.structure.argument.ScriptArgumentParser;
import com.dfsek.terra.addons.structure.command.structure.completer.RotationCompleter;
import com.dfsek.terra.addons.structure.command.structure.completer.ScriptCompleter;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.command.CommandTemplate;
import com.dfsek.terra.api.command.annotation.Argument;
@@ -16,11 +19,8 @@ import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.addons.structure.command.structure.argument.ScriptArgumentParser;
import com.dfsek.terra.addons.structure.command.structure.completer.RotationCompleter;
import com.dfsek.terra.addons.structure.command.structure.completer.ScriptCompleter;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
@PlayerCommand
@@ -66,7 +66,7 @@ public class StructureLoadCommand implements CommandTemplate {
Player player = (Player) sender;
long t = System.nanoTime();
FastRandom random = new FastRandom(ThreadLocalRandom.current().nextLong());
Random random = new Random(ThreadLocalRandom.current().nextLong());
Rotation r;
try {
r = Rotation.fromDegrees(rotation);

View File

@@ -1,5 +1,8 @@
package com.dfsek.terra.addons.structure.command.structure;
import com.dfsek.terra.addons.structure.command.AsyncStructureFinder;
import com.dfsek.terra.addons.structure.command.structure.argument.StructureArgumentParser;
import com.dfsek.terra.addons.structure.command.structure.completer.StructureCompleter;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.command.CommandTemplate;
import com.dfsek.terra.api.command.annotation.Argument;
@@ -13,12 +16,8 @@ import com.dfsek.terra.api.command.arg.IntegerArgumentParser;
import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.structure.ConfiguredStructure;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.locate.AsyncStructureFinder;
import com.dfsek.terra.addons.structure.command.structure.argument.StructureArgumentParser;
import com.dfsek.terra.addons.structure.command.structure.completer.StructureCompleter;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.world.population.items.TerraStructure;
import java.util.Locale;
@@ -50,7 +49,7 @@ public class StructureLocateCommand implements CommandTemplate {
private TerraPlugin main;
@ArgumentTarget("structure")
private TerraStructure structure;
private ConfiguredStructure structure;
@ArgumentTarget("radius")
private Integer radius;
@@ -64,11 +63,11 @@ public class StructureLocateCommand implements CommandTemplate {
new Thread(new AsyncStructureFinder(main.getWorld(player.world()).getBiomeProvider(), structure, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> {
if(location != null) {
sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", structure.getTemplate().getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position())));
sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", structure.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position())));
if(teleport) {
main.runPossiblyUnsafeTask(() -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ())));
}
} else LangUtil.send("command.biome.unable-to-locate", sender);
} //else LangUtil.send("command.biome.unable-to-locate", sender);
}, main), "Biome Location Thread").start();
}
}

View File

@@ -14,6 +14,6 @@ public class ScriptArgumentParser implements ArgumentParser<Structure> {
@Override
public Structure parse(CommandSender sender, String arg) {
return main.getWorld(((Player) sender).world()).getConfig().getRegistry(StructureScript.class).get(arg);
return main.getWorld(((Player) sender).world()).getConfig().getRegistry(Structure.class).get(arg);
}
}

View File

@@ -6,7 +6,6 @@ import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.structure.ConfiguredStructure;
import com.dfsek.terra.world.population.items.TerraStructure;
public class StructureArgumentParser implements ArgumentParser<ConfiguredStructure> {
@Inject
@@ -14,6 +13,6 @@ public class StructureArgumentParser implements ArgumentParser<ConfiguredStructu
@Override
public ConfiguredStructure parse(CommandSender sender, String arg) {
return main.getWorld(((Player) sender).world()).getConfig().getRegistry(TerraStructure.class).get(arg);
return main.getWorld(((Player) sender).world()).getConfig().getRegistry(ConfiguredStructure.class).get(arg);
}
}

View File

@@ -6,7 +6,6 @@ import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.addons.structure.structures.script.StructureScript;
import java.util.List;
import java.util.stream.Collectors;
@@ -17,6 +16,6 @@ public class ScriptCompleter implements TabCompleter {
@Override
public List<String> complete(CommandSender sender) {
return main.getWorld(((Player) sender).world()).getConfig().getRegistry(StructureScript.class).entries().stream().map(Structure::getId).collect(Collectors.toList());
return main.getWorld(((Player) sender).world()).getConfig().getRegistry(Structure.class).entries().stream().map(Structure::getId).collect(Collectors.toList());
}
}

View File

@@ -5,7 +5,7 @@ import com.dfsek.terra.api.command.tab.TabCompleter;
import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.world.population.items.TerraStructure;
import com.dfsek.terra.api.structure.ConfiguredStructure;
import java.util.ArrayList;
import java.util.List;
@@ -17,6 +17,6 @@ public class StructureCompleter implements TabCompleter {
@Override
public List<String> complete(CommandSender sender) {
Player player = (Player) sender;
return new ArrayList<>(main.getWorld(player.world()).getConfig().getRegistry(TerraStructure.class).keys());
return new ArrayList<>(main.getWorld(player.world()).getConfig().getRegistry(ConfiguredStructure.class).keys());
}
}

View File

@@ -7,11 +7,11 @@ import com.dfsek.terra.addons.structure.structures.loot.functions.AmountFunction
import com.dfsek.terra.addons.structure.structures.loot.functions.DamageFunction;
import com.dfsek.terra.addons.structure.structures.loot.functions.EnchantFunction;
import com.dfsek.terra.addons.structure.structures.loot.functions.LootFunction;
import com.dfsek.terra.api.util.GlueList;
import net.jafama.FastMath;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@@ -21,7 +21,7 @@ import java.util.Random;
public class Entry {
private final Item item;
private final long weight;
private final List<LootFunction> functions = new GlueList<>();
private final List<LootFunction> functions = new ArrayList<>();
/**
* Instantiates an Entry from a JSON representation.

View File

@@ -3,12 +3,12 @@ package com.dfsek.terra.addons.structure.structures.loot;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.inventory.Inventory;
import com.dfsek.terra.api.inventory.ItemStack;
import com.dfsek.terra.api.util.GlueList;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@@ -16,7 +16,7 @@ import java.util.Random;
* Class representation of a Loot Table to populate chest loot.
*/
public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable {
private final List<Pool> pools = new GlueList<>();
private final List<Pool> pools = new ArrayList<>();
/**
* Instantiates a LootTable from a JSON String.
@@ -35,7 +35,7 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable {
@Override
public List<ItemStack> getLoot(Random r) {
List<ItemStack> itemList = new GlueList<>();
List<ItemStack> itemList = new ArrayList<>();
for(Pool pool : pools) {
itemList.addAll(pool.getItems(r));
}

View File

@@ -2,13 +2,12 @@ package com.dfsek.terra.addons.structure.structures.loot;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.inventory.ItemStack;
import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import net.jafama.FastMath;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@@ -51,7 +50,7 @@ public class Pool {
public List<ItemStack> getItems(Random r) {
int rolls = r.nextInt(max - min + 1) + min;
List<ItemStack> items = new GlueList<>();
List<ItemStack> items = new ArrayList<>();
for(int i = 0; i < rolls; i++) {
items.add(entries.get(r).getItem(r));
}

View File

@@ -4,10 +4,10 @@ import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.inventory.ItemStack;
import com.dfsek.terra.api.inventory.item.Enchantment;
import com.dfsek.terra.api.inventory.item.ItemMeta;
import com.dfsek.terra.api.util.GlueList;
import net.jafama.FastMath;
import org.json.simple.JSONArray;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
@@ -38,7 +38,7 @@ public class EnchantFunction implements LootFunction {
if(original.getItemMeta() == null) return original;
double enchant = (r.nextDouble() * (max - min)) + min;
List<Enchantment> possible = new GlueList<>();
List<Enchantment> possible = new ArrayList<>();
for(Enchantment ench : main.getItemHandle().getEnchantments()) {
if(ench.canEnchantItem(original) && (disabled == null || !this.disabled.contains(ench.getID()))) {
possible.add(ench);

View File

@@ -9,4 +9,6 @@ public interface ConfiguredStructure {
Range getSpawnStart();
StructureSpawn getSpawn();
String getID();
}

View File

@@ -72,6 +72,7 @@ public final class FabricUtil {
}
}
/*
Pair<PreLoadCompatibilityOptions, PostLoadCompatibilityOptions> pair = fabricAddon.getTemplates().get(pack);
PreLoadCompatibilityOptions compatibilityOptions = pair.getLeft();
PostLoadCompatibilityOptions postLoadCompatibilityOptions = pair.getRight();
@@ -100,6 +101,8 @@ public final class FabricUtil {
}
}
*/
BiomeEffectsAccessor accessor = (BiomeEffectsAccessor) vanilla.getEffects();
BiomeEffects.Builder effects = new BiomeEffects.Builder()
.waterColor(colors.getOrDefault("water", accessor.getWaterColor()))