From cbe1c77433b99e8e1917add20a8583f8bbb9842f Mon Sep 17 00:00:00 2001 From: "yrsegal@gmail.com" Date: Tue, 9 Aug 2022 13:49:57 -0400 Subject: [PATCH] jei/rei/emi for edify and craft phial --- .../utils/PhialRecipeStackBuilder.java | 55 +++++++++++ .../assets/hexcasting/lang/en_us.json | 2 + .../assets/hexcasting/textures/gui/edify.png | Bin 0 -> 2889 bytes .../hexcasting/textures/gui/edify_jei.png | Bin 0 -> 2702 bytes .../assets/hexcasting/textures/gui/phial.png | Bin 0 -> 2473 bytes .../hexcasting/textures/gui/phial_jei.png | Bin 0 -> 2365 bytes .../interop/emi/EmiBrainsweepRecipe.java | 2 +- .../fabric/interop/emi/EmiEdifyRecipe.java | 81 ++++++++++++++++ .../fabric/interop/emi/EmiPhialRecipe.java | 83 +++++++++++++++++ .../fabric/interop/emi/HexEMIPlugin.java | 21 +++++ .../interop/emi/PatternRendererEMI.java | 18 +++- .../interop/rei/BrainsweepRecipeCategory.java | 3 +- .../interop/rei/EdifyRecipeCategory.java | 76 +++++++++++++++ .../interop/rei/EdifyRecipeDisplay.java | 52 +++++++++++ .../fabric/interop/rei/HexREIPlugin.java | 19 ++-- .../interop/rei/PatternRendererREI.java | 18 +++- .../interop/rei/PhialRecipeCategory.java | 76 +++++++++++++++ .../interop/rei/PhialRecipeDisplay.java | 49 ++++++++++ .../interop/jei/EdifyRecipeCategory.java | 87 ++++++++++++++++++ .../forge/interop/jei/HexJEIPlugin.java | 53 ++++++----- .../forge/interop/jei/PatternDrawable.java | 7 +- .../interop/jei/PhialRecipeCategory.java | 87 ++++++++++++++++++ 22 files changed, 754 insertions(+), 35 deletions(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/interop/utils/PhialRecipeStackBuilder.java create mode 100644 Common/src/main/resources/assets/hexcasting/textures/gui/edify.png create mode 100644 Common/src/main/resources/assets/hexcasting/textures/gui/edify_jei.png create mode 100644 Common/src/main/resources/assets/hexcasting/textures/gui/phial.png create mode 100644 Common/src/main/resources/assets/hexcasting/textures/gui/phial_jei.png create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiEdifyRecipe.java create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiPhialRecipe.java create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeCategory.java create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeDisplay.java create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeCategory.java create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeDisplay.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java create mode 100644 Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/utils/PhialRecipeStackBuilder.java b/Common/src/main/java/at/petrak/hexcasting/interop/utils/PhialRecipeStackBuilder.java new file mode 100644 index 00000000..4d17479f --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/interop/utils/PhialRecipeStackBuilder.java @@ -0,0 +1,55 @@ +package at.petrak.hexcasting.interop.utils; + +import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.common.items.magic.ItemManaBattery; +import at.petrak.hexcasting.common.lib.HexItems; +import com.google.common.collect.Lists; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; + +import java.util.List; + +public class PhialRecipeStackBuilder { + private static ItemStack makeBattery(int unit, int size) { + return ItemManaBattery.withMana(new ItemStack(HexItems.BATTERY), unit * size, unit * size); + } + + public static Pair, List> createStacks() { + List inputItems = Lists.newArrayList(); + List outputItems = Lists.newArrayList(); + + int dust = HexConfig.common().dustManaAmount(); + int shard = HexConfig.common().shardManaAmount(); + int charged = HexConfig.common().chargedCrystalManaAmount(); + + if (dust > 0) { + inputItems.add(new ItemStack(HexItems.AMETHYST_DUST, 1)); + outputItems.add(makeBattery(dust, 1)); + inputItems.add(new ItemStack(HexItems.AMETHYST_DUST, 64)); + outputItems.add(makeBattery(dust, 64)); + } + + if (shard > 0) { + inputItems.add(new ItemStack(Items.AMETHYST_SHARD, 1)); + outputItems.add(makeBattery(shard, 1)); + inputItems.add(new ItemStack(Items.AMETHYST_SHARD, 64)); + outputItems.add(makeBattery(shard, 64)); + } + + if (charged > 0) { + inputItems.add(new ItemStack(HexItems.CHARGED_AMETHYST, 1)); + outputItems.add(makeBattery(charged, 1)); + inputItems.add(new ItemStack(HexItems.CHARGED_AMETHYST, 64)); + outputItems.add(makeBattery(charged, 64)); + } + + return new Pair<>(inputItems, outputItems); + } + + public static boolean shouldAddRecipe() { + return HexConfig.common().dustManaAmount() > 0 || + HexConfig.common().shardManaAmount() > 0 || + HexConfig.common().chargedCrystalManaAmount() > 0; + } +} diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.json b/Common/src/main/resources/assets/hexcasting/lang/en_us.json index 5bb728ae..3a378534 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.json +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.json @@ -147,6 +147,8 @@ "tag.hexcasting.akashic_planks": "Edified Planks", "tag.hexcasting.phial_base": "Empty Phials", "emi.category.hexcasting.brainsweep": "Flay Mind", + "emi.category.hexcasting.craft.battery": "Craft Phial", + "emi.category.hexcasting.edify": "Edify Sapling", "emi.category.hexcasting.villager_leveling": "Trade Leveling", "emi.category.hexcasting.villager_profession": "Villager Profession", diff --git a/Common/src/main/resources/assets/hexcasting/textures/gui/edify.png b/Common/src/main/resources/assets/hexcasting/textures/gui/edify.png new file mode 100644 index 0000000000000000000000000000000000000000..3e46d984cd23460fc2f8fb17c3bf1199cbd0b919 GIT binary patch literal 2889 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 literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/hexcasting/textures/gui/phial.png b/Common/src/main/resources/assets/hexcasting/textures/gui/phial.png new file mode 100644 index 0000000000000000000000000000000000000000..f752c62e1672afad01af6866ce8a320a72fffc46 GIT binary patch literal 2473 zcmd^BeNYr-9A0t4JjF({8FNCn#UTmz_Tz5Z+l>Q(Q$alhB*CsirnCcHr^P_3T^s>xx{0hYUC?$LMI8JQPoc`@*_TBg0 z{r#Tj`F*_a-uk@Ud2xoR1_VLka7ia<+^m=5K4_dJ>E)VDWV**3NCR(W#%g_nY zVtXE%rT78L8Yx^PNfKo_ql0u>9DpNdp)^TT1Vs}RgVPjGGd#thksk*6{F0L|u+5FI z!Ic#&(KH`V5P?9z7%&+Xzl)$ajw48#plKXh;A(}e2|-*|6NV6MKo$LNpXOF%R7VsX zN||QGpw_`4yuK)`tVR+AQ$_>@A3+&OJ*cpuBu4FgWqwbXToMW30bU?$Dzv4dw!RWY zQ`8dW0npLc_YuJ4+U-$}5w&=|Q3_R?Qx3z3BxFQuwXnhmhytK0WquLNDTgu>^k{s1 zmLCY3;xAMb&rqrIh9sl3$w;F!?Skl*^&palxd5A>0V@XUM&l$b8e2%QJS-i<;-r}; z$w5=QBDtLv!%ZzX$rV!2&dk%?eWtK&BtaAY)mRdFr{ebtFl4t^Z~?+6yD&7GNIpyP zD1Jx`)tSO7>~=m!Ry9EuL5|Ie!KjUHx5S%Gl7#^&Cfp>M8Qjd8MBHLwNgOZ~%>t1T zoKAYk-=>IVdTn+8!A6%95n|k9rC83wq_83`vMCJiWXv4ya5x~Yg_cq{6UVSzRLvs4 z8}2p1GaOY{B|$`i5*X1$nQ_Ks;&3yQ;=nn;z^t((YjT*S6w1lz{d|vk2qgo?r@~UI zk^Pb>xFR!;J8cNwWHFnZlIXx;gfwn;IB1-sU?FJQ?2sgrz*0^zmC!c_bV3JbgFwW? z86g48bGBPoP!Zu>3|2=Kpy4j%1ySF9R!r2}4oFz!v3rF2JW?hi{(%wzK_AkLgY2r} z)B=JZWVm20AEDie2gz53@`sCmwB{OAHC+6N+vC59kEBK{5o8yD2Rec2;e=~DSQz4; zH4DERc1RAH!;@E^Mh|_sh<-MJ459t-qp;0jFe6AzZ;maaFxYbCWLGYhKV|mS-k8M3 z#%2AnuVy;-ool+ibD8}4N9)`BVjG*9W?+GF&kAv?Ur#^!f_j*s5^b)uw|nB}CZ21_ zTK+}HwAm{TB4@@Uhogg>cXM>oj-9(!O`f=?c-A|_p5p^o;;+@#Z*jVNmfKr9H!ezS z$nTn-o`AKt|8iv2Q%BBU_F3LIdT>GY=K5gG#ueB8*njoL{N^2TDwDr2=5p&ZXRmkO z6u-O0PFU8FP!OsZW{Fv^!c6(A;?R`nWg+cu-z~8B^0v^z{+^#I0-NqMC3jDJpKUmNI_}qfwzw}vc z@Xm>%(7Z97rO9iPyT^8ZJZXwP#!OZX_4TJ4nx9C$(H5G1W}vA0tqE&hOYY9^EbmJ& zyfo^D@#co=E&GCSVR&!Gn6#QpzaH4!H@VJ*_%`N_QrMaMYdUsa{4ict0vmoN=T7{l zHuUnbS>CO?bI(@AEZ(&G_sT__vgCZP`D^a0{u5O(3%2SRJ9^8$GI!7ZsUBlx&)K&5 z&0s~FTGM*ex^~B@{^eo!^(T=N-d7&$ei~^R^*FzoGw`%9)dEYtLM{ F?r#bgUr_)6 literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/hexcasting/textures/gui/phial_jei.png b/Common/src/main/resources/assets/hexcasting/textures/gui/phial_jei.png new file mode 100644 index 0000000000000000000000000000000000000000..97cf24caabb6ec3cb5271b3fc5679c1bf6eb336b GIT binary patch literal 2365 zcmds3c}x^n7$4Ax6^%BuhBj8lv06->onzT$cVxwtr9#UB#cdD+${cT(k=>bLW?&ca zO0{jU24fS^REiBrO^T_lM}pcKsL^UtHISyKRZOkYU@Rr|K1$#0RobE@{@G1t=X-B{ z-}n8#>&-M37cQAH>DfsLf=tQJbCtmRdgGdy2>%PpZ??kQ6G~p0h9Jo)#+87)+nS0X z6G}wSGJTo5fZ^qUi4|lHm_h*sq7fu3JEX9DHPBHG_(aKp4Sw2%p`zfxN-b{Et>l0z zF|R=dOB)J3d_y&F7qIMwXjX`U1_D55(NMrIX-vq0h3zs>Hns^24MX&52j(;!qRZUH zXpXD`G}A=kJV}yhrrpGmUKQ_5Qw|b^xQfaMl>O#qBT#w0*Dfz$+apEa_b^Ff^V>CP((mDs&9l znZqpHZYE#SbXMX)zRQ8Zs7<0MFqGG9aN7kuV~#p9i8u= zJXJn@>fsG|?=1Pn$t~?2$C?AD?v?-k;CSN87qV|(+Pd-N38^#rr`7Fg-AjDPj)cky z>z_fqhOj1q+f02SUTr=i?{{82ZramEZQ0Vbc;e18-lKnHt?Eskdhfx)jY{o}+M_FW z9jR%Dn3?Y-EO%FwzGh+1_Z1bDwN33>W2lx^T)#iBT^#7>m^pK8bH%~*P5u4Z=dM}5 zoZ#pYHgq>t+^y@bX`G%*t?J!Be{gW{&B0&8+pC`*Z$?fdpUg=*boB7slLohTiVqal_QoHE#KV^GRuQy8XdL z?JJ$vZmqjdW%XUY-FSKYr3=!X1(jz@v!6eg@X_^exhtjF^Ba>+4-dQrl5P{J$TzoU zOuIB|WARhDWi2T!%|qmGJ*Mwbh1-5MW#7$<2S2<@Y~Q};>tFf@cJDoqm9}Mgf*V(WJw3>Sp%ZjLTalsd_A-IEa`w*QgP am{7A4E!)=lO1klZlb>7Y+Pk>&^*;gkyCt>& literal 0 HcmV?d00001 diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiBrainsweepRecipe.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiBrainsweepRecipe.java index e418c13c..ee65e66f 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiBrainsweepRecipe.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiBrainsweepRecipe.java @@ -50,7 +50,7 @@ public record EmiBrainsweepRecipe(EmiIngredient blockInput, @Override public void addWidgets(WidgetHolder widgets) { - widgets.addTexture(OVERLAY, 0, 0, 118, 85, 0, 0, 118, 85, 128, 128); + widgets.addTexture(OVERLAY, 0, 0, getDisplayWidth(), getDisplayHeight(), 0, 0, getDisplayWidth(), getDisplayHeight(), 128, 128); widgets.addSlot(blockInput, 11, 34).drawBack(false).custom(null, 0, 0, 19, 19); widgets.add(new TheCoolerSlotWidget(villagerInput, 37, 19, 2.75f).useOffset(false).customShift(-8.5f, 2.485f)) diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiEdifyRecipe.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiEdifyRecipe.java new file mode 100644 index 00000000..7c3250d4 --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiEdifyRecipe.java @@ -0,0 +1,81 @@ +package at.petrak.hexcasting.fabric.interop.emi; + +import at.petrak.hexcasting.common.lib.HexBlocks; +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.widget.WidgetHolder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class EmiEdifyRecipe implements EmiRecipe { + private static final ResourceLocation OVERLAY = modLoc("textures/gui/edify_jei.png"); + + private final EmiIngredient saplings; + private final EmiIngredient leaves; + private final EmiIngredient log; + + public EmiEdifyRecipe() { + this.saplings = EmiIngredient.of(ItemTags.SAPLINGS); + this.leaves = EmiIngredient.of(List.of( + EmiStack.of(HexBlocks.AKASHIC_LEAVES1), + EmiStack.of(HexBlocks.AKASHIC_LEAVES2), + EmiStack.of(HexBlocks.AKASHIC_LEAVES3) + )); + this.log = EmiStack.of(HexBlocks.AKASHIC_LOG); + } + + @Override + public EmiRecipeCategory getCategory() { + return HexEMIPlugin.EDIFY; + } + + @Override + public @Nullable ResourceLocation getId() { + return HexEMIPlugin.EDIFY_ID; + } + + @Override + public List getInputs() { + return List.of(saplings); + } + + @Override + public List getOutputs() { + return Stream.concat(leaves.getEmiStacks().stream(), log.getEmiStacks().stream()).collect(Collectors.toList()); + } + + @Override + public int getDisplayWidth() { + return 79; + } + + @Override + public int getDisplayHeight() { + return 61; + } + + @Override + public boolean supportsRecipeTree() { + return false; + } + + @Override + public void addWidgets(WidgetHolder widgets) { + widgets.addTexture(OVERLAY, 0, 0, getDisplayWidth(), getDisplayHeight(), 0, 0, getDisplayWidth(), getDisplayHeight(), 128, 128); + widgets.addSlot(saplings, 11, 21).drawBack(false).custom(null, 0, 0, 19, 19); + widgets.addGeneratedSlot(r -> { + var stacks = leaves.getEmiStacks(); + return stacks.get(r.nextInt(stacks.size())); + }, 0, 50, 9).drawBack(false).recipeContext(this).custom(null, 0, 0, 19, 19); + widgets.addSlot(log, 50, 34).drawBack(false).recipeContext(this).custom(null, 0, 0, 19, 19); + } +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiPhialRecipe.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiPhialRecipe.java new file mode 100644 index 00000000..a7b97bfc --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/EmiPhialRecipe.java @@ -0,0 +1,83 @@ +package at.petrak.hexcasting.fabric.interop.emi; + +import at.petrak.hexcasting.api.mod.HexItemTags; +import at.petrak.hexcasting.interop.utils.PhialRecipeStackBuilder; +import dev.emi.emi.EmiUtil; +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.widget.WidgetHolder; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.stream.Collectors; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class EmiPhialRecipe implements EmiRecipe { + private static final ResourceLocation OVERLAY = modLoc("textures/gui/phial_jei.png"); + + private final EmiIngredient inputs; + private final EmiIngredient bottle; + private final EmiIngredient outputs; + + private final int uniq = EmiUtil.RANDOM.nextInt(); + + public EmiPhialRecipe() { + var stacks = PhialRecipeStackBuilder.createStacks(); + this.inputs = EmiIngredient.of(stacks.getFirst().stream().map(EmiStack::of).collect(Collectors.toList())); + this.bottle = EmiIngredient.of(HexItemTags.PHIAL_BASE); + this.outputs = EmiIngredient.of(stacks.getSecond().stream().map(EmiStack::of).collect(Collectors.toList())); + } + + @Override + public EmiRecipeCategory getCategory() { + return HexEMIPlugin.PHIAL; + } + + @Override + public @Nullable ResourceLocation getId() { + return HexEMIPlugin.PHIAL_ID; + } + + @Override + public List getInputs() { + return List.of(inputs, bottle); + } + + @Override + public List getOutputs() { + return outputs.getEmiStacks(); + } + + @Override + public int getDisplayWidth() { + return 113; + } + + @Override + public int getDisplayHeight() { + return 40; + } + + @Override + public boolean supportsRecipeTree() { + return false; + } + + @Override + public void addWidgets(WidgetHolder widgets) { + widgets.addTexture(OVERLAY, 0, 0, getDisplayWidth(), getDisplayHeight(), 0, 0, getDisplayWidth(), getDisplayHeight(), 128, 128); + widgets.addGeneratedSlot((r) -> { + var stacks = inputs.getEmiStacks(); + return stacks.get(r.nextInt(stacks.size())); + }, uniq, 11, 11).drawBack(false).custom(null, 0, 0, 19, 19); + widgets.addSlot(bottle, 46, 11).drawBack(false).custom(null, 0, 0, 19, 19); + widgets.addGeneratedSlot((r) -> { + var stacks = outputs.getEmiStacks(); + return stacks.get(r.nextInt(stacks.size())); + }, uniq, 84, 11).drawBack(false).recipeContext(this).custom(null, 0, 0, 19, 19); + } +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/HexEMIPlugin.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/HexEMIPlugin.java index b8214f64..727d89bc 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/HexEMIPlugin.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/HexEMIPlugin.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.mod.HexItemTags; import at.petrak.hexcasting.common.recipe.BrainsweepRecipe; import at.petrak.hexcasting.common.recipe.HexRecipeSerializers; import at.petrak.hexcasting.common.recipe.ingredient.VillagerIngredient; +import at.petrak.hexcasting.interop.utils.PhialRecipeStackBuilder; import at.petrak.hexcasting.mixin.accessor.AccessorPoiType; import dev.emi.emi.api.EmiPlugin; import dev.emi.emi.api.EmiRegistry; @@ -28,6 +29,8 @@ import static at.petrak.hexcasting.api.HexAPI.modLoc; public class HexEMIPlugin implements EmiPlugin { private static final ResourceLocation BRAINSWEEP_ID = modLoc("brainsweep"); + public static final ResourceLocation PHIAL_ID = modLoc("craft/battery"); + public static final ResourceLocation EDIFY_ID = modLoc("edify"); private static final ResourceLocation VILLAGER_LEVELING_ID = modLoc("villager_leveling"); private static final ResourceLocation VILLAGER_PROFESSION_ID = modLoc("villager_profession"); @@ -39,6 +42,14 @@ public class HexEMIPlugin implements EmiPlugin { new PatternRendererEMI(BRAINSWEEP_ID, 16, 16), new EmiTexture(SIMPLIFIED_ICON_BRAINSWEEP, 0, 0, 16, 16, 16, 16, 16, 16)); + public static final EmiRecipeCategory PHIAL = new EmiRecipeCategory(PHIAL_ID, + new PatternRendererEMI(PHIAL_ID, 12, 12).shift(2, 2), + new EmiTexture(SIMPLIFIED_ICON_BRAINSWEEP, 0, 0, 16, 16, 16, 16, 16, 16)); // temp + + public static final EmiRecipeCategory EDIFY = new EmiRecipeCategory(EDIFY_ID, + new PatternRendererEMI(EDIFY_ID, 16, 16).strokeOrder(false), + new EmiTexture(SIMPLIFIED_ICON_BRAINSWEEP, 0, 0, 16, 16, 16, 16, 16, 16)); // temp + public static final EmiRecipeCategory VILLAGER_LEVELING = new EmiRecipeCategory(VILLAGER_LEVELING_ID, EmiStack.of(Items.EMERALD), new EmiTexture(SIMPLIFIED_ICON_LEVELING, 0, 0, 16, 16, 16, 16, 16, 16)); @@ -50,9 +61,13 @@ public class HexEMIPlugin implements EmiPlugin { @Override public void register(EmiRegistry registry) { registry.addCategory(BRAINSWEEP); + registry.addCategory(PHIAL); + registry.addCategory(EDIFY); registry.addCategory(VILLAGER_LEVELING); registry.addCategory(VILLAGER_PROFESSION); registry.addWorkstation(BRAINSWEEP, EmiIngredient.of(HexItemTags.WANDS)); + registry.addWorkstation(PHIAL, EmiIngredient.of(HexItemTags.WANDS)); + registry.addWorkstation(EDIFY, EmiIngredient.of(HexItemTags.WANDS)); for (BrainsweepRecipe recipe : registry.getRecipeManager().getAllRecipesFor(HexRecipeSerializers.BRAINSWEEP_TYPE)) { var inputs = EmiIngredient.of(recipe.blockIn().getDisplayedStacks().stream() @@ -62,6 +77,12 @@ public class HexEMIPlugin implements EmiPlugin { registry.addRecipe(new EmiBrainsweepRecipe(inputs, villagerInput, output, recipe.getId())); } + if (PhialRecipeStackBuilder.shouldAddRecipe()) { + registry.addRecipe(new EmiPhialRecipe()); + } + + registry.addRecipe(new EmiEdifyRecipe()); + var basicVillager = new VillagerIngredient(null, null, 1); for (VillagerProfession profession : Registry.VILLAGER_PROFESSION) { diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/PatternRendererEMI.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/PatternRendererEMI.java index 5731573d..a5918e45 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/PatternRendererEMI.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/emi/PatternRendererEMI.java @@ -19,7 +19,10 @@ public class PatternRendererEMI implements EmiRenderable { private final int width; private final int height; - private final boolean strokeOrder; + private int xOffset = 0; + private int yOffset = 0; + + private boolean strokeOrder; private final List patterns; private final List pathfinderDots; @@ -34,11 +37,22 @@ public class PatternRendererEMI implements EmiRenderable { this.height = h; } + public PatternRendererEMI shift(int x, int y) { + xOffset += x; + yOffset += y; + return this; + } + + public PatternRendererEMI strokeOrder(boolean order) { + strokeOrder = order; + return this; + } + @Override public void render(PoseStack poseStack, int x, int y, float delta) { long time = (System.currentTimeMillis() - startTime) / 50; poseStack.pushPose(); - poseStack.translate(x - 0.5f + width / 2f, y + 1 + height / 2f, 0); + poseStack.translate(xOffset + x - 0.5f + width / 2f, yOffset + y + 1 + height / 2f, 0); poseStack.scale(width / 64f, height / 64f, 1f); PatternDrawingUtil.drawPattern(poseStack, 0, 0, this.patterns, this.pathfinderDots, this.strokeOrder, time, 0xff_333030, 0xff_191818, 0xc8_0c0a0c, 0x80_666363); diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/BrainsweepRecipeCategory.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/BrainsweepRecipeCategory.java index e98d5588..f03a2703 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/BrainsweepRecipeCategory.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/BrainsweepRecipeCategory.java @@ -20,6 +20,7 @@ import java.util.List; import static at.petrak.hexcasting.api.HexAPI.modLoc; public class BrainsweepRecipeCategory implements DisplayCategory { + public static final ResourceLocation UID = modLoc("brainsweep"); private final ResourceLocation OVERLAY = modLoc("textures/gui/brainsweep.png"); private final Renderer icon; @@ -48,7 +49,7 @@ public class BrainsweepRecipeCategory implements DisplayCategory { RenderSystem.enableBlend(); RenderSystem.setShaderTexture(0, OVERLAY); - GuiComponent.blit(matrices, bounds.getMinX(), bounds.getMinY(), 0, 0, 118, 85, 128, 128); + GuiComponent.blit(matrices, bounds.getMinX(), bounds.getMinY(), 0, 0, getDisplayWidth(display), getDisplayHeight(), 128, 128); RenderSystem.disableBlend(); }))); widgets.add(new VillagerWidget(display.recipe.villagerIn(), bounds.getMinX(), bounds.getMinY())); diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeCategory.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeCategory.java new file mode 100644 index 00000000..dd9ad765 --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeCategory.java @@ -0,0 +1,76 @@ +package at.petrak.hexcasting.fabric.interop.rei; + +import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class EdifyRecipeCategory implements DisplayCategory { + public static final ResourceLocation UID = modLoc("edify"); + + private final ResourceLocation OVERLAY = modLoc("textures/gui/edify.png"); + + private final Renderer icon; + private final Component localizedName; + + public EdifyRecipeCategory() { + localizedName = new TranslatableComponent("hexcasting.spell." + UID); + icon = new PatternRendererREI(UID, 16, 16).strokeOrder(false); + } + + @Override + public Renderer getIcon() { + return icon; + } + + @Override + public @NotNull Component getTitle() { + return localizedName; + } + + @Override + public List setupDisplay(EdifyRecipeDisplay display, Rectangle bounds) { + List widgets = new ArrayList<>(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createDrawableWidget(((helper, matrices, mouseX, mouseY, delta) -> { + RenderSystem.enableBlend(); + RenderSystem.setShaderTexture(0, OVERLAY); + GuiComponent.blit(matrices, bounds.getMinX(), bounds.getMinY(), 0, 0, getDisplayWidth(display), getDisplayHeight(), 128, 128); + RenderSystem.disableBlend(); + }))); + widgets.add(Widgets.createSlot(new Point(bounds.getMinX() + 12, bounds.getMinY() + 22)).entries(display.getInputEntries().get(0)).disableBackground()); + widgets.add(Widgets.createSlot(new Point(bounds.getMinX() + 51, bounds.getMinY() + 10)).entries(display.getOutputEntries().get(0)).disableBackground()); + widgets.add(Widgets.createSlot(new Point(bounds.getMinX() + 51, bounds.getMinY() + 35)).entries(display.getOutputEntries().get(1)).disableBackground()); + + return widgets; + } + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return HexREIPlugin.EDIFY; + } + + @Override + public int getDisplayHeight() { + return 61; + } + + @Override + public int getDisplayWidth(EdifyRecipeDisplay display) { + return 79; + } +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeDisplay.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeDisplay.java new file mode 100644 index 00000000..93e2e66a --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/EdifyRecipeDisplay.java @@ -0,0 +1,52 @@ +package at.petrak.hexcasting.fabric.interop.rei; + +import at.petrak.hexcasting.common.lib.HexBlocks; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.crafting.Ingredient; + +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Optional; + +public class EdifyRecipeDisplay implements Display { + protected EntryIngredient saplings; + protected EntryIngredient leaves; + protected EntryIngredient log; + + public EdifyRecipeDisplay() { + + this.saplings = EntryIngredients.ofIngredient(Ingredient.of(ItemTags.SAPLINGS)); + this.leaves = EntryIngredients.ofItems(List.of( + HexBlocks.AKASHIC_LEAVES1, + HexBlocks.AKASHIC_LEAVES2, + HexBlocks.AKASHIC_LEAVES3 + )); + this.log = EntryIngredients.of(HexBlocks.AKASHIC_LOG); + + } + + @Override + public @Nonnull List getInputEntries() { + return List.of(this.saplings); + } + + @Override + public @Nonnull List getOutputEntries() { + return List.of(this.leaves, this.log); + } + + @Override + public @Nonnull Optional getDisplayLocation() { + return Optional.of(EdifyRecipeCategory.UID); + } + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return HexREIPlugin.EDIFY; + } +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/HexREIPlugin.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/HexREIPlugin.java index 2c41eb6a..f08c898c 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/HexREIPlugin.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/HexREIPlugin.java @@ -2,26 +2,25 @@ package at.petrak.hexcasting.fabric.interop.rei; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.recipe.BrainsweepRecipe; +import at.petrak.hexcasting.interop.utils.PhialRecipeStackBuilder; import com.google.common.collect.ImmutableSet; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.util.EntryStacks; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; import java.util.Set; -import static at.petrak.hexcasting.api.HexAPI.modLoc; - public class HexREIPlugin implements REIClientPlugin { - public static final ResourceLocation UID = modLoc("brainsweep"); - public static final CategoryIdentifier BRAINSWEEP = CategoryIdentifier.of(UID); + public static final CategoryIdentifier BRAINSWEEP = CategoryIdentifier.of(BrainsweepRecipeCategory.UID); + public static final CategoryIdentifier PHIAL = CategoryIdentifier.of(PhialRecipeCategory.UID); + public static final CategoryIdentifier EDIFY = CategoryIdentifier.of(EdifyRecipeCategory.UID); @Override public void registerCategories(CategoryRegistry registry) { - registry.add(new BrainsweepRecipeCategory()); + registry.add(new BrainsweepRecipeCategory(), new PhialRecipeCategory(), new EdifyRecipeCategory()); Set wands = ImmutableSet.of( HexItems.WAND_OAK, HexItems.WAND_SPRUCE, @@ -34,13 +33,21 @@ public class HexREIPlugin implements REIClientPlugin { HexItems.WAND_AKASHIC); for (ItemLike wand : wands) { registry.addWorkstations(BRAINSWEEP, EntryStacks.of(wand)); + registry.addWorkstations(PHIAL, EntryStacks.of(wand)); + registry.addWorkstations(EDIFY, EntryStacks.of(wand)); } registry.removePlusButton(BRAINSWEEP); + registry.removePlusButton(PHIAL); + registry.removePlusButton(EDIFY); } @Override public void registerDisplays(DisplayRegistry helper) { helper.registerFiller(BrainsweepRecipe.class, BrainsweepRecipeDisplay::new); + if (PhialRecipeStackBuilder.shouldAddRecipe()) { + helper.add(new PhialRecipeDisplay()); + } + helper.add(new EdifyRecipeDisplay()); } } diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PatternRendererREI.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PatternRendererREI.java index 8c0c1e3d..ec40ef62 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PatternRendererREI.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PatternRendererREI.java @@ -22,11 +22,14 @@ public class PatternRendererREI implements Renderer { private final int width; private final int height; - private final boolean strokeOrder; + private boolean strokeOrder; private final List patterns; private final List pathfinderDots; + private int xOffset = 0; + private int yOffset = 0; + public PatternRendererREI(ResourceLocation pattern, int w, int h) { var entry = PatternRegistry.lookupPattern(pattern); this.strokeOrder = !entry.isPerWorld(); @@ -37,6 +40,17 @@ public class PatternRendererREI implements Renderer { this.height = h; } + public PatternRendererREI shift(int x, int y) { + xOffset += x; + yOffset += y; + return this; + } + + public PatternRendererREI strokeOrder(boolean order) { + strokeOrder = order; + return this; + } + @Environment(EnvType.CLIENT) private int blitOffset; @@ -56,7 +70,7 @@ public class PatternRendererREI implements Renderer { public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { long time = (System.currentTimeMillis() - startTime) / 50; matrices.pushPose(); - matrices.translate(bounds.getMinX() - 0.5f + width / 2f, bounds.getMinY() + height / 2f, blitOffset); + matrices.translate(bounds.getMinX() + xOffset - 0.5f + width / 2f, bounds.getMinY() + yOffset + height / 2f, blitOffset); matrices.scale(width / 64f, height / 64f, 1f); PatternDrawingUtil.drawPattern(matrices, 0, 0, this.patterns, this.pathfinderDots, this.strokeOrder, time, 0xff_333030, 0xff_191818, 0xc8_0c0a0c, 0x80_666363); diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeCategory.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeCategory.java new file mode 100644 index 00000000..57e59f5b --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeCategory.java @@ -0,0 +1,76 @@ +package at.petrak.hexcasting.fabric.interop.rei; + +import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class PhialRecipeCategory implements DisplayCategory { + public static final ResourceLocation UID = modLoc("craft/battery"); + + private final ResourceLocation OVERLAY = modLoc("textures/gui/phial.png"); + + private final Renderer icon; + private final Component localizedName; + + public PhialRecipeCategory() { + localizedName = new TranslatableComponent("hexcasting.spell." + UID); + icon = new PatternRendererREI(UID, 12, 12).shift(2, 2); + } + + @Override + public Renderer getIcon() { + return icon; + } + + @Override + public @NotNull Component getTitle() { + return localizedName; + } + + @Override + public List setupDisplay(PhialRecipeDisplay display, Rectangle bounds) { + List widgets = new ArrayList<>(); + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createDrawableWidget(((helper, matrices, mouseX, mouseY, delta) -> { + RenderSystem.enableBlend(); + RenderSystem.setShaderTexture(0, OVERLAY); + GuiComponent.blit(matrices, bounds.getMinX(), bounds.getMinY(), 0, 0, getDisplayWidth(display), getDisplayHeight(), 128, 128); + RenderSystem.disableBlend(); + }))); + widgets.add(Widgets.createSlot(new Point(bounds.getMinX() + 12, bounds.getMinY() + 12)).entries(display.getInputEntries().get(0)).disableBackground()); + widgets.add(Widgets.createSlot(new Point(bounds.getMinX() + 47, bounds.getMinY() + 12)).entries(display.getInputEntries().get(1)).disableBackground()); + widgets.add(Widgets.createSlot(new Point(bounds.getMinX() + 85, bounds.getMinY() + 12)).entries(display.getOutputEntries().get(0)).disableBackground()); + + return widgets; + } + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return HexREIPlugin.PHIAL; + } + + @Override + public int getDisplayHeight() { + return 40; + } + + @Override + public int getDisplayWidth(PhialRecipeDisplay display) { + return 113; + } +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeDisplay.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeDisplay.java new file mode 100644 index 00000000..f9efc04f --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/rei/PhialRecipeDisplay.java @@ -0,0 +1,49 @@ +package at.petrak.hexcasting.fabric.interop.rei; + +import at.petrak.hexcasting.api.mod.HexItemTags; +import at.petrak.hexcasting.interop.utils.PhialRecipeStackBuilder; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; + +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class PhialRecipeDisplay implements Display { + protected EntryIngredient inputs; + protected EntryIngredient bottle; + protected EntryIngredient outputs; + + public PhialRecipeDisplay() { + var stacks = PhialRecipeStackBuilder.createStacks(); + this.inputs = EntryIngredients.ofItemStacks(stacks.getFirst()); + this.bottle = EntryIngredients.ofIngredient(Ingredient.of(HexItemTags.PHIAL_BASE)); + this.outputs = EntryIngredients.ofItemStacks(stacks.getSecond()); + + } + + @Override + public @Nonnull List getInputEntries() { + return List.of(this.inputs, this.bottle); + } + + @Override + public @Nonnull List getOutputEntries() { + return Collections.singletonList(this.outputs); + } + + @Override + public @Nonnull Optional getDisplayLocation() { + return Optional.of(PhialRecipeCategory.UID); + } + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return HexREIPlugin.PHIAL; + } +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java new file mode 100644 index 00000000..f9913725 --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/EdifyRecipeCategory.java @@ -0,0 +1,87 @@ +package at.petrak.hexcasting.forge.interop.jei; + +import at.petrak.hexcasting.common.casting.operators.spells.OpEdifySapling; +import at.petrak.hexcasting.common.lib.HexBlocks; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableStatic; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class EdifyRecipeCategory implements IRecipeCategory { + public static final ResourceLocation UID = modLoc("edify_tree"); + + private final IDrawableStatic background; + private final IDrawable icon; + private final Component localizedName; + + public EdifyRecipeCategory(IGuiHelper guiHelper) { + ResourceLocation location = modLoc("textures/gui/edify_jei.png"); + background = guiHelper.drawableBuilder(location, 0, 0, 79, 61).setTextureSize(128, 128).build(); + var edify = modLoc("edify"); + localizedName = new TranslatableComponent("hexcasting.spell." + edify); + icon = new PatternDrawable(edify, 16, 16).strokeOrder(false); + } + + @Override + @OnlyIn(Dist.CLIENT) + public @NotNull Component getTitle() { + return localizedName; + } + + @Override + public @NotNull IDrawable getBackground() { + return background; + } + + @Override + public @NotNull IDrawable getIcon() { + return icon; + } + + @Override + public void setRecipe(@NotNull IRecipeLayoutBuilder builder, @NotNull OpEdifySapling recipe, + @NotNull IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.INPUT, 12, 22) + .addIngredients(Ingredient.of(ItemTags.SAPLINGS)); + + builder.addSlot(RecipeIngredientRole.OUTPUT, 51, 10) + .addItemStack(new ItemStack(HexBlocks.AKASHIC_LEAVES1)) + .addItemStack(new ItemStack(HexBlocks.AKASHIC_LEAVES2)) + .addItemStack(new ItemStack(HexBlocks.AKASHIC_LEAVES3)); + builder.addSlot(RecipeIngredientRole.OUTPUT, 51, 35) + .addItemStack(new ItemStack(HexBlocks.AKASHIC_LOG)); + + } + + @Override + public @NotNull RecipeType getRecipeType() { + return HexJEIPlugin.EDIFY; + } + + @Override + @SuppressWarnings("removal") + public @NotNull ResourceLocation getUid() { + return UID; + } + + @Override + @SuppressWarnings("removal") + public @NotNull Class getRecipeClass() { + return OpEdifySapling.class; + } +} diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java index 6fd814d9..a8ce2e93 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/HexJEIPlugin.java @@ -1,23 +1,26 @@ package at.petrak.hexcasting.forge.interop.jei; import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.common.casting.operators.spells.OpEdifySapling; +import at.petrak.hexcasting.common.casting.operators.spells.OpMakeBattery; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.recipe.BrainsweepRecipe; import at.petrak.hexcasting.common.recipe.HexRecipeSerializers; +import at.petrak.hexcasting.interop.utils.PhialRecipeStackBuilder; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; -import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter; import mezz.jei.api.recipe.RecipeType; import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration; import mezz.jei.api.registration.IRecipeRegistration; -import mezz.jei.api.registration.ISubtypeRegistration; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; +import java.util.List; + import static at.petrak.hexcasting.api.HexAPI.modLoc; @JeiPlugin @@ -27,25 +30,25 @@ public class HexJEIPlugin implements IModPlugin { public static final RecipeType BRAINSWEEPING = RecipeType.create(HexAPI.MOD_ID, "brainsweeping", BrainsweepRecipe.class); + // Only one entry, might as well use the op class + public static final RecipeType PHIAL = + RecipeType.create(HexAPI.MOD_ID, "craft_phial", OpMakeBattery.class); + public static final RecipeType EDIFY = + RecipeType.create(HexAPI.MOD_ID, "edify_tree", OpEdifySapling.class); + @NotNull @Override public ResourceLocation getPluginUid() { return UID; } - @Override - public void registerItemSubtypes(@NotNull ISubtypeRegistration registration) { - registration.registerSubtypeInterpreter(HexItems.BATTERY, (itemStack, ctx) -> { - if (!itemStack.hasTag()) { - return IIngredientSubtypeInterpreter.NONE; - } - return String.valueOf(HexItems.BATTERY.getMaxMana(itemStack)); - }); - } - @Override public void registerCategories(IRecipeCategoryRegistration registration) { - registration.addRecipeCategories(new BrainsweepRecipeCategory(registration.getJeiHelpers().getGuiHelper())); + var guiHelper = registration.getJeiHelpers().getGuiHelper(); + registration.addRecipeCategories( + new BrainsweepRecipeCategory(guiHelper), + new PhialRecipeCategory(guiHelper), + new EdifyRecipeCategory(guiHelper)); } @Override @@ -55,18 +58,24 @@ public class HexJEIPlugin implements IModPlugin { registration.addRecipes(BRAINSWEEPING, level.getRecipeManager().getAllRecipesFor(HexRecipeSerializers.BRAINSWEEP_TYPE)); } + + if (PhialRecipeStackBuilder.shouldAddRecipe()) { + registration.addRecipes(PHIAL, List.of(OpMakeBattery.INSTANCE)); + } + + registration.addRecipes(EDIFY, List.of(OpEdifySapling.INSTANCE)); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_OAK), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_SPRUCE), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_BIRCH), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_JUNGLE), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_ACACIA), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_DARK_OAK), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_CRIMSON), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_WARPED), BRAINSWEEPING); - registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_AKASHIC), BRAINSWEEPING); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_OAK), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_SPRUCE), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_BIRCH), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_JUNGLE), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_ACACIA), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_DARK_OAK), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_CRIMSON), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_WARPED), BRAINSWEEPING, PHIAL, EDIFY); + registration.addRecipeCatalyst(new ItemStack(HexItems.WAND_AKASHIC), BRAINSWEEPING, PHIAL, EDIFY); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PatternDrawable.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PatternDrawable.java index 3233ca26..b95483aa 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PatternDrawable.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PatternDrawable.java @@ -19,7 +19,7 @@ public class PatternDrawable implements IDrawable { private final int width; private final int height; - private final boolean strokeOrder; + private boolean strokeOrder; private final List patterns; private final List pathfinderDots; @@ -44,6 +44,11 @@ public class PatternDrawable implements IDrawable { return height; } + public PatternDrawable strokeOrder(boolean order) { + strokeOrder = order; + return this; + } + @Override public void draw(PoseStack poseStack, int xOffset, int yOffset) { long time = (System.currentTimeMillis() - startTime) / 50; diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java new file mode 100644 index 00000000..2573f95a --- /dev/null +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/interop/jei/PhialRecipeCategory.java @@ -0,0 +1,87 @@ +package at.petrak.hexcasting.forge.interop.jei; + +import at.petrak.hexcasting.api.mod.HexItemTags; +import at.petrak.hexcasting.common.casting.operators.spells.OpMakeBattery; +import at.petrak.hexcasting.interop.utils.PhialRecipeStackBuilder; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableStatic; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; + +public class PhialRecipeCategory implements IRecipeCategory { + public static final ResourceLocation UID = modLoc("craft_phial"); + + private final IDrawableStatic background; + private final IDrawable icon; + private final Component localizedName; + + public PhialRecipeCategory(IGuiHelper guiHelper) { + ResourceLocation location = modLoc("textures/gui/phial_jei.png"); + background = guiHelper.drawableBuilder(location, 0, 0, 113, 40).setTextureSize(128, 128).build(); + var craftPhial = modLoc("craft/battery"); + localizedName = new TranslatableComponent("hexcasting.spell." + craftPhial); + icon = new PatternDrawable(craftPhial, 12, 12); + } + + @Override + @OnlyIn(Dist.CLIENT) + public @NotNull Component getTitle() { + return localizedName; + } + + @Override + public @NotNull IDrawable getBackground() { + return background; + } + + @Override + public @NotNull IDrawable getIcon() { + return icon; + } + + @Override + public void setRecipe(@NotNull IRecipeLayoutBuilder builder, @NotNull OpMakeBattery recipe, + @NotNull IFocusGroup focuses) { + var stacks = PhialRecipeStackBuilder.createStacks(); + + var inputSlot = builder.addSlot(RecipeIngredientRole.INPUT, 12, 12) + .addItemStacks(stacks.getFirst()); + builder.addSlot(RecipeIngredientRole.INPUT, 47, 12) + .addIngredients(Ingredient.of(HexItemTags.PHIAL_BASE)); + + var outputSlot = builder.addSlot(RecipeIngredientRole.OUTPUT, 85, 12) + .addItemStacks(stacks.getSecond()); + + builder.createFocusLink(inputSlot, outputSlot); + } + + @Override + public @NotNull RecipeType getRecipeType() { + return HexJEIPlugin.PHIAL; + } + + @Override + @SuppressWarnings("removal") + public @NotNull ResourceLocation getUid() { + return UID; + } + + @Override + @SuppressWarnings("removal") + public @NotNull Class getRecipeClass() { + return OpMakeBattery.class; + } +}