diff --git a/README.md b/README.md index cc6712e..534a9b7 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,38 @@ ### SlimefunEssentials Slimefun Essentials is a minecraft mod dedicated to add support for Slimefun4 items and mechanics to other client sided mods. + +### What does it do: +- Adds Support for Slimefun Recipes to EMI, REI, JEI +- Adds Support for Custom Textures for Placed Slimefun Blocks (Requires More Block Predicates on the Client and Requires Slimefun Server Essentials on the Server) +- Adds Support for Jade Tooltips for Placed Slimefun Blocks (Requires Jade on the Client and Requires Slimefun Server Essentials on the Server) +- More Coming Soon™ + +### Downloads +- [Github](https://github.com/JustAHuman-xD/SlimefunEssentials/releases) +- [Modrinth](https://modrinth.com/mod/slimefun-essentials) +- [Curseforge](https://www.curseforge.com/minecraft/mc-mods/slimefun-essentials) + ### Dependencies - Mod Menu (Optional) - Cloth Config API (Optional) - More Block Predicates (Optional) +- Jade (Optional) - One of the following: (Optional) - EMI - JEI - REI + ### Configuration: -- "use_custom_textures" - - Should Slimefun Essentials enabled support for Custom Textures - - Requires More Block Predicates - - Requires Slimefun Server Essentials on the Server +- "block_features" + - Should Slimefun Essentials enabled support for Custom Textures & Jade Integration + - Requires More Block Predicates (For Custom Textures) + - Requires Jade (For Well Jade Integration) + - Requires Slimefun Server Essentials on the Server (For Any Features) +- "recipe_features" + - Should Slimefun Essentials add support for Slimefun Recipes + - Requires EMI, JEI, or REI - "auto_toggle_addons" - Should Slimefun Essentials attempt to automatically toggle on or off Addons when Joining a Server with Slimefun Server Essentials installed - -### Downloads -- https://github.com/JustAHuman-xD/SlimefunEssentials/releases -- https://modrinth.com/mod/slimefun-essentials -- https://www.curseforge.com/minecraft/mc-mods/slimefun-essentials - -### What does it do: -- Adds Support for Slimefun Recipes to EMI, REI, JEI -- Adds Support for Custom Textures for Placed Slimefun Blocks (Requires More Block Predicates on the Client and Requires Slimefun Server Essentials on the Server) -- More Coming Soon™ \ No newline at end of file +- "addons" + - A list of addons to support + - Items **for all features** will only be supported if the addon they come from is in this list \ No newline at end of file diff --git a/src/main/java/me/justahuman/slimefun_essentials/api/OffsetBuilder.java b/src/main/java/me/justahuman/slimefun_essentials/api/OffsetBuilder.java index bbe15a2..14d3f12 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/api/OffsetBuilder.java +++ b/src/main/java/me/justahuman/slimefun_essentials/api/OffsetBuilder.java @@ -112,44 +112,49 @@ public Offset subtract(int subtract) { return this; } - public void addLabel() { - addLabel(true); + public Offset addLabel() { + return addLabel(true); } - public void addLabel(boolean padding) { + public Offset addLabel(boolean padding) { this.value += TextureUtils.LABEL_SIZE + (padding ? TextureUtils.PADDING : 0); + return this; } - public void addEnergy() { - addEnergy(true); + public Offset addEnergy() { + return addEnergy(true); } - public void addEnergy(boolean padding) { + public Offset addEnergy(boolean padding) { this.value += TextureUtils.ENERGY_WIDTH + (padding ? TextureUtils.PADDING : 0); + return this; } - public void addSlot() { - addSlot(true); + public Offset addSlot() { + return addSlot(true); } - public void addSlot(boolean padding) { + public Offset addSlot(boolean padding) { this.value += TextureUtils.SLOT_SIZE + (padding ? TextureUtils.PADDING : 0); + return this; } - public void addArrow() { - addArrow(true); + public Offset addArrow() { + return addArrow(true); } - public void addArrow(boolean padding) { + public Offset addArrow(boolean padding) { this.value += TextureUtils.ARROW_WIDTH + (padding ? TextureUtils.PADDING : 0); + return this; } - public void addOutput() { - addOutput(true); + public Offset addOutput() { + return addOutput(true); } - public void addOutput(boolean padding) { + public Offset addOutput(boolean padding) { this.value += TextureUtils.OUTPUT_SIZE + (padding ? TextureUtils.PADDING : 0); + return this; } public Offset addPadding() { diff --git a/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunItemStack.java b/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunItemStack.java index efa4921..942c577 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunItemStack.java +++ b/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunItemStack.java @@ -1,8 +1,13 @@ package me.justahuman.slimefun_essentials.client; +import me.justahuman.slimefun_essentials.utils.Utils; import net.minecraft.item.ItemStack; public record SlimefunItemStack(String id, ItemStack itemStack) { + public SlimefunItemStack(ItemStack itemStack) { + this(Utils.getSlimefunId(itemStack), itemStack); + } + public SlimefunItemStack setAmount(int amount) { itemStack.setCount(amount); return this; diff --git a/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunLabel.java b/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunLabel.java index c49cae4..8ca7f3c 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunLabel.java +++ b/src/main/java/me/justahuman/slimefun_essentials/client/SlimefunLabel.java @@ -59,6 +59,6 @@ public void draw(DrawContext graphics, int x, int y) { } public Text text() { - return Text.translatable("slimefun_essentials.recipe.label." + this.id); + return Text.translatable("slimefun_essentials.recipes.label." + this.id); } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/emi/EmiLabel.java b/src/main/java/me/justahuman/slimefun_essentials/compat/emi/EmiLabel.java index 053f4a5..44a62e3 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/emi/EmiLabel.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/emi/EmiLabel.java @@ -13,7 +13,7 @@ public class EmiLabel extends TextureWidget { public EmiLabel(String id, EmiTexture texture, int x, int y) { super(texture.texture, x, y, texture.width, texture.height, texture.u, texture.v, texture.regionWidth, texture.regionHeight, texture.textureWidth, texture.textureHeight); - tooltip((mx, my) -> List.of(TooltipComponent.of(Text.translatable("slimefun_essentials.recipe.label." + id).asOrderedText()))); + tooltip((mx, my) -> List.of(TooltipComponent.of(Text.translatable("slimefun_essentials.recipes.label." + id).asOrderedText()))); } public EmiLabel(SlimefunLabel slimefunLabel, int x, int y) { diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/AncientAltarRecipe.java b/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/AncientAltarRecipe.java index 39c901b..381874b 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/AncientAltarRecipe.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/AncientAltarRecipe.java @@ -19,7 +19,8 @@ public AncientAltarRecipe(SlimefunCategory slimefunCategory, SlimefunRecipe slim @Override public void addWidgets(WidgetHolder widgets) { final OffsetBuilder offsets = new OffsetBuilder(this, this.slimefunRecipe); - + + // Special Inputs widgets.addSlot(this.inputs.get(3), offsets.getX(), offsets.slot()).backgroundTexture(TextureUtils.WIDGETS, 0, 0); offsets.x().addSlot(false); widgets.addSlot(this.inputs.get(0), offsets.getX(), offsets.slot() + TextureUtils.SLOT_SIZE).backgroundTexture(TextureUtils.WIDGETS, 0, 0); @@ -34,8 +35,11 @@ public void addWidgets(WidgetHolder widgets) { offsets.x().addSlot(false); widgets.addSlot(this.inputs.get(5), offsets.getX(), offsets.slot()).backgroundTexture(TextureUtils.WIDGETS, 0, 0); offsets.x().addSlot(); - widgets.addFillingArrow(offsets.getX(), offsets.arrow(), this.slimefunRecipe.time() * 1000); - offsets.x().addArrow(); + + // Add Arrow + addArrowWithCheck(widgets, offsets); + + // Output widgets.addSlot(this.outputs.get(0), offsets.getX(), offsets.slot()); } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/ProcessRecipe.java b/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/ProcessRecipe.java index 79118ff..31a1eba 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/ProcessRecipe.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/emi/recipes/ProcessRecipe.java @@ -130,7 +130,7 @@ protected void addEnergy(WidgetHolder widgets, OffsetBuilder offsets) { protected void addEnergy(WidgetHolder widgets, int x, int y) { final int totalEnergy = this.slimefunRecipe.energy() * Math.max(1, this.slimefunRecipe.time() / 10 / (this.slimefunCategory.hasSpeed() ? this.slimefunCategory.speed() : 1)); widgets.addTexture(EmiUtils.EMPTY_CHARGE, x, y); - widgets.addAnimatedTexture(totalEnergy >= 0 ? EmiUtils.GAIN_CHARGE : EmiUtils.LOOSE_CHARGE, x, y, 1000, false, totalEnergy < 0, totalEnergy < 0).tooltip(tooltip("slimefun_essentials.recipe.energy." + (totalEnergy >= 0 ? "generate" : "use"), TextureUtils.numberFormat.format(Math.abs(totalEnergy)))); + widgets.addAnimatedTexture(totalEnergy >= 0 ? EmiUtils.GAIN_CHARGE : EmiUtils.LOOSE_CHARGE, x, y, 1000, false, totalEnergy < 0, totalEnergy < 0).tooltip(tooltip("slimefun_essentials.recipes.energy." + (totalEnergy >= 0 ? "generate" : "use"), TextureUtils.numberFormat.format(Math.abs(totalEnergy)))); } protected void addArrowWithCheck(WidgetHolder widgets, OffsetBuilder offsets) { @@ -140,7 +140,7 @@ protected void addArrowWithCheck(WidgetHolder widgets, OffsetBuilder offsets) { protected void addArrowWithCheck(WidgetHolder widgets, int x, int y, boolean backwards) { if (this.slimefunRecipe.hasTime()) { - final int sfTicks = Math.max(1, this.slimefunRecipe.time() / 10 / (this.slimefunCategory.hasSpeed() ? this.slimefunCategory.speed() : 1)); + final int sfTicks = this.slimefunRecipe.sfTicks(this.slimefunCategory.hasSpeed() ? this.slimefunCategory.speed() : 1); final int millis = sfTicks * 500; addFillingArrow(widgets, x, y, backwards, sfTicks, millis); } else { @@ -171,7 +171,7 @@ protected void addOutputs(WidgetHolder widgets, OffsetBuilder offsets) { } } - protected BiFunction> tooltip(String key, Object... args) { - return (mx, my) -> List.of(TooltipComponent.of(Text.translatable(key, args).asOrderedText())); + protected List tooltip(String key, Object... args) { + return List.of(TooltipComponent.of(Text.translatable(key, args).asOrderedText())); } } \ No newline at end of file diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/AncientAltarCategory.java b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/AncientAltarCategory.java index b039f07..5c8a439 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/AncientAltarCategory.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/AncientAltarCategory.java @@ -12,6 +12,11 @@ import mezz.jei.api.recipe.RecipeIngredientRole; import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; public class AncientAltarCategory extends ProcessCategory { public AncientAltarCategory(IGuiHelper guiHelper, SlimefunCategory slimefunCategory, ItemStack catalyst) { @@ -62,8 +67,20 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo offsets.x().addSlot(false); TextureUtils.PEDESTAL.draw(graphics, offsets.getX(), offsets.slot()); offsets.x().addSlot(); - addArrow(graphics, offsets.getX(), offsets.arrow(), false); + addArrow(graphics, recipe, offsets.getX(), offsets.arrow(), false); offsets.x().addArrow(); TextureUtils.SLOT.draw(graphics, offsets.getX(), offsets.slot()); } + + @NotNull + @Override + public List getTooltipStrings(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { + final List tooltips = new ArrayList<>(); + final OffsetBuilder offsets = new OffsetBuilder(this, recipe); + offsets.x().addSlot(false).addSlot(false).addSlot(false).addSlot(false).addSlot(); + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.arrow(), TextureUtils.ARROW)) { + tooltips.add(timeTooltip(recipe)); + } + return tooltips; + } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/GridCategory.java b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/GridCategory.java index a0678ad..c663dd1 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/GridCategory.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/GridCategory.java @@ -13,6 +13,11 @@ import mezz.jei.api.recipe.RecipeIngredientRole; import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; public class GridCategory extends ProcessCategory { protected final int side; @@ -76,4 +81,33 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo // Display Outputs addOutputsOrEnergy(graphics, offsets, recipe); } + + @NotNull + @Override + public List getTooltipStrings(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { + final List tooltips = new ArrayList<>(); + final OffsetBuilder offsets = new OffsetBuilder(this, recipe, calculateXOffset(recipe), TextureUtils.PADDING); + + // Energy Tooltip Option 1 + if (recipe.hasEnergy() && recipe.hasOutputs()) { + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.energy(), TextureUtils.ENERGY)) { + tooltips.add(energyTooltip(recipe)); + } + offsets.x().addEnergy(); + } + + offsets.x().add(TextureUtils.SLOT_SIZE * this.side).addPadding(); + offsets.y().add(TextureUtils.SLOT_SIZE * this.side); + + if (recipe.hasTime() && tooltipActive(mouseX, mouseY, offsets.getX(), offsets.arrow(), TextureUtils.ARROW)) { + tooltips.add(timeTooltip(recipe)); + } + offsets.x().addArrow(); + + // Energy Tooltip Option 2 + if (!recipe.hasOutputs() && tooltipActive(mouseX, mouseY, offsets.getX(), offsets.energy(), TextureUtils.ENERGY)) { + tooltips.add(energyTooltip(recipe)); + } + return tooltips; + } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ProcessCategory.java b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ProcessCategory.java index 0167b44..a444f6d 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ProcessCategory.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ProcessCategory.java @@ -27,6 +27,9 @@ import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + public class ProcessCategory extends RecipeRenderer implements IRecipeCategory { protected final IGuiHelper guiHelper; protected final SlimefunCategory slimefunCategory; @@ -169,6 +172,46 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo addOutputsOrEnergy(graphics, offsets, recipe); } + @NotNull + @Override + public List getTooltipStrings(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { + final List tooltips = new ArrayList<>(); + final OffsetBuilder offsets = new OffsetBuilder(this, recipe, calculateXOffset(this.slimefunCategory, recipe)); + + // Label Tooltips + if (recipe.hasLabels()) { + for (SlimefunLabel slimefunLabel : recipe.labels()) { + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.label(), slimefunLabel)) { + tooltips.add(labelTooltip(slimefunLabel)); + } + offsets.x().addLabel(); + } + } + + // Energy Tooltip Option 1 + if (recipe.hasEnergy() && recipe.hasOutputs()) { + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.energy(), TextureUtils.ENERGY)) { + tooltips.add(energyTooltip(recipe)); + } + offsets.x().addEnergy(); + } + + offsets.x().add((TextureUtils.SLOT_SIZE + TextureUtils.PADDING) * (recipe.hasInputs() ? recipe.inputs().size() : 1)); + + // Arrow Tooltip + if (recipe.hasTime() && tooltipActive(mouseX, mouseY, offsets.getX(), offsets.arrow(), TextureUtils.ARROW)) { + tooltips.add(timeTooltip(recipe)); + } + offsets.x().addArrow(); + + // Energy Tooltip Option 2 + if (!recipe.hasOutputs() && tooltipActive(mouseX, mouseY, offsets.getX(), offsets.energy(), TextureUtils.ENERGY)) { + tooltips.add(energyTooltip(recipe)); + } + + return tooltips; + } + protected void addEnergyWithCheck(DrawContext graphics, OffsetBuilder offsets, SlimefunRecipe recipe) { if (recipe.hasEnergy() && recipe.hasOutputs()) { addEnergy(graphics, offsets, recipe.energy() < 0); @@ -192,7 +235,7 @@ protected void addArrow(DrawContext graphics, OffsetBuilder offsets, SlimefunRec protected void addArrow(DrawContext graphics, SlimefunRecipe recipe, int x, int y, boolean backwards) { if (recipe.hasTime()) { - addFillingArrow(graphics, x, y, backwards, getTime(recipe)); + addFillingArrow(graphics, x, y, backwards, getSfTicks(recipe)); } else { addArrow(graphics, x, y, backwards); } @@ -222,11 +265,32 @@ protected void addOutputs(DrawContext graphics, OffsetBuilder offsets, SlimefunR } } - protected int getTime(SlimefunRecipe slimefunRecipe) { + protected int getSfTicks(SlimefunRecipe slimefunRecipe) { if (slimefunRecipe.hasTime()) { return slimefunRecipe.sfTicks(this.slimefunCategory.hasSpeed() ? this.slimefunCategory.speed() : 1); } else { return 2; } } + + protected boolean tooltipActive(double mouseX, double mouseY, OffsetBuilder offsets, SlimefunLabel label) { + return tooltipActive(mouseX, mouseY, offsets.getX(), offsets.getY(), label); + } + + protected boolean tooltipActive(double mouseX, double mouseY, int x, int y, SlimefunLabel label) { + return mouseX >= x && mouseX <= x + label.width() && mouseY >= y && mouseY <= y + label.height(); + } + + protected Text labelTooltip(SlimefunLabel label) { + return Text.translatable("slimefun_essentials.recipes.label." + label.id()); + } + + protected Text timeTooltip(SlimefunRecipe recipe) { + return Text.translatable("slimefun_essentials.recipes.time", TextureUtils.numberFormat.format(getSfTicks(recipe) / 2), TextureUtils.numberFormat.format(getSfTicks(recipe) * 10L)); + } + + protected Text energyTooltip(SlimefunRecipe recipe) { + final int totalEnergy = recipe.energy() * Math.max(1, recipe.time() / 10 / (this.slimefunCategory.hasSpeed() ? this.slimefunCategory.speed() : 1)); + return Text.translatable("slimefun_essentials.recipes.energy." + (totalEnergy >= 0 ? "generate" : "use"), TextureUtils.numberFormat.format(Math.abs(totalEnergy))); + } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ReactorCategory.java b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ReactorCategory.java index 202e10b..9a970c0 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ReactorCategory.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/ReactorCategory.java @@ -12,6 +12,11 @@ import mezz.jei.api.recipe.RecipeIngredientRole; import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; public class ReactorCategory extends ProcessCategory { public ReactorCategory(IGuiHelper guiHelper, SlimefunCategory slimefunCategory, ItemStack catalyst) { @@ -62,7 +67,7 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo TextureUtils.SLOT.draw(graphics, offsets.getX(), offsets.getY()); offsets.x().addSlot(); - addFillingArrow(graphics, offsets.getX(), offsets.getY(), false, getTime(recipe)); + addFillingArrow(graphics, offsets.getX(), offsets.getY(), false, getSfTicks(recipe)); offsets.x().addArrow(); if (recipe.hasOutputs()) { @@ -74,7 +79,7 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo offsets.x().add(recipe.hasOutputs() ? TextureUtils.OUTPUT_SIZE : TextureUtils.ENERGY_WIDTH).addPadding(); } - addFillingArrow(graphics, offsets.getX(), offsets.getY(), true, getTime(recipe)); + addFillingArrow(graphics, offsets.getX(), offsets.getY(), true, getSfTicks(recipe)); offsets.x().addArrow(); offsets.y().subtract(TextureUtils.SLOT_SIZE * 2); TextureUtils.SLOT.draw(graphics, offsets.getX(), offsets.getY()); @@ -83,4 +88,31 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo offsets.y().addSlot(false); TextureUtils.SLOT.draw(graphics, offsets.getX(), offsets.getY()); } + + @NotNull + @Override + public List getTooltipStrings(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { + final List tooltips = new ArrayList<>(); + final OffsetBuilder offsets = new OffsetBuilder(this, recipe, calculateXOffset(this.slimefunCategory, recipe), calculateYOffset(this.slimefunCategory, recipe)); + + offsets.y().addSlot(false).addSlot(false); + offsets.x().addSlot(); + + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.getY(), TextureUtils.ARROW)) { + tooltips.add(timeTooltip(recipe)); + } + offsets.x().addArrow(); + + if (recipe.hasEnergy()) { + if (tooltipActive(mouseX, mouseY, offsets.getX() + (recipe.hasOutputs() ? (TextureUtils.OUTPUT_SIZE - TextureUtils.ENERGY_WIDTH) / 2 : 0), offsets.getY() + (recipe.hasOutputs() ? - TextureUtils.ENERGY_HEIGHT - TextureUtils.PADDING : TextureUtils.PADDING), TextureUtils.ENERGY)) { + tooltips.add(energyTooltip(recipe)); + } + offsets.x().add(recipe.hasOutputs() ? TextureUtils.OUTPUT_SIZE : TextureUtils.ENERGY_WIDTH).addPadding(); + } + + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.getY(), TextureUtils.ARROW)) { + tooltips.add(timeTooltip(recipe)); + } + return tooltips; + } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/SmelteryCategory.java b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/SmelteryCategory.java index 5596962..5b06752 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/SmelteryCategory.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/jei/categories/SmelteryCategory.java @@ -13,6 +13,11 @@ import mezz.jei.api.recipe.RecipeIngredientRole; import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; public class SmelteryCategory extends ProcessCategory { public SmelteryCategory(IGuiHelper guiHelper, SlimefunCategory slimefunCategory, ItemStack catalyst) { @@ -76,4 +81,26 @@ public void draw(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, DrawCo // Display Outputs addOutputs(graphics, offsets, recipe); } + + @NotNull + @Override + public List getTooltipStrings(SlimefunRecipe recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { + final List tooltips = new ArrayList<>(); + final OffsetBuilder offsets = new OffsetBuilder(this, recipe, TextureUtils.PADDING, TextureUtils.PADDING); + + if (recipe.hasEnergy() && recipe.hasOutputs()) { + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.energy(), TextureUtils.ENERGY)) { + tooltips.add(energyTooltip(recipe)); + } + offsets.x().addEnergy(); + } + + offsets.x().addSlot(false).addSlot(false).addPadding(); + offsets.y().addSlot(false).addSlot(false).addSlot(false); + + if (tooltipActive(mouseX, mouseY, offsets.getX(), offsets.arrow(), TextureUtils.ARROW)) { + tooltips.add(timeTooltip(recipe)); + } + return tooltips; + } } diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/rei/SlimefunEntryDefinition.java b/src/main/java/me/justahuman/slimefun_essentials/compat/rei/SlimefunEntryDefinition.java index a017fc7..89fa191 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/rei/SlimefunEntryDefinition.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/rei/SlimefunEntryDefinition.java @@ -23,6 +23,7 @@ import net.minecraft.client.resource.language.I18n; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.Registries; import net.minecraft.registry.tag.TagKey; import net.minecraft.text.Text; @@ -31,7 +32,7 @@ import java.util.stream.Stream; -public class SlimefunEntryDefinition implements EntryDefinition { +public class SlimefunEntryDefinition implements EntryDefinition, EntrySerializer { private final EntryRenderer renderer = new SlimefunItemStackRenderer(); @Override @@ -97,12 +98,15 @@ public long hash(EntryStack entry, SlimefunItemStack value, C @Override public boolean equals(SlimefunItemStack o1, SlimefunItemStack o2, ComparisonContext context) { + if (!o1.id().equals(o2.id())) { + return false; + } + if (o1.itemStack().getItem() != o2.itemStack().getItem()) { return false; } - - final boolean initial = ItemComparatorRegistry.getInstance().hashOf(context, o1.itemStack()) == ItemComparatorRegistry.getInstance().hashOf(context, o2.itemStack()); - return context.isExact() ? initial : initial && Utils.equalSlimefunIds(o1.itemStack(), o2.itemStack()); + + return ItemComparatorRegistry.getInstance().hashOf(context, o1.itemStack()) == ItemComparatorRegistry.getInstance().hashOf(context, o2.itemStack()); } @Override @@ -138,6 +142,31 @@ public Stream> getTagsFor(EntryStack entr return Stream.empty(); } + @Override + public boolean supportSaving() { + return true; + } + + @Override + public boolean supportReading() { + return true; + } + + @Override + public boolean acceptsNull() { + return false; + } + + @Override + public NbtCompound save(EntryStack entry, SlimefunItemStack value) { + return value.itemStack().writeNbt(new NbtCompound()); + } + + @Override + public SlimefunItemStack read(NbtCompound tag) { + return new SlimefunItemStack(ItemStack.fromNbt(tag)); + } + public static class SlimefunItemStackRenderer implements BatchedEntryRenderer { private final ItemEntryDefinition.ItemEntryRenderer itemStackEntryRenderer; diff --git a/src/main/java/me/justahuman/slimefun_essentials/compat/rei/displays/ProcessDisplay.java b/src/main/java/me/justahuman/slimefun_essentials/compat/rei/displays/ProcessDisplay.java index 69c9919..295ef6f 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/compat/rei/displays/ProcessDisplay.java +++ b/src/main/java/me/justahuman/slimefun_essentials/compat/rei/displays/ProcessDisplay.java @@ -90,7 +90,7 @@ protected void addEnergy(List widgets, int x, int y) { final int totalEnergy = this.slimefunRecipe.energy() * Math.max(1, this.slimefunRecipe.time() / 10 / (this.slimefunCategory.hasSpeed() ? this.slimefunCategory.speed() : 1)); widgets.add(ReiIntegration.widgetFromSlimefunLabel(TextureUtils.ENERGY, x, y)); widgets.add(ReiIntegration.widgetFromSlimefunLabel((totalEnergy >= 0 ? TextureUtils.ENERGY_POSITIVE : TextureUtils.ENERGY_NEGATIVE), x, y, 1000, false, totalEnergy < 0, totalEnergy < 0)); - widgets.add(Widgets.createTooltip(new Rectangle(x, y, TextureUtils.ENERGY_WIDTH, TextureUtils.ENERGY_HEIGHT), Text.translatable("slimefun_essentials.recipe.energy." + (totalEnergy >= 0 ? "generate" : "use"), TextureUtils.numberFormat.format(Math.abs(totalEnergy))))); + widgets.add(Widgets.createTooltip(new Rectangle(x, y, TextureUtils.ENERGY_WIDTH, TextureUtils.ENERGY_HEIGHT), Text.translatable("slimefun_essentials.recipes.energy." + (totalEnergy >= 0 ? "generate" : "use"), TextureUtils.numberFormat.format(Math.abs(totalEnergy))))); } protected void addSlot(List widgets, OffsetBuilder offsets, EntryIngredient entryIngredient) { diff --git a/src/main/java/me/justahuman/slimefun_essentials/utils/CompatUtils.java b/src/main/java/me/justahuman/slimefun_essentials/utils/CompatUtils.java index ace2866..2bedb53 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/utils/CompatUtils.java +++ b/src/main/java/me/justahuman/slimefun_essentials/utils/CompatUtils.java @@ -20,7 +20,7 @@ public static boolean isEmiLoaded() { } public static boolean isReiLoaded() { - return isModLoaded("rei"); + return isModLoaded("roughlyenoughitems"); } public static boolean isJeiLoaded() { diff --git a/src/main/java/me/justahuman/slimefun_essentials/utils/Utils.java b/src/main/java/me/justahuman/slimefun_essentials/utils/Utils.java index 267faa4..e29202b 100644 --- a/src/main/java/me/justahuman/slimefun_essentials/utils/Utils.java +++ b/src/main/java/me/justahuman/slimefun_essentials/utils/Utils.java @@ -52,22 +52,18 @@ public static String getFileName(String path) { return path.substring(path.lastIndexOf("/") + 1, path.indexOf(".json")); } - public static boolean equalSlimefunIds(ItemStack o1, ItemStack o2) { - final NbtCompound n1 = o1.getNbt(); - final NbtCompound n2 = o2.getNbt(); - if (n1 == null || n1.isEmpty() || n2 == null || n2.isEmpty() || !n1.contains("PublicBukkitValues") || !n2.contains("PublicBukkitValues")) { - return false; + public static String getSlimefunId(ItemStack itemStack) { + final NbtCompound nbt = itemStack.getNbt(); + if (nbt == null || nbt.isEmpty() || !nbt.contains("PublicBukkitValues")) { + return null; } - final NbtCompound b1 = n1.getCompound("PublicBukkitValues"); - final NbtCompound b2 = n2.getCompound("PublicBukkitValues"); - if (!b1.contains("slimefun:slimefun_item") || !b2.contains("slimefun:slimefun_item")) { - return false; + final NbtCompound bukkitValues = nbt.getCompound("PublicBukkitValues"); + if (!bukkitValues.contains("slimefun:slimefun_item")) { + return null; } - final String id1 = b1.getString("slimefun:slimefun_item"); - final String id2 = b2.getString("slimefun:slimefun_item"); - return id1 != null && id1.equals(id2); + return bukkitValues.getString("slimefun:slimefun_item"); } public static void log(String message) {