ClientHelper.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package me.shedaniel.rei.client;
  2. import com.google.common.collect.ImmutableList;
  3. import com.google.common.collect.Maps;
  4. import io.netty.buffer.Unpooled;
  5. import me.shedaniel.rei.RoughlyEnoughItemsCore;
  6. import me.shedaniel.rei.RoughlyEnoughItemsNetwork;
  7. import me.shedaniel.rei.api.RecipeCategory;
  8. import me.shedaniel.rei.api.RecipeDisplay;
  9. import me.shedaniel.rei.api.RecipeHelper;
  10. import me.shedaniel.rei.gui.RecipeViewingScreen;
  11. import net.fabricmc.api.ClientModInitializer;
  12. import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
  13. import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
  14. import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl;
  15. import net.fabricmc.loader.api.FabricLoader;
  16. import net.fabricmc.loader.api.ModContainer;
  17. import net.fabricmc.loader.api.metadata.ModMetadata;
  18. import net.minecraft.client.MinecraftClient;
  19. import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen;
  20. import net.minecraft.client.util.InputUtil;
  21. import net.minecraft.item.Item;
  22. import net.minecraft.item.ItemStack;
  23. import net.minecraft.item.Items;
  24. import net.minecraft.text.TranslatableTextComponent;
  25. import net.minecraft.util.DefaultedList;
  26. import net.minecraft.util.Identifier;
  27. import net.minecraft.util.PacketByteBuf;
  28. import net.minecraft.util.registry.Registry;
  29. import java.io.IOException;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.Optional;
  34. public class ClientHelper implements ClientModInitializer {
  35. private static final Identifier RECIPE_KEYBIND = new Identifier("roughlyenoughitems", "recipe_keybind");
  36. private static final Identifier USAGE_KEYBIND = new Identifier("roughlyenoughitems", "usage_keybind");
  37. private static final Identifier HIDE_KEYBIND = new Identifier("roughlyenoughitems", "hide_keybind");
  38. private static final Map<String, String> MOD_NAME_CACHE = Maps.newHashMap();
  39. public static FabricKeyBinding RECIPE, USAGE, HIDE;
  40. static {
  41. MOD_NAME_CACHE.put("minecraft", "Minecraft");
  42. MOD_NAME_CACHE.put("c", "Common");
  43. }
  44. public static String getFormattedModFromItem(Item item) {
  45. String mod = getModFromItem(item);
  46. if (mod.equalsIgnoreCase(""))
  47. return "";
  48. return "§9§o" + mod;
  49. }
  50. public static String getModFromItem(Item item) {
  51. if (item.equals(Items.AIR))
  52. return "";
  53. return getModFromIdentifier(Registry.ITEM.getId(item));
  54. }
  55. public static String getModFromIdentifier(Identifier identifier) {
  56. if (identifier == null)
  57. return "";
  58. Optional<String> any = Optional.ofNullable(MOD_NAME_CACHE.getOrDefault(identifier.getNamespace(), null));
  59. if (any.isPresent())
  60. return any.get();
  61. String modid = identifier.getNamespace();
  62. String s = FabricLoader.getInstance().getModContainer(modid).map(ModContainer::getMetadata).map(ModMetadata::getName).orElse(modid);
  63. MOD_NAME_CACHE.put(modid, s);
  64. return s;
  65. }
  66. public static boolean isCheating() {
  67. return RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating;
  68. }
  69. public static void setCheating(boolean cheating) {
  70. RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating = cheating;
  71. try {
  72. RoughlyEnoughItemsCore.getConfigManager().saveConfig();
  73. } catch (IOException e) {
  74. e.printStackTrace();
  75. }
  76. }
  77. public static void sendDeletePacket() {
  78. if (ScreenHelper.getLastContainerScreen() instanceof CreativePlayerInventoryScreen) {
  79. MinecraftClient.getInstance().player.inventory.setCursorStack(ItemStack.EMPTY);
  80. return;
  81. }
  82. ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET, new PacketByteBuf(Unpooled.buffer()));
  83. }
  84. public static boolean tryCheatingStack(ItemStack cheatedStack) {
  85. if (RoughlyEnoughItemsCore.hasPermissionToUsePackets()) {
  86. try {
  87. ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(cheatedStack.copy()));
  88. return true;
  89. } catch (Exception e) {
  90. return false;
  91. }
  92. } else {
  93. Identifier identifier = Registry.ITEM.getId(cheatedStack.getItem());
  94. String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().asString() : "";
  95. String og = cheatedStack.getAmount() != 1 ? RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand.replaceAll(" \\{count}", "").replaceAll("\\{count}", "") : RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand;
  96. String madeUpCommand = og.replaceAll("\\{player_name}", MinecraftClient.getInstance().player.getEntityName()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getAmount()));
  97. if (madeUpCommand.length() > 256) {
  98. madeUpCommand = og.replaceAll("\\{player_name}", MinecraftClient.getInstance().player.getEntityName()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", "").replaceAll("\\{count}", String.valueOf(cheatedStack.getAmount()));
  99. MinecraftClient.getInstance().player.addChatMessage(new TranslatableTextComponent("text.rei.too_long_nbt"), false);
  100. }
  101. MinecraftClient.getInstance().player.sendChatMessage(madeUpCommand);
  102. return true;
  103. }
  104. }
  105. public static boolean executeRecipeKeyBind(ItemStack stack) {
  106. Map<RecipeCategory, List<RecipeDisplay>> map = RecipeHelper.getInstance().getRecipesFor(stack);
  107. if (map.keySet().size() > 0)
  108. MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(MinecraftClient.getInstance().window, map));
  109. return map.keySet().size() > 0;
  110. }
  111. public static boolean executeUsageKeyBind(ItemStack stack) {
  112. Map<RecipeCategory, List<RecipeDisplay>> map = RecipeHelper.getInstance().getUsagesFor(stack);
  113. if (map.keySet().size() > 0)
  114. MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(MinecraftClient.getInstance().window, map));
  115. return map.keySet().size() > 0;
  116. }
  117. public static List<ItemStack> getInventoryItemsTypes() {
  118. List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor, MinecraftClient.getInstance().player.inventory.offHand);
  119. List<ItemStack> inventoryStacks = new ArrayList<>();
  120. field_7543.forEach(itemStacks -> itemStacks.forEach(itemStack -> {
  121. if (!itemStack.isEmpty())
  122. inventoryStacks.add(itemStack);
  123. }));
  124. return inventoryStacks;
  125. }
  126. public static boolean executeViewAllRecipesKeyBind() {
  127. Map<RecipeCategory, List<RecipeDisplay>> map = RecipeHelper.getInstance().getAllRecipes();
  128. if (map.keySet().size() > 0)
  129. MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(MinecraftClient.getInstance().window, map));
  130. return map.keySet().size() > 0;
  131. }
  132. @Override
  133. public void onInitializeClient() {
  134. registerFabricKeyBinds();
  135. }
  136. private void registerFabricKeyBinds() {
  137. String category = "key.rei.category";
  138. KeyBindingRegistryImpl.INSTANCE.addCategory(category);
  139. KeyBindingRegistryImpl.INSTANCE.register(RECIPE = FabricKeyBinding.Builder.create(RECIPE_KEYBIND, InputUtil.Type.KEYSYM, 82, category).build());
  140. KeyBindingRegistryImpl.INSTANCE.register(USAGE = FabricKeyBinding.Builder.create(USAGE_KEYBIND, InputUtil.Type.KEYSYM, 85, category).build());
  141. KeyBindingRegistryImpl.INSTANCE.register(HIDE = FabricKeyBinding.Builder.create(HIDE_KEYBIND, InputUtil.Type.KEYSYM, 79, category).build());
  142. }
  143. }