PrettyPipes/src/main/java/de/ellpeck/prettypipes/packets/PacketButton.java

138 lines
5.6 KiB
Java
Raw Permalink Normal View History

package de.ellpeck.prettypipes.packets;
2024-03-07 16:00:49 +01:00
import de.ellpeck.prettypipes.PrettyPipes;
import de.ellpeck.prettypipes.Utility;
import de.ellpeck.prettypipes.items.IModule;
2020-04-16 15:19:13 +02:00
import de.ellpeck.prettypipes.misc.ItemFilter.IFilteredContainer;
2021-12-02 14:44:26 +01:00
import de.ellpeck.prettypipes.pipe.PipeBlockEntity;
import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer;
2021-03-03 01:56:19 +01:00
import de.ellpeck.prettypipes.pipe.modules.modifier.FilterModifierModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.modifier.FilterModifierModuleItem;
2020-04-18 22:30:14 +02:00
import de.ellpeck.prettypipes.pipe.modules.stacksize.StackSizeModuleItem;
2021-12-02 14:44:26 +01:00
import de.ellpeck.prettypipes.terminal.CraftingTerminalBlockEntity;
import de.ellpeck.prettypipes.terminal.ItemTerminalBlockEntity;
2020-04-18 22:30:14 +02:00
import net.minecraft.client.Minecraft;
2021-12-02 14:44:26 +01:00
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
2024-03-07 16:00:49 +01:00
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
2021-12-02 14:44:26 +01:00
import net.minecraft.world.MenuProvider;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
2024-03-07 16:00:49 +01:00
import net.neoforged.neoforge.network.PacketDistributor;
import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import org.apache.logging.log4j.util.TriConsumer;
2020-04-16 04:42:42 +02:00
import javax.annotation.Nullable;
2022-06-30 16:00:33 +02:00
import static de.ellpeck.prettypipes.misc.DirectionSelector.IDirectionContainer;
2024-03-07 16:00:49 +01:00
public class PacketButton implements CustomPacketPayload {
2024-03-07 16:00:49 +01:00
public static final ResourceLocation ID = new ResourceLocation(PrettyPipes.ID, "button");
private final BlockPos pos;
private final ButtonResult result;
private final int[] data;
public PacketButton(BlockPos pos, ButtonResult result, int... data) {
this.pos = pos;
this.result = result;
this.data = data;
}
2024-03-07 16:00:49 +01:00
public PacketButton(FriendlyByteBuf buf) {
this.pos = buf.readBlockPos();
this.result = ButtonResult.values()[buf.readByte()];
this.data = buf.readVarIntArray();
}
2024-03-07 16:00:49 +01:00
@Override
public void write(FriendlyByteBuf buf) {
buf.writeBlockPos(this.pos);
buf.writeByte(this.result.ordinal());
buf.writeVarIntArray(this.data);
}
2024-03-07 16:00:49 +01:00
@Override
public ResourceLocation id() {
return PacketButton.ID;
}
2024-03-07 16:00:49 +01:00
public static void onMessage(PacketButton message, PlayPayloadContext ctx) {
ctx.workHandler().execute(() -> {
var player = ctx.player().orElseThrow();
message.result.action.accept(message.pos, message.data, player);
});
}
2020-04-18 22:30:14 +02:00
public static void sendAndExecute(BlockPos pos, ButtonResult result, int... data) {
2024-03-07 16:00:49 +01:00
PacketDistributor.SERVER.noArg().send(new PacketButton(pos, result, data));
2020-04-18 22:30:14 +02:00
result.action.accept(pos, data, Minecraft.getInstance().player);
}
public enum ButtonResult {
PIPE_TAB((pos, data, player) -> {
2023-07-07 19:54:52 +02:00
var tile = Utility.getBlockEntity(PipeBlockEntity.class, player.level(), pos);
2020-04-16 04:42:42 +02:00
if (data[0] < 0) {
2024-03-07 16:00:49 +01:00
player.openMenu(tile, pos);
2020-04-16 04:42:42 +02:00
} else {
2021-12-02 16:55:04 +01:00
var stack = tile.modules.getStackInSlot(data[0]);
2024-03-07 16:00:49 +01:00
player.openMenu(new MenuProvider() {
2020-04-16 04:42:42 +02:00
@Override
2021-12-02 14:44:26 +01:00
public Component getDisplayName() {
return stack.getHoverName();
2020-04-16 04:42:42 +02:00
}
@Nullable
@Override
2021-12-02 14:44:26 +01:00
public AbstractContainerMenu createMenu(int windowId, Inventory inv, Player player) {
2020-04-16 04:42:42 +02:00
return ((IModule) stack.getItem()).getContainer(stack, tile, windowId, inv, player, data[0]);
}
2021-12-02 14:44:26 +01:00
2020-04-16 04:42:42 +02:00
}, buf -> {
buf.writeBlockPos(pos);
buf.writeInt(data[0]);
});
}
2020-04-16 15:19:13 +02:00
}),
FILTER_CHANGE((pos, data, player) -> {
if (player.containerMenu instanceof IFilteredContainer filtered)
filtered.getFilter().onButtonPacket(filtered, data[0]);
2020-04-18 22:30:14 +02:00
}),
STACK_SIZE_MODULE_BUTTON((pos, data, player) -> {
2021-12-02 16:55:04 +01:00
var container = (AbstractPipeContainer<?>) player.containerMenu;
2020-04-18 22:30:14 +02:00
StackSizeModuleItem.setLimitToMaxStackSize(container.moduleStack, !StackSizeModuleItem.getLimitToMaxStackSize(container.moduleStack));
}),
STACK_SIZE_AMOUNT((pos, data, player) -> {
2021-12-02 16:55:04 +01:00
var container = (AbstractPipeContainer<?>) player.containerMenu;
2020-04-18 22:30:14 +02:00
StackSizeModuleItem.setMaxStackSize(container.moduleStack, data[0]);
2020-05-09 13:40:46 +02:00
}),
CRAFT_TERMINAL_REQUEST((pos, data, player) -> {
2023-07-07 19:54:52 +02:00
var tile = Utility.getBlockEntity(CraftingTerminalBlockEntity.class, player.level(), pos);
tile.requestCraftingItems(player, data[0], data[1] > 0);
}),
CANCEL_CRAFTING((pos, data, player) -> {
2023-07-07 19:54:52 +02:00
var tile = Utility.getBlockEntity(ItemTerminalBlockEntity.class, player.level(), pos);
tile.cancelCrafting();
2021-03-03 01:56:19 +01:00
}),
TAG_FILTER((pos, data, player) -> {
2021-12-02 16:55:04 +01:00
var container = (FilterModifierModuleContainer) player.containerMenu;
2021-03-03 01:56:19 +01:00
FilterModifierModuleItem.setFilterTag(container.moduleStack, container.getTags().get(data[0]));
2022-06-30 16:00:33 +02:00
}),
DIRECTION_SELECTOR((pos, data, player) -> {
if (player.containerMenu instanceof IDirectionContainer filtered)
filtered.getSelector().onButtonPacket();
});
2021-12-02 14:44:26 +01:00
public final TriConsumer<BlockPos, int[], Player> action;
2021-12-02 14:44:26 +01:00
ButtonResult(TriConsumer<BlockPos, int[], Player> action) {
this.action = action;
}
}
2024-03-07 16:00:49 +01:00
}