Skip to content

Commit 8aac53f

Browse files
committed
Allow setting block breaker to sneak
1 parent 951535e commit 8aac53f

File tree

6 files changed

+114
-3
lines changed

6 files changed

+114
-3
lines changed

src/main/java/com/direwolf20/justdirethings/client/screens/BlockBreakerT1Screen.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,38 @@
22

33
import com.direwolf20.justdirethings.client.screens.basescreens.BaseMachineScreen;
44
import com.direwolf20.justdirethings.client.screens.standardbuttons.ToggleButtonFactory;
5+
import com.direwolf20.justdirethings.client.screens.widgets.GrayscaleButton;
56
import com.direwolf20.justdirethings.client.screens.widgets.ToggleButton;
7+
import com.direwolf20.justdirethings.common.blockentities.BlockBreakerT1BE;
68
import com.direwolf20.justdirethings.common.containers.BlockBreakerT1Container;
9+
import com.direwolf20.justdirethings.common.network.data.BreakerPayload;
710
import com.direwolf20.justdirethings.util.MiscHelpers;
811
import net.minecraft.client.gui.GuiGraphics;
912
import net.minecraft.network.chat.Component;
1013
import net.minecraft.world.entity.player.Inventory;
1114
import net.minecraft.world.inventory.Slot;
1215
import net.minecraft.world.item.ItemStack;
16+
import net.neoforged.neoforge.network.PacketDistributor;
1317

1418
public class BlockBreakerT1Screen extends BaseMachineScreen<BlockBreakerT1Container> {
19+
public boolean sneaking;
20+
1521
public BlockBreakerT1Screen(BlockBreakerT1Container container, Inventory inv, Component name) {
1622
super(container, inv, name);
23+
if (baseMachineBE instanceof BlockBreakerT1BE breaker) {
24+
sneaking = breaker.sneaking;
25+
}
1726
}
1827

1928
@Override
2029
public void init() {
2130
super.init();
31+
32+
addRenderableWidget(ToggleButtonFactory.SNEAKCLICKBUTTON(getGuiLeft() + 56, topSectionTop + 38, sneaking, b -> {
33+
sneaking = !sneaking;
34+
((GrayscaleButton) b).toggleActive();
35+
saveSettings();
36+
}));
2237
}
2338

2439
@Override
@@ -43,4 +58,10 @@ protected void drawMachineSlot(GuiGraphics guiGraphics, Slot slot) {
4358
else
4459
super.drawMachineSlot(guiGraphics, slot);
4560
}
61+
62+
@Override
63+
public void saveSettings() {
64+
super.saveSettings();
65+
PacketDistributor.sendToServer(new BreakerPayload(sneaking));
66+
}
4667
}

src/main/java/com/direwolf20/justdirethings/client/screens/BlockBreakerT2Screen.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import com.direwolf20.justdirethings.client.screens.basescreens.BaseMachineScreen;
44
import com.direwolf20.justdirethings.client.screens.standardbuttons.ToggleButtonFactory;
5+
import com.direwolf20.justdirethings.client.screens.widgets.GrayscaleButton;
56
import com.direwolf20.justdirethings.client.screens.widgets.ToggleButton;
67
import com.direwolf20.justdirethings.common.containers.BlockBreakerT2Container;
8+
import com.direwolf20.justdirethings.common.network.data.BreakerPayload;
79
import com.direwolf20.justdirethings.common.network.data.DirectionSettingPayload;
810
import net.minecraft.client.gui.GuiGraphics;
911
import net.minecraft.network.chat.Component;
@@ -13,6 +15,8 @@
1315
import net.neoforged.neoforge.network.PacketDistributor;
1416

1517
public class BlockBreakerT2Screen extends BaseMachineScreen<BlockBreakerT2Container> {
18+
public boolean sneaking;
19+
1620
public BlockBreakerT2Screen(BlockBreakerT2Container container, Inventory inv, Component name) {
1721
super(container, inv, name);
1822
}
@@ -30,6 +34,11 @@ public void init() {
3034
direction = ((ToggleButton) b).getTexturePosition();
3135
PacketDistributor.sendToServer(new DirectionSettingPayload(direction));
3236
}));
37+
addRenderableWidget(ToggleButtonFactory.SNEAKCLICKBUTTON(getGuiLeft() + 8, topSectionTop + 44, sneaking, b -> {
38+
sneaking = !sneaking;
39+
((GrayscaleButton) b).toggleActive();
40+
saveSettings();
41+
}));
3342
}
3443

3544
@Override
@@ -40,4 +49,10 @@ protected void drawMachineSlot(GuiGraphics guiGraphics, Slot slot) {
4049
else
4150
super.drawMachineSlot(guiGraphics, slot);
4251
}
52+
53+
@Override
54+
public void saveSettings() {
55+
super.saveSettings();
56+
PacketDistributor.sendToServer(new BreakerPayload(sneaking));
57+
}
4358
}

src/main/java/com/direwolf20/justdirethings/common/blockentities/BlockBreakerT1BE.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.minecraft.core.Direction;
1010
import net.minecraft.core.HolderLookup;
1111
import net.minecraft.core.registries.Registries;
12+
import net.minecraft.nbt.CompoundTag;
1213
import net.minecraft.network.protocol.game.ClientboundBlockDestructionPacket;
1314
import net.minecraft.server.level.ServerLevel;
1415
import net.minecraft.server.level.ServerPlayer;
@@ -41,6 +42,7 @@ public BlockBreakingProgress(BlockState blockState, int ticks, int iterator, flo
4142
LinkedHashMap<BlockPos, BlockBreakingProgress> blockBreakingTracker = new LinkedHashMap<>();
4243
public RedstoneControlData redstoneControlData = new RedstoneControlData();
4344
Map.Entry<BlockPos, BlockBreakingProgress> currentBlock;
45+
public boolean sneaking = false;
4446

4547
public BlockBreakerT1BE(BlockEntityType<?> pType, BlockPos pPos, BlockState pBlockState) {
4648
super(pType, pPos, pBlockState);
@@ -51,6 +53,11 @@ public BlockBreakerT1BE(BlockPos pPos, BlockState pBlockState) {
5153
this(Registration.BlockBreakerT1BE.get(), pPos, pBlockState);
5254
}
5355

56+
public void setBreakerSettings(boolean sneaking) {
57+
this.sneaking = sneaking;
58+
markDirtyClient();
59+
}
60+
5461
@Override
5562
public RedstoneControlData getRedstoneControlData() {
5663
return redstoneControlData;
@@ -96,16 +103,18 @@ public void clearTrackerIfNeeded(ItemStack tool, FakePlayer fakePlayer) {
96103
@Override
97104
public void tickServer() {
98105
super.tickServer();
99-
doBlockBreak();
106+
FakePlayer fakePlayer = getFakePlayer((ServerLevel) level);
107+
fakePlayer.setShiftKeyDown(sneaking);
108+
doBlockBreak(fakePlayer);
109+
fakePlayer.setShiftKeyDown(false);
100110
}
101111

102112
public boolean canMine() {
103113
return true;
104114
}
105115

106-
public void doBlockBreak() {
116+
public void doBlockBreak(FakePlayer fakePlayer) {
107117
ItemStack tool = getTool();
108-
FakePlayer fakePlayer = getFakePlayer((ServerLevel) level);
109118
clearTrackerIfNeeded(tool, fakePlayer);
110119
if (tool.isEmpty()) {
111120
getRedstoneControlData().pulsed = false;
@@ -268,6 +277,20 @@ public boolean isDefaultSettings() {
268277
return false;
269278
if (!getRedstoneControlData().equals(getDefaultRedstoneData()))
270279
return false;
280+
if (sneaking)
281+
return false;
271282
return true;
272283
}
284+
285+
@Override
286+
public void saveAdditional(CompoundTag tag, HolderLookup.Provider provider) {
287+
super.saveAdditional(tag, provider);
288+
tag.putBoolean("sneaking", sneaking);
289+
}
290+
291+
@Override
292+
public void loadAdditional(CompoundTag tag, HolderLookup.Provider provider) {
293+
this.sneaking = tag.getBoolean("sneaking");
294+
super.loadAdditional(tag, provider);
295+
}
273296
}

src/main/java/com/direwolf20/justdirethings/common/network/PacketHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public static void registerNetworking(final RegisterPayloadHandlersEvent event)
1414
registrar.playToServer(AreaAffectingPayload.TYPE, AreaAffectingPayload.STREAM_CODEC, AreaAffectingPacket.get()::handle);
1515
registrar.playToServer(BlockStateFilterPayload.TYPE, BlockStateFilterPayload.STREAM_CODEC, BlockStateFilterPacket.get()::handle);
1616
registrar.playToServer(ClickerPayload.TYPE, ClickerPayload.STREAM_CODEC, ClickerPacket.get()::handle);
17+
registrar.playToServer(BreakerPayload.TYPE, BreakerPayload.STREAM_CODEC, BreakerPacket.get()::handle);
1718
registrar.playToServer(CopyMachineSettingsPayload.TYPE, CopyMachineSettingsPayload.STREAM_CODEC, CopyMachineSettingsPacket.get()::handle);
1819
registrar.playToServer(DirectionSettingPayload.TYPE, DirectionSettingPayload.STREAM_CODEC, DirectionSettingPacket.get()::handle);
1920
registrar.playToServer(DropperSettingPayload.TYPE, DropperSettingPayload.STREAM_CODEC, DropperSettingPacket.get()::handle);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.direwolf20.justdirethings.common.network.data;
2+
3+
import com.direwolf20.justdirethings.JustDireThings;
4+
import io.netty.buffer.ByteBuf;
5+
import net.minecraft.network.codec.ByteBufCodecs;
6+
import net.minecraft.network.codec.StreamCodec;
7+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
8+
import net.minecraft.resources.ResourceLocation;
9+
10+
public record BreakerPayload(
11+
boolean sneaking
12+
) implements CustomPacketPayload {
13+
public static final Type<BreakerPayload> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(JustDireThings.MODID, "breaker_packet"));
14+
15+
@Override
16+
public Type<? extends CustomPacketPayload> type() {
17+
return TYPE;
18+
}
19+
20+
public static final StreamCodec<ByteBuf, BreakerPayload> STREAM_CODEC = StreamCodec.composite(
21+
ByteBufCodecs.BOOL, BreakerPayload::sneaking,
22+
BreakerPayload::new
23+
);
24+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.direwolf20.justdirethings.common.network.handler;
2+
3+
import com.direwolf20.justdirethings.common.blockentities.BlockBreakerT1BE;
4+
import com.direwolf20.justdirethings.common.containers.basecontainers.BaseMachineContainer;
5+
import com.direwolf20.justdirethings.common.network.data.BreakerPayload;
6+
import net.minecraft.world.entity.player.Player;
7+
import net.minecraft.world.inventory.AbstractContainerMenu;
8+
import net.neoforged.neoforge.network.handling.IPayloadContext;
9+
10+
public class BreakerPacket {
11+
public static final BreakerPacket INSTANCE = new BreakerPacket();
12+
13+
public static BreakerPacket get() {
14+
return INSTANCE;
15+
}
16+
17+
public void handle(final BreakerPayload payload, final IPayloadContext context) {
18+
context.enqueueWork(() -> {
19+
Player sender = context.player();
20+
AbstractContainerMenu container = sender.containerMenu;
21+
22+
if (container instanceof BaseMachineContainer baseMachineContainer && baseMachineContainer.baseMachineBE instanceof BlockBreakerT1BE breaker) {
23+
breaker.setBreakerSettings(payload.sneaking());
24+
}
25+
});
26+
}
27+
}

0 commit comments

Comments
 (0)