From 8d70c4b7b3f44aa7a84acabc56dfc2b20f203207 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Sat, 5 Oct 2024 23:13:13 +0200
Subject: [PATCH] refactored hitbox logic to external class

---
 .../pixelblocks/pixelblock/PixelBlock.java    | 61 +---------------
 .../pixelblock/PixelBlockHitbox.java          | 72 +++++++++++++++++++
 2 files changed, 74 insertions(+), 59 deletions(-)
 create mode 100644 src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockHitbox.java

diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java
index 9cc2e21..912bf26 100644
--- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java
@@ -4,7 +4,6 @@ import co.aikar.taskchain.TaskChain;
 import eu.mhsl.minecraft.pixelblocks.PixelBlockItem;
 import eu.mhsl.minecraft.pixelblocks.Main;
 import eu.mhsl.minecraft.pixelblocks.utils.Direction;
-import eu.mhsl.minecraft.pixelblocks.utils.MinMaxUtil;
 import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.format.NamedTextColor;
 import org.bukkit.*;
@@ -29,7 +28,7 @@ public class PixelBlock {
     public Direction facingDirection;
     public List<Pixel> pixels = new ArrayList<>();
 
-    public Interaction hitbox;
+    public PixelBlockHitbox hitbox;
     public List<ItemDisplay> placeholderIcon = new ArrayList<>();
 
     public Location lastEntryLocation;
@@ -113,59 +112,7 @@ public class PixelBlock {
     }
 
     public void spawnInteraction(boolean fullBlock) {
-        if(fullBlock) {
-            hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity(
-                    pixelBlockLocation.clone().add(0.5, -hitboxOffset, 0.5),
-                    EntityType.INTERACTION
-            );
-            hitbox.setInteractionHeight(1 + 2*hitboxOffset);
-            hitbox.setInteractionWidth(1 + 2*hitboxOffset);
-        } else {
-            double startingX = MinMaxUtil.getMinProperty(this.pixels, pixel -> pixel.relativeLocation.getX());
-            double startingY = MinMaxUtil.getMinProperty(this.pixels, pixel -> pixel.relativeLocation.getY());
-            double startingZ = MinMaxUtil.getMinProperty(this.pixels, pixel -> pixel.relativeLocation.getZ());
-
-            double endingX = MinMaxUtil.getMaxProperty(this.pixels, pixel -> pixel.relativeLocation.getX());
-            double endingY = MinMaxUtil.getMaxProperty(this.pixels, pixel -> pixel.relativeLocation.getY());
-            double endingZ = MinMaxUtil.getMaxProperty(this.pixels, pixel -> pixel.relativeLocation.getZ());
-
-            Location spawnLocation = pixelBlockLocation.clone().add(
-                    ((startingX+endingX+1)/2)/pixelsPerBlock,
-                    (startingY/pixelsPerBlock)-hitboxOffset,
-                    ((startingZ+endingZ+1)/2)/pixelsPerBlock
-                );
-
-            float height = (float) (endingY-startingY+1)/pixelsPerBlock + 2*hitboxOffset;
-
-            float width;
-            if((endingX-startingX) > (endingZ-startingZ)) {
-                width = (float) (endingX-startingX+1)/pixelsPerBlock + 2*hitboxOffset;
-            } else {
-                width = (float) (endingZ-startingZ+1)/pixelsPerBlock + 2*hitboxOffset;
-            }
-
-            if(spawnLocation.getX()+width/2 > this.pixelBlockLocation.getX()+1) {
-                spawnLocation.subtract((spawnLocation.getX()+width/2)-(this.pixelBlockLocation.getX()+1), 0, 0);
-            }
-            if(spawnLocation.getX()-width/2 < this.pixelBlockLocation.getX()) {
-                spawnLocation.add(this.pixelBlockLocation.getX()-(spawnLocation.getX()-width/2), 0, 0);
-            }
-
-            if(spawnLocation.getZ()+width/2 > this.pixelBlockLocation.getZ()+1) {
-                spawnLocation.subtract(0, 0, (spawnLocation.getZ()+width/2)-(this.pixelBlockLocation.getZ()+1));
-            }
-            if(spawnLocation.getZ()-width/2 < this.pixelBlockLocation.getZ()) {
-                spawnLocation.add(0, 0, this.pixelBlockLocation.getZ()-(spawnLocation.getZ()-width/2));
-            }
-
-            hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity(
-                spawnLocation,
-                EntityType.INTERACTION
-            );
-
-            hitbox.setInteractionHeight(height);
-            hitbox.setInteractionWidth(width);
-        }
+        this.hitbox = new PixelBlockHitbox(fullBlock, pixelBlockLocation, hitboxOffset, this.pixels, pixelsPerBlock);
     }
 
     public void updateEntities() {
@@ -317,8 +264,4 @@ public class PixelBlock {
     public @NotNull PixelBlockWorld getPixelWorld() {
         return pixelWorld;
     }
-
-    public int getPixelsPerBlock() {
-        return pixelsPerBlock;
-    }
 }
diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockHitbox.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockHitbox.java
new file mode 100644
index 0000000..97a7376
--- /dev/null
+++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockHitbox.java
@@ -0,0 +1,72 @@
+package eu.mhsl.minecraft.pixelblocks.pixelblock;
+
+import eu.mhsl.minecraft.pixelblocks.utils.MinMaxUtil;
+import org.bukkit.Location;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Interaction;
+
+import java.util.List;
+
+public class PixelBlockHitbox {
+    private final Interaction hitbox;
+
+    public PixelBlockHitbox(boolean fullBlock, Location pixelBlockLocation, float hitboxOffset, List<Pixel> pixels, int pixelsPerBlock) {
+        if(fullBlock) {
+            hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity(
+                pixelBlockLocation.clone().add(0.5, -hitboxOffset, 0.5),
+                EntityType.INTERACTION
+            );
+            hitbox.setInteractionHeight(1 + 2*hitboxOffset);
+            hitbox.setInteractionWidth(1 + 2*hitboxOffset);
+        } else {
+            double startingX = MinMaxUtil.getMinProperty(pixels, pixel -> pixel.relativeLocation.getX());
+            double startingY = MinMaxUtil.getMinProperty(pixels, pixel -> pixel.relativeLocation.getY());
+            double startingZ = MinMaxUtil.getMinProperty(pixels, pixel -> pixel.relativeLocation.getZ());
+
+            double endingX = MinMaxUtil.getMaxProperty(pixels, pixel -> pixel.relativeLocation.getX());
+            double endingY = MinMaxUtil.getMaxProperty(pixels, pixel -> pixel.relativeLocation.getY());
+            double endingZ = MinMaxUtil.getMaxProperty(pixels, pixel -> pixel.relativeLocation.getZ());
+
+            Location spawnLocation = pixelBlockLocation.clone().add(
+                ((startingX+endingX+1)/2)/pixelsPerBlock,
+                (startingY/pixelsPerBlock)-hitboxOffset,
+                ((startingZ+endingZ+1)/2)/pixelsPerBlock
+            );
+
+            float height = (float) (endingY-startingY+1)/pixelsPerBlock + 2*hitboxOffset;
+
+            float width;
+            if((endingX-startingX) > (endingZ-startingZ)) {
+                width = (float) (endingX-startingX+1)/pixelsPerBlock + 2*hitboxOffset;
+            } else {
+                width = (float) (endingZ-startingZ+1)/pixelsPerBlock + 2*hitboxOffset;
+            }
+
+            if(spawnLocation.getX()+width/2 > pixelBlockLocation.getX()+1) {
+                spawnLocation.subtract((spawnLocation.getX()+width/2)-(pixelBlockLocation.getX()+1), 0, 0);
+            }
+            if(spawnLocation.getX()-width/2 < pixelBlockLocation.getX()) {
+                spawnLocation.add(pixelBlockLocation.getX()-(spawnLocation.getX()-width/2), 0, 0);
+            }
+
+            if(spawnLocation.getZ()+width/2 > pixelBlockLocation.getZ()+1) {
+                spawnLocation.subtract(0, 0, (spawnLocation.getZ()+width/2)-(pixelBlockLocation.getZ()+1));
+            }
+            if(spawnLocation.getZ()-width/2 < pixelBlockLocation.getZ()) {
+                spawnLocation.add(0, 0, pixelBlockLocation.getZ()-(spawnLocation.getZ()-width/2));
+            }
+
+            hitbox = (Interaction) pixelBlockLocation.getWorld().spawnEntity(
+                spawnLocation,
+                EntityType.INTERACTION
+            );
+
+            hitbox.setInteractionHeight(height);
+            hitbox.setInteractionWidth(width);
+        }
+    }
+
+    public void remove() {
+        this.hitbox.remove();
+    }
+}