Skip to content

Commit

Permalink
Biome Conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
Dueris committed Jul 13, 2024
1 parent cad24fa commit 524609e
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@
import me.dueris.originspaper.registry.Registries;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.biome.Biome;
import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.block.CraftBiome;
import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.craftbukkit.util.CraftLocation;
Expand Down Expand Up @@ -142,7 +139,7 @@ public CraftEntity right() {
return false;
}

public static boolean testBiome(FactoryJsonObject condition, org.bukkit.block.Biome biome, Location blockPos, ServerLevel level) {
public static boolean testBiome(FactoryJsonObject condition, BlockPos blockPos, ServerLevel level) {
if (condition == null || condition.isEmpty()) return true; // Empty condition, do nothing
if (isMetaCondition(condition)) {
String type = condition.getString("type");
Expand All @@ -156,7 +153,7 @@ public static boolean testBiome(FactoryJsonObject condition, org.bukkit.block.Bi
Registrar<BiomeConditions.ConditionFactory> factory = OriginsPaper.getPlugin().registry.retrieve(Registries.BIOME_CONDITION);
BiomeConditions.ConditionFactory con = factory.get(NamespacedKey.fromString(obj.getString("type")));
if (con != null) {
cons.add(getPossibleInvert(condition.getBooleanOrDefault("inverted", false), testBiome(obj, biome, blockPos, level)));
cons.add(getPossibleInvert(condition.getBooleanOrDefault("inverted", false), testBiome(obj, blockPos, level)));
} else {
cons.add(getPossibleInvert(condition.getBooleanOrDefault("inverted", false), true)); // Condition null or not found.
}
Expand All @@ -176,7 +173,7 @@ public static boolean testBiome(FactoryJsonObject condition, org.bukkit.block.Bi
Registrar<BiomeConditions.ConditionFactory> factory = OriginsPaper.getPlugin().registry.retrieve(Registries.BIOME_CONDITION);
BiomeConditions.ConditionFactory con = factory.get(NamespacedKey.fromString(obj.getString("type")));
if (con != null) {
cons.add(getPossibleInvert(condition.getBooleanOrDefault("inverted", false), testBiome(obj, biome, blockPos, level)));
cons.add(getPossibleInvert(condition.getBooleanOrDefault("inverted", false), testBiome(obj, blockPos, level)));
} else {
cons.add(getPossibleInvert(condition.getBooleanOrDefault("inverted", false), true)); // Condition null or not found.
}
Expand All @@ -196,19 +193,11 @@ public static boolean testBiome(FactoryJsonObject condition, org.bukkit.block.Bi
}
} else {
// return the condition
Biome nmsBiome = CraftBiome.bukkitToMinecraft(biome);
if (nmsBiome == null) {
BlockPos nmsPos = CraftLocation.toBlockPosition(blockPos);
nmsBiome = level.getBiome(nmsPos).value();
if (nmsBiome == null) {
throw new RuntimeException("Unable to convert biome to NMS equivalent!");
}
}
Registrar<BiomeConditions.ConditionFactory> factory = OriginsPaper.getPlugin().registry.retrieve(Registries.BIOME_CONDITION);
BiomeConditions.ConditionFactory con = factory.get(NamespacedKey.fromString(condition.getString("type")));
boolean invert = condition.getBooleanOrDefault("inverted", false);
if (con != null) {
return getPossibleInvert(invert, con.test(condition, new oshi.util.tuples.Pair<Biome, BlockPos>(nmsBiome, CraftLocation.toBlockPosition(blockPos))));
return getPossibleInvert(invert, con.test(condition, level.getBiomeManager().getBiome(blockPos)));
} else {
return getPossibleInvert(invert, false); // Condition null or not found.
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,42 @@
import me.dueris.calio.data.factory.FactoryJsonObject;
import me.dueris.calio.registry.Registrable;
import me.dueris.originspaper.OriginsPaper;
import me.dueris.originspaper.factory.data.types.Comparison;
import me.dueris.originspaper.registry.Registries;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Biome.Precipitation;
import org.bukkit.NamespacedKey;
import oshi.util.tuples.Pair;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;

import java.util.function.BiPredicate;

public class BiomeConditions {

public void registerConditions() {

register(new ConditionFactory(OriginsPaper.apoliIdentifier("high_humidity"), (data, biome) -> {
return biome.value().climateSettings.downfall() > 0.85F;
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("temperature"), (data, biome) -> {
return Comparison.fromString(data.getString("comparison")).compare(biome.value().getBaseTemperature(), data.getNumber("compare_to").getFloat());
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("category"), (data, biome) -> {
ResourceLocation tagId = CraftNamespacedKey.toMinecraft(OriginsPaper.apoliIdentifier("category/" + data.getString("category")));
TagKey<Biome> biomeTag = TagKey.create(net.minecraft.core.registries.Registries.BIOME, tagId);
return biome.is(biomeTag);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("precipitation"), (data, biome) -> {
Precipitation precipitation = data.getEnumValue("precipitation", Precipitation.class);
return biome.value().getPrecipitationAt(new BlockPos(0, 64, 0)).equals(precipitation);
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("in_tag"), (data, biome) -> {
ResourceLocation tagId = data.getResourceLocation("tag");
TagKey<Biome> biomeTag = TagKey.create(net.minecraft.core.registries.Registries.BIOME, tagId);
return biome.is(biomeTag);
}));
}

private net.minecraft.world.level.biome.Biome.Precipitation getPrecipitation(FactoryJsonObject condition) {
Expand All @@ -41,14 +65,14 @@ public void register(ConditionFactory factory) {

public class ConditionFactory implements Registrable {
NamespacedKey key;
BiPredicate<FactoryJsonObject, Pair<net.minecraft.world.level.biome.Biome, BlockPos>> test;
BiPredicate<FactoryJsonObject, Holder<Biome>> test;

public ConditionFactory(NamespacedKey key, BiPredicate<FactoryJsonObject, Pair<net.minecraft.world.level.biome.Biome, BlockPos>> test) {
public ConditionFactory(NamespacedKey key, BiPredicate<FactoryJsonObject, Holder<Biome>> test) {
this.key = key;
this.test = test;
}

public boolean test(FactoryJsonObject condition, Pair<net.minecraft.world.level.biome.Biome, BlockPos> tester) {
public boolean test(FactoryJsonObject condition, Holder<Biome> tester) {
return test.test(condition, tester);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package me.dueris.originspaper.factory.conditions.types;

import me.dueris.calio.data.factory.FactoryElement;
import me.dueris.calio.data.factory.FactoryJsonObject;
import me.dueris.calio.registry.Registrable;
import me.dueris.originspaper.OriginsPaper;
import me.dueris.originspaper.factory.conditions.ConditionExecutor;
import me.dueris.originspaper.factory.data.types.Comparison;
import me.dueris.originspaper.factory.powers.apoli.Resource;
import me.dueris.originspaper.factory.powers.holder.PowerType;
import me.dueris.originspaper.registry.Registries;
import me.dueris.originspaper.util.entity.PowerHolderComponent;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.biome.Biome;
import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;

Expand Down Expand Up @@ -53,6 +60,28 @@ public void registerConditions() {
// if its value is 0, then it would be true in apoli.
return Resource.serverLoadedBars.containsKey(condition.getString("resource")) && condition.getString("comparison").equalsIgnoreCase("==") && condition.getNumber("compare_to").getInt() == 0;
}));
register(new ConditionFactory(OriginsPaper.apoliIdentifier("biome"), (data, entity) -> {
BlockPos blockPos = entity.getHandle().blockPosition();
ServerLevel level = (ServerLevel) entity.getHandle().level();
Biome biome = level.getBiome(blockPos).value();
FactoryJsonObject condition = data.getJsonObject("condition");
if (data.isPresent("biome") || data.isPresent("biomes")) {
ResourceLocation biomeId = entity.getHandle().level().registryAccess().registryOrThrow(net.minecraft.core.registries.Registries.BIOME).getKey(biome);
if (data.isPresent("biome") && biomeId.equals(data.getResourceLocation("biome"))) {
return condition == null || condition.isEmpty() || ConditionExecutor.testBiome(condition, blockPos, level);
}
if (data.isPresent("biomes") && (
data.getJsonArray("biomes").asList.stream()
.map(FactoryElement::getString)
.map(NamespacedKey::fromString)
.map(CraftNamespacedKey::toMinecraft).toList()
).contains(biomeId)) {
return condition == null || condition.isEmpty() || ConditionExecutor.testBiome(condition, blockPos, level);
}
return false;
}
return condition == null || condition.isEmpty() || ConditionExecutor.testBiome(condition, blockPos, level);
}));
}

public void register(EntityConditions.ConditionFactory factory) {
Expand Down

0 comments on commit 524609e

Please sign in to comment.