minecraft-source/src/net/minecraft/advancements/critereon/LocationPredicate.java

175 lines
7.9 KiB
Java

package net.minecraft.advancements.critereon;
import com.google.gson.JsonSyntaxException;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import net.minecraft.core.Registry;
import net.minecraft.world.level.levelgen.feature.Feature;
import com.google.gson.JsonObject;
import com.google.gson.JsonNull;
import com.google.gson.JsonElement;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.levelgen.feature.StructureFeature;
import javax.annotation.Nullable;
import net.minecraft.world.level.biome.Biome;
public class LocationPredicate {
public static final LocationPredicate ANY;
private final MinMaxBounds.Floats x;
private final MinMaxBounds.Floats y;
private final MinMaxBounds.Floats z;
@Nullable
private final Biome biome;
@Nullable
private final StructureFeature<?> feature;
@Nullable
private final DimensionType dimension;
private final LightPredicate light;
private final BlockPredicate block;
private final FluidPredicate fluid;
public LocationPredicate(final MinMaxBounds.Floats c1, final MinMaxBounds.Floats c2, final MinMaxBounds.Floats c3, @Nullable final Biome bkt, @Nullable final StructureFeature<?> cfl, @Nullable final DimensionType cbi, final LightPredicate bo, final BlockPredicate aj, final FluidPredicate bf) {
this.x = c1;
this.y = c2;
this.z = c3;
this.biome = bkt;
this.feature = cfl;
this.dimension = cbi;
this.light = bo;
this.block = aj;
this.fluid = bf;
}
public static LocationPredicate inBiome(final Biome bkt) {
return new LocationPredicate(MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, bkt, null, null, LightPredicate.ANY, BlockPredicate.ANY, FluidPredicate.ANY);
}
public static LocationPredicate inDimension(final DimensionType cbi) {
return new LocationPredicate(MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, null, null, cbi, LightPredicate.ANY, BlockPredicate.ANY, FluidPredicate.ANY);
}
public static LocationPredicate inFeature(final StructureFeature<?> cfl) {
return new LocationPredicate(MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, null, cfl, null, LightPredicate.ANY, BlockPredicate.ANY, FluidPredicate.ANY);
}
public boolean matches(final ServerLevel xd, final double double2, final double double3, final double double4) {
return this.matches(xd, (float)double2, (float)double3, (float)double4);
}
public boolean matches(final ServerLevel xd, final float float2, final float float3, final float float4) {
if (!this.x.matches(float2)) {
return false;
}
if (!this.y.matches(float3)) {
return false;
}
if (!this.z.matches(float4)) {
return false;
}
if (this.dimension != null && this.dimension != xd.dimension.getType()) {
return false;
}
final BlockPos fk6 = new BlockPos(float2, float3, float4);
final boolean boolean7 = xd.isLoaded(fk6);
return (this.biome == null || (boolean7 && this.biome == xd.getBiome(fk6))) && (this.feature == null || (boolean7 && this.feature.isInsideFeature(xd, fk6))) && this.light.matches(xd, fk6) && this.block.matches(xd, fk6) && this.fluid.matches(xd, fk6);
}
public JsonElement serializeToJson() {
if (this == LocationPredicate.ANY) {
return JsonNull.INSTANCE;
}
final JsonObject jsonObject2 = new JsonObject();
if (!this.x.isAny() || !this.y.isAny() || !this.z.isAny()) {
final JsonObject jsonObject3 = new JsonObject();
jsonObject3.add("x", this.x.serializeToJson());
jsonObject3.add("y", this.y.serializeToJson());
jsonObject3.add("z", this.z.serializeToJson());
jsonObject2.add("position", jsonObject3);
}
if (this.dimension != null) {
jsonObject2.addProperty("dimension", DimensionType.getName(this.dimension).toString());
}
if (this.feature != null) {
jsonObject2.addProperty("feature", Feature.STRUCTURES_REGISTRY.inverse().get(this.feature));
}
if (this.biome != null) {
jsonObject2.addProperty("biome", Registry.BIOME.getKey(this.biome).toString());
}
jsonObject2.add("light", this.light.serializeToJson());
jsonObject2.add("block", this.block.serializeToJson());
jsonObject2.add("fluid", this.fluid.serializeToJson());
return jsonObject2;
}
public static LocationPredicate fromJson(@Nullable final JsonElement jsonElement) {
if (jsonElement == null || jsonElement.isJsonNull()) {
return LocationPredicate.ANY;
}
final JsonObject jsonObject2 = GsonHelper.convertToJsonObject(jsonElement, "location");
final JsonObject jsonObject3 = GsonHelper.getAsJsonObject(jsonObject2, "position", new JsonObject());
final MinMaxBounds.Floats c4 = MinMaxBounds.Floats.fromJson(jsonObject3.get("x"));
final MinMaxBounds.Floats c5 = MinMaxBounds.Floats.fromJson(jsonObject3.get("y"));
final MinMaxBounds.Floats c6 = MinMaxBounds.Floats.fromJson(jsonObject3.get("z"));
final DimensionType cbi7 = jsonObject2.has("dimension") ? DimensionType.getByName(new ResourceLocation(GsonHelper.getAsString(jsonObject2, "dimension"))) : null;
final StructureFeature<?> cfl8 = jsonObject2.has("feature") ? Feature.STRUCTURES_REGISTRY.get(GsonHelper.getAsString(jsonObject2, "feature")) : null;
Biome bkt9 = null;
if (jsonObject2.has("biome")) {
final ResourceLocation sm10 = new ResourceLocation(GsonHelper.getAsString(jsonObject2, "biome"));
final Object o;
final Object obj;
bkt9 = Registry.BIOME.getOptional(sm10).<Throwable>orElseThrow(() -> {
new JsonSyntaxException("Unknown biome '" + obj + "'");
return o;
});
}
final LightPredicate bo10 = LightPredicate.fromJson(jsonObject2.get("light"));
final BlockPredicate aj11 = BlockPredicate.fromJson(jsonObject2.get("block"));
final FluidPredicate bf12 = FluidPredicate.fromJson(jsonObject2.get("fluid"));
return new LocationPredicate(c4, c5, c6, bkt9, cfl8, cbi7, bo10, aj11, bf12);
}
static {
ANY = new LocationPredicate(MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, MinMaxBounds.Floats.ANY, null, null, null, LightPredicate.ANY, BlockPredicate.ANY, FluidPredicate.ANY);
}
public static class Builder {
private MinMaxBounds.Floats x;
private MinMaxBounds.Floats y;
private MinMaxBounds.Floats z;
@Nullable
private Biome biome;
@Nullable
private StructureFeature<?> feature;
@Nullable
private DimensionType dimension;
private LightPredicate light;
private BlockPredicate block;
private FluidPredicate fluid;
public Builder() {
this.x = MinMaxBounds.Floats.ANY;
this.y = MinMaxBounds.Floats.ANY;
this.z = MinMaxBounds.Floats.ANY;
this.light = LightPredicate.ANY;
this.block = BlockPredicate.ANY;
this.fluid = FluidPredicate.ANY;
}
public static Builder location() {
return new Builder();
}
public Builder setBiome(@Nullable final Biome bkt) {
this.biome = bkt;
return this;
}
public LocationPredicate build() {
return new LocationPredicate(this.x, this.y, this.z, this.biome, this.feature, this.dimension, this.light, this.block, this.fluid);
}
}
}