aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java/me
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-06-17 00:10:57 +0800
committershedaniel <daniel@shedaniel.me>2022-06-17 00:10:57 +0800
commitf1fd1e6455be1a49d9c1d26a756cc1d22a1831cb (patch)
tree470b157962d710577d20c294ee9cbfb1e1a5f3f1 /runtime/src/main/java/me
parente9187e728209167bd28bdf4120e6e1dc695d1ec7 (diff)
downloadRoughlyEnoughItems-f1fd1e6455be1a49d9c1d26a756cc1d22a1831cb.tar.gz
RoughlyEnoughItems-f1fd1e6455be1a49d9c1d26a756cc1d22a1831cb.tar.bz2
RoughlyEnoughItems-f1fd1e6455be1a49d9c1d26a756cc1d22a1831cb.zip
Add hotbar quick cheat + fix stacked cheating
Diffstat (limited to 'runtime/src/main/java/me')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java18
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java35
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java26
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java22
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 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<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 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<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 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<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))