HeK.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package me.hammerle;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.nio.file.Files;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.stream.Collectors;
  10. import net.minecraft.client.Minecraft;
  11. import net.minecraft.client.gui.AbstractGui;
  12. import net.minecraft.client.gui.FontRenderer;
  13. import net.minecraft.client.util.ITooltipFlag.TooltipFlags;
  14. import net.minecraft.item.ItemStack;
  15. import net.minecraft.util.text.ChatType;
  16. import net.minecraft.util.text.ITextComponent;
  17. import net.minecraft.util.text.StringTextComponent;
  18. import net.minecraftforge.client.event.GuiContainerEvent;
  19. import net.minecraftforge.client.event.ClientChatEvent;
  20. import net.minecraftforge.client.event.ClientChatReceivedEvent;
  21. import net.minecraftforge.client.event.RenderGameOverlayEvent;
  22. import net.minecraftforge.event.TickEvent;
  23. import net.minecraftforge.eventbus.api.SubscribeEvent;
  24. import net.minecraftforge.fml.common.Mod;
  25. @Mod.EventBusSubscriber
  26. @Mod("hek")
  27. public class HeK {
  28. private final static HashMap<String, Skill> SKILLS = new HashMap<>();
  29. private static void addSkill(String name) {
  30. SKILLS.put(name, new Skill(name));
  31. }
  32. private static int skillCorner = 0;
  33. private static boolean toggle = true;
  34. static {
  35. addSkill("Attack");
  36. addSkill("Constitution");
  37. addSkill("Mining");
  38. addSkill("Smelting");
  39. addSkill("Fishing");
  40. addSkill("Hunting");
  41. addSkill("Taming");
  42. addSkill("Leatherworking");
  43. addSkill("Tailoring");
  44. addSkill("Strength");
  45. addSkill("Woodcutting");
  46. addSkill("Firemaking");
  47. addSkill("Weaponsmithing");
  48. addSkill("Farming");
  49. addSkill("Cooking");
  50. addSkill("Merchanting");
  51. addSkill("Crafting");
  52. addSkill("Tinkering");
  53. addSkill("Ranged");
  54. addSkill("Fletching");
  55. addSkill("Carpentry");
  56. addSkill("Armoursmithing");
  57. addSkill("Herblore");
  58. addSkill("Agility");
  59. addSkill("Thieving");
  60. addSkill("Forgery");
  61. addSkill("Alchemy");
  62. addSkill("Defence");
  63. load();
  64. }
  65. private static String filter = "Hegemony";
  66. private static void sendMessage(String msg) {
  67. Minecraft.getInstance().ingameGUI.addChatMessage(ChatType.CHAT, new StringTextComponent(msg));
  68. }
  69. private static String removeFormatting(ITextComponent text) {
  70. return text.getFormattedText().replaceAll("§.", "");
  71. }
  72. private static double parse(String number) {
  73. try {
  74. return Double.parseDouble(number.replace(",", ""));
  75. } catch(NumberFormatException ex) {
  76. return 0.0;
  77. }
  78. }
  79. private static void save() {
  80. File config = new File("./config");
  81. if(!config.exists()) {
  82. config.mkdir();
  83. }
  84. ArrayList<String> data = new ArrayList<>();
  85. data.add(String.valueOf(skillCorner));
  86. try {
  87. Files.write(new File("./config/hek").toPath(), data);
  88. } catch(IOException ex) {
  89. }
  90. }
  91. private static void load() {
  92. try {
  93. File config = new File("./config/hek");
  94. if(!config.exists()) {
  95. return;
  96. }
  97. List<String> list = Files.readAllLines(config.toPath());
  98. if(list.isEmpty()) {
  99. return;
  100. }
  101. try {
  102. skillCorner = Integer.parseInt(list.get(0));
  103. } catch(NumberFormatException ex) {
  104. }
  105. } catch(Exception ex) {
  106. }
  107. }
  108. @SubscribeEvent
  109. public static void onClientChat(GuiContainerEvent e) {
  110. if(!e.getGuiContainer().getTitle().getFormattedText().contains("Skills")) {
  111. return;
  112. }
  113. for(ItemStack stack : e.getGuiContainer().getContainer().getInventory()) {
  114. if(stack.isEmpty()) {
  115. continue;
  116. }
  117. String name = removeFormatting(stack.getDisplayName());
  118. Skill skill = SKILLS.get(name);
  119. if(skill == null) {
  120. continue;
  121. }
  122. List<ITextComponent> lore = stack.getTooltip(Minecraft.getInstance().player, TooltipFlags.NORMAL);
  123. for(ITextComponent text : lore) {
  124. String line = removeFormatting(text);
  125. if(line.startsWith("Experience") && line.length() >= 13) {
  126. skill.setExperience(parse(line.substring(12)));
  127. }
  128. }
  129. }
  130. }
  131. @SubscribeEvent
  132. public static void onClientChat(ClientChatEvent e) {
  133. try {
  134. if(!e.getMessage().startsWith("/")) {
  135. return;
  136. }
  137. String[] parts = e.getMessage().split(" ");
  138. switch(parts[0]) {
  139. case "/hefix":
  140. e.setCanceled(true);
  141. if(parts.length < 2) {
  142. filter = null;
  143. sendMessage("Filter cleared");
  144. return;
  145. }
  146. filter = String.join(" ", Arrays.copyOfRange(parts, 1, parts.length));
  147. sendMessage("Filter set to '" + filter + "'");
  148. break;
  149. case "/toggle":
  150. e.setCanceled(true);
  151. skillCorner = (skillCorner + 1) % 4;
  152. save();
  153. break;
  154. }
  155. } catch(Exception ex) {
  156. }
  157. }
  158. @SubscribeEvent
  159. public static void onChatReceive(ClientChatReceivedEvent e) {
  160. String msg = removeFormatting(e.getMessage());
  161. if(filter != null && msg.contains(filter)) {
  162. e.setCanceled(true);
  163. }
  164. if(e.getType() == ChatType.GAME_INFO) {
  165. String[] parts = msg.split(" ");
  166. ArrayList<Skill> skills = new ArrayList<>();
  167. ArrayList<Double> xp = new ArrayList<>();
  168. for(String part : parts) {
  169. part = part.replace(",", "");
  170. Skill skill = SKILLS.get(part);
  171. if(skill != null) {
  172. skills.add(skill);
  173. continue;
  174. }
  175. try {
  176. xp.add(Double.parseDouble(part));
  177. } catch(NumberFormatException ex) {
  178. }
  179. }
  180. if(skills.size() == xp.size()) {
  181. for(int i = 0; i < skills.size(); i++) {
  182. skills.get(i).addExperience(xp.get(i));
  183. }
  184. } else if(xp.size() == 1) {
  185. for(int i = 0; i < skills.size(); i++) {
  186. skills.get(i).addExperience(xp.get(0));
  187. }
  188. }
  189. }
  190. }
  191. @SubscribeEvent
  192. public static void onClientTick(TickEvent.ClientTickEvent e) {
  193. if(e.phase == TickEvent.Phase.END) {
  194. SKILLS.values().forEach(skill -> skill.tick());
  195. }
  196. }
  197. @SubscribeEvent
  198. public static void onRenderGui(RenderGameOverlayEvent.Post e) {
  199. if(e.getType() != RenderGameOverlayEvent.ElementType.EXPERIENCE) {
  200. return;
  201. }
  202. toggle = false;
  203. List<String> texts = SKILLS.values().stream()
  204. .filter(skill -> skill.shouldRender())
  205. .sorted()
  206. .map(skill -> {
  207. String c = "§r";
  208. if(toggle) {
  209. c = "§7";
  210. }
  211. toggle = !toggle;
  212. if(skill.shouldRenderLastPercent()) {
  213. return String.format("§6Lv. %s%d §6%s: %s%.2f%% +%.2f%%",
  214. c, skill.getLevel(), skill.getName(), c, skill.getPercent(), skill.getLastPercent());
  215. }
  216. return String.format("§6Lv. %s%d §6%s: %s%.2f%%",
  217. c, skill.getLevel(), skill.getName(), c, skill.getPercent());
  218. })
  219. .collect(Collectors.toList());
  220. Minecraft mc = Minecraft.getInstance();
  221. FontRenderer fr = mc.fontRenderer;
  222. int width = 0;
  223. int height = 4;
  224. for(String text : texts) {
  225. height += fr.FONT_HEIGHT;
  226. width = Math.max(fr.getStringWidth(text), width);
  227. }
  228. width += 4;
  229. // 0 - top left
  230. int y = 0;
  231. int x = 0;
  232. switch(skillCorner) {
  233. case 1: // 1 - top right
  234. x = mc.getMainWindow().getScaledWidth() - width;
  235. y = 0;
  236. break;
  237. case 2: // 2 - bottom left
  238. x = 0;
  239. y = mc.getMainWindow().getScaledHeight() - height;
  240. break;
  241. case 3: // 3 - bottom right
  242. x = mc.getMainWindow().getScaledWidth() - width;
  243. y = mc.getMainWindow().getScaledHeight() - height;
  244. break;
  245. }
  246. AbstractGui.fill(x, y, x + width, y + height, 1342177280);
  247. x += 2;
  248. y += 2;
  249. for(String text : texts) {
  250. fr.drawString(text, x, y, 0xFFFFFF);
  251. y += fr.FONT_HEIGHT;
  252. }
  253. }
  254. }