From 3bfbcfacdddcd49f6eff4fdac5afc8a8db65e08b Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:24:04 +0200 Subject: [PATCH 01/15] Update ItemStorageBreak.java --- .../setup/common/events/ItemStorageBreak.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java index e115728..e3feb7e 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemStorageBreak.java @@ -2,6 +2,7 @@ import com.devdyna.cakesticklib.api.aspect.logic.ItemStorageBlock; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.neoforged.bus.api.SubscribeEvent; @@ -14,12 +15,14 @@ public static void inventoryDestroy(BreakBlockEvent event) { var level = event.getLevel(); var pos = event.getPos(); var be = level.getBlockEntity(pos); + var entity = event.getPlayer(); try { if (be instanceof ItemStorageBlock storage) - if (storage.dropOnBreak(event.getPlayer())) - for (int i = 0; i < storage.getSlots(); i++) - Block.popResource((Level) level, pos, storage.getStackInSlot(i)); + if (entity != null && entity instanceof Player player) + if (storage.dropOnBreak(player)) + for (int i = 0; i < storage.getSlots(); i++) + Block.popResource((Level) level, pos, storage.getStackInSlot(i)); } catch (Exception e) { // it must prevent persistent broken storage blocks on break } From d49111492c1d5b7ca0b140290832d6220da23d30 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:26:12 +0200 Subject: [PATCH 02/15] moved new templates to a new folder --- .../cakesticklib/api/templates/TickingBE.java | 59 +++++++++++++++++++ .../api/templates/TickingBlock.java | 39 ++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/main/java/com/devdyna/cakesticklib/api/templates/TickingBE.java create mode 100644 src/main/java/com/devdyna/cakesticklib/api/templates/TickingBlock.java diff --git a/src/main/java/com/devdyna/cakesticklib/api/templates/TickingBE.java b/src/main/java/com/devdyna/cakesticklib/api/templates/TickingBE.java new file mode 100644 index 0000000..9e0f9bd --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/templates/TickingBE.java @@ -0,0 +1,59 @@ +package com.devdyna.cakesticklib.api.templates; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class TickingBE extends BlockEntity { + + public TickingBE(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + /** + * Server only ticking + *
+ *
+ * Level-null SAFE + *
+ *
+ * Useful for block events + *
+ *
+ * Dont require super! + */ + public void tickServer() { + } + + /** + * Client only ticking + *
+ *
+ * Level-null SAFE + *
+ *
+ * Useful for player events + *
+ *
+ * Dont require super! + */ + public void tickClient() { + } + + /** + * Client and Server ticking + *
+ *
+ * Level-null SAFE + *
+ *
+ * Usefull for particles + *
+ *
+ * Dont require super! + */ + public void tickBoth() { + } + +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/templates/TickingBlock.java b/src/main/java/com/devdyna/cakesticklib/api/templates/TickingBlock.java new file mode 100644 index 0000000..07026a6 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/templates/TickingBlock.java @@ -0,0 +1,39 @@ +package com.devdyna.cakesticklib.api.templates; + +import javax.annotation.Nullable; + +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class TickingBlock extends Block implements EntityBlock { + + public TickingBlock(Properties p) { + super(p); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level l, BlockState s, + BlockEntityType ty) { + return (lvl, pos, b, t) -> { + if (t instanceof TickingBE be) { + + if (l == null) + return; + + be.tickBoth(); + + if (l.isClientSide()) + be.tickClient(); + else + be.tickServer(); + } + }; + } + +} From 87351412529bcc4077875524275e0e8c41fcb343 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:26:25 +0200 Subject: [PATCH 03/15] Update ItemStorageBlock.java --- .../api/aspect/logic/ItemStorageBlock.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/ItemStorageBlock.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/ItemStorageBlock.java index 38fc9e8..e851892 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/ItemStorageBlock.java +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/ItemStorageBlock.java @@ -1,5 +1,6 @@ package com.devdyna.cakesticklib.api.aspect.logic; +import net.minecraft.world.Clearable; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; @@ -12,7 +13,7 @@ *
* It doesn't restrict IO , for that you need to use {@link MachineItemStorage} */ -public interface ItemStorageBlock { +public interface ItemStorageBlock extends Clearable{ ItemStacksResourceHandler getItemStorage(); @@ -21,7 +22,7 @@ public interface ItemStorageBlock { BlockState getBlockState(); default boolean dropOnBreak(Player player) { - return dropOnBreak(); + return dropOnBreak(); } @Deprecated @@ -61,7 +62,12 @@ default boolean isSlotsEmpty() { return isSlotsEmpty(0, getSlots()); } - default void clear() { + @Deprecated + default void clear(){ + this.clearContent(); + } + + default void clearContent() { if (!isSlotsEmpty()) try (var tx = Transaction.openRoot()) { for (int i = 0; i < getSlots(); i++) From d0df90339decf404f2206ff58e5d85a0054fe1b4 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:27:07 +0200 Subject: [PATCH 04/15] merged effect item template from vintage tech --- .../api/templates/EffectItem.java | 146 ++++++++++++++++++ .../setup/common/events/ItemToolTipped.java | 4 + 2 files changed, 150 insertions(+) create mode 100644 src/main/java/com/devdyna/cakesticklib/api/templates/EffectItem.java diff --git a/src/main/java/com/devdyna/cakesticklib/api/templates/EffectItem.java b/src/main/java/com/devdyna/cakesticklib/api/templates/EffectItem.java new file mode 100644 index 0000000..6508b7d --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/templates/EffectItem.java @@ -0,0 +1,146 @@ +package com.devdyna.cakesticklib.api.templates; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +import com.devdyna.cakesticklib.api.utils.ColorUtils; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffectUtil; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.component.Consumable; +import net.minecraft.world.item.consume_effects.ApplyStatusEffectsConsumeEffect; + +public class EffectItem extends Item { + + private List effects; + + public EffectItem(Properties p, List effects) { + super(p); + this.effects = effects; + } + + /** + * Create an food item with a dedicated tooltip to show mobEffects + */ + public static class Builder { + + private final List list = new ArrayList<>(); + private Properties p = new Properties(); + private FoodProperties food; + + public Builder properties(Function f) { + this.p = f.apply(p); + return this; + } + + public Builder food(FoodProperties food) { + this.food = food; + return this; + } + + public Builder effect(FoodEffect effect) { + this.list.add(effect); + return this; + } + + /** + * 100% success + */ + public Builder effect(MobEffectInstance... effect) { + return effect(FoodEffect.of(effect)); + } + + public Builder effect(float chance, MobEffectInstance... effect) { + return effect(FoodEffect.of(chance, effect)); + } + + public Builder effect(float chance, List effect) { + return effect(FoodEffect.of(chance, effect)); + } + + public Builder effect(List effect) { + return effect(FoodEffect.of(effect)); + } + + public EffectItem build() { + var consumable = Consumable.builder(); + var potions = new ArrayList(); + + for (var effect : list) { + consumable.onConsume(new ApplyStatusEffectsConsumeEffect(effect.effects(), effect.chance())); + potions.addAll(effect.effects()); + } + + return new EffectItem(p.food(food, consumable.build()), potions); + } + + public record FoodEffect(float chance, List effects) { + + public static final float SUCCESS = 1.0f; + + public static FoodEffect of(float c, List e) { + return new FoodEffect(c, e); + } + + /** + * 100% success + */ + public static FoodEffect of(MobEffectInstance... e) { + return of(SUCCESS, e); + } + + public static FoodEffect of(float c, MobEffectInstance... e) { + return of(c, List.of(e)); + + } + + /** + * 100% success + */ + public static FoodEffect of(List e) { + return of(SUCCESS, e); + } + } + } + + public List getEffectToolTip() { + + var list = new ArrayList(); + + for (var instance : effects) { + + var effect = instance.getEffect().value(); + + var result = Component.empty() + .append(effect.getDisplayName()); + + if (instance.getAmplifier() > 0) + result.append(" ") + .append(Component.translatable( + "potion.potency." + instance.getAmplifier())); + + result.append(" (") + .append(MobEffectUtil.formatDuration(instance, 1.0F, + Minecraft.getInstance().level.tickRateManager().tickrate())) + .append(")"); + + result.withStyle(style -> style.withColor(switch (effect.getCategory()) { + case MobEffectCategory.BENEFICIAL -> ColorUtils.rgb(85, 85, 255); + case MobEffectCategory.HARMFUL -> ColorUtils.rgb(255, 85, 85); + case MobEffectCategory.NEUTRAL -> ColorUtils.rgb(170, 0, 170); + })); + + list.add(result); + } + + return list; + + } + +} diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java index 2cc9d1c..bf7b035 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java @@ -5,6 +5,7 @@ import com.devdyna.cakesticklib.api.ToolTipHelper; import com.devdyna.cakesticklib.api.aspect.logic.BlockItemKeeper; import com.devdyna.cakesticklib.api.datagen.LangUtils.TipColors; +import com.devdyna.cakesticklib.api.templates.EffectItem; import com.devdyna.cakesticklib.api.upgrades.UpgradeComponents.UpgradeType; import com.devdyna.cakesticklib.api.upgrades.modifiers.DirectionalModifier; import com.devdyna.cakesticklib.api.upgrades.modifiers.ModifierUtils; @@ -115,5 +116,8 @@ public static void main(ItemTooltipEvent event) { if (item.getItem() instanceof SpectralArrowItem) tip.add(ToolTipHelper.INDEX, Component.translatable("extra.effect.minecraft.glowing")); + if (item.getItem() instanceof EffectItem effect) + ToolTipHelper.add(tip, effect.getEffectToolTip()); + } } From c0c527cfad77ef851c8cf4bfa8a5b4ccf7d03c0d Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:27:31 +0200 Subject: [PATCH 05/15] added to queueutils a limit of rools --- .../cakesticklib/api/primitive/QueueUtil.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/api/primitive/QueueUtil.java b/src/main/java/com/devdyna/cakesticklib/api/primitive/QueueUtil.java index 69173e7..157e38d 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/primitive/QueueUtil.java +++ b/src/main/java/com/devdyna/cakesticklib/api/primitive/QueueUtil.java @@ -9,7 +9,8 @@ */ public class QueueUtil { - private boolean add_start = true; + private int limit = Integer.MAX_VALUE; + private boolean ignoreStart = false; private Function, Boolean> loop_when = q -> !q.isEmpty(); private T start; private List, T, QueueStatus>> chain = List @@ -24,7 +25,12 @@ public static QueueUtil of(T v) { } public QueueUtil ignoreStart() { - this.add_start = false; + this.ignoreStart = true; + return this; + } + + public QueueUtil limit(int limit) { + this.limit = limit; return this; } @@ -52,15 +58,19 @@ public boolean run() { Set visited = new HashSet<>(); Queue queue = new LinkedList<>(); - if (add_start) + if (!ignoreStart) queue.add(start); - main: while (loop_when.apply(queue)) { + int checked = 0; + + main: while (loop_when.apply(queue) && checked < limit) { var v = queue.poll(); if (!visited.add(v)) continue; + checked++; + for (var operation : chain) switch (operation.apply(queue, v)) { case QueueStatus.SUCCESS: @@ -70,7 +80,6 @@ public boolean run() { case QueueStatus.CONTINUE: continue main; } - } return false; From 3999559a09a35b64f56451b7a0586c188057fc37 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:27:36 +0200 Subject: [PATCH 06/15] Update VanillaPlants.java --- .../api/factories/plants/VanillaPlants.java | 92 +++++++++---------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java index c1393c5..c0b1063 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java +++ b/src/main/java/com/devdyna/cakesticklib/api/factories/plants/VanillaPlants.java @@ -1,14 +1,12 @@ package com.devdyna.cakesticklib.api.factories.plants; import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Queue; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.Nullable; + +import com.devdyna.cakesticklib.api.primitive.QueueUtil; import com.devdyna.cakesticklib.setup.Config; import net.minecraft.core.BlockPos; @@ -188,81 +186,79 @@ public static void onClientClick(Level level, Player player, InteractionHand han } + public static List checkTree(Level level, BlockPos pos, boolean simulate) { + return checkTree(level, pos, simulate, (s, p) -> false); + } + public static List checkTree(Level level, BlockPos pos) { - return checkTree(level, pos, (i, p) -> false); + return checkTree(level, pos, false); } - public static List checkTree(Level level, BlockPos pos, + public static List checkTree(Level level, BlockPos pos, boolean simulate, BiFunction tool) { var state = level.getBlockState(pos); - boolean canProcede = false; + var validTree = false; if (state.is(BlockTags.COMPLETES_FIND_TREE_TUTORIAL)) - for (Direction dir : Direction.values()) { + for (Direction dir : Direction.values()) if (level.getBlockState(pos.relative(dir)).is(BlockTags.COMPLETES_FIND_TREE_TUTORIAL)) { - canProcede = true; + validTree = true; break; } - } - if (canProcede) { + if (!validTree) + return null; - ArrayList itemList = new ArrayList<>(); + List items = new ArrayList<>(); + List sounds = new ArrayList<>(); - ArrayList souldList = new ArrayList<>(); + sounds.add(state.getSoundType(level, pos, null).getBreakSound()); - souldList.add(state.getSoundType(level, pos, null).getBreakSound()); + QueueUtil.of(pos) + .limit(treeHarvestingBlockLimit) + .define((queue, current) -> { - Queue queue = new LinkedList<>(); - Set visited = new HashSet<>(); + for (List off : getTreeDirections()) { + var offset = current.offset(off.get(0), off.get(1), off.get(2)); - queue.add(pos); - visited.add(pos); + var offstate = level.getBlockState(offset); - int checkBlocks = 0; - boolean toolFlag = false; + if (!offstate.is(BlockTags.COMPLETES_FIND_TREE_TUTORIAL)) + continue; - while (!queue.isEmpty()) { - BlockPos currentPos = queue.poll(); + Block.getDrops(offstate, (ServerLevel) level, offset, null) + .forEach(items::add); - for (List off : getTreeDirections()) { - BlockPos adjacentPos = currentPos.offset(off.get(0), off.get(1), off.get(2)); - BlockState adjacentState = level.getBlockState(adjacentPos); + if (!simulate) + level.setBlockAndUpdate(offset, Blocks.AIR.defaultBlockState()); - if (adjacentState.is(BlockTags.COMPLETES_FIND_TREE_TUTORIAL) && !visited.contains(adjacentPos)) { - queue.add(adjacentPos); - visited.add(adjacentPos); - level.setBlockAndUpdate(adjacentPos, Blocks.AIR.defaultBlockState()); - Block.getDrops(adjacentState, (ServerLevel) level, adjacentPos, null) - .forEach(t -> itemList.add(t)); + var sound = offstate.getSoundType(level, offset, null).getBreakSound(); - toolFlag = tool.apply(adjacentState, adjacentPos); + if (!sounds.contains(sound)) + sounds.add(sound); - if (!souldList.contains(adjacentState.getSoundType(level, adjacentPos, null).getBreakSound())) { - souldList.add(adjacentState.getSoundType(level, adjacentPos, null).getBreakSound()); - } + if (tool.apply(offstate, offset)) + return QueueUtil.QueueStatus.SUCCESS; + + queue.add(offset); } - } - checkBlocks++; - if (checkBlocks >= treeHarvestingBlockLimit) - break; + return QueueUtil.QueueStatus.CONTINUE; + }) + .run(); - if (toolFlag) - break; - } + Block.getDrops(state, (ServerLevel) level, pos, null) + .forEach(items::add); + if (!simulate) level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); - Block.getDrops(state, (ServerLevel) level, pos, null).forEach(t -> itemList.add(t)); - souldList.forEach(s -> level.playSound(null, pos, s, SoundSource.BLOCKS)); + if (!simulate) + sounds.forEach(sound -> level.playSound(null, pos, sound, SoundSource.BLOCKS)); - return itemList; - } - - return null; + return items; } public static List checkBigPlant(Level level, BlockPos pos) { From 515c9c2d112826c5eacb5b3d0bb45916488e33a0 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 16:30:53 +0200 Subject: [PATCH 07/15] Update CreativeTab.java --- .../com/devdyna/cakesticklib/setup/common/CreativeTab.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java b/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java index d4daec1..9180b1c 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java @@ -30,7 +30,7 @@ public static void register(BuildCreativeModeTabContentsEvent event) { event.accept(LibItems.HAMMER.get()); event.accept(LibItems.WRENCH.get()); - event.accept(upgrade(LibItems.SPEED_UPGRADE, b -> b.speed(20).energy(125).create())); + event.accept(upgrade(LibItems.SPEED_UPGRADE, b -> b.speed(20).energy(125).create())); event.accept(upgrade(LibItems.ENERGY_UPGRADE, b -> b.energy(-50).create())); event.accept(upgrade(LibItems.LUCK_UPGRADE, b -> b.luck(15).energy(150).create())); event.accept(upgrade(LibItems.FLUID_UPGRADE, b -> b.fluid(-20).energy(150).create())); @@ -59,7 +59,7 @@ public static void register(BuildCreativeModeTabContentsEvent event) { } - private static ItemStack upgrade(DeferredHolder item, + private static ItemStack upgrade(DeferredHolder item, Function upgrades) { var stack = x.item(item.get()); stack.set(LibComponents.UPGRADE_COMPONENTS, upgrades.apply(UpgradeComponents.Builder.of())); From b74b22a63e3cb70489b549ac8fc1553c28ac93b8 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:36:27 +0200 Subject: [PATCH 08/15] updated jei , jade and neoforge --- dependencies.gradle | 2 +- gradle.properties | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7a0c267..ae47534 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -27,6 +27,6 @@ dependencies { compileOnly "mezz.jei:jei-${minecraft_version}-common-api:${jei_version}" compileOnly "mezz.jei:jei-${minecraft_version}-neoforge-api:${jei_version}" runtimeOnly "mezz.jei:jei-${minecraft_version}-neoforge:${jei_version}" - implementation "curse.maven:jade-324717:7886513" + implementation "curse.maven:jade-324717:${jade_version}" } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 782eebd..30c604e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.caching=true org.gradle.configuration-cache=true minecraft_version=26.1.2 minecraft_version_range=[26.1,26.2] -neo_version=26.1.2.75 +neo_version=26.1.2.99 ## Mod Properties @@ -19,4 +19,6 @@ mod_description=A standalone port of JustDynaThings and Synergy API to unify mos ## Compats -jei_version=29.5.0.28 +jei_version=29.37.0.98 + +jade_version=8857417 From 06478e03b86f25303365a10cbf5fe4e8a815e8f1 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:36:49 +0200 Subject: [PATCH 09/15] readded fluid eject upgrade recipe --- .../setup/datagen/server/DataRecipe.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/devdyna/cakesticklib/setup/datagen/server/DataRecipe.java b/src/main/java/com/devdyna/cakesticklib/setup/datagen/server/DataRecipe.java index 7b16a04..8c499df 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/datagen/server/DataRecipe.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/datagen/server/DataRecipe.java @@ -235,6 +235,20 @@ protected void buildRecipes() { .output(LibItems.EJECT_UPGRADE.get()) .save(output); + UpgradeApplicationBuilder.of(registries) + .eject(Direction.NORTH, UseType.FLUID) + .pattern(" R ") + .pattern("CSC") + .pattern(" B ") + .define('S', LibTags.Items.STEEL_PLATE) + .define('R', Items.PISTON) + .define('B', LibTags.Items.EMERALD_DUST) + .define('C', LibItems.CHIP.get()) + .unlockedBy(getHasName(LibTags.Items.STEEL_PLATE), has(LibTags.Items.STEEL_PLATE)) + .disableClearRecipe() + .output(LibItems.EJECT_UPGRADE.get()) + .save(output); + UpgradeApplicationBuilder.of(registries) .energy(-50) .pattern(" B ") From 9e0cdc1aa3ac0d5328fd5d9b48d03e36fa292893 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:37:08 +0200 Subject: [PATCH 10/15] fixed jei doesn't show fluid eject upgrade --- .../devdyna/cakesticklib/setup/compat/jei/PluginJEI.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java index 5934120..af97bac 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java @@ -15,6 +15,7 @@ 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.resources.Identifier; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeHolder; @@ -60,6 +61,13 @@ public void registerRecipes(IRecipeRegistration r) { } + @Override + public void registerItemSubtypes(ISubtypeRegistration r) { + r.registerFromDataComponentTypes( + LibItems.EJECT_UPGRADE.get(), + LibComponents.UPGRADE_COMPONENTS.get()); + } + private > List> getRecipes(RecipeType type) { return List.copyOf(Client.getRecipeCollector().byType(type)); } From a4701b2be111e8d1832c8abe6b4fd7af2f525884 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:37:15 +0200 Subject: [PATCH 11/15] Update CreativeTab.java --- .../com/devdyna/cakesticklib/setup/common/CreativeTab.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java b/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java index 9180b1c..9172b42 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java @@ -34,8 +34,8 @@ public static void register(BuildCreativeModeTabContentsEvent event) { event.accept(upgrade(LibItems.ENERGY_UPGRADE, b -> b.energy(-50).create())); event.accept(upgrade(LibItems.LUCK_UPGRADE, b -> b.luck(15).energy(150).create())); event.accept(upgrade(LibItems.FLUID_UPGRADE, b -> b.fluid(-20).energy(150).create())); - event.accept(upgrade(LibItems.EJECT_UPGRADE, b -> b.eject(Direction.DOWN, UseType.ITEM).create())); - event.accept(upgrade(LibItems.EJECT_UPGRADE, b -> b.eject(Direction.DOWN, UseType.FLUID).create())); + event.accept(upgrade(LibItems.EJECT_UPGRADE, b -> b.eject(Direction.NORTH, UseType.ITEM).create())); + event.accept(upgrade(LibItems.EJECT_UPGRADE, b -> b.eject(Direction.NORTH, UseType.FLUID).create())); } From 1c3c0f466ef8f2d38c5653be1a2d8b937f64cc36 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:38:28 +0200 Subject: [PATCH 12/15] reworked directional buttons to use the same sprite of the type --- .../gui/buttons/DirectionalItemButton.java | 33 ++++++++++-------- .../upgrades/eject/EjectModifierScreen.java | 9 +++++ .../textures/gui/modifier/buttons/fluid.png | Bin 488 -> 485 bytes .../textures/gui/modifier/buttons/item.png | Bin 395 -> 393 bytes .../textures/gui/modifier/buttons/on.png | Bin 158 -> 0 bytes 5 files changed, 27 insertions(+), 15 deletions(-) delete mode 100644 src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/on.png diff --git a/src/main/java/com/devdyna/cakesticklib/api/gui/buttons/DirectionalItemButton.java b/src/main/java/com/devdyna/cakesticklib/api/gui/buttons/DirectionalItemButton.java index cda71d6..43e7cb8 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/gui/buttons/DirectionalItemButton.java +++ b/src/main/java/com/devdyna/cakesticklib/api/gui/buttons/DirectionalItemButton.java @@ -3,17 +3,18 @@ import static com.devdyna.cakesticklib.CakeStickLib.MODULE_ID; import java.util.List; - -import com.devdyna.cakesticklib.api.utils.x; - +import java.util.function.BiConsumer; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; public class DirectionalItemButton extends ItemButton { private final Direction direction; + private BiConsumer sprites; + public DirectionalItemButton(int x, int y, int width, int height, Direction dir, boolean flag, OnPress onPress) { super(x, y, width, height, onPress, Component.translatable(MODULE_ID + ".widgets.button." + dir.name())); @@ -25,21 +26,23 @@ public Direction getDirection() { return direction; } + public DirectionalItemButton defineSprites(BiConsumer clicked) { + this.sprites = clicked; + return this; + } + + public void draw(GuiGraphicsExtractor graphics, Identifier rl) { + graphics.blit(RenderPipelines.GUI_TEXTURED, + rl, + getX(), getY(), + 0, 0, + getWidth(), getHeight(), getWidth(), getHeight()); + } + @Override protected void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) { - if (isClicked()) - graphics.blit(RenderPipelines.GUI_TEXTURED, - x.rl(MODULE_ID, "textures/gui/modifier/buttons/on.png"), - getX(), getY(), - 0, 0, - getWidth(), getHeight(), getWidth(), getHeight()); - else - graphics.blit(RenderPipelines.GUI_TEXTURED, - x.rl(MODULE_ID, "textures/gui/modifier/buttons/off.png"), - getX(), getY(), - 0, 0, - getWidth(), getHeight(), getWidth(), getHeight()); + sprites.accept(graphics, isClicked()); if (!item.isEmpty()) graphics.item(item, getX(), getY()); diff --git a/src/main/java/com/devdyna/cakesticklib/api/upgrades/eject/EjectModifierScreen.java b/src/main/java/com/devdyna/cakesticklib/api/upgrades/eject/EjectModifierScreen.java index e5dd295..7cbb0de 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/upgrades/eject/EjectModifierScreen.java +++ b/src/main/java/com/devdyna/cakesticklib/api/upgrades/eject/EjectModifierScreen.java @@ -120,6 +120,15 @@ private void addSynchedButton(Direction dir, int xOf, int yOf) { .sendToServer(new EjectDirectionPayload(menu.containerId, dir)); }); + button.defineSprites((graphics, clicked) -> { + if (clicked) + button.draw(graphics, x.rl(MODULE_ID, "textures/gui/modifier/buttons/"+(cachedType == UseType.ITEM ? "item" : "fluid")+".png")); + + else + button.draw(graphics, x.rl(MODULE_ID, "textures/gui/modifier/buttons/off.png")); + + }); + BUTTONS.put(dir, button); addRenderableWidget(button); diff --git a/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/fluid.png b/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/fluid.png index a5246867d40cb4c24ad502be0333d3f3bfc921ce..03c1ac5b3c86cf594faa5885862fc5791027dd95 100644 GIT binary patch literal 485 zcmVvfVa6J%4ZaJbnH4 z;M>PMJ^#J_@$;9K;dVS815V>9VEi%04eUMR=ryzVO)pcFkhT81XNwk@S+v%|W{EO~ zGIk$pTci9Atyo5{r$QcjN3epr**_h)u4_-=xulTP#d<^)k(I&HRECHwy{*@PFXbDM zP4M9G5@QNzWCb}Bi?A+Rb|Q={EGdWsV(`UXbE-SfKbjeoyMud@aJ(sUY|4im`ol<$ zac4iL$ST#A%waeLWlLC{KXTjgxwBhoG`>os0~zQ*Nxsge0KdCmVf=kqzBV)2>ti+zUbeggmi|NrZp`U(I500v1! bK~w_()L%UAO!bP)`mN#ZB%a%O@32*Q7e=I@IZnwiv z+ithN@WO3(&-mtbqe>tI?48eNT$)Q*^U=VzVDC+%n9RPdyLK+i0yAc$lrYaTX$n!2Aelu(IagbrAk@{`U76^3m~o;`xr8K0X5bnp zi3K7_q%<&%xuZ!+jO5B2RUNy1^NX3U>)Q4B1^@v6|N3*ikN^Mx e21!IgR09CTg(X0aAU#F^0000?xoqz;TOGY-6&>$3=Tanm11xQ+E4!d+Kg^e|?skp|=|b4Bb z0g>-oj4sU#eW+5ge|cff!W9Gm`1bpK@p~eN!y%5xW9;|)9G#n&?RFdDyf7BK`vd?0 n|Nm07za#(v00v1!K~w_(Bz-5VUfN&*00000NkvXXu0mjf6OOH) literal 395 zcmV;60d)R}P)-Bo5LreL~<+4ngxdB;G6jqj{qpB(cQ4^^FIcS=OvDILnXUnq8h|Vs5X}**;P18Y# z1Ac)d@(&Y828ohP(q_U!csHPljX)B-gE|_WSpK9{XJ#qaM@XAOK$PTLLze`7fM1X@ zG)sFUS6~Vcq*a4sZZnW%=kwV&O7ciU0Hbjn|9=NG(J%~yH;}V|hz8JzK-w2<7a#-} zmi8uit|NlOB@p0rI&Ei5f;u3*hTagj3&K_U9Hu$0ieYK(bA!}9a-KPI-aepa5xJBY z@Qw3rcU@_xo+n=hGgKhrM1euk$?jh?W8!4TC=b p00960o)b?~00006Nklcap diff --git a/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/on.png b/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/on.png deleted file mode 100644 index 17ba985886f20f865bf09d85b278b209ef5bfcc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@RheU{4pvkP5~(Q#NukDDbc}TU#`o z-rZaF?XWz zCe9n;^3Ob~J$|!Hw5wxeVEF%kcim(jpz&-VgTe~DWM4f Dhch&G From 8dd04e4e54b728596dabde75ad8f65bd9fde4546 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:38:50 +0200 Subject: [PATCH 13/15] changed type part of tooltip to be more clean --- .../cakesticklib/setup/common/events/ItemToolTipped.java | 7 ++++--- .../cakesticklib/setup/datagen/client/DataLang.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java index bf7b035..0d1dc95 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/events/ItemToolTipped.java @@ -11,7 +11,6 @@ import com.devdyna.cakesticklib.api.upgrades.modifiers.ModifierUtils; import com.devdyna.cakesticklib.api.upgrades.modifiers.NumericModifier; import com.devdyna.cakesticklib.api.upgrades.modifiers.base.BaseModifier.UseType; -import com.devdyna.cakesticklib.api.utils.StringUtil; import com.devdyna.cakesticklib.api.utils.x; import com.devdyna.cakesticklib.setup.registry.builders.CakeStick; import com.devdyna.cakesticklib.setup.registry.builders.Chisel; @@ -69,10 +68,12 @@ public static void main(ItemTooltipEvent event) { tip.add(2, Component.translatable(MODULE_ID + ".upgrades.modifier.eject.shift")); var eject = ((DirectionalModifier) ModifierUtils.get(nbt, UpgradeType.EJECT)); + tip.add(2, Component.translatable(MODULE_ID + ".upgrades.modifier.eject", TipColors.GOLD + eject.dir().name(), - (eject.type() == UseType.FLUID ? TipColors.LIGHT_BLUE : TipColors.GREEN) - + StringUtil.nameCapitalized(eject.type().getId()))); + (eject.type() == UseType.FLUID ? TipColors.LIGHT_BLUE : TipColors.YELLOW) + + eject.type().name())); + } } diff --git a/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java b/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java index d66b7a5..eefa423 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java @@ -129,7 +129,7 @@ protected void addTranslations() { add(MODULE_ID + ".upgrades.modifier.speed", TipColors.ITEM_TOOLTIP + "Recipe Speed: %s"); add(MODULE_ID + ".upgrades.modifier.luck", TipColors.ITEM_TOOLTIP + "Secondary Output: %s"); add(MODULE_ID + ".upgrades.modifier.fluid", TipColors.ITEM_TOOLTIP + "Fluid Usage: %s"); - add(MODULE_ID + ".upgrades.modifier.eject", TipColors.ITEM_TOOLTIP + "Ejection to: %s [%s]"); + add(MODULE_ID + ".upgrades.modifier.eject", TipColors.ITEM_TOOLTIP + "Ejection to: %s §7| Type : %s"); add(MODULE_ID + ".screen.upgrades", "Supported Upgrades:"); From cd2000107445cf9c74510fcece258e4dd39241ee Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:39:05 +0200 Subject: [PATCH 14/15] datagen --- .../assets/cakesticklib/lang/en_us.json | 2 +- .../eject_upgrade_fluid.json | 32 +++++++++++++++++++ .../eject_upgrade_fluid.json | 27 ++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/cakesticklib/advancement/recipes/misc/upgrade_application/eject_upgrade_fluid.json create mode 100644 src/generated/resources/data/cakesticklib/recipe/upgrade_application/eject_upgrade_fluid.json diff --git a/src/generated/resources/assets/cakesticklib/lang/en_us.json b/src/generated/resources/assets/cakesticklib/lang/en_us.json index 527fe26..f5b74ff 100644 --- a/src/generated/resources/assets/cakesticklib/lang/en_us.json +++ b/src/generated/resources/assets/cakesticklib/lang/en_us.json @@ -112,7 +112,7 @@ "cakesticklib.screen.upgrades": "Supported Upgrades:", "cakesticklib.tank_interact.empty": "Empty", "cakesticklib.ui.dont_consume": "§cNot consume", - "cakesticklib.upgrades.modifier.eject": "§7Ejection to: %s [%s]", + "cakesticklib.upgrades.modifier.eject": "§7Ejection to: %s §7| Type : %s", "cakesticklib.upgrades.modifier.eject.shift": "§8§o", "cakesticklib.upgrades.modifier.empty": "§8§o", "cakesticklib.upgrades.modifier.energy": "§7Energy Usage: %s", diff --git a/src/generated/resources/data/cakesticklib/advancement/recipes/misc/upgrade_application/eject_upgrade_fluid.json b/src/generated/resources/data/cakesticklib/advancement/recipes/misc/upgrade_application/eject_upgrade_fluid.json new file mode 100644 index 0000000..2c0e81d --- /dev/null +++ b/src/generated/resources/data/cakesticklib/advancement/recipes/misc/upgrade_application/eject_upgrade_fluid.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_plates/steel": { + "conditions": { + "items": [ + { + "items": "#c:plates/steel" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "cakesticklib:upgrade_application/eject_upgrade_fluid" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_plates/steel" + ] + ], + "rewards": { + "recipes": [ + "cakesticklib:upgrade_application/eject_upgrade_fluid" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cakesticklib/recipe/upgrade_application/eject_upgrade_fluid.json b/src/generated/resources/data/cakesticklib/recipe/upgrade_application/eject_upgrade_fluid.json new file mode 100644 index 0000000..ff24561 --- /dev/null +++ b/src/generated/resources/data/cakesticklib/recipe/upgrade_application/eject_upgrade_fluid.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "upgrade_application", + "key": { + "B": "#c:dusts/emerald", + "C": "cakesticklib:chip", + "R": "minecraft:piston", + "S": "#c:plates/steel" + }, + "pattern": [ + " R ", + "CSC", + " B " + ], + "result": { + "components": { + "cakesticklib:modifiers": { + "eject": { + "type": "fluid", + "dir": "north" + } + } + }, + "id": "cakesticklib:eject_upgrade" + } +} \ No newline at end of file From 6796ff73046cc8964f88fddd92390f6492c265c1 Mon Sep 17 00:00:00 2001 From: DevDyna Date: Tue, 15 Sep 2026 17:43:09 +0200 Subject: [PATCH 15/15] Update gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 30c604e..4f08a75 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ neo_version=26.1.2.99 mod_id=cakesticklib mod_name=CakeStickLib mod_license=Ora Et Labora License -mod_version=1.17.3 +mod_version=1.17.4 mod_group_id=com.devdyna.cakestick mod_authors=DevDyna mod_description=A standalone port of JustDynaThings and Synergy API to unify most of the code