BaseBoundsHandlerImpl.java 4.3 KB

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