AdvancementScreenMixin.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package de.guntram.mcmod.advancementinfo.mixin;
  7. import de.guntram.mcmod.advancementinfo.AdvancementInfo;
  8. import static de.guntram.mcmod.advancementinfo.AdvancementInfo.AI_spaceX;
  9. import static de.guntram.mcmod.advancementinfo.AdvancementInfo.AI_spaceY;
  10. import de.guntram.mcmod.advancementinfo.AdvancementStep;
  11. import de.guntram.mcmod.advancementinfo.IteratorReceiver;
  12. import de.guntram.mcmod.advancementinfo.accessors.AdvancementWidgetAccessor;
  13. import java.util.List;
  14. import net.minecraft.advancement.Advancement;
  15. import net.minecraft.client.gui.screen.Screen;
  16. import net.minecraft.client.gui.screen.advancement.AdvancementWidget;
  17. import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
  18. import net.minecraft.client.resource.language.I18n;
  19. import net.minecraft.client.util.math.MatrixStack;
  20. import org.spongepowered.asm.mixin.Mixin;
  21. import org.spongepowered.asm.mixin.injection.At;
  22. import org.spongepowered.asm.mixin.injection.Constant;
  23. import org.spongepowered.asm.mixin.injection.Inject;
  24. import org.spongepowered.asm.mixin.injection.ModifyConstant;
  25. import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
  26. import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
  27. /**
  28. *
  29. * @author gbl
  30. */
  31. @Mixin(AdvancementsScreen.class)
  32. public class AdvancementScreenMixin extends Screen {
  33. public AdvancementScreenMixin() { super(null); }
  34. private int scrollPos;
  35. @ModifyConstant(method="render", constant=@Constant(intValue = 252), require=1)
  36. private int getRenderLeft(int orig) { return width - AI_spaceX*2; }
  37. @ModifyConstant(method="render", constant=@Constant(intValue = 140), require=1)
  38. private int getRenderTop(int orig) { return height - AI_spaceY*2; }
  39. @ModifyConstant(method="mouseClicked", constant=@Constant(intValue = 252), require=1)
  40. private int getMouseLeft(int orig) { return width - AI_spaceX*2; }
  41. @ModifyConstant(method="mouseClicked", constant=@Constant(intValue = 140), require=1)
  42. private int getMouseTop(int orig) { return height - AI_spaceY*2; }
  43. @ModifyConstant(method="drawAdvancementTree", constant=@Constant(intValue = 234), require = 1)
  44. private int getAdvTreeXSize(int orig) { return width - AI_spaceX*2 - 2*9 - AdvancementInfo.AI_infoWidth; }
  45. @ModifyConstant(method="drawAdvancementTree", constant=@Constant(intValue = 113), require = 1)
  46. private int getAdvTreeYSize(int orig) { return height - AI_spaceY*2 - 3*9; }
  47. /* Make it so that drawWidgets only draws the left top corner ... */
  48. @ModifyConstant(method="drawWidgets", constant=@Constant(intValue = 252), require=1)
  49. private int getWidgetsLeft(int orig) // { return width - AI_spaceX*2; }
  50. { return 126; }
  51. @ModifyConstant(method="drawWidgets", constant=@Constant(intValue = 140), require=1)
  52. private int getWidgetsTop(int orig) // { return height - AI_spaceY*2; }
  53. { return 70; }
  54. @Inject(method="render",
  55. at=@At(value="INVOKE",
  56. target="net/minecraft/client/gui/screen/advancement/AdvancementsScreen.drawWidgets(Lnet/minecraft/client/util/math/MatrixStack;II)V"))
  57. public void renderRightFrameBackground(MatrixStack stack, int x, int y, float delta, CallbackInfo ci) {
  58. fill(stack,
  59. width-AI_spaceX-AdvancementInfo.AI_infoWidth+4, AI_spaceY+4,
  60. width-AI_spaceX-4, height-AI_spaceY-4, 0xffc0c0c0);
  61. }
  62. @Inject(method="drawWidgets",
  63. at=@At(value="INVOKE",
  64. target="net/minecraft/client/gui/screen/advancement/AdvancementsScreen.drawTexture(Lnet/minecraft/client/util/math/MatrixStack;IIIIII)V"))
  65. public void renderFrames(MatrixStack stack, int x, int y, CallbackInfo ci)
  66. {
  67. int iw = AdvancementInfo.AI_infoWidth;
  68. drawTexture(stack, width-AI_spaceX-126 - iw, y, 127, 0, 126, 70);
  69. drawTexture(stack, x, height-AI_spaceY-70, 0, 71, 126, 70);
  70. drawTexture(stack, width-AI_spaceX-126 - iw, height-AI_spaceY-70, 127, 71, 126, 70);
  71. iterate(126, width-AI_spaceX-126 - iw, 200, (pos, len) -> drawTexture(stack, pos, y, 15, 0, len, 70));
  72. iterate(126, width-AI_spaceX-126 - iw, 200, (pos, len) -> drawTexture(stack, pos, height-AI_spaceY-70, 15, 71, len, 70));
  73. iterate(70, height-AI_spaceY-70, 100, (pos, len) -> drawTexture(stack, x, pos, 0, 25, 70, len));
  74. iterate(70, height-AI_spaceY-70, 100, (pos, len) -> drawTexture(stack, width-AI_spaceX-126 - iw, pos, 127, 25, 126, len));
  75. drawTexture(stack, width-AI_spaceX - iw , y, 0 , 0, iw/2, 70);
  76. drawTexture(stack, width-AI_spaceX - iw/2, y, 252-iw/2, 0, iw/2+1, 70);
  77. drawTexture(stack, width-AI_spaceX - iw , height-AI_spaceY-70, 0 , 71, iw/2, 70);
  78. drawTexture(stack, width-AI_spaceX - iw/2, height-AI_spaceY-70, 252-iw/2, 71, iw/2+1, 70);
  79. iterate(70, height-AI_spaceY-70, 100, (pos, len) -> drawTexture(stack, width-AI_spaceX - iw, pos, 0, 25, iw/2, len));
  80. iterate(70, height-AI_spaceY-70, 100, (pos, len) -> drawTexture(stack, width-AI_spaceX - iw/2, pos, 252-iw/2, 25, iw/2, len));
  81. }
  82. private void iterate(int start, int end, int maxstep, IteratorReceiver func) {
  83. int size;
  84. for (int i=start; i<end; i+=maxstep) {
  85. size=maxstep;
  86. if (i+size > end) {
  87. size = end - i;
  88. }
  89. func.accept(i, size);
  90. }
  91. }
  92. @Inject(method="drawWidgets", at=@At("RETURN"))
  93. public void renderRightFrameTitle(MatrixStack stack, int x, int y, CallbackInfo ci) {
  94. textRenderer.draw(stack, I18n.translate("advancementinfo.infopane"), width-AI_spaceX-AdvancementInfo.AI_infoWidth+8, y+6, 4210752);
  95. if (AdvancementInfo.mouseClicked != null) {
  96. renderCriteria(stack, AdvancementInfo.mouseClicked);
  97. } else if (AdvancementInfo.mouseOver != null) {
  98. renderCriteria(stack, AdvancementInfo.mouseOver);
  99. }
  100. }
  101. @Inject(method="mouseClicked", at=@At("HEAD"))
  102. public void rememberClickedWidget(double x, double y, int button, CallbackInfoReturnable cir) {
  103. AdvancementInfo.mouseClicked = AdvancementInfo.mouseOver;
  104. scrollPos = 0;
  105. if (AdvancementInfo.mouseClicked != null) {
  106. AdvancementInfo.cachedClickList = AdvancementInfo.getSteps((AdvancementWidgetAccessor) AdvancementInfo.mouseClicked);
  107. } else {
  108. AdvancementInfo.cachedClickList = null;
  109. }
  110. }
  111. @Inject(method="onRootAdded", at=@At("HEAD"))
  112. public void debugRootAdded(Advancement root, CallbackInfo ci) {
  113. // System.out.println("root added to screen; display="+root.getDisplay()+", id="+root.getId().toString());
  114. }
  115. // @Inject(method="mouseScrolled", at=@At("HEAD"), cancellable = true)
  116. @Override
  117. public boolean mouseScrolled(double X, double Y, double amount /*, CallbackInfoReturnable cir */) {
  118. if (amount > 0 && scrollPos > 0) {
  119. scrollPos--;
  120. } else if (amount < 0 && AdvancementInfo.cachedClickList != null
  121. && scrollPos < AdvancementInfo.cachedClickList.size() - (height-2*AI_spaceY)/textRenderer.fontHeight + 5) {
  122. scrollPos++;
  123. }
  124. return false;
  125. }
  126. private void renderCriteria(MatrixStack stack, AdvancementWidget widget) {
  127. int y = AI_spaceY + 20;
  128. int skip;
  129. List<AdvancementStep> list;
  130. if (widget == AdvancementInfo.mouseClicked) {
  131. list = AdvancementInfo.cachedClickList;
  132. skip = scrollPos;
  133. } else {
  134. list = AdvancementInfo.getSteps((AdvancementWidgetAccessor) widget);
  135. skip = 0;
  136. }
  137. for (AdvancementStep entry: list) {
  138. if (skip-- > 0) {
  139. continue;
  140. }
  141. textRenderer.draw(stack,
  142. textRenderer.trimToWidth(entry.getName(), AdvancementInfo.AI_infoWidth-24),
  143. width-AI_spaceX-AdvancementInfo.AI_infoWidth+12, y,
  144. entry.getObtained() ? 0x00ff00 : 0xff0000);
  145. y+=textRenderer.fontHeight;
  146. if (y > height - AI_spaceY - textRenderer.fontHeight) {
  147. break;
  148. }
  149. if (list.size() == 1 && entry.getDetails() != null) {
  150. for (String detail: entry.getDetails()) {
  151. textRenderer.draw(stack,
  152. textRenderer.trimToWidth(detail, AdvancementInfo.AI_infoWidth-34),
  153. width-AI_spaceX-AdvancementInfo.AI_infoWidth+22, y,
  154. 0x000000);
  155. y+=textRenderer.fontHeight;
  156. }
  157. }
  158. }
  159. }
  160. }