From 352bce0d261cfefed0abe72d000c5823ec2fddbf Mon Sep 17 00:00:00 2001
From: Outspending <Dxrippy15@gmail.com>
Date: Wed, 3 Jan 2024 08:31:43 -0700
Subject: [PATCH] Removed `Lombok` & Improved Performance

---
 build.gradle.kts                              |  4 -
 .../benchmarks/TestingBenchmark.java          |  2 -
 .../biomesapi/BiomeTempModifier.java          | 11 ++-
 .../biomesapi/BiomeUpdaterImpl.java           |  7 +-
 .../biomesapi/biome/BiomeHandler.java         | 19 ++++-
 .../outspending/biomesapi/nms/NMSHandler.java |  6 +-
 .../biomesapi/registry/BiomeResourceKey.java  | 13 +--
 .../biomesapi/renderer/AmbientParticle.java   | 14 +++-
 .../biomesapi/{ => setter}/BiomeSetter.java   |  6 +-
 .../biomesapi/setter/ClientBiomeSetter.java   | 84 +++++++++++++++++++
 .../GlobalBiomeSetter.java}                   | 28 ++++---
 11 files changed, 157 insertions(+), 37 deletions(-)
 rename src/main/java/me/outspending/biomesapi/{ => setter}/BiomeSetter.java (98%)
 create mode 100644 src/main/java/me/outspending/biomesapi/setter/ClientBiomeSetter.java
 rename src/main/java/me/outspending/biomesapi/{BiomeSetterImpl.java => setter/GlobalBiomeSetter.java} (84%)

diff --git a/build.gradle.kts b/build.gradle.kts
index 0c0cc2b..a65e509 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -87,10 +87,6 @@ allprojects {
         }
     }
 
-    dependencies {
-        compileOnly("org.projectlombok:lombok:1.18.30")
-        annotationProcessor("org.projectlombok:lombok:1.18.30")
-    }
 }
 
 val nmsVersions = listOf("1.19_R2", "1.19_R3", "1.20_R1", "1.20_R2", "1.20_R3")
diff --git a/src/jmh/java/me/outspending/biomesapi/benchmarks/TestingBenchmark.java b/src/jmh/java/me/outspending/biomesapi/benchmarks/TestingBenchmark.java
index 5d74500..6168ca6 100644
--- a/src/jmh/java/me/outspending/biomesapi/benchmarks/TestingBenchmark.java
+++ b/src/jmh/java/me/outspending/biomesapi/benchmarks/TestingBenchmark.java
@@ -1,7 +1,5 @@
 package me.outspending.biomesapi.benchmarks;
 
-import me.outspending.biomesapi.biome.CustomBiome;
-import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.State;
 
diff --git a/src/main/java/me/outspending/biomesapi/BiomeTempModifier.java b/src/main/java/me/outspending/biomesapi/BiomeTempModifier.java
index 5d98233..3e049a6 100644
--- a/src/main/java/me/outspending/biomesapi/BiomeTempModifier.java
+++ b/src/main/java/me/outspending/biomesapi/BiomeTempModifier.java
@@ -1,6 +1,5 @@
 package me.outspending.biomesapi;
 
-import lombok.Getter;
 import me.outspending.biomesapi.annotations.AsOf;
 import net.minecraft.world.level.biome.Biome;
 
@@ -11,7 +10,6 @@
  *
  * @version 0.0.1
  */
-@Getter
 @AsOf("0.0.1")
 public enum BiomeTempModifier {
 
@@ -45,4 +43,13 @@ public enum BiomeTempModifier {
         this.modifier = modifier;
     }
 
+    /**
+     * This method returns the TemperatureModifier that corresponds to the enum value.
+     *
+     * @return The TemperatureModifier that corresponds to the enum value.
+     */
+    public Biome.TemperatureModifier getModifier() {
+        return modifier;
+    }
+
 }
diff --git a/src/main/java/me/outspending/biomesapi/BiomeUpdaterImpl.java b/src/main/java/me/outspending/biomesapi/BiomeUpdaterImpl.java
index 0e4cda8..d6bdb3b 100644
--- a/src/main/java/me/outspending/biomesapi/BiomeUpdaterImpl.java
+++ b/src/main/java/me/outspending/biomesapi/BiomeUpdaterImpl.java
@@ -16,10 +16,13 @@ public void updateChunk(Chunk chunk) {
 
     @Override
     public void updateChunks(Location from, Location to) {
-        if (from == null || to == null)
+        if (from == null || to == null) {
             throw new IllegalArgumentException("Locations cannot be null.");
+        } else {
+            List<Chunk> updateChunks = getChunksBetweenLocations(from, to);
 
-        updateChunks(getChunksBetweenLocations(from, to));
+            updateChunks(updateChunks);
+        }
     }
 
     @Override
diff --git a/src/main/java/me/outspending/biomesapi/biome/BiomeHandler.java b/src/main/java/me/outspending/biomesapi/biome/BiomeHandler.java
index acb0f9f..b84f56e 100644
--- a/src/main/java/me/outspending/biomesapi/biome/BiomeHandler.java
+++ b/src/main/java/me/outspending/biomesapi/biome/BiomeHandler.java
@@ -1,7 +1,5 @@
 package me.outspending.biomesapi.biome;
 
-import lombok.Getter;
-import lombok.experimental.UtilityClass;
 import me.outspending.biomesapi.annotations.AsOf;
 import me.outspending.biomesapi.exceptions.UnknownBiomeException;
 import me.outspending.biomesapi.registry.BiomeResourceKey;
@@ -20,12 +18,25 @@
  * @version 0.0.1
  */
 @AsOf("0.0.1")
-@UtilityClass
 public class BiomeHandler {
 
-    @Getter
     private static final List<CustomBiome> registeredBiomes = new ArrayList<>();
 
+    public BiomeHandler() {
+        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated.");
+    }
+
+    /**
+     * This method gets the registered biomes list
+     *
+     * @version 0.0.1
+     * @return
+     */
+    @AsOf("0.0.1")
+    public static List<CustomBiome> getRegisteredBiomes() {
+        return registeredBiomes;
+    }
+
     /**
      * This method retrieves a Biome object from the Minecraft server's biome registry.
      * It uses the Bukkit API to get the server instance and then accesses the server's biome registry.
diff --git a/src/main/java/me/outspending/biomesapi/nms/NMSHandler.java b/src/main/java/me/outspending/biomesapi/nms/NMSHandler.java
index 8724e81..4a77339 100644
--- a/src/main/java/me/outspending/biomesapi/nms/NMSHandler.java
+++ b/src/main/java/me/outspending/biomesapi/nms/NMSHandler.java
@@ -1,6 +1,5 @@
 package me.outspending.biomesapi.nms;
 
-import lombok.experimental.UtilityClass;
 import me.outspending.biomesapi.annotations.AsOf;
 import me.outspending.biomesapi.exceptions.UnknownNMSVersionException;
 import org.bukkit.Bukkit;
@@ -16,7 +15,6 @@
  *
  * @version 0.0.1
  */
-@UtilityClass
 @AsOf("0.0.1")
 public class NMSHandler {
 
@@ -25,6 +23,10 @@ public class NMSHandler {
      */
     private static NMS NMS_VERSION;
 
+    public NMSHandler() {
+        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated.");
+    }
+
     /**
      * Static initializer for the NMSHandler class.
      * This method is invoked when the class is loaded by the JVM.
diff --git a/src/main/java/me/outspending/biomesapi/registry/BiomeResourceKey.java b/src/main/java/me/outspending/biomesapi/registry/BiomeResourceKey.java
index c36ccc8..58d74d3 100644
--- a/src/main/java/me/outspending/biomesapi/registry/BiomeResourceKey.java
+++ b/src/main/java/me/outspending/biomesapi/registry/BiomeResourceKey.java
@@ -80,14 +80,15 @@ public String toString() {
     @Override
     @AsOf("0.0.1")
     public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (obj == null || getClass() != obj.getClass()) return false;
+        if (obj instanceof BiomeResourceKey key) {
+            ResourceLocation location = key.resourceLocation();
+            String namespace = location.getNamespace();
+            String path = location.getPath();
 
-        BiomeResourceKey key = (BiomeResourceKey) obj;
-        String namespace = key.resourceLocation().getNamespace();
-        String path = key.resourceLocation().getPath();
+            return namespace.equals(this.resourceLocation.getNamespace()) && path.equals(this.resourceLocation.getPath());
+        }
 
-        return namespace.equals(this.resourceLocation.getNamespace()) && path.equals(this.resourceLocation.getPath());
+        return false;
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/me/outspending/biomesapi/renderer/AmbientParticle.java b/src/main/java/me/outspending/biomesapi/renderer/AmbientParticle.java
index 8537e7b..406097e 100644
--- a/src/main/java/me/outspending/biomesapi/renderer/AmbientParticle.java
+++ b/src/main/java/me/outspending/biomesapi/renderer/AmbientParticle.java
@@ -1,6 +1,5 @@
 package me.outspending.biomesapi.renderer;
 
-import lombok.Getter;
 import me.outspending.biomesapi.annotations.AsOf;
 import net.minecraft.core.particles.ParticleTypes;
 import net.minecraft.core.particles.SimpleParticleType;
@@ -12,7 +11,6 @@
  *
  * @version 0.0.1
  */
-@Getter
 @AsOf("0.0.1")
 public enum AmbientParticle {
     ASH(ParticleTypes.ASH),
@@ -105,4 +103,16 @@ public enum AmbientParticle {
         this.particle = particle;
     }
 
+    /**
+     * This method returns the SimpleParticleType associated with the ambient particle.
+     * The @AsOf annotation indicates the version when this method was introduced.
+     *
+     * @return the SimpleParticleType associated with the ambient particle
+     * @version 0.0.1
+     */
+    @AsOf("0.0.1")
+    public SimpleParticleType getParticle() {
+        return particle;
+    }
+
 }
diff --git a/src/main/java/me/outspending/biomesapi/BiomeSetter.java b/src/main/java/me/outspending/biomesapi/setter/BiomeSetter.java
similarity index 98%
rename from src/main/java/me/outspending/biomesapi/BiomeSetter.java
rename to src/main/java/me/outspending/biomesapi/setter/BiomeSetter.java
index 201c0ed..f9ff85f 100644
--- a/src/main/java/me/outspending/biomesapi/BiomeSetter.java
+++ b/src/main/java/me/outspending/biomesapi/setter/BiomeSetter.java
@@ -1,6 +1,5 @@
-package me.outspending.biomesapi;
+package me.outspending.biomesapi.setter;
 
-import lombok.experimental.UtilityClass;
 import me.outspending.biomesapi.annotations.AsOf;
 import me.outspending.biomesapi.biome.CustomBiome;
 import org.bukkit.Chunk;
@@ -22,6 +21,9 @@
 @AsOf("0.0.1")
 public interface BiomeSetter {
 
+    int MIN_HEIGHT = -64;
+    int MAX_HEIGHT = 320;
+
     /**
      * Returns the RegionAccessor for the given location.
      *
diff --git a/src/main/java/me/outspending/biomesapi/setter/ClientBiomeSetter.java b/src/main/java/me/outspending/biomesapi/setter/ClientBiomeSetter.java
new file mode 100644
index 0000000..a172fd6
--- /dev/null
+++ b/src/main/java/me/outspending/biomesapi/setter/ClientBiomeSetter.java
@@ -0,0 +1,84 @@
+package me.outspending.biomesapi.setter;
+
+import me.outspending.biomesapi.biome.CustomBiome;
+import org.bukkit.Chunk;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.util.BoundingBox;
+import org.bukkit.util.Vector;
+import org.jetbrains.annotations.NotNull;
+
+public class ClientBiomeSetter implements BiomeSetter {
+
+    private final Player client;
+
+    public ClientBiomeSetter(@NotNull Player client) {
+        this.client = client;
+    }
+
+    public Player getClient() {
+        return client;
+    }
+
+    @Override
+    public void setBlockBiome(@NotNull Block block, @NotNull CustomBiome customBiome) {
+        setBlockBiome(block, customBiome, false);
+    }
+
+    @Override
+    public void setBlockBiome(@NotNull Block block, @NotNull CustomBiome customBiome, boolean updateBiome) {
+        // TODO: Method
+    }
+
+    @Override
+    public void setChunkBiome(@NotNull Chunk chunk, @NotNull CustomBiome customBiome) {
+        setChunkBiome(chunk, customBiome, false);
+    }
+
+    @Override
+    public void setChunkBiome(@NotNull Chunk chunk, @NotNull CustomBiome customBiome, boolean updateBiome) {
+        setChunkBiome(chunk, MIN_HEIGHT, MAX_HEIGHT, customBiome, false);
+    }
+
+    @Override
+    public void setChunkBiome(@NotNull Chunk chunk, int minHeight, int maxHeight, @NotNull CustomBiome customBiome) {
+        setChunkBiome(chunk, minHeight, maxHeight, customBiome, false);
+    }
+
+    @Override
+    public void setChunkBiome(@NotNull Chunk chunk, int minHeight, int maxHeight, @NotNull CustomBiome customBiome, boolean updateBiome) {
+        // TODO: Method
+    }
+
+    @Override
+    public void setBoundingBoxBiome(@NotNull World world, @NotNull BoundingBox boundingBox, @NotNull CustomBiome customBiome) {
+        // TODO: Method
+    }
+
+    @Override
+    public void setRegionBiome(@NotNull Location from, @NotNull Location to, @NotNull CustomBiome customBiome) {
+        setRegionBiome(from, to , customBiome, false);
+    }
+
+    @Override
+    public void setRegionBiome(@NotNull Location from, @NotNull Location to, @NotNull CustomBiome customBiome, boolean updateBiome) {
+        // TODO: Method
+    }
+
+    @Override
+    public void setRegionBiome(@NotNull World world, @NotNull Vector from, @NotNull Vector to, @NotNull CustomBiome customBiome) {
+        setRegionBiome(world, from, to, customBiome, false);
+    }
+
+    @Override
+    public void setRegionBiome(@NotNull World world, @NotNull Vector from, @NotNull Vector to, @NotNull CustomBiome customBiome, boolean updateBiome) {
+        setRegionBiome(world, from.toLocation(world), to.toLocation(world), customBiome, updateBiome);
+    }
+
+    @Override
+    public void setRegionBiome(@NotNull World world, @NotNull Location from, @NotNull Location to, @NotNull CustomBiome customBiome, boolean updateBiome) {
+
+    }
+}
diff --git a/src/main/java/me/outspending/biomesapi/BiomeSetterImpl.java b/src/main/java/me/outspending/biomesapi/setter/GlobalBiomeSetter.java
similarity index 84%
rename from src/main/java/me/outspending/biomesapi/BiomeSetterImpl.java
rename to src/main/java/me/outspending/biomesapi/setter/GlobalBiomeSetter.java
index c145a04..ba0c7aa 100644
--- a/src/main/java/me/outspending/biomesapi/BiomeSetterImpl.java
+++ b/src/main/java/me/outspending/biomesapi/setter/GlobalBiomeSetter.java
@@ -1,23 +1,20 @@
-package me.outspending.biomesapi;
+package me.outspending.biomesapi.setter;
 
+import me.outspending.biomesapi.BiomeUpdater;
 import me.outspending.biomesapi.biome.CustomBiome;
 import me.outspending.biomesapi.misc.PointRange3D;
-import me.outspending.biomesapi.nms.NMSHandler;
 import org.bukkit.*;
 import org.bukkit.block.Block;
 import org.bukkit.util.BoundingBox;
 import org.bukkit.util.Vector;
 import org.jetbrains.annotations.NotNull;
 
-public class BiomeSetterImpl implements BiomeSetter {
+public class GlobalBiomeSetter implements BiomeSetter {
 
     @SuppressWarnings("deprecation")
     private static final UnsafeValues UNSAFE = Bukkit.getUnsafe();
     private static final BiomeUpdater BIOME_UPDATER = BiomeUpdater.of();
 
-    private static final int MAX_HEIGHT = 320;
-    private static final int MIN_HEIGHT = -64;
-
     @Override
     public void setBlockBiome(@NotNull Block block, @NotNull CustomBiome customBiome) {
         setBlockBiome(block, customBiome, false);
@@ -112,14 +109,23 @@ public void setRegionBiome(@NotNull World world, @NotNull Vector from, @NotNull
 
     @Override
     public void setRegionBiome(@NotNull World world, @NotNull Location from, @NotNull Location to, @NotNull CustomBiome customBiome, boolean updateBiome) {
-        NMSHandler.executeNMS(nms -> {
+        if (!from.getWorld().equals(to.getWorld())) {
+            throw new RuntimeException("Locations must be in the same world!");
+        } else {
+            NamespacedKey key = customBiome.toNamespacedKey();
             PointRange3D range = PointRange3D.of(from, to);
 
-            nms.updateBiome(range.getMinLocation(world), range.getMaxLocation(world), customBiome.toNamespacedKey());
-        });
+            for (int x = range.minX(); x <= range.maxX(); x++) {
+                for (int y = range.minY(); y <= range.maxY(); y++) {
+                    for (int z = range.minZ(); z <= range.maxZ(); z++) {
+                        UNSAFE.setBiomeKey(world, x, y, z, key);
+                    }
+                }
+            }
 
-        if (updateBiome) {
-            BIOME_UPDATER.updateChunks(from, to);
+            if (updateBiome) {
+                BIOME_UPDATER.updateChunks(from, to);
+            }
         }
     }