ClientHelperImpl.java 11 KB

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