RoughlyEnoughItemsNetwork.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei;
  6. import com.google.common.collect.Lists;
  7. import com.google.common.collect.Maps;
  8. import io.netty.buffer.Unpooled;
  9. import me.shedaniel.rei.server.InputSlotCrafter;
  10. import net.fabricmc.api.ModInitializer;
  11. import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
  12. import net.fabricmc.loader.api.FabricLoader;
  13. import net.minecraft.container.Container;
  14. import net.minecraft.container.CraftingContainer;
  15. import net.minecraft.container.PlayerContainer;
  16. import net.minecraft.item.ItemStack;
  17. import net.minecraft.server.network.ServerPlayerEntity;
  18. import net.minecraft.text.TranslatableText;
  19. import net.minecraft.util.Formatting;
  20. import net.minecraft.util.Identifier;
  21. import net.minecraft.util.PacketByteBuf;
  22. import java.util.Comparator;
  23. import java.util.List;
  24. import java.util.Map;
  25. public class RoughlyEnoughItemsNetwork implements ModInitializer {
  26. public static final Identifier DELETE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "delete_item");
  27. public static final Identifier CREATE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "create_item");
  28. public static final Identifier CREATE_ITEMS_MESSAGE_PACKET = new Identifier("roughlyenoughitems", "ci_msg");
  29. public static final Identifier MOVE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "move_items");
  30. public static final Identifier NOT_ENOUGH_ITEMS_PACKET = new Identifier("roughlyenoughitems", "og_not_enough");
  31. @Override
  32. public void onInitialize() {
  33. ServerSidePacketRegistry.INSTANCE.register(DELETE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
  34. ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
  35. if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
  36. player.addChatMessage(new TranslatableText("text.rei.no_permission_cheat").formatted(Formatting.RED), false);
  37. return;
  38. }
  39. if (!player.inventory.getCursorStack().isEmpty())
  40. player.inventory.setCursorStack(ItemStack.EMPTY);
  41. });
  42. ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
  43. ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
  44. if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
  45. player.addChatMessage(new TranslatableText("text.rei.no_permission_cheat").formatted(Formatting.RED), false);
  46. return;
  47. }
  48. ItemStack stack = packetByteBuf.readItemStack();
  49. if (player.inventory.insertStack(stack.copy())) {
  50. ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(stack.copy()).writeString(player.getEntityName(), 32767));
  51. } else
  52. player.addChatMessage(new TranslatableText("text.rei.failed_cheat_items"), false);
  53. });
  54. ServerSidePacketRegistry.INSTANCE.register(MOVE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
  55. Identifier category = packetByteBuf.readIdentifier();
  56. ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
  57. Container container = player.container;
  58. PlayerContainer playerContainer = player.playerContainer;
  59. try {
  60. boolean shift = packetByteBuf.readBoolean();
  61. Map<Integer, List<ItemStack>> input = Maps.newHashMap();
  62. int mapSize = packetByteBuf.readInt();
  63. for (int i = 0; i < mapSize; i++) {
  64. List<ItemStack> list = Lists.newArrayList();
  65. int count = packetByteBuf.readInt();
  66. for (int j = 0; j < count; j++) {
  67. list.add(packetByteBuf.readItemStack());
  68. }
  69. input.put(i, list);
  70. }
  71. try {
  72. InputSlotCrafter.start(category, container, player, input, shift);
  73. } catch (NullPointerException e) {
  74. if (!(container instanceof CraftingContainer))
  75. return;
  76. PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
  77. buf.writeInt(input.size());
  78. input.entrySet().stream().sorted(Comparator.comparingInt(Map.Entry::getKey)).forEach(entry -> {
  79. List<ItemStack> stacks = entry.getValue();
  80. buf.writeInt(stacks.size());
  81. for (ItemStack stack : stacks) {
  82. buf.writeItemStack(stack);
  83. }
  84. });
  85. if (ServerSidePacketRegistry.INSTANCE.canPlayerReceive(player, NOT_ENOUGH_ITEMS_PACKET)) {
  86. ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, NOT_ENOUGH_ITEMS_PACKET, buf);
  87. }
  88. } catch (IllegalStateException e) {
  89. player.sendMessage(new TranslatableText(e.getMessage()).formatted(Formatting.RED));
  90. } catch (Exception e) {
  91. player.sendMessage(new TranslatableText("error.rei.internal.error", e.getMessage()).formatted(Formatting.RED));
  92. e.printStackTrace();
  93. }
  94. } catch (Exception e) {
  95. e.printStackTrace();
  96. }
  97. // }
  98. });
  99. FabricLoader.getInstance().getEntrypoints("rei_containers", Runnable.class).forEach(Runnable::run);
  100. }
  101. }