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.