From 609851e848eb0369a709d98ee128557e1a77a5ae Mon Sep 17 00:00:00 2001 From: slin-o Date: Thu, 24 Jul 2025 11:41:18 +0200 Subject: [PATCH 1/3] add SidedScrollOptionBehavior and made AllIcons usable with custom rescource --- gradlew | 0 .../behaviour/ValueSettingsClient.java | 2 +- .../behaviour/ValueSettingsInputHandler.java | 6 ++ .../behaviour/ValueSettingsPacket.java | 3 + .../behaviour/ValueSettingsScreen.java | 7 +- .../ISidedScrollValueBehavior.java | 14 ++++ .../scrollValue/ScrollValueRenderer.java | 6 ++ .../SidedScrollOptionBehavior.java | 65 +++++++++++++++++++ .../create/foundation/gui/AllIcons.java | 13 +++- 9 files changed, 109 insertions(+), 7 deletions(-) mode change 100755 => 100644 gradlew create mode 100644 src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ISidedScrollValueBehavior.java create mode 100644 src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/SidedScrollOptionBehavior.java diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java index 646b3deceb..061ac2cc79 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java @@ -99,7 +99,7 @@ public void tick() { return; ScreenOpener.open(new ValueSettingsScreen(interactHeldPos, valueSettingBehaviour.createBoard(player, blockHitResult), valueSettingBehaviour.getValueSettings(), - valueSettingBehaviour::newSettingHovered, valueSettingBehaviour.netId())); + valueSettingBehaviour::newSettingHovered, valueSettingBehaviour.netId(), interactHeldFace)); interactHeldTicks = -1; } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java index 795352f0bd..35c3e1d670 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java @@ -5,6 +5,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ISidedScrollValueBehavior; import com.simibubi.create.foundation.utility.AdventureUtil; import net.createmod.catnip.platform.CatnipServices; @@ -54,6 +55,11 @@ public static void onBlockActivated(PlayerInteractEvent.RightClickBlock event) { BlockHitResult ray = event.getHitVec(); if (ray == null) return; + if (behaviour instanceof ISidedScrollValueBehavior sidedBehavior) { + behaviour = sidedBehavior.get(ray.getDirection()); + if (behaviour == null) + continue; + } if (behaviour instanceof SidedFilteringBehaviour) { behaviour = ((SidedFilteringBehaviour) behaviour).get(ray.getDirection()); if (behaviour == null) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java index 697c7fc28e..b38abf7879 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBehaviour.ValueSettings; +import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ISidedScrollValueBehavior; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; import net.createmod.catnip.codecs.stream.CatnipLargerStreamCodecs; @@ -65,6 +66,8 @@ protected void applySettings(ServerPlayer player, SmartBlockEntity be) { valueSettingsBehaviour.onShortInteract(player, interactHand, side, hitResult); return; } + if (valueSettingsBehaviour instanceof ISidedScrollValueBehavior) valueSettingsBehaviour = ((ISidedScrollValueBehavior) valueSettingsBehaviour).get(side); + valueSettingsBehaviour.newSettingHovered(new ValueSettings(row, value)); valueSettingsBehaviour.setValueSettings(player, new ValueSettings(row, value), ctrlDown); return; } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java index 99939c8100..ed6240e04f 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java @@ -42,9 +42,10 @@ public class ValueSettingsScreen extends AbstractSimiScreen { private int milestoneSize; private int soundCoolDown; private int netId; + private Direction face; public ValueSettingsScreen(BlockPos pos, ValueSettingsBoard board, ValueSettings valueSettings, - Consumer onHover, int netId) { + Consumer onHover, int netId, Direction face) { this.pos = pos; this.board = board; this.initialSettings = valueSettings; @@ -52,6 +53,7 @@ public ValueSettingsScreen(BlockPos pos, ValueSettingsBoard board, ValueSettings this.netId = netId; this.iconMode = board.formatter() instanceof ScrollOptionSettingsFormatter; this.milestoneSize = iconMode ? 8 : 4; + this.face = face; } @Override @@ -321,8 +323,7 @@ public boolean mouseReleased(double pMouseX, double pMouseY, int pButton) { protected void saveAndClose(double pMouseX, double pMouseY) { ValueSettings closest = getClosestCoordinate((int) pMouseX, (int) pMouseY); - // FIXME: value settings may be face-sensitive on future components - CatnipServices.NETWORK.sendToServer(new ValueSettingsPacket(pos, closest.row(), closest.value(), null, null, Direction.UP, + CatnipServices.NETWORK.sendToServer(new ValueSettingsPacket(pos, closest.row(), closest.value(), null, null, face, AllKeys.ctrlDown(), netId)); onClose(); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ISidedScrollValueBehavior.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ISidedScrollValueBehavior.java new file mode 100644 index 0000000000..83041a294e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ISidedScrollValueBehavior.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.blockEntity.behaviour.scrollValue; + +import net.minecraft.core.Direction; + +public interface ISidedScrollValueBehavior{ + + /** + * Returns the ValueSettingsBehaviour for the given side. + * + * @param side the side for which to get the ValueSettingsBehaviour + * @return the ValueSettingsBehaviour for the given side + */ + B get(Direction side); +} diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java index 77b33fa463..197bfcbdec 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java @@ -11,6 +11,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.IconValueBox; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.TextValueBox; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.outliner.Outliner; @@ -47,6 +48,11 @@ public static void tick() { if (!(blockEntityBehaviour instanceof ScrollValueBehaviour behaviour)) continue; + if (behaviour instanceof ISidedScrollValueBehavior sidedScrollValueBehavior) { + behaviour = sidedScrollValueBehavior.get(face); + if (behaviour == null) + continue; + } if (!behaviour.isActive()) { Outliner.getInstance().remove(behaviour); continue; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/SidedScrollOptionBehavior.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/SidedScrollOptionBehavior.java new file mode 100644 index 0000000000..8aca1f142d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/SidedScrollOptionBehavior.java @@ -0,0 +1,65 @@ +package com.simibubi.create.foundation.blockEntity.behaviour.scrollValue; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; + +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; + +import java.util.IdentityHashMap; +import java.util.Map; + +// Example implementation of ISidedScrollValueBehavior +public class SidedScrollOptionBehavior & INamedIconOptions> extends ScrollValueBehaviour implements ISidedScrollValueBehavior> { + Map> sidedBehaviours; + + /** + * Creates a new SidedScrollOptionBehavior with the given enum type, label, block entity, and slot transform. + * + * @param label The label for the behavior. + * @param be The SmartBlockEntity this behavior is associated with. + * @param slot The ValueBoxTransform for the slot. + */ + + public SidedScrollOptionBehavior(Class enum_, Component label, SmartBlockEntity be, ValueBoxTransform slot) { + super(label, be, slot); + sidedBehaviours = new IdentityHashMap<>(); + for (Direction d : Iterate.directions) { + sidedBehaviours.put(d, new ScrollOptionBehaviour<>(enum_, label, be, slot)); + } + } + + @Override + public ScrollOptionBehaviour get(Direction side) { + return sidedBehaviours.get(side); + } + + @Override + public void read(CompoundTag nbt, HolderLookup.Provider registries, boolean clientPacket) { + NBTHelper.iterateCompoundList(nbt.getList("Behaviors", Tag.TAG_COMPOUND), compound -> { + Direction face = Direction.from3DDataValue(compound.getInt("Side")); + if (sidedBehaviours.containsKey(face)) + sidedBehaviours.get(face) + .read(compound, registries, clientPacket); + }); + super.read(nbt, registries, clientPacket); + } + + @Override + public void write(CompoundTag nbt, HolderLookup.Provider registries, boolean clientPacket) { + nbt.put("Behaviors", NBTHelper.writeCompoundList(sidedBehaviours.entrySet(), entry -> { + CompoundTag compound = new CompoundTag(); + compound.putInt("Side", entry.getKey() + .get3DDataValue()); + entry.getValue() + .write(compound, registries, clientPacket); + return compound; + })); + super.write(nbt, registries, clientPacket); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index e8551a3bfb..b3a9146173 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -21,8 +21,8 @@ public class AllIcons implements ScreenElement { - public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png"); - public static final int ICON_ATLAS_SIZE = 256; + public final ResourceLocation ICON_ATLAS ; + public final int ICON_ATLAS_SIZE; private static int x = 0, y = -1; private int iconX; @@ -170,9 +170,16 @@ public class AllIcons implements ScreenElement { I_MOVE_GAUGE = next(); ; - public AllIcons(int x, int y) { + private AllIcons(int x, int y) { + this(x, y, Create.asResource("textures/gui/icons.png"), 256); + } + + public AllIcons(int x, int y, ResourceLocation iconAtlas, int iconAtlasSize) { iconX = x * 16; iconY = y * 16; + ICON_ATLAS = iconAtlas; + ICON_ATLAS_SIZE = iconAtlasSize; + } private static AllIcons next() { From cb2c0174949aca79c7d26f7d749f6c71719accbd Mon Sep 17 00:00:00 2001 From: slin-o Date: Thu, 24 Jul 2025 11:58:14 +0200 Subject: [PATCH 2/3] fix permissions on gradlew file --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 306373a67d3e9501e1950036f31efab1ab35885b Mon Sep 17 00:00:00 2001 From: slin-o Date: Thu, 24 Jul 2025 16:43:41 +0200 Subject: [PATCH 3/3] fix Client not recognizing sided behavior on opening menu --- .../blockEntity/behaviour/ValueSettingsClient.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java index 061ac2cc79..ebba6d5c68 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java @@ -4,6 +4,8 @@ import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ISidedScrollValueBehavior; + import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.platform.CatnipServices; import net.createmod.catnip.theme.Color; @@ -85,6 +87,9 @@ public void tick() { cancelInteraction(); return; } + + if (valueSettingBehaviour instanceof ISidedScrollValueBehavior sided) valueSettingBehaviour = sided.get(interactHeldFace); + if (!mc.options.keyUse.isDown()) { CatnipServices.NETWORK.sendToServer(new ValueSettingsPacket(interactHeldPos, 0, 0, interactHeldHand, blockHitResult, interactHeldFace, false, valueSettingBehaviour.netId()));