9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-20 15:29:33 +00:00
Files
SakuraMC/patches/api/0004-Merge-Cannon-Entities.patch
2024-05-09 00:00:28 +01:00

122 lines
4.1 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <40902469+Samsuik@users.noreply.github.com>
Date: Thu, 5 Oct 2023 14:34:30 +0100
Subject: [PATCH] Merge Cannon Entities
diff --git a/src/main/java/me/samsuik/sakura/entity/merge/MergeLevel.java b/src/main/java/me/samsuik/sakura/entity/merge/MergeLevel.java
new file mode 100644
index 0000000000000000000000000000000000000000..506ea3cb8c3b965661a65f9a91903999c1eba309
--- /dev/null
+++ b/src/main/java/me/samsuik/sakura/entity/merge/MergeLevel.java
@@ -0,0 +1,64 @@
+package me.samsuik.sakura.entity.merge;
+
+import java.util.Locale;
+
+public enum MergeLevel {
+ /**
+ * Disabled.
+ */
+ NONE(-1),
+ /**
+ * "STRICT" merges entities with the same properties, position, momentum and OOE.
+ * This is considered safe to use, and will not break cannon mechanics.
+ */
+ STRICT(1),
+ /**
+ * "LENIENT" merges entities aggressively by tracking the entities that have
+ * previously merged. This is a hybrid of "SPAWN" and "STRICT" merging, with the
+ * visuals of "STRICT" merging and better merging potential of "SPAWN" merging.
+ */
+ LENIENT(2),
+ /**
+ * "SPAWN" merges entities one gametick after they have spawned. Merging is
+ * only possible after it has been established that the entity is safe to
+ * merge by collecting information on the entities that merge together over time.
+ */
+ SPAWN(3);
+
+ private final int level;
+
+ MergeLevel(int level) {
+ this.level = level;
+ }
+
+ public boolean atLeast(MergeLevel level) {
+ return getLevel() >= level.getLevel();
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public static MergeLevel from(int of) {
+ for (MergeLevel t : values()) {
+ if (t.getLevel() == of) {
+ return t;
+ }
+ }
+
+ return NONE;
+ }
+
+ public static MergeLevel from(String string) {
+ try {
+ return from(Integer.parseInt(string));
+ } catch (NumberFormatException ignored) {}
+
+ try {
+ var name = string.toUpperCase(Locale.ROOT);
+ return valueOf(name);
+ } catch (IllegalArgumentException ignored) {}
+
+ return NONE;
+ }
+}
diff --git a/src/main/java/me/samsuik/sakura/entity/merge/Mergeable.java b/src/main/java/me/samsuik/sakura/entity/merge/Mergeable.java
new file mode 100644
index 0000000000000000000000000000000000000000..c241a3a359cad1d7c2cdb690649e0cacc491508b
--- /dev/null
+++ b/src/main/java/me/samsuik/sakura/entity/merge/Mergeable.java
@@ -0,0 +1,13 @@
+package me.samsuik.sakura.entity.merge;
+
+import org.jetbrains.annotations.NotNull;
+
+public interface Mergeable {
+ @NotNull MergeLevel getMergeLevel();
+
+ void setMergeLevel(@NotNull MergeLevel level);
+
+ int getStacked();
+
+ void setStacked(int stacked);
+}
diff --git a/src/main/java/org/bukkit/entity/FallingBlock.java b/src/main/java/org/bukkit/entity/FallingBlock.java
index 7904c716a3b0869ebf2f9b416536c59121a539a8..2479453b96a75fda2c307261f84c91034e73000d 100644
--- a/src/main/java/org/bukkit/entity/FallingBlock.java
+++ b/src/main/java/org/bukkit/entity/FallingBlock.java
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Represents a falling block
*/
-public interface FallingBlock extends Entity {
+public interface FallingBlock extends Entity, me.samsuik.sakura.entity.merge.Mergeable { // Sakura
/**
* Get the Material of the falling block
diff --git a/src/main/java/org/bukkit/entity/TNTPrimed.java b/src/main/java/org/bukkit/entity/TNTPrimed.java
index 87e717c9ea61b0cbf536bc62fa829ddcfae5ad8c..ba84b3cbbd3358b16b21a18baa9c1812733fc144 100644
--- a/src/main/java/org/bukkit/entity/TNTPrimed.java
+++ b/src/main/java/org/bukkit/entity/TNTPrimed.java
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a Primed TNT.
*/
-public interface TNTPrimed extends Explosive {
+public interface TNTPrimed extends Explosive, me.samsuik.sakura.entity.merge.Mergeable { // Sakura
/**
* Set the number of ticks until the TNT blows up after being primed.