Requirement tooltips
This commit is contained in:
@@ -14,7 +14,7 @@ parchment_version = 2024.11.17
|
|||||||
mod_id=mechanical_lemon_lib
|
mod_id=mechanical_lemon_lib
|
||||||
mod_name=MechanicalLemonLib
|
mod_name=MechanicalLemonLib
|
||||||
mod_license=LGPL3
|
mod_license=LGPL3
|
||||||
mod_version=0.1.49
|
mod_version=0.1.56
|
||||||
mod_group_id=com.oierbravo
|
mod_group_id=com.oierbravo
|
||||||
mod_author=oierbravo
|
mod_author=oierbravo
|
||||||
mod_description=Mod Utility Library
|
mod_description=Mod Utility Library
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public abstract class BaseRecipe<T extends RecipeInput, P extends BaseRecipePara
|
|||||||
|
|
||||||
protected ArrayList<ICondition> conditions;
|
protected ArrayList<ICondition> conditions;
|
||||||
|
|
||||||
abstract public List<String> getEnabledRequirements();
|
//abstract public List<String> getEnabledRequirements();
|
||||||
|
|
||||||
public BaseRecipe(P params){
|
public BaseRecipe(P params){
|
||||||
this.id = params.id;
|
this.id = params.id;
|
||||||
|
|||||||
@@ -44,12 +44,12 @@ public abstract class BaseRecipeBuilder<R extends BaseRecipe<?,P>, P extends Bas
|
|||||||
public <BRP extends BaseRecipeBuilder<?,?>> BRP withRequirement(IRecipeRequirement requirement){
|
public <BRP extends BaseRecipeBuilder<?,?>> BRP withRequirement(IRecipeRequirement requirement){
|
||||||
//public <BRP extends BaseRecipeSerializer<?,?> BaseRecipeBuilder<R,P> withRequirement(IRecipeRequirement requirement){
|
//public <BRP extends BaseRecipeSerializer<?,?> BaseRecipeBuilder<R,P> withRequirement(IRecipeRequirement requirement){
|
||||||
params.recipeRequirements.add(requirement);
|
params.recipeRequirements.add(requirement);
|
||||||
return (BRP) this;
|
return ((BRP) this);
|
||||||
}
|
}
|
||||||
public <BRP extends BaseRecipeBuilder<?,?>> BRP withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
|
public <BRP extends BaseRecipeBuilder<?,?>> BRP withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
|
||||||
//public BaseRecipeBuilder<R,P> withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
|
//public BaseRecipeBuilder<R,P> withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
|
||||||
params.recipeRequirements.addAll(pRecipeRequirements);
|
params.recipeRequirements.addAll(pRecipeRequirements);
|
||||||
return (BRP) this;
|
return ((BRP) this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseRecipeBuilder<R,P> whenModLoaded(String modid) {
|
public BaseRecipeBuilder<R,P> whenModLoaded(String modid) {
|
||||||
|
|||||||
@@ -28,13 +28,14 @@ public interface IRecipeRequirement {
|
|||||||
STREAM_CODEC.apply(ByteBufCodecs.list(256));
|
STREAM_CODEC.apply(ByteBufCodecs.list(256));
|
||||||
|
|
||||||
boolean test(Level pLevel, BlockEntity pBlockEntity);
|
boolean test(Level pLevel, BlockEntity pBlockEntity);
|
||||||
/*boolean isPresent();*/
|
|
||||||
String getIdString();
|
String getIdString();
|
||||||
String toString();
|
String toString();
|
||||||
RecipeRequirementType<?> getType();
|
RecipeRequirementType<?> getType();
|
||||||
|
|
||||||
default Component toTooltipComponent(){
|
default Component toTooltipComponent(){
|
||||||
return LibLang.translate("ui.recipe_requirement." + getIdString() + ".tooltip", toString()).component();
|
//return LibLang.translate("ui.recipe_requirement." + getIdString() + ".tooltip").newLine().component().append(toString());.component();
|
||||||
|
return LibLang.translate("ui.recipe_requirement." + getIdString() + ".tooltip", toString()).newLine().space().add(Component.literal(toString())).component();
|
||||||
};
|
};
|
||||||
default Component toMissingComponent(){
|
default Component toMissingComponent(){
|
||||||
return LibLang.translate("ui.recipe_requirement." + getIdString() + ".missing").component();
|
return LibLang.translate("ui.recipe_requirement." + getIdString() + ".missing").component();
|
||||||
|
|||||||
@@ -2,21 +2,29 @@ package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
|
|||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.util.GsonHelper;
|
import net.minecraft.util.GsonHelper;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class RecipeRequirementsUtils {
|
public class RecipeRequirementsUtils {
|
||||||
public static ArrayList<RecipeRequirementType<?>> checkRequirements(Map<String, IRecipeRequirement> pRecipeRequirements, BlockEntity pBlockEntity){
|
/*public static ArrayList<RecipeRequirementType<?>> checkRequirements(Map<String, IRecipeRequirement> pRecipeRequirements, BlockEntity pBlockEntity){
|
||||||
ArrayList<RecipeRequirementType<?>> missingRequirements = new ArrayList<>();
|
ArrayList<RecipeRequirementType<?>> missingRequirements = new ArrayList<>();
|
||||||
pRecipeRequirements.forEach((recipeRequirementType, recipeRequirement) -> {
|
pRecipeRequirements.forEach((recipeRequirementType, recipeRequirement) -> {
|
||||||
if(!recipeRequirement.test(pBlockEntity.getLevel(),pBlockEntity))
|
if(!recipeRequirement.test(pBlockEntity.getLevel(),pBlockEntity))
|
||||||
missingRequirements.add(recipeRequirement.getType());
|
missingRequirements.add(recipeRequirement.getType());
|
||||||
});
|
});
|
||||||
return missingRequirements;
|
return missingRequirements;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
public static <BR extends IRecipeWithRequirements> List<Component> getRequirementsTooltips(BR recipe){
|
||||||
|
if(recipe.getRecipeRequirements().isEmpty())
|
||||||
|
return List.of();
|
||||||
|
return recipe.getRecipeRequirements().stream().map(IRecipeRequirement::toTooltipComponent).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
|
||||||
|
|
||||||
|
import com.mojang.serialization.MapCodec;
|
||||||
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.IRecipeRequirement;
|
||||||
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
||||||
|
import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRecipeRequirementTypes;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||||
|
import net.minecraft.network.codec.ByteBufCodecs;
|
||||||
|
import net.minecraft.network.codec.StreamCodec;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.tags.TagKey;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public record BiomeRequirement(ResourceKey<Biome> biomeResourceKey) implements IRecipeRequirement {
|
||||||
|
public static String ID = "biome";
|
||||||
|
|
||||||
|
public static MapCodec<BiomeRequirement> CODEC = RecordCodecBuilder
|
||||||
|
.mapCodec((builder)
|
||||||
|
-> builder
|
||||||
|
.group(ResourceKey.codec(Registries.BIOME).optionalFieldOf("value", null)
|
||||||
|
.forGetter(BiomeRequirement::biomeResourceKey)).apply(builder,BiomeRequirement::new));
|
||||||
|
|
||||||
|
public static final StreamCodec<RegistryFriendlyByteBuf, BiomeRequirement> STREAM_CODEC = StreamCodec.composite(
|
||||||
|
ResourceKey.streamCodec(Registries.BIOME), BiomeRequirement::biomeResourceKey,
|
||||||
|
BiomeRequirement::new
|
||||||
|
);
|
||||||
|
|
||||||
|
public static BiomeRequirement of(ResourceKey<Biome> key) {
|
||||||
|
return new BiomeRequirement( key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean test(Level pLevel, BlockEntity pBlockEntity) {
|
||||||
|
if(biomeResourceKey == null)
|
||||||
|
return true;
|
||||||
|
Holder<Biome> blockEntityBiome = pLevel.getBiome(pBlockEntity.getBlockPos());
|
||||||
|
|
||||||
|
if(pLevel.isClientSide()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<Holder.Reference<Biome>> requiredBiomeHolder = pLevel.getServer().registryAccess().registryOrThrow(Registries.BIOME).asLookup().get(biomeResourceKey);
|
||||||
|
|
||||||
|
if(requiredBiomeHolder.isPresent()
|
||||||
|
&& blockEntityBiome.is(requiredBiomeHolder.get().key()))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RecipeRequirementType<?> getType() {
|
||||||
|
return MechanicalLemonRecipeRequirementTypes.BIOME.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdString() {
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return biomeResourceKey.location().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
|
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.mojang.serialization.JsonOps;
|
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirement;
|
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.registries.Registries;
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.tags.TagKey;
|
|
||||||
import net.minecraft.util.GsonHelper;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.biome.Biome;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static java.lang.constant.ConstantDescs.NULL;
|
|
||||||
|
|
||||||
public class BiomeRequirement extends RecipeRequirement {
|
|
||||||
public static final RecipeRequirementType<BiomeRequirement> TYPE = new BiomeRequirementType();
|
|
||||||
|
|
||||||
|
|
||||||
public static final BiomeRequirement EMPTY = new BiomeRequirement();
|
|
||||||
|
|
||||||
protected TagKey<Biome> biomeTagKey;
|
|
||||||
|
|
||||||
protected ResourceKey<Biome> biomeResourceKey;
|
|
||||||
|
|
||||||
public BiomeRequirement() {
|
|
||||||
|
|
||||||
}
|
|
||||||
public BiomeRequirement(TagKey<Biome> tag) {
|
|
||||||
biomeTagKey = tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeRequirement(ResourceKey<Biome> key) {
|
|
||||||
biomeResourceKey = key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeRequirement(ResourceKey<Biome> key, TagKey<Biome> tag) {
|
|
||||||
this.biomeResourceKey = key;
|
|
||||||
this.biomeTagKey = tag;
|
|
||||||
}
|
|
||||||
public static BiomeRequirement of(ResourceKey<Biome> key) {
|
|
||||||
return new BiomeRequirement(key);
|
|
||||||
}
|
|
||||||
public static BiomeRequirement of(TagKey<Biome> tag) {
|
|
||||||
return new BiomeRequirement(tag);
|
|
||||||
}
|
|
||||||
public static BiomeRequirement of(ResourceKey<Biome> key, TagKey<Biome> tag) {
|
|
||||||
return new BiomeRequirement(key, tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean test(Level pLevel, BlockEntity pBlockEntity) {
|
|
||||||
if(biomeResourceKey == null && biomeTagKey == null)
|
|
||||||
return true;
|
|
||||||
Holder<Biome> blockEntityBiome = pLevel.getBiome(pBlockEntity.getBlockPos());
|
|
||||||
|
|
||||||
if(pLevel.isClientSide()){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Optional<Holder.Reference<Biome>> requiredBiomeHolder = pLevel.getServer().registryAccess().registryOrThrow(Registries.BIOME).asLookup().get(biomeResourceKey);
|
|
||||||
|
|
||||||
if(requiredBiomeHolder.isPresent()
|
|
||||||
&& blockEntityBiome.is(requiredBiomeHolder.get().key()))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
return pLevel.getServer().registryAccess().registryOrThrow(Registries.BIOME).getTag(biomeTagKey).map(t ->
|
|
||||||
t.contains(blockEntityBiome)
|
|
||||||
).orElse(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isPresent(){
|
|
||||||
if(biomeTagKey == null && biomeResourceKey == null)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString(){
|
|
||||||
if(biomeTagKey == null && biomeResourceKey == null)
|
|
||||||
return null;
|
|
||||||
if(biomeResourceKey != null)
|
|
||||||
return biomeResourceKey.location().toString();
|
|
||||||
return biomeTagKey.location().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RecipeRequirementType<?> getType() {
|
|
||||||
return TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class BiomeRequirementType extends RecipeRequirementType<BiomeRequirement> {
|
|
||||||
|
|
||||||
public BiomeRequirementType() {
|
|
||||||
super("biome");
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeRequirementType(String id) {
|
|
||||||
super(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeRequirement fromJson(JsonObject pJson) {
|
|
||||||
if (GsonHelper.isValidNode(pJson, "biome")) {
|
|
||||||
ResourceKey<Biome> biomeResourceKey = ResourceKey.codec(Registries.BIOME).parse(JsonOps.INSTANCE, pJson.get("biome")).result().get();
|
|
||||||
TagKey<Biome> biomeTag = TagKey.codec(Registries.BIOME).parse(JsonOps.INSTANCE, pJson.get("biome")).result().get();
|
|
||||||
return BiomeRequirement.of(biomeResourceKey,biomeTag);
|
|
||||||
}
|
|
||||||
return BiomeRequirement.EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JsonObject toJson(JsonObject pJson, RecipeRequirement pRecipeRequirement){
|
|
||||||
if(!pRecipeRequirement.isPresent())
|
|
||||||
return pJson;
|
|
||||||
pJson.addProperty("biome", pRecipeRequirement.toString());
|
|
||||||
return pJson;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeRequirement fromNetwork(FriendlyByteBuf buffer) {
|
|
||||||
boolean hasRequirement = buffer.readBoolean();
|
|
||||||
if(hasRequirement) {
|
|
||||||
ResourceLocation rl = buffer.readResourceLocation();
|
|
||||||
if (NULL.equals(rl)) return BiomeRequirement.EMPTY;
|
|
||||||
else return BiomeRequirement.of(TagKey.create(Registries.BIOME, rl));
|
|
||||||
}
|
|
||||||
return BiomeRequirement.EMPTY;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void toNetwork(FriendlyByteBuf buffer, RecipeRequirement pRecipeRequirement) {
|
|
||||||
if(pRecipeRequirement == null)
|
|
||||||
pRecipeRequirement = new BiomeRequirement();
|
|
||||||
if(pRecipeRequirement instanceof BiomeRequirement){
|
|
||||||
buffer.writeBoolean(pRecipeRequirement.isPresent());
|
|
||||||
if(pRecipeRequirement.isPresent()) {
|
|
||||||
TagKey<Biome> biome = ((BiomeRequirement) pRecipeRequirement).biomeTagKey;
|
|
||||||
buffer.writeResourceLocation(biome.location());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
|
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.mojang.serialization.JsonOps;
|
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirement;
|
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.RegistryAccess;
|
|
||||||
import net.minecraft.core.registries.Registries;
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.tags.TagKey;
|
|
||||||
import net.minecraft.util.GsonHelper;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.biome.Biome;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static java.lang.constant.ConstantDescs.NULL;
|
|
||||||
|
|
||||||
public class BiomeRequirement extends RecipeRequirement {
|
|
||||||
public static final RecipeRequirementType<BiomeRequirement> TYPE = new BiomeRequirementType();
|
|
||||||
|
|
||||||
|
|
||||||
public static final BiomeRequirement EMPTY = new BiomeRequirement();
|
|
||||||
|
|
||||||
protected TagKey<Biome> biomeTagKey;
|
|
||||||
|
|
||||||
protected ResourceKey<Biome> biomeResourceKey;
|
|
||||||
|
|
||||||
public BiomeRequirement() {
|
|
||||||
|
|
||||||
}
|
|
||||||
public BiomeRequirement(TagKey<Biome> tag) {
|
|
||||||
this(null,tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeRequirement(ResourceKey<Biome> key) {
|
|
||||||
this(key,null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeRequirement(ResourceKey<Biome> key, TagKey<Biome> tag) {
|
|
||||||
this.biomeResourceKey = key;
|
|
||||||
this.biomeTagKey = tag;
|
|
||||||
}
|
|
||||||
public static BiomeRequirement of(ResourceKey<Biome> key) {
|
|
||||||
return new BiomeRequirement(key);
|
|
||||||
}
|
|
||||||
public static BiomeRequirement of(TagKey<Biome> tag) {
|
|
||||||
return new BiomeRequirement(tag);
|
|
||||||
}
|
|
||||||
public static BiomeRequirement of(ResourceKey<Biome> key, TagKey<Biome> tag) {
|
|
||||||
return new BiomeRequirement(key, tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean test(Level pLevel, BlockEntity pBlockEntity) {
|
|
||||||
if(biomeResourceKey == null && biomeTagKey == null)
|
|
||||||
return true;
|
|
||||||
Holder<Biome> blockEntityBiome = pLevel.getBiome(pBlockEntity.getBlockPos());
|
|
||||||
|
|
||||||
/*if(pLevel.isClientSide()){
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
RegistryAccess registryAccess;
|
|
||||||
if(pLevel.isClientSide())
|
|
||||||
registryAccess = Objects.requireNonNull(Minecraft.getInstance().getConnection()).registryAccess();
|
|
||||||
registryAccess = pLevel.registryAccess();
|
|
||||||
|
|
||||||
Optional<Holder.Reference<Biome>> requiredBiomeHolder = Objects.requireNonNull(registryAccess.registryOrThrow(Registries.BIOME).asLookup().get(biomeResourceKey));
|
|
||||||
|
|
||||||
if(requiredBiomeHolder.isPresent()
|
|
||||||
&& blockEntityBiome.is(requiredBiomeHolder.get().key()))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
return registryAccess.registryOrThrow(Registries.BIOME).getTag(biomeTagKey).map(t ->
|
|
||||||
t.contains(blockEntityBiome)
|
|
||||||
).orElse(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isPresent(){
|
|
||||||
if(biomeTagKey == null && biomeResourceKey == null)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString(){
|
|
||||||
if(biomeTagKey == null && biomeResourceKey == null)
|
|
||||||
return null;
|
|
||||||
if(biomeResourceKey != null)
|
|
||||||
return biomeResourceKey.location().toString();
|
|
||||||
return biomeTagKey.location().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RecipeRequirementType<?> getType() {
|
|
||||||
return TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class BiomeRequirementType extends RecipeRequirementType<BiomeRequirement> {
|
|
||||||
|
|
||||||
public BiomeRequirementType() {
|
|
||||||
super("biome");
|
|
||||||
}
|
|
||||||
|
|
||||||
public BiomeRequirementType(String id) {
|
|
||||||
super(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeRequirement fromJson(JsonObject pJson) {
|
|
||||||
if (GsonHelper.isValidNode(pJson, "biome")) {
|
|
||||||
ResourceKey<Biome> biomeResourceKey = ResourceKey.codec(Registries.BIOME).parse(JsonOps.INSTANCE, pJson.get("biome")).result().get();
|
|
||||||
TagKey<Biome> biomeTag = TagKey.codec(Registries.BIOME).parse(JsonOps.INSTANCE, pJson.get("biome")).result().get();
|
|
||||||
return BiomeRequirement.of(biomeResourceKey,biomeTag);
|
|
||||||
}
|
|
||||||
return BiomeRequirement.EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JsonObject toJson(JsonObject pJson, RecipeRequirement pRecipeRequirement){
|
|
||||||
if(!pRecipeRequirement.isPresent())
|
|
||||||
return pJson;
|
|
||||||
pJson.addProperty("biome", pRecipeRequirement.toString());
|
|
||||||
return pJson;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BiomeRequirement fromNetwork(FriendlyByteBuf buffer) {
|
|
||||||
boolean hasRequirement = buffer.readBoolean();
|
|
||||||
if(hasRequirement) {
|
|
||||||
ResourceLocation rl = buffer.readResourceLocation();
|
|
||||||
if (NULL.equals(rl)) return BiomeRequirement.EMPTY;
|
|
||||||
else return BiomeRequirement.of(TagKey.create(Registries.BIOME, rl));
|
|
||||||
}
|
|
||||||
return BiomeRequirement.EMPTY;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void toNetwork(FriendlyByteBuf buffer, RecipeRequirement pRecipeRequirement) {
|
|
||||||
if(pRecipeRequirement == null)
|
|
||||||
pRecipeRequirement = new BiomeRequirement();
|
|
||||||
if(pRecipeRequirement instanceof BiomeRequirement){
|
|
||||||
buffer.writeBoolean(pRecipeRequirement.isPresent());
|
|
||||||
if(pRecipeRequirement.isPresent()) {
|
|
||||||
TagKey<Biome> biome = ((BiomeRequirement) pRecipeRequirement).biomeTagKey;
|
|
||||||
buffer.writeResourceLocation(biome.location());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
|
||||||
|
|
||||||
|
import com.mojang.serialization.Codec;
|
||||||
|
import com.mojang.serialization.MapCodec;
|
||||||
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.IRecipeRequirement;
|
||||||
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
||||||
|
import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRecipeRequirementTypes;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||||
|
import net.minecraft.network.codec.ByteBufCodecs;
|
||||||
|
import net.minecraft.network.codec.StreamCodec;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.tags.BiomeTags;
|
||||||
|
import net.minecraft.tags.TagKey;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public record BiomeTagRequirement(TagKey<Biome> tag) implements IRecipeRequirement {
|
||||||
|
public static String ID = "biome_tag";
|
||||||
|
|
||||||
|
public BiomeTagRequirement(ResourceLocation resourceLocation){
|
||||||
|
this(TagKey.create(Registries.BIOME,resourceLocation));
|
||||||
|
}
|
||||||
|
public static MapCodec<BiomeTagRequirement> CODEC = RecordCodecBuilder
|
||||||
|
.mapCodec((builder)
|
||||||
|
-> builder
|
||||||
|
//.group(TagKey.codec(Registries.BIOME).optionalFieldOf("value", null)
|
||||||
|
.group(ResourceLocation.CODEC.optionalFieldOf("value", null)
|
||||||
|
.forGetter(BiomeTagRequirement::getResourceLocation)).apply(builder,BiomeTagRequirement::new));
|
||||||
|
|
||||||
|
public static final StreamCodec<RegistryFriendlyByteBuf, BiomeTagRequirement> STREAM_CODEC = StreamCodec.composite(
|
||||||
|
ResourceLocation.STREAM_CODEC, BiomeTagRequirement::getResourceLocation,
|
||||||
|
BiomeTagRequirement::new
|
||||||
|
);
|
||||||
|
public ResourceLocation getResourceLocation(){
|
||||||
|
return tag.location();
|
||||||
|
}
|
||||||
|
/* public static final StreamCodec<RegistryFriendlyByteBuf, BiomeTagRequirement> STREAM_CODEC = StreamCodec.composite(
|
||||||
|
ResourceKey.streamCodec(Registries.BIOME), BiomeTagRequirement::tag,
|
||||||
|
BiomeTagRequirement::new
|
||||||
|
);*/
|
||||||
|
|
||||||
|
public static BiomeTagRequirement of(TagKey<Biome> tag) {
|
||||||
|
return new BiomeTagRequirement(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean test(Level pLevel, BlockEntity pBlockEntity) {
|
||||||
|
if(tag == null)
|
||||||
|
return true;
|
||||||
|
Holder<Biome> blockEntityBiome = pLevel.getBiome(pBlockEntity.getBlockPos());
|
||||||
|
|
||||||
|
if(pLevel.isClientSide()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pLevel.getServer().registryAccess().registryOrThrow(Registries.BIOME).getTag(tag).map(t ->
|
||||||
|
t.contains(blockEntityBiome)
|
||||||
|
).orElse(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RecipeRequirementType<?> getType() {
|
||||||
|
return MechanicalLemonRecipeRequirementTypes.BIOME_TAG.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdString() {
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return tag.location().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -33,14 +33,9 @@ public record MaxSpeedRequirement(Float speed) implements IRecipeRequirement {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @Override
|
|
||||||
public boolean isPresent() {
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RecipeRequirementType<?> getType() {
|
public RecipeRequirementType<?> getType() {
|
||||||
return MechanicalLemonRecipeRequirementTypes.MIN_SPEED.get();
|
return MechanicalLemonRecipeRequirementTypes.MAX_SPEED.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -39,11 +39,6 @@ public record MaxYRequirement(Integer maxY) implements IRecipeRequirement{
|
|||||||
return pos.getCenter().y <= maxY;
|
return pos.getCenter().y <= maxY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @Override
|
|
||||||
public boolean isPresent() {
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RecipeRequirementType<?> getType() {
|
public RecipeRequirementType<?> getType() {
|
||||||
return MechanicalLemonRecipeRequirementTypes.MAX_Y.get();
|
return MechanicalLemonRecipeRequirementTypes.MAX_Y.get();
|
||||||
|
|||||||
@@ -33,11 +33,6 @@ public record MinSpeedRequirement(Float speed) implements IRecipeRequirement {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @Override
|
|
||||||
public boolean isPresent() {
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RecipeRequirementType<?> getType() {
|
public RecipeRequirementType<?> getType() {
|
||||||
return MechanicalLemonRecipeRequirementTypes.MIN_SPEED.get();
|
return MechanicalLemonRecipeRequirementTypes.MIN_SPEED.get();
|
||||||
|
|||||||
@@ -39,11 +39,6 @@ public record MinYRequirement(Integer minY) implements IRecipeRequirement {
|
|||||||
return pos.getCenter().y >= minY;
|
return pos.getCenter().y >= minY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*@Override
|
|
||||||
public boolean isPresent() {
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RecipeRequirementType<?> getType() {
|
public RecipeRequirementType<?> getType() {
|
||||||
return MechanicalLemonRecipeRequirementTypes.MIN_Y.get();
|
return MechanicalLemonRecipeRequirementTypes.MIN_Y.get();
|
||||||
|
|||||||
@@ -4,10 +4,7 @@ import com.mojang.serialization.MapCodec;
|
|||||||
import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib;
|
import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib;
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.IRecipeRequirement;
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.IRecipeRequirement;
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements.MaxSpeedRequirement;
|
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements.*;
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements.MaxYRequirement;
|
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements.MinYRequirement;
|
|
||||||
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements.MinSpeedRequirement;
|
|
||||||
import net.minecraft.network.codec.StreamCodec;
|
import net.minecraft.network.codec.StreamCodec;
|
||||||
import net.neoforged.bus.api.IEventBus;
|
import net.neoforged.bus.api.IEventBus;
|
||||||
import net.neoforged.neoforge.registries.DeferredRegister;
|
import net.neoforged.neoforge.registries.DeferredRegister;
|
||||||
@@ -31,6 +28,12 @@ public class MechanicalLemonRecipeRequirementTypes {
|
|||||||
public static final Supplier<RecipeRequirementType<MaxYRequirement>> MAX_Y =
|
public static final Supplier<RecipeRequirementType<MaxYRequirement>> MAX_Y =
|
||||||
register(MaxYRequirement.ID, MaxYRequirement.CODEC, MaxYRequirement.STREAM_CODEC);
|
register(MaxYRequirement.ID, MaxYRequirement.CODEC, MaxYRequirement.STREAM_CODEC);
|
||||||
|
|
||||||
|
public static final Supplier<RecipeRequirementType<BiomeRequirement>> BIOME =
|
||||||
|
register(BiomeRequirement.ID, BiomeRequirement.CODEC, BiomeRequirement.STREAM_CODEC);
|
||||||
|
|
||||||
|
public static final Supplier<RecipeRequirementType<BiomeTagRequirement>> BIOME_TAG =
|
||||||
|
register(BiomeTagRequirement.ID, BiomeTagRequirement.CODEC, BiomeTagRequirement.STREAM_CODEC);
|
||||||
|
|
||||||
public static void init(IEventBus modEventBus) {
|
public static void init(IEventBus modEventBus) {
|
||||||
RECIPE_REQUIREMENT_TYPES.register(modEventBus);
|
RECIPE_REQUIREMENT_TYPES.register(modEventBus);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
{
|
{
|
||||||
"mechanical_lemon_lib.ui.progress": "Progress: %d%%",
|
"mechanical_lemon_lib.ui.progress": "Progress: %d%%",
|
||||||
"itemGroup.mechanical_lemon_lib": "Mechanicals",
|
"itemGroup.mechanical_lemon_lib": "Mechanicals",
|
||||||
|
"mechanical_lemon_lib.ui.recipe.requirements.title": "Requirements:",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.none.tooltip": "No specific requirement",
|
"mechanical_lemon_lib.ui.recipe_requirement.none.tooltip": "No specific requirement",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.biome.tooltip": "Biome: %s",
|
"mechanical_lemon_lib.ui.recipe_requirement.biome.tooltip": "Biome: %s",
|
||||||
|
"mechanical_lemon_lib.ui.recipe_requirement.biome_tag.tooltip": "Biome: %s",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.min_y.tooltip": "Min Y: %s",
|
"mechanical_lemon_lib.ui.recipe_requirement.min_y.tooltip": "Min Y: %s",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.max_y.tooltip": "Max Y: %s",
|
"mechanical_lemon_lib.ui.recipe_requirement.max_y.tooltip": "Max Y: %s",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.min_speed.tooltip": "Min Speed: %s",
|
"mechanical_lemon_lib.ui.recipe_requirement.min_speed.tooltip": "Min Speed: %s",
|
||||||
|
"mechanical_lemon_lib.ui.recipe_requirement.max_speed.tooltip": "Max Speed: %s",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.biome.missing": "Incorrect biome",
|
"mechanical_lemon_lib.ui.recipe_requirement.biome.missing": "Incorrect biome",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.max_y.missing": "Too high",
|
"mechanical_lemon_lib.ui.recipe_requirement.max_y.missing": "Y position Too high",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.min_y.missing": "Too low",
|
"mechanical_lemon_lib.ui.recipe_requirement.min_y.missing": "Y position Too low",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.min_speed.missing": "Not enough speed",
|
"mechanical_lemon_lib.ui.recipe_requirement.min_speed.missing": "Not enough speed",
|
||||||
|
"mechanical_lemon_lib.ui.recipe_requirement.max_speed.missing": "Too fast",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.output.missing": "Output full or incompatible",
|
"mechanical_lemon_lib.ui.recipe_requirement.output.missing": "Output full or incompatible",
|
||||||
"mechanical_lemon_lib.ui.recipe_requirement.ingredients.missing": "Missing ingredients"
|
"mechanical_lemon_lib.ui.recipe_requirement.ingredients.missing": "Missing ingredients"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user