BaseBoundsHandlerImpl.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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.Lists;
  7. import me.shedaniel.math.api.Rectangle;
  8. import me.shedaniel.rei.api.BaseBoundsHandler;
  9. import me.shedaniel.rei.api.DisplayHelper;
  10. import me.shedaniel.rei.api.annotations.Internal;
  11. import net.minecraft.client.MinecraftClient;
  12. import net.minecraft.client.gui.screen.Screen;
  13. import net.minecraft.util.ActionResult;
  14. import net.minecraft.util.Pair;
  15. import java.util.Comparator;
  16. import java.util.List;
  17. import java.util.function.Supplier;
  18. @Deprecated
  19. @Internal
  20. public class BaseBoundsHandlerImpl implements BaseBoundsHandler {
  21. private static final Comparator<? super Rectangle> RECTANGLE_COMPARER = Comparator.comparingLong(Rectangle::hashCode);
  22. private long lastArea = -1;
  23. private List<Pair<Pair<Class<?>, Float>, Supplier<List<Rectangle>>>> list = Lists.newArrayList();
  24. @Override
  25. public Class<?> getBaseSupportedClass() {
  26. return Screen.class;
  27. }
  28. @Override
  29. public Rectangle getLeftBounds(Screen screen) {
  30. return new Rectangle();
  31. }
  32. @Override
  33. public Rectangle getRightBounds(Screen screen) {
  34. return new Rectangle();
  35. }
  36. @Override
  37. public float getPriority() {
  38. return -5f;
  39. }
  40. @Override
  41. public ActionResult isInZone(double mouseX, double mouseY) {
  42. Class<? extends Screen> screenClass = MinecraftClient.getInstance().currentScreen.getClass();
  43. for (Pair<Pair<Class<?>, Float>, Supplier<List<Rectangle>>> pair : list) {
  44. if (pair.getLeft().getLeft().isAssignableFrom(screenClass))
  45. for (Rectangle zone : pair.getRight().get())
  46. if (zone.contains(mouseX, mouseY))
  47. return ActionResult.FAIL;
  48. }
  49. return ActionResult.PASS;
  50. }
  51. @Override
  52. public boolean shouldRecalculateArea(boolean isOnRightSide, Rectangle rectangle) {
  53. long current = currentHashCode(isOnRightSide);
  54. if (lastArea == current)
  55. return false;
  56. lastArea = current;
  57. return true;
  58. }
  59. private long currentHashCode(boolean isOnRightSide) {
  60. DisplayHelper.DisplayBoundsHandler handler = DisplayHelper.getInstance().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
  61. return areasHashCode(isOnRightSide ? handler.getRightBounds(MinecraftClient.getInstance().currentScreen) : handler.getLeftBounds(MinecraftClient.getInstance().currentScreen), getExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), false));
  62. }
  63. @Override
  64. public ActionResult canItemSlotWidgetFit(int left, int top, Screen screen, Rectangle fullBounds) {
  65. Class<? extends Screen> screenClass = screen.getClass();
  66. for (Pair<Pair<Class<?>, Float>, Supplier<List<Rectangle>>> pair : list) {
  67. if (pair.getLeft().getLeft().isAssignableFrom(screenClass))
  68. for (Rectangle zone : pair.getRight().get()) {
  69. if (left + 18 >= zone.x && top + 18 >= zone.y && left <= zone.getMaxX() && top <= zone.getMaxY())
  70. return ActionResult.FAIL;
  71. }
  72. }
  73. return ActionResult.PASS;
  74. }
  75. @Override
  76. public List<Rectangle> getExclusionZones(Class<?> currentScreenClass, boolean sort) {
  77. List<Rectangle> rectangles = Lists.newArrayList();
  78. for (Pair<Pair<Class<?>, Float>, Supplier<List<Rectangle>>> pair : list) {
  79. if (pair.getLeft().getLeft().isAssignableFrom(currentScreenClass))
  80. rectangles.addAll(pair.getRight().get());
  81. }
  82. if (sort)
  83. rectangles.sort(RECTANGLE_COMPARER);
  84. return rectangles;
  85. }
  86. @Override
  87. public int supplierSize() {
  88. return list.size();
  89. }
  90. @Override
  91. public void registerExclusionZones(Class<?> screenClass, Supplier<List<Rectangle>> supplier) {
  92. list.add(new Pair<>(new Pair<>(screenClass, 0f), supplier));
  93. }
  94. private long areasHashCode(Rectangle rectangle, List<Rectangle> exclusionZones) {
  95. int hashCode = 31 + (rectangle == null ? 0 : rectangle.hashCode());
  96. for (Rectangle e : exclusionZones)
  97. hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
  98. return hashCode;
  99. }
  100. }