RoughlyEnoughItemsNetwork.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. FabricLoader.getInstance().getEntrypoints("rei_containers", Runnable.class).forEach(Runnable::run);
  34. ServerSidePacketRegistry.INSTANCE.register(DELETE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
  35. ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
  36. if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
  37. player.addChatMessage(new TranslatableText("text.rei.no_permission_cheat").formatted(Formatting.RED), false);
  38. return;
  39. }
  40. if (!player.inventory.getCursorStack().isEmpty())
  41. player.inventory.setCursorStack(ItemStack.EMPTY);
  42. });
  43. ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
  44. ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
  45. if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
  46. player.addChatMessage(new TranslatableText("text.rei.no_permission_cheat").formatted(Formatting.RED), false);
  47. return;
  48. }
  49. ItemStack stack = packetByteBuf.readItemStack();
  50. if (player.inventory.insertStack(stack.copy())) {
  51. ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(stack.copy()).writeString(player.getEntityName(), 32767));
  52. } else
  53. player.addChatMessage(new TranslatableText("text.rei.failed_cheat_items"), false);
  54. });
  55. ServerSidePacketRegistry.INSTANCE.register(MOVE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
  56. Identifier category = packetByteBuf.readIdentifier();
  57. ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
  58. Container container = player.container;
  59. PlayerContainer playerContainer = player.playerContainer;
  60. try {
  61. boolean shift = packetByteBuf.readBoolean();
  62. Map<Integer, List<ItemStack>> input = Maps.newHashMap();
  63. int mapSize = packetByteBuf.readInt();
  64. for (int i = 0; i < mapSize; i++) {
  65. List<ItemStack> list = Lists.newArrayList();
  66. int count = packetByteBuf.readInt();
  67. for (int j = 0; j < count; j++) {
  68. list.add(packetByteBuf.readItemStack());
  69. }
  70. input.put(i, list);
  71. }
  72. try {
  73. InputSlotCrafter.start(category, container, player, input, shift);
  74. } catch (InputSlotCrafter.NotEnoughMaterialsException e) {
  75. if (!(container instanceof CraftingContainer))
  76. return;
  77. PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
  78. buf.writeInt(input.size());
  79. input.entrySet().stream().sorted(Comparator.comparingInt(Map.Entry::getKey)).forEach(entry -> {
  80. List<ItemStack> stacks = entry.getValue();
  81. buf.writeInt(stacks.size());
  82. for (ItemStack stack : stacks) {
  83. buf.writeItemStack(stack);
  84. }
  85. });
  86. if (ServerSidePacketRegistry.INSTANCE.canPlayerReceive(player, NOT_ENOUGH_ITEMS_PACKET)) {
  87. ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, NOT_ENOUGH_ITEMS_PACKET, buf);
  88. }
  89. } catch (IllegalStateException e) {
  90. player.sendMessage(new TranslatableText(e.getMessage()).formatted(Formatting.RED));
  91. } catch (Exception e) {
  92. player.sendMessage(new TranslatableText("error.rei.internal.error", e.getMessage()).formatted(Formatting.RED));
  93. e.printStackTrace();
  94. }
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. }
  98. });
  99. }
  100. }