ClientHelperImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.client;
  6. import com.google.common.collect.ImmutableList;
  7. import com.google.common.collect.Maps;
  8. import io.netty.buffer.Unpooled;
  9. import me.shedaniel.rei.RoughlyEnoughItemsCore;
  10. import me.shedaniel.rei.RoughlyEnoughItemsNetwork;
  11. import me.shedaniel.rei.api.ClientHelper;
  12. import me.shedaniel.rei.api.RecipeCategory;
  13. import me.shedaniel.rei.api.RecipeDisplay;
  14. import me.shedaniel.rei.api.RecipeHelper;
  15. import me.shedaniel.rei.gui.PreRecipeViewingScreen;
  16. import me.shedaniel.rei.gui.RecipeViewingScreen;
  17. import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
  18. import me.shedaniel.rei.gui.config.RecipeScreenType;
  19. import net.fabricmc.api.ClientModInitializer;
  20. import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding;
  21. import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
  22. import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl;
  23. import net.fabricmc.loader.api.FabricLoader;
  24. import net.fabricmc.loader.api.ModContainer;
  25. import net.fabricmc.loader.api.metadata.ModMetadata;
  26. import net.minecraft.ChatFormat;
  27. import net.minecraft.client.MinecraftClient;
  28. import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
  29. import net.minecraft.client.util.InputUtil;
  30. import net.minecraft.item.Item;
  31. import net.minecraft.item.ItemStack;
  32. import net.minecraft.item.Items;
  33. import net.minecraft.network.chat.TranslatableComponent;
  34. import net.minecraft.util.DefaultedList;
  35. import net.minecraft.util.Identifier;
  36. import net.minecraft.util.PacketByteBuf;
  37. import net.minecraft.util.registry.Registry;
  38. import java.io.IOException;
  39. import java.util.ArrayList;
  40. import java.util.List;
  41. import java.util.Map;
  42. import java.util.Optional;
  43. public class ClientHelperImpl implements ClientHelper, ClientModInitializer {
  44. public static ClientHelperImpl instance;
  45. private final Identifier recipeKeybind = new Identifier("roughlyenoughitems", "recipe_keybind");
  46. private final Identifier usageKeybind = new Identifier("roughlyenoughitems", "usage_keybind");
  47. private final Identifier hideKeybind = new Identifier("roughlyenoughitems", "hide_keybind");
  48. private final Identifier previousPageKeybind = new Identifier("roughlyenoughitems", "previous_page");
  49. private final Identifier nextPageKeybind = new Identifier("roughlyenoughitems", "next_page");
  50. private final Map<String, String> modNameCache = Maps.newHashMap();
  51. public FabricKeyBinding recipe, usage, hide, previousPage, nextPage;
  52. public String getFormattedModNoItalicFromItem(Item item) {
  53. String mod = getModFromItem(item);
  54. if (mod.equalsIgnoreCase(""))
  55. return "";
  56. return ChatFormat.BLUE.toString() + mod;
  57. }
  58. @Override
  59. public String getFormattedModFromItem(Item item) {
  60. String mod = getModFromItem(item);
  61. if (mod.equalsIgnoreCase(""))
  62. return "";
  63. return ChatFormat.BLUE.toString() + ChatFormat.ITALIC.toString() + mod;
  64. }
  65. @Override
  66. public String getFormattedModFromIdentifier(Identifier identifier) {
  67. String mod = getModFromIdentifier(identifier);
  68. if (mod.equalsIgnoreCase(""))
  69. return "";
  70. return ChatFormat.BLUE.toString() + ChatFormat.ITALIC.toString() + mod;
  71. }
  72. @Override
  73. public FabricKeyBinding getRecipeKeyBinding() {
  74. return recipe;
  75. }
  76. @Override
  77. public FabricKeyBinding getUsageKeyBinding() {
  78. return usage;
  79. }
  80. @Override
  81. public FabricKeyBinding getHideKeyBinding() {
  82. return hide;
  83. }
  84. @Override
  85. public FabricKeyBinding getPreviousPageKeyBinding() {
  86. return previousPage;
  87. }
  88. @Override
  89. public FabricKeyBinding getNextPageKeyBinding() {
  90. return nextPage;
  91. }
  92. @Override
  93. public String getModFromItem(Item item) {
  94. if (item.equals(Items.AIR))
  95. return "";
  96. return getModFromIdentifier(Registry.ITEM.getId(item));
  97. }
  98. @Override
  99. public String getModFromIdentifier(Identifier identifier) {
  100. if (identifier == null)
  101. return "";
  102. Optional<String> any = Optional.ofNullable(modNameCache.getOrDefault(identifier.getNamespace(), null));
  103. if (any.isPresent())
  104. return any.get();
  105. String modid = identifier.getNamespace();
  106. String s = FabricLoader.getInstance().getModContainer(modid).map(ModContainer::getMetadata).map(ModMetadata::getName).orElse(modid);
  107. modNameCache.put(modid, s);
  108. return s;
  109. }
  110. @Override
  111. public boolean isCheating() {
  112. return RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating;
  113. }
  114. @Override
  115. public void setCheating(boolean cheating) {
  116. RoughlyEnoughItemsCore.getConfigManager().getConfig().cheating = cheating;
  117. try {
  118. RoughlyEnoughItemsCore.getConfigManager().saveConfig();
  119. } catch (IOException e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. @Override
  124. public void sendDeletePacket() {
  125. if (ScreenHelper.getLastContainerScreen() instanceof CreativeInventoryScreen) {
  126. MinecraftClient.getInstance().player.inventory.setCursorStack(ItemStack.EMPTY);
  127. return;
  128. }
  129. ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET, new PacketByteBuf(Unpooled.buffer()));
  130. }
  131. @Override
  132. public boolean tryCheatingStack(ItemStack cheatedStack) {
  133. if (RoughlyEnoughItemsCore.canUsePackets()) {
  134. try {
  135. ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(cheatedStack.copy()));
  136. return true;
  137. } catch (Exception e) {
  138. return false;
  139. }
  140. } else {
  141. Identifier identifier = Registry.ITEM.getId(cheatedStack.getItem());
  142. String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().asString() : "";
  143. String og = cheatedStack.getAmount() == 1 ? RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand.replaceAll(" \\{count}", "") : RoughlyEnoughItemsCore.getConfigManager().getConfig().giveCommand;
  144. String madeUpCommand = og.replaceAll("\\{player_name}", MinecraftClient.getInstance().player.getEntityName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getAmount()));
  145. if (madeUpCommand.length() > 256) {
  146. madeUpCommand = og.replaceAll("\\{player_name}", MinecraftClient.getInstance().player.getEntityName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", "").replaceAll("\\{count}", String.valueOf(cheatedStack.getAmount()));
  147. MinecraftClient.getInstance().player.addChatMessage(new TranslatableComponent("text.rei.too_long_nbt"), false);
  148. }
  149. MinecraftClient.getInstance().player.sendChatMessage(madeUpCommand);
  150. return true;
  151. }
  152. }
  153. @Override
  154. public boolean executeRecipeKeyBind(ItemStack stack) {
  155. Map<RecipeCategory, List<RecipeDisplay>> map = RecipeHelper.getInstance().getRecipesFor(stack);
  156. if (map.keySet().size() > 0)
  157. openRecipeViewingScreen(map);
  158. return map.keySet().size() > 0;
  159. }
  160. @Override
  161. public boolean executeUsageKeyBind(ItemStack stack) {
  162. Map<RecipeCategory, List<RecipeDisplay>> map = RecipeHelper.getInstance().getUsagesFor(stack);
  163. if (map.keySet().size() > 0)
  164. openRecipeViewingScreen(map);
  165. return map.keySet().size() > 0;
  166. }
  167. @Override
  168. public List<ItemStack> getInventoryItemsTypes() {
  169. List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor, MinecraftClient.getInstance().player.inventory.offHand);
  170. List<ItemStack> inventoryStacks = new ArrayList<>();
  171. field_7543.forEach(itemStacks -> itemStacks.forEach(itemStack -> {
  172. if (!itemStack.isEmpty())
  173. inventoryStacks.add(itemStack);
  174. }));
  175. return inventoryStacks;
  176. }
  177. @Override
  178. public boolean executeViewAllRecipesKeyBind() {
  179. Map<RecipeCategory, List<RecipeDisplay>> map = RecipeHelper.getInstance().getAllRecipes();
  180. if (map.keySet().size() > 0)
  181. openRecipeViewingScreen(map);
  182. return map.keySet().size() > 0;
  183. }
  184. @Override
  185. public boolean executeViewAllRecipesFromCategory(Identifier category) {
  186. Map<RecipeCategory, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
  187. Optional<RecipeCategory> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
  188. if (!any.isPresent())
  189. return false;
  190. RecipeCategory<?> recipeCategory = any.get();
  191. map.put(recipeCategory, RecipeHelper.getInstance().getAllRecipesFromCategory(recipeCategory));
  192. if (map.keySet().size() > 0)
  193. openRecipeViewingScreen(map);
  194. return map.keySet().size() > 0;
  195. }
  196. @Override
  197. public boolean executeViewAllRecipesFromCategories(List<Identifier> categories) {
  198. Map<RecipeCategory, List<RecipeDisplay>> map = Maps.newLinkedHashMap();
  199. for(Identifier category : categories) {
  200. Optional<RecipeCategory> any = RecipeHelper.getInstance().getAllCategories().stream().filter(c -> c.getIdentifier().equals(category)).findAny();
  201. if (!any.isPresent())
  202. continue;
  203. RecipeCategory<?> recipeCategory = any.get();
  204. map.put(recipeCategory, RecipeHelper.getInstance().getAllRecipesFromCategory(recipeCategory));
  205. }
  206. if (map.keySet().size() > 0)
  207. openRecipeViewingScreen(map);
  208. return map.keySet().size() > 0;
  209. }
  210. @Override
  211. public void openRecipeViewingScreen(Map<RecipeCategory, List<RecipeDisplay>> map) {
  212. if (RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType == RecipeScreenType.VILLAGER)
  213. MinecraftClient.getInstance().openScreen(new VillagerRecipeViewingScreen(map));
  214. else if (RoughlyEnoughItemsCore.getConfigManager().getConfig().screenType == RecipeScreenType.UNSET)
  215. MinecraftClient.getInstance().openScreen(new PreRecipeViewingScreen(map));
  216. else
  217. MinecraftClient.getInstance().openScreen(new RecipeViewingScreen(map));
  218. }
  219. @Override
  220. public void onInitializeClient() {
  221. ClientHelperImpl.instance = (ClientHelperImpl) this;
  222. registerFabricKeyBinds();
  223. modNameCache.put("minecraft", "Minecraft");
  224. modNameCache.put("c", "Common");
  225. }
  226. @Override
  227. public void registerFabricKeyBinds() {
  228. String category = "key.rei.category";
  229. KeyBindingRegistryImpl.INSTANCE.addCategory(category);
  230. KeyBindingRegistryImpl.INSTANCE.register(recipe = FabricKeyBinding.Builder.create(recipeKeybind, InputUtil.Type.KEYSYM, 82, category).build());
  231. KeyBindingRegistryImpl.INSTANCE.register(usage = FabricKeyBinding.Builder.create(usageKeybind, InputUtil.Type.KEYSYM, 85, category).build());
  232. KeyBindingRegistryImpl.INSTANCE.register(hide = FabricKeyBinding.Builder.create(hideKeybind, InputUtil.Type.KEYSYM, 79, category).build());
  233. KeyBindingRegistryImpl.INSTANCE.register(previousPage = FabricKeyBinding.Builder.create(previousPageKeybind, InputUtil.Type.KEYSYM, -1, category).build());
  234. KeyBindingRegistryImpl.INSTANCE.register(nextPage = FabricKeyBinding.Builder.create(nextPageKeybind, InputUtil.Type.KEYSYM, -1, category).build());
  235. }
  236. }