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..4f08a75 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,18 +5,20 @@ 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 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 ## Compats -jei_version=29.5.0.28 +jei_version=29.37.0.98 + +jade_version=8857417 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 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++) 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) { 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/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; 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/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(); + } + }; + } + +} 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/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java b/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java index d4daec1..9172b42 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/common/CreativeTab.java @@ -30,12 +30,12 @@ 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())); - 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())); } @@ -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())); 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 } 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..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 @@ -5,12 +5,12 @@ 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; 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; @@ -68,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())); + } } @@ -115,5 +117,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()); + } } 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)); } 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:"); 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 ") 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 a524686..03c1ac5 100644 Binary files a/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/fluid.png and b/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/fluid.png differ diff --git a/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/item.png b/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/item.png index dbc493a..6f24bd5 100644 Binary files a/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/item.png and b/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/item.png differ 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 17ba985..0000000 Binary files a/src/main/resources/assets/cakesticklib/textures/gui/modifier/buttons/on.png and /dev/null differ