diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-17 00:10:57 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-06-28 03:21:12 +0800 |
| commit | db456ff7f6d10692d6579c7193f172bad7c65b12 (patch) | |
| tree | 29204b5588b8d1678a0b216566de26846eea2b9f /runtime/src/main/java/me | |
| parent | 90ef94bb9d5cf482c824ee53aa6133939d8de670 (diff) | |
| download | RoughlyEnoughItems-db456ff7f6d10692d6579c7193f172bad7c65b12.tar.gz RoughlyEnoughItems-db456ff7f6d10692d6579c7193f172bad7c65b12.tar.bz2 RoughlyEnoughItems-db456ff7f6d10692d6579c7193f172bad7c65b12.zip | |
Add hotbar quick cheat + fix stacked cheating
Diffstat (limited to 'runtime/src/main/java/me')
4 files changed, 99 insertions, 2 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 19d382455..328914480 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<Display> 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 9111045a1..452b05e6f 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 @@ -123,6 +123,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(); } @@ -226,6 +230,37 @@ public class ClientHelperImpl implements ClientHelper { } } + @Override + public boolean tryCheatingEntryTo(EntryStack<?> e, int hotbarSlotId) { + if (e.getType() != VanillaEntryTypes.ITEM) + return false; + EntryStack<ItemStack> entry = (EntryStack<ItemStack>) 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<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> cheatsAs = entry.cheatsAs(); + entry = cheatsAs.isEmpty() ? entry : cheatsAs; + } + if (entry.getValueType() == ItemStack.class) { + entry.<ItemStack>castValue().setCount(entry.<ItemStack>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 7b8356bcb..978723e6a 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 @@ -485,8 +485,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<ItemStack> 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)) |
