From f1fd1e6455be1a49d9c1d26a756cc1d22a1831cb Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 17 Jun 2022 00:10:57 +0800 Subject: Add hotbar quick cheat + fix stacked cheating --- .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 18 +++++++++++ .../rei/impl/client/ClientHelperImpl.java | 35 ++++++++++++++++++++++ .../client/gui/widget/DisplayedEntryWidget.java | 26 ++++++++++++++++ .../gui/widget/entrylist/EntryListWidget.java | 22 ++++++++++++-- 4 files changed, 99 insertions(+), 2 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 0fef1e488..80d868c28 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -47,6 +47,7 @@ import java.util.Collections; public class RoughlyEnoughItemsNetwork { public static final ResourceLocation DELETE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "delete_item"); public static final ResourceLocation CREATE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "create_item"); + public static final ResourceLocation CREATE_ITEMS_HOTBAR_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_hotbar"); public static final ResourceLocation CREATE_ITEMS_GRAB_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_grab"); public static final ResourceLocation CREATE_ITEMS_MESSAGE_PACKET = new ResourceLocation("roughlyenoughitems", "ci_msg"); public static final ResourceLocation MOVE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "move_items"); @@ -97,6 +98,23 @@ public class RoughlyEnoughItemsNetwork { menu.broadcastChanges(); NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); }); + NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_HOTBAR_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + ItemStack stack = buf.readItem(); + int hotbarSlotId = buf.readVarInt(); + if (hotbarSlotId >= 0 && hotbarSlotId < 9) { + AbstractContainerMenu menu = player.containerMenu; + player.getInventory().items.set(hotbarSlotId, stack.copy()); + menu.broadcastChanges(); + NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); + } else { + player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); + } + }); NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> { ServerPlayer player = (ServerPlayer) context.getPlayer(); CategoryIdentifier category = CategoryIdentifier.of(packetByteBuf.readResourceLocation()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 6070fc06a..be826d6c9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -122,6 +122,10 @@ public class ClientHelperImpl implements ClientHelper { return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); } + public boolean canUseHotbarPackets() { + return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET); + } + public boolean canDeleteItems() { return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems(); } @@ -225,6 +229,37 @@ public class ClientHelperImpl implements ClientHelper { } } + @Override + public boolean tryCheatingEntryTo(EntryStack e, int hotbarSlotId) { + if (e.getType() != VanillaEntryTypes.ITEM) + return false; + EntryStack entry = (EntryStack) e; + if (Minecraft.getInstance().player == null) return false; + if (Minecraft.getInstance().player.getInventory() == null) return false; + if (Minecraft.getInstance().gameMode != null && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (menu.getCarried().isEmpty()) { + Minecraft.getInstance().player.getInventory().setItem(hotbarSlotId, stack.getValue().copy()); + Minecraft.getInstance().player.inventoryMenu.broadcastChanges(); + return true; + } + } + if (ClientHelperImpl.getInstance().canUseHotbarPackets()) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (!menu.getCarried().isEmpty()) { + return false; + } + try { + NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.getValue().copy()).writeVarInt(hotbarSlotId)); + return true; + } catch (Exception exception) { + return false; + } + } else return false; + } + @ApiStatus.Internal public Long2LongMap _getInventoryItemsTypes() { EntryDefinition definition; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java index bd15c0da5..cf7f2f5b7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.world.item.ItemStack; @@ -100,4 +101,29 @@ public abstract class DisplayedEntryWidget extends EntryWidget { } return super.cancelDeleteItems(stack); } + + @Override + public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers) { + if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { + EntryStack entry = getCurrentEntry().copy(); + if (!entry.isEmpty()) { + if (entry.getType() != VanillaEntryTypes.ITEM) { + EntryStack cheatsAs = entry.cheatsAs(); + entry = cheatsAs.isEmpty() ? entry : cheatsAs; + } + if (entry.getValueType() == ItemStack.class) { + entry.castValue().setCount(entry.castValue().getMaxStackSize()); + + KeyMapping[] keyHotbarSlots = Minecraft.getInstance().options.keyHotbarSlots; + for (int i = 0; i < keyHotbarSlots.length; i++) { + if (keyHotbarSlots[i].matches(keyCode, scanCode)) { + return ClientHelper.getInstance().tryCheatingEntryTo(entry, i); + } + } + } + } + } + + return super.keyPressedIgnoreContains(keyCode, scanCode, modifiers); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index ff338307b..e52ca1cb8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -486,8 +486,26 @@ public class EntryListWidget extends WidgetWithBounds implements OverlayListWidg if (containsChecked(mouseX, mouseY, false)) { LocalPlayer player = minecraft.player; if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && ClientHelperImpl.getInstance().canDeleteItems()) { - ClientHelper.getInstance().sendDeletePacket(); - return true; + EntryStack stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy()); + if (stack.getType() != VanillaEntryTypes.ITEM) { + EntryStack cheatsAs = stack.cheatsAs(); + stack = cheatsAs.isEmpty() ? stack : cheatsAs; + } + boolean canDelete = true; + + for (Widget child : children()) { + if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget widget) { + if (widget.cancelDeleteItems(stack)) { + canDelete = false; + break; + } + } + } + + if (canDelete) { + ClientHelper.getInstance().sendDeletePacket(); + return true; + } } for (Widget widget : children()) if (widget.mouseReleased(mouseX, mouseY, button)) -- cgit