Name change

This commit is contained in:
2025-03-17 11:44:54 +01:00
parent f961ec81e4
commit 3b6df19189
47 changed files with 364 additions and 458 deletions

View File

@@ -1,4 +1,4 @@
# Mechanical Lemon Lib
# Mechanicals Lib
## License
- Certain sections of the code are from the Create mod, which is licensed under the MIT license. See Create's license for more information.

View File

@@ -11,13 +11,13 @@ parchment_minecraft_version = 1.21.1
parchment_version = 2024.11.17
# Dependency Versions
mod_id=mechanical_lemon_lib
mod_name=MechanicalLemonLib
mod_id=mechanicals
mod_name=Mechanicals Lib
mod_license=LGPL3
mod_version=0.1.56
mod_version=0.1.0
mod_group_id=com.oierbravo
mod_author=oierbravo
mod_description=Mod Utility Library
mod_description=Utility Library for Create Addons.
# dependency versions
create_version = 6.0.2-32

View File

@@ -12,4 +12,4 @@ plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
}
rootProject.name = 'MechanicalLemonLib'
rootProject.name = 'Mechanicals'

View File

@@ -1,38 +0,0 @@
package com.oierbravo.mechanical_lemon_lib;
import com.mojang.logging.LogUtils;
import com.oierbravo.mechanical_lemon_lib.register.LemonCreativeModeTabs;
import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRecipeRequirementTypes;
import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRegistries;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.registries.*;
import org.slf4j.Logger;
@Mod(MechanicalLemonLib.MODID)
public class MechanicalLemonLib {
public static final String MODID = "mechanical_lemon_lib";
private static final Logger LOGGER = LogUtils.getLogger();
public MechanicalLemonLib(IEventBus modEventBus, ModContainer modContainer) {
LemonCreativeModeTabs.register(modEventBus);
modEventBus.addListener(this::newRegistries);
MechanicalLemonRecipeRequirementTypes.init(modEventBus);
}
private void newRegistries(NewRegistryEvent event) {
MechanicalLemonRegistries.register(event);
}
public static ResourceLocation asResource(String path) {
return ResourceLocation.fromNamespaceAndPath(MODID, path);
}
public static Logger getLogger(){
return LOGGER;
}
}

View File

@@ -1,159 +0,0 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementRequirements;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.Criterion;
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.neoforged.neoforge.common.conditions.ICondition;
import net.neoforged.neoforge.common.conditions.ModLoadedCondition;
import net.neoforged.neoforge.common.conditions.NotCondition;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
public abstract class BaseRecipeBuilder<R extends BaseRecipe<?,P>, P extends BaseRecipeParams> {
protected final Map<String, Criterion<?>> criteria = new LinkedHashMap<>();
protected P params;
protected ArrayList<IRecipeRequirement> recipeRequirements;
protected ArrayList<ICondition> recipeConditions;
public BaseRecipeBuilder( ResourceLocation id){
recipeRequirements = new ArrayList<>();
recipeConditions = new ArrayList<>();
}
public abstract R build();
public void build(Consumer<RecipeBuilder> consumer) {
consumer.accept(new DataGenResult<>(build(), recipeConditions));
}
public <BRP extends BaseRecipeBuilder<?,?>> BRP withRequirement(IRecipeRequirement requirement){
//public <BRP extends BaseRecipeSerializer<?,?> BaseRecipeBuilder<R,P> withRequirement(IRecipeRequirement requirement){
params.recipeRequirements.add(requirement);
return ((BRP) this);
}
public <BRP extends BaseRecipeBuilder<?,?>> BRP withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
//public BaseRecipeBuilder<R,P> withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
params.recipeRequirements.addAll(pRecipeRequirements);
return ((BRP) this);
}
public BaseRecipeBuilder<R,P> whenModLoaded(String modid) {
return withCondition(new ModLoadedCondition(modid));
}
public BaseRecipeBuilder<R,P> whenModMissing(String modid) {
return withCondition(new NotCondition(new ModLoadedCondition(modid)));
}
public BaseRecipeBuilder<R,P> withCondition(ICondition condition) {
recipeConditions.add(condition);
return this;
}
public void save(RecipeOutput recipeOutput, ResourceLocation resourceLocation) {
Advancement.Builder advancement = recipeOutput.advancement()
.addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(resourceLocation))
.rewards(AdvancementRewards.Builder.recipe(resourceLocation))
.requirements(AdvancementRequirements.Strategy.OR);
this.criteria.forEach(advancement::addCriterion);
recipeOutput.accept(resourceLocation, build(), advancement.build(params.id.withPrefix("recipes/")));
}
public void save(RecipeOutput recipeOutput) {
save(recipeOutput, params.id);
}
public static class DataGenResult<S extends BaseRecipe<?,?>> implements RecipeBuilder {
private List<ICondition> recipeConditions;
private BaseRecipeSerializer<S,?> serializer;
private ResourceLocation id;
protected final Map<String, Criterion<?>> criteria = new LinkedHashMap<>();
@Nullable
protected String group;
private S recipe;
@SuppressWarnings("unchecked")
public DataGenResult(S recipe, List<ICondition> recipeConditions) {
this.recipe = recipe;
this.recipeConditions = recipeConditions;
ResourceLocation typeId = recipe.id;
if (!(recipe.getSerializer() instanceof BaseRecipeSerializer))
throw new IllegalStateException("Cannot datagen Recipe of type: " + typeId);
this.id = ResourceLocation.fromNamespaceAndPath(recipe.id.getNamespace(),
typeId.getPath() + "/" + recipe.id.getPath());
this.serializer = (BaseRecipeSerializer<S, ?>) recipe.getSerializer();
}
@Override
public RecipeBuilder unlockedBy(String name, Criterion<?> criterion) {
this.criteria.put(name, criterion);
return this;
}
@Override
public RecipeBuilder group(@Nullable String s) {
this.group = group;
return this; }
@Override
public Item getResult() {
return null;
}
@Override
public void save(RecipeOutput recipeOutput, ResourceLocation resourceLocation) {
}
/*@Override
public void serializeRecipeData(JsonObject json) {
serializer.write(json, recipe);
if (recipeConditions.isEmpty())
return;
JsonArray conds = new JsonArray();
recipeConditions.forEach(c -> conds.add(CraftingHelper.serialize(c)));
json.add("conditions", conds);
}
@Override
public ResourceLocation getId() {
return id;
}
@Override
public RecipeSerializer<?> getType() {
return serializer;
}
@Override
public JsonObject serializeAdvancement() {
return null;
}
@Override
public ResourceLocation getAdvancementId() {
return null;
}*/
}
}

View File

@@ -1,20 +0,0 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
import com.google.gson.JsonObject;
import com.mojang.serialization.MapCodec;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.crafting.RecipeSerializer;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public abstract class BaseRecipeSerializer<R extends BaseRecipe<?,?>, B extends BaseRecipeBuilder<R,?>> implements RecipeSerializer<R> {
protected final List<String> enabledRecipeRequirements;
public BaseRecipeSerializer(List<String> pEnabledRecipeRequirements) {
this.enabledRecipeRequirements = pEnabledRecipeRequirements;
}
}

View File

@@ -1,5 +0,0 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
public interface IBaseRecipeParams {
}

View File

@@ -1,8 +0,0 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
public interface IProcessBlockingRequirement {
boolean test(Level pLevel, BlockEntity pBlockEntity);
}

View File

@@ -1,23 +0,0 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public interface IRecipeWithRequirements {
ArrayList<IRecipeRequirement> getRecipeRequirements();
//List<String> getEnabledRequirements();
default Optional<IRecipeRequirement> getRequirement(RecipeRequirementType<?> type) {
return getRecipeRequirements().stream().filter(iRecipeRequirement -> iRecipeRequirement.getType() == type).findFirst();
}
boolean checkRequirements(Level pLevel, BlockEntity pBlockEntity);
}

View File

@@ -1,30 +0,0 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
import com.google.gson.JsonObject;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class RecipeRequirementsUtils {
/*public static ArrayList<RecipeRequirementType<?>> checkRequirements(Map<String, IRecipeRequirement> pRecipeRequirements, BlockEntity pBlockEntity){
ArrayList<RecipeRequirementType<?>> missingRequirements = new ArrayList<>();
pRecipeRequirements.forEach((recipeRequirementType, recipeRequirement) -> {
if(!recipeRequirement.test(pBlockEntity.getLevel(),pBlockEntity))
missingRequirements.add(recipeRequirement.getType());
});
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();
}
}

View File

@@ -0,0 +1,13 @@
package com.oierbravo.mechanicals;
import dev.engine_room.flywheel.lib.model.baked.PartialModel;
public class MechanicalPartials {
public static final PartialModel SHAFT_QUARTER = block("shaft_quarter");
private static PartialModel block(String path) {
return PartialModel.of(Mechanicals.asResource("block/" + path));
}
public static void init() {
// init static fields
}
}

View File

@@ -0,0 +1,44 @@
package com.oierbravo.mechanicals;
import com.mojang.logging.LogUtils;
import com.oierbravo.mechanicals.register.MechanicalCreativeModeTabs;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
import com.oierbravo.mechanicals.register.MechanicalRegistries;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.registries.*;
import org.slf4j.Logger;
@Mod(Mechanicals.MODID)
public class Mechanicals {
public static final String MODID = "mechanicals";
private static final Logger LOGGER = LogUtils.getLogger();
public Mechanicals(IEventBus modEventBus, ModContainer modContainer) {
MechanicalCreativeModeTabs.register(modEventBus);
modEventBus.addListener(this::newRegistries);
MechanicalRecipeRequirementTypes.init(modEventBus);
modEventBus.addListener(this::doClientStuff);
}
private void doClientStuff(final FMLClientSetupEvent event) {
MechanicalPartials.init();
}
private void newRegistries(NewRegistryEvent event) {
MechanicalRegistries.register(event);
}
public static ResourceLocation asResource(String path) {
return ResourceLocation.fromNamespaceAndPath(MODID, path);
}
public static Logger getLogger(){
return LOGGER;
}
}

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.foundation.blockEntity.behaviour;
package com.oierbravo.mechanicals.foundation.blockEntity.behaviour;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType;

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.foundation.blockEntity.behaviour;
package com.oierbravo.mechanicals.foundation.blockEntity.behaviour;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType;

View File

@@ -1,9 +1,7 @@
package com.oierbravo.mechanical_lemon_lib.foundation.blockEntity.behaviour;
package com.oierbravo.mechanicals.foundation.blockEntity.behaviour;
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.IRecipeWithRequirements;
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanical_lemon_lib.utility.LibLang;
import com.oierbravo.mechanicals.foundation.recipe.IRecipeWithRequirements;
import com.oierbravo.mechanicals.utility.LibLang;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
@@ -13,28 +11,21 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class RecipeRequirementsBehaviour<R extends IRecipeWithRequirements> extends BlockEntityBehaviour {
public static final BehaviourType<RecipeRequirementsBehaviour<?>> TYPE = new BehaviourType<>();
public RecipeRequirementsSpecifics<R> specifics;
private boolean meetsRequirements;
private boolean meetsIngredients;
private boolean hasEnoughOutput;
private ArrayList<String> missingRequirements;
public <T extends SmartBlockEntity & RecipeRequirementsSpecifics<R>> RecipeRequirementsBehaviour(T te) {
super(te);
this.specifics = te;
this.meetsIngredients = false;
this.missingRequirements = new ArrayList<>();
}
@@ -44,50 +35,38 @@ public class RecipeRequirementsBehaviour<R extends IRecipeWithRequirements> exte
}
public boolean meetsRequirements(){
return meetsRequirements;
return !missingRequirements.isEmpty();
}
public <T> boolean checkRequirements(Optional<R> pRecipe, Level pLevel, T pBlockEntity) {
public <T> boolean checkRequirements(R pRecipe) {
missingRequirements = new ArrayList<>();
boolean result = true;
if(pRecipe.isEmpty() || !specifics.matchIngredients(pRecipe.get())){
meetsIngredients = false;
if(!specifics.matchesIngredients(pRecipe)){
missingRequirements.add("ingredients");
blockEntity.sendData();
return false;
}
meetsIngredients = true;
hasEnoughOutput = specifics.hasEnoughOutputSpace();
if(!hasEnoughOutput){
if(!specifics.hasEnoughOutputSpace()){
missingRequirements.add("output");
result = false;
}
meetsRequirements = checkRequirements(pRecipe.get(), pLevel, specifics);
if(!meetsRequirements){
result = false;
missingRequirements.addAll(pRecipe.getMissingRequirements((BlockEntity) specifics));
if(!missingRequirements.isEmpty()){
blockEntity.sendData();
return false;
}
//meetsRequirements = meetsRequirements(pRecipe.get().getRecipeRequirements(), specifics);
//if(!pRecipe.get().checkRequirements((BlockEntity) specifics)){
//}
blockEntity.sendData();
return result;
}
private boolean checkRequirements(R pRecipe, Level pLevel, RecipeRequirementsSpecifics<R> pSpecifics){
boolean result = true;
for( IRecipeRequirement requirement : pRecipe.getRecipeRequirements()){
if(!checkRequirement(requirement, pLevel, (BlockEntity) pSpecifics)){
missingRequirements.add(requirement.getIdString());
result = false;
}
return true;
}
return result;
}
private boolean checkRequirement(IRecipeRequirement value, Level pLevel, BlockEntity pSpecifics){
return value.test(pLevel, pSpecifics);
}
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking, boolean added) {
if(missingRequirements.isEmpty())
return false;
@@ -124,6 +103,6 @@ public class RecipeRequirementsBehaviour<R extends IRecipeWithRequirements> exte
public interface RecipeRequirementsSpecifics<R extends IRecipeWithRequirements> {
boolean hasEnoughOutputSpace();
boolean matchIngredients(R recipe);
boolean matchesIngredients(R recipe);
}
}

View File

@@ -1,16 +1,11 @@
package com.oierbravo.mechanical_lemon_lib.foundation.data;
package com.oierbravo.mechanicals.foundation.data;
import com.google.gson.JsonObject;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.tterrag.registrate.util.entry.FluidEntry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import net.neoforged.neoforge.common.conditions.ICondition;
import net.neoforged.neoforge.common.conditions.ModLoadedCondition;
import net.neoforged.neoforge.fluids.BaseFlowingFluid;
public record FluidExistsCondition(String fluid) implements ICondition {
public static MapCodec<FluidExistsCondition> CODEC = RecordCodecBuilder.mapCodec((builder) -> builder.group(Codec.STRING.fieldOf("fluid_exists").forGetter(FluidExistsCondition::fluid)).apply(builder, FluidExistsCondition::new));

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.foundation.energy;
package com.oierbravo.mechanicals.foundation.energy;
import net.neoforged.neoforge.energy.EnergyStorage;

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
package com.oierbravo.mechanicals.foundation.recipe;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.resources.ResourceLocation;
@@ -8,7 +8,6 @@ import net.neoforged.neoforge.common.conditions.ICondition;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@MethodsReturnNonnullByDefault
@@ -21,12 +20,9 @@ public abstract class BaseRecipe<T extends RecipeInput, P extends BaseRecipePara
protected ArrayList<ICondition> conditions;
//abstract public List<String> getEnabledRequirements();
public BaseRecipe(P params){
this.id = params.id;
recipeRequirements = params.recipeRequirements;
//recipeRequirements.putAll(params.recipeRequirements);
this.conditions = params.conditions;
}

View File

@@ -0,0 +1,67 @@
package com.oierbravo.mechanicals.foundation.recipe;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementRequirements;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.Criterion;
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.neoforge.common.conditions.ICondition;
import net.neoforged.neoforge.common.conditions.ModLoadedCondition;
import net.neoforged.neoforge.common.conditions.NotCondition;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public abstract class BaseRecipeBuilder<R extends BaseRecipe<?,P>, P extends BaseRecipeParams, BRB extends BaseRecipeBuilder<R,P,?>> {
protected final Map<String, Criterion<?>> criteria = new LinkedHashMap<>();
protected P params;
protected ArrayList<IRecipeRequirement> recipeRequirements;
protected ArrayList<ICondition> recipeConditions;
public BaseRecipeBuilder( ResourceLocation id){
recipeRequirements = new ArrayList<>();
recipeConditions = new ArrayList<>();
}
public abstract R build();
public BRB withRequirement(IRecipeRequirement requirement){
params.recipeRequirements.add(requirement);
return (BRB) this;
}
public BRB withRequirements(List<IRecipeRequirement> pRecipeRequirements) {
params.recipeRequirements.addAll(pRecipeRequirements);
return (BRB) this;
}
public BRB whenModLoaded(String modid) {
return withCondition(new ModLoadedCondition(modid));
}
public BRB whenModMissing(String modid) {
return withCondition(new NotCondition(new ModLoadedCondition(modid)));
}
public BRB withCondition(ICondition condition) {
recipeConditions.add(condition);
return (BRB) this;
}
public void save(RecipeOutput recipeOutput, ResourceLocation resourceLocation) {
Advancement.Builder advancement = recipeOutput.advancement()
.addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(resourceLocation))
.rewards(AdvancementRewards.Builder.recipe(resourceLocation))
.requirements(AdvancementRequirements.Strategy.OR);
this.criteria.forEach(advancement::addCriterion);
recipeOutput.accept(resourceLocation, build(), advancement.build(params.id.withPrefix("recipes/")));
}
public void save(RecipeOutput recipeOutput) {
save(recipeOutput, params.id);
}
}

View File

@@ -1,12 +1,9 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
package com.oierbravo.mechanicals.foundation.recipe;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.neoforge.common.conditions.ICondition;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class BaseRecipeParams implements IBaseRecipeParams {
public ResourceLocation id;

View File

@@ -0,0 +1,5 @@
package com.oierbravo.mechanicals.foundation.recipe;
public interface IBaseRecipeParams {
}

View File

@@ -1,10 +1,9 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
package com.oierbravo.mechanicals.foundation.recipe;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.oierbravo.mechanical_lemon_lib.register.MechanicalLemonRegistries;
import com.oierbravo.mechanical_lemon_lib.utility.LibLang;
import net.minecraft.network.FriendlyByteBuf;
import com.oierbravo.mechanicals.register.MechanicalRegistries;
import com.oierbravo.mechanicals.utility.LibLang;
import net.createmod.catnip.data.Pair;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
@@ -13,15 +12,13 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public interface IRecipeRequirement {
Codec<IRecipeRequirement> CODEC = MechanicalLemonRegistries.RECIPE_REQUIREMENT_TYPE.byNameCodec().dispatch(IRecipeRequirement::getType, RecipeRequirementType::codec);
Codec<IRecipeRequirement> CODEC = MechanicalRegistries.RECIPE_REQUIREMENT_TYPE.byNameCodec().dispatch(IRecipeRequirement::getType, RecipeRequirementType::codec);
Codec<List<IRecipeRequirement>> LIST_CODEC = CODEC.listOf();
StreamCodec<RegistryFriendlyByteBuf,IRecipeRequirement> STREAM_CODEC
= ByteBufCodecs.registry(MechanicalLemonRegistries.Keys.RECIPE_REQUIREMENT)
= ByteBufCodecs.registry(MechanicalRegistries.Keys.RECIPE_REQUIREMENT)
.dispatch(IRecipeRequirement::getType, RecipeRequirementType::streamCodec);
StreamCodec<RegistryFriendlyByteBuf, List<IRecipeRequirement>> LIST_STREAM_CODEC =
@@ -33,9 +30,10 @@ public interface IRecipeRequirement {
String toString();
RecipeRequirementType<?> getType();
default Component toTooltipComponent(){
//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 Pair<Component,Component> toTooltipComponent(){
return Pair.of(LibLang.translate("ui.recipe_requirement." + getIdString() + ".tooltip.title").component(),
LibLang.translate("ui.recipe_requirement." + getIdString() + ".tooltip.value", toString()).component()
);
};
default Component toMissingComponent(){
return LibLang.translate("ui.recipe_requirement." + getIdString() + ".missing").component();

View File

@@ -0,0 +1,44 @@
package com.oierbravo.mechanicals.foundation.recipe;
import net.createmod.catnip.data.Pair;
import net.minecraft.network.chat.Component;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public interface IRecipeWithRequirements {
ArrayList<IRecipeRequirement> getRecipeRequirements();
default Optional<IRecipeRequirement> getRequirement(RecipeRequirementType<?> type) {
return getRecipeRequirements().stream().filter(iRecipeRequirement -> iRecipeRequirement.getType() == type).findFirst();
}
default boolean meetsRequirements(BlockEntity pBlockEntity){
for( IRecipeRequirement requirement : getRecipeRequirements()){
if(!requirement.test(pBlockEntity.getLevel(), pBlockEntity)){
return false;
}
}
return true;
};
default List<String> getMissingRequirements(BlockEntity pBlockEntity){
ArrayList<String> missingRequirements = new ArrayList<>();
for( IRecipeRequirement requirement : getRecipeRequirements() ){
if(!requirement.test(pBlockEntity.getLevel(), pBlockEntity)){
missingRequirements.add(requirement.getIdString());
}
}
return missingRequirements;
};
default List<Pair<Component,Component>> getRequirementsTooltips(){
if(getRecipeRequirements().isEmpty())
return List.of();
return getRecipeRequirements().stream().map(IRecipeRequirement::toTooltipComponent).toList();
}
}

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe;
package com.oierbravo.mechanicals.foundation.recipe;
import com.mojang.serialization.MapCodec;
import net.minecraft.network.RegistryFriendlyByteBuf;

View File

@@ -0,0 +1,20 @@
package com.oierbravo.mechanicals.foundation.recipe;
public class RecipeRequirementsUtils {
/*public static List<String> getMissingRequirements(List<IRecipeRequirement> pRecipeRequirements, BlockEntity pBlockEntity){
ArrayList<String> missingRequirements = new ArrayList<>();
for( IRecipeRequirement requirement : pRecipeRequirements ){
if(!requirement.test(pBlockEntity.getLevel(), pBlockEntity)){
missingRequirements.add(requirement.getIdString());
}
}
return missingRequirements;
}*/
/*public static <BR extends IRecipeWithRequirements> List<Pair<Component,Component>> getRequirementsTooltips(BR recipe){
if(recipe.getRecipeRequirements().isEmpty())
return List.of();
return recipe.getRecipeRequirements().stream().map(IRecipeRequirement::toTooltipComponent).toList();
}*/
}

View File

@@ -1,19 +1,15 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
package com.oierbravo.mechanicals.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 com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
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;
@@ -58,7 +54,7 @@ public record BiomeRequirement(ResourceKey<Biome> biomeResourceKey) implements I
@Override
public RecipeRequirementType<?> getType() {
return MechanicalLemonRecipeRequirementTypes.BIOME.get();
return MechanicalRecipeRequirementTypes.BIOME.get();
}
@Override

View File

@@ -1,26 +1,20 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
package com.oierbravo.mechanicals.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 com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
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";
@@ -66,7 +60,7 @@ public record BiomeTagRequirement(TagKey<Biome> tag) implements IRecipeRequireme
@Override
public RecipeRequirementType<?> getType() {
return MechanicalLemonRecipeRequirementTypes.BIOME_TAG.get();
return MechanicalRecipeRequirementTypes.BIOME_TAG.get();
}
@Override

View File

@@ -1,11 +1,11 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
package com.oierbravo.mechanicals.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 com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
@@ -35,7 +35,7 @@ public record MaxSpeedRequirement(Float speed) implements IRecipeRequirement {
@Override
public RecipeRequirementType<?> getType() {
return MechanicalLemonRecipeRequirementTypes.MAX_SPEED.get();
return MechanicalRecipeRequirementTypes.MAX_SPEED.get();
}
@Override

View File

@@ -1,11 +1,11 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
package com.oierbravo.mechanicals.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 com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
import net.minecraft.core.BlockPos;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
@@ -41,7 +41,7 @@ public record MaxYRequirement(Integer maxY) implements IRecipeRequirement {
@Override
public RecipeRequirementType<?> getType() {
return MechanicalLemonRecipeRequirementTypes.MAX_Y.get();
return MechanicalRecipeRequirementTypes.MAX_Y.get();
}
@Override

View File

@@ -1,11 +1,11 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
package com.oierbravo.mechanicals.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 com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
@@ -35,7 +35,7 @@ public record MinSpeedRequirement(Float speed) implements IRecipeRequirement {
@Override
public RecipeRequirementType<?> getType() {
return MechanicalLemonRecipeRequirementTypes.MIN_SPEED.get();
return MechanicalRecipeRequirementTypes.MIN_SPEED.get();
}
@Override

View File

@@ -1,11 +1,11 @@
package com.oierbravo.mechanical_lemon_lib.foundation.recipe.requirements;
package com.oierbravo.mechanicals.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 com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.register.MechanicalRecipeRequirementTypes;
import net.minecraft.core.BlockPos;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
@@ -41,7 +41,7 @@ public record MinYRequirement(Integer minY) implements IRecipeRequirement {
@Override
public RecipeRequirementType<?> getType() {
return MechanicalLemonRecipeRequirementTypes.MIN_Y.get();
return MechanicalRecipeRequirementTypes.MIN_Y.get();
}
@Override

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.foundation.visual;
package com.oierbravo.mechanicals.foundation.visual;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;

View File

@@ -0,0 +1,17 @@
package com.oierbravo.mechanicals.foundation.visual;
import com.oierbravo.mechanicals.MechanicalPartials;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import com.simibubi.create.content.kinetics.base.SingleAxisRotatingVisual;
import dev.engine_room.flywheel.api.visualization.VisualizationContext;
import dev.engine_room.flywheel.lib.model.Models;
import net.minecraft.core.Direction;
public class QuarterShaftVisual<T extends KineticBlockEntity> extends SingleAxisRotatingVisual<T> {
public QuarterShaftVisual(VisualizationContext context, T blockEntity, float partialTick, Direction direction) {
super(context, blockEntity, partialTick, direction, Models.partial(MechanicalPartials.SHAFT_QUARTER));
}
public static <T extends KineticBlockEntity> QuarterShaftVisual<T> bottom(VisualizationContext context, T blockEntity, float partialTick) {
return new QuarterShaftVisual<>(context, blockEntity, partialTick, Direction.NORTH);
}
}

View File

@@ -1,4 +1,4 @@
package com.oierbravo.mechanical_lemon_lib.jade;
package com.oierbravo.mechanicals.jade;
public interface IHavePercent {
int getProgressPercent();

View File

@@ -1,8 +1,7 @@
package com.oierbravo.mechanical_lemon_lib.jade;
package com.oierbravo.mechanicals.jade;
import com.oierbravo.mechanical_lemon_lib.utility.LibLang;
import com.oierbravo.mechanicals.utility.LibLang;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import snownee.jade.api.BlockAccessor;
import snownee.jade.api.IBlockComponentProvider;
@@ -13,10 +12,10 @@ import snownee.jade.api.ui.BoxStyle;
import snownee.jade.api.ui.IElementHelper;
import snownee.jade.api.ui.ProgressStyle;
public class LemonProgressComponentProvider implements IBlockComponentProvider, IServerDataProvider<BlockAccessor> {
public class MechanicalProgressComponentProvider implements IBlockComponentProvider, IServerDataProvider<BlockAccessor> {
private final ResourceLocation UID;
public LemonProgressComponentProvider(ResourceLocation UID){
public MechanicalProgressComponentProvider(ResourceLocation UID){
this.UID = UID;
}

View File

@@ -1,23 +1,23 @@
package com.oierbravo.mechanical_lemon_lib.register;
package com.oierbravo.mechanicals.register;
import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib;
import com.oierbravo.mechanicals.Mechanicals;
import com.oierbravo.mechanicals.utility.LibLang;
import net.minecraft.world.item.Items;
import net.neoforged.bus.api.IEventBus;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
public class LemonCreativeModeTabs {
public class MechanicalCreativeModeTabs {
private static final DeferredRegister<CreativeModeTab> TAB_REGISTER =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MechanicalLemonLib.MODID);
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, Mechanicals.MODID);
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> MAIN_TAB = TAB_REGISTER.register("main",
() -> CreativeModeTab.builder()
.title(Component.translatable("itemGroup.mechanical_lemon_lib"))
.title(LibLang.translate("itemGroup.mechanicals").component())
.icon(() -> Items.EGG.asItem().getDefaultInstance())
.build());

View File

@@ -1,10 +1,10 @@
package com.oierbravo.mechanical_lemon_lib.register;
package com.oierbravo.mechanicals.register;
import com.mojang.serialization.MapCodec;
import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib;
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.requirements.*;
import com.oierbravo.mechanicals.Mechanicals;
import com.oierbravo.mechanicals.foundation.recipe.IRecipeRequirement;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.foundation.recipe.requirements.*;
import net.minecraft.network.codec.StreamCodec;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredRegister;
@@ -13,9 +13,9 @@ import net.minecraft.network.RegistryFriendlyByteBuf;
import java.util.function.Supplier;
public class MechanicalLemonRecipeRequirementTypes {
public class MechanicalRecipeRequirementTypes {
public static final DeferredRegister<RecipeRequirementType<?>> RECIPE_REQUIREMENT_TYPES =
DeferredRegister.create(MechanicalLemonRegistries.Keys.RECIPE_REQUIREMENT, MechanicalLemonLib.MODID);
DeferredRegister.create(MechanicalRegistries.Keys.RECIPE_REQUIREMENT, Mechanicals.MODID);
public static final Supplier<RecipeRequirementType<MinSpeedRequirement>> MIN_SPEED =
register(MinSpeedRequirement.ID, MinSpeedRequirement.CODEC, MinSpeedRequirement.STREAM_CODEC);

View File

@@ -1,23 +1,23 @@
package com.oierbravo.mechanical_lemon_lib.register;
package com.oierbravo.mechanicals.register;
import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib;
import com.oierbravo.mechanical_lemon_lib.foundation.recipe.RecipeRequirementType;
import com.oierbravo.mechanicals.Mechanicals;
import com.oierbravo.mechanicals.foundation.recipe.RecipeRequirementType;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.neoforged.neoforge.registries.NewRegistryEvent;
import net.neoforged.neoforge.registries.RegistryBuilder;
public class MechanicalLemonRegistries {
public class MechanicalRegistries {
public static Registry<RecipeRequirementType<?>> RECIPE_REQUIREMENT_TYPE;// = (new RegistryBuilder(Keys.RECIPE_REQUIREMENT_TYPES)).create();
public MechanicalLemonRegistries() {
public MechanicalRegistries() {
}
static {
RECIPE_REQUIREMENT_TYPE = new RegistryBuilder<>(MechanicalLemonRegistries.Keys.RECIPE_REQUIREMENT).sync(true).create();
RECIPE_REQUIREMENT_TYPE = new RegistryBuilder<>(MechanicalRegistries.Keys.RECIPE_REQUIREMENT).sync(true).create();
}
public static final class Keys {
public static final ResourceKey<Registry<RecipeRequirementType<?>>> RECIPE_REQUIREMENT = ResourceKey.createRegistryKey(MechanicalLemonLib.asResource("requirement"));
public static final ResourceKey<Registry<RecipeRequirementType<?>>> RECIPE_REQUIREMENT = ResourceKey.createRegistryKey(Mechanicals.asResource("requirement"));
}
public static void register(NewRegistryEvent event) {

View File

@@ -1,6 +1,6 @@
package com.oierbravo.mechanical_lemon_lib.utility;
package com.oierbravo.mechanicals.utility;
import com.oierbravo.mechanical_lemon_lib.MechanicalLemonLib;
import com.oierbravo.mechanicals.Mechanicals;
import net.createmod.catnip.lang.Lang;
import net.createmod.catnip.lang.LangBuilder;
@@ -9,7 +9,7 @@ public class LibLang extends Lang {
super();
}
public static LangBuilder builder() {
return new LangBuilder(MechanicalLemonLib.MODID);
return new LangBuilder(Mechanicals.MODID);
}
public static LangBuilder translate(String langKey, Object... args) {
return builder().translate(langKey, args);

View File

@@ -1,11 +1,11 @@
package com.oierbravo.mechanical_lemon_lib.utility;
package com.oierbravo.mechanicals.utility;
import com.simibubi.create.api.stress.BlockStressValues;
import com.tterrag.registrate.util.nullness.NonNullConsumer;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.NotNull;
public class LemonRegistrate {
public class MechanicalRegistrate {
public static <B extends Block> @NotNull NonNullConsumer<B> setImpact(double value) {
return (block) -> {
BlockStressValues.IMPACTS.register(block, () -> value);

View File

@@ -0,0 +1 @@
public-f net.minecraft.data.recipes.RecipeProvider getName()Ljava/lang/String;

View File

@@ -7,7 +7,7 @@ version = "${mod_version}" #mandatory
displayName = "${mod_name}" #mandatory
#updateJSONURL="https://change.me.example.invalid/updates.json" #optional
#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional
#logoFile="mechanical_lemon_lib.png" #optional
#logoFile="mechanicals_lib.png" #optional
#credits="Thanks for this example mod goes to Java" #optional
authors = "${mod_author}" #optional
description = '''${mod_description}'''

View File

@@ -1,19 +0,0 @@
{
"mechanical_lemon_lib.ui.progress": "Progress: %d%%",
"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.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.max_y.tooltip": "Max Y: %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.max_y.missing": "Y position Too high",
"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.max_speed.missing": "Too fast",
"mechanical_lemon_lib.ui.recipe_requirement.output.missing": "Output full or incompatible",
"mechanical_lemon_lib.ui.recipe_requirement.ingredients.missing": "Missing ingredients"
}

View File

@@ -0,0 +1,25 @@
{
"mechanicals.ui.progress": "Progress: %d%%",
"itemGroup.mechanicals": "Mechanicals",
"mechanicals.ui.recipe.requirements.title": "Requirements:",
"mechanicals.ui.recipe_requirement.none.tooltip": "No specific requirement",
"mechanicals.ui.recipe_requirement.biome.tooltip.title": "Biome:",
"mechanicals.ui.recipe_requirement.biome.tooltip.value": "%s",
"mechanicals.ui.recipe_requirement.biome_tag.tooltip.title": "Biome Tag:",
"mechanicals.ui.recipe_requirement.biome_tag.tooltip.value": "#%s",
"mechanicals.ui.recipe_requirement.min_y.tooltip.title": "Min Y:",
"mechanicals.ui.recipe_requirement.min_y.tooltip.value": "%s",
"mechanicals.ui.recipe_requirement.max_y.tooltip.title": "Max Y:",
"mechanicals.ui.recipe_requirement.max_y.tooltip.value": "%s",
"mechanicals.ui.recipe_requirement.min_speed.tooltip.title": "Min Speed:",
"mechanicals.ui.recipe_requirement.min_speed.tooltip.value": "%s RPM",
"mechanicals.ui.recipe_requirement.max_speed.tooltip.title": "Max Speed:",
"mechanicals.ui.recipe_requirement.max_speed.tooltip.value": "%s RPM",
"mechanicals.ui.recipe_requirement.biome.missing": "Incorrect biome",
"mechanicals.ui.recipe_requirement.max_y.missing": "Y position Too high",
"mechanicals.ui.recipe_requirement.min_y.missing": "Y position Too low",
"mechanicals.ui.recipe_requirement.min_speed.missing": "Not enough speed",
"mechanicals.ui.recipe_requirement.max_speed.missing": "Too fast",
"mechanicals.ui.recipe_requirement.output.missing": "Output full or incompatible",
"mechanicals.ui.recipe_requirement.ingredients.missing": "Missing ingredients"
}

View File

@@ -0,0 +1,24 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/axis",
"1": "create:block/axis_top",
"particle": "create:block/axis"
},
"elements": [
{
"name": "Axis",
"from": [6, 6, 12],
"to": [10, 10, 16],
"faces": {
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"},
"east": {"uv": [6, 0, 10, 4], "rotation": 270, "texture": "#0"},
"south": {"uv": [6, 6, 10, 10], "texture": "#1"},
"west": {"uv": [6, 0, 10, 4], "rotation": 90, "texture": "#0"},
"up": {"uv": [6, 0, 10, 4], "rotation": 180, "texture": "#0"},
"down": {"uv": [6, 0, 10, 4], "texture": "#0"}
}
}
]
}

View File

@@ -1,6 +0,0 @@
{
"pack": {
"description": "mechanical_lemon_lib resources",
"pack_format": 15
}
}