aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com
diff options
context:
space:
mode:
authorKrakenied <krakenied1@gmail.com>2026-01-19 11:24:06 +0100
committerKrakenied <krakenied1@gmail.com>2026-01-19 22:38:20 +0100
commit574ffa99bd822c983c2ae6e805197cae7c4bd601 (patch)
tree307e711b3f03db69ca57a1e995666db12b49549c /bukkit/src/main/java/com
parent6f8d1d3bd8cefe7ec75bd568b5c5a7586ff1db08 (diff)
Prepare for Mojang version mess
New API to be used in server version detection and version specific handlers
Diffstat (limited to 'bukkit/src/main/java/com')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java100
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java44
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java90
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java48
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_11.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java)36
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_11_2.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java)7
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_14.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java)7
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_15_2.java19
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_16.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java)19
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_17.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler17.java)8
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_19_2.java18
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20.java44
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20_4.java42
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_11.java24
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_6.java18
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_8.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java)42
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_9.java (renamed from bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java)32
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java3
18 files changed, 304 insertions, 297 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
index 434b0752..c79a2e4b 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -37,15 +37,6 @@ import com.leonardobishop.quests.bukkit.hook.title.Title_Nothing;
import com.leonardobishop.quests.bukkit.hook.vault.AbstractVaultHook;
import com.leonardobishop.quests.bukkit.hook.vault.VaultHook;
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler11;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler12;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler14;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler16;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler17;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler20;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler21;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler8;
-import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler9;
import com.leonardobishop.quests.bukkit.hook.wildstacker.AbstractWildStackerHook;
import com.leonardobishop.quests.bukkit.hook.wildstacker.WildStackerHook;
import com.leonardobishop.quests.bukkit.item.ParsedQuestItem;
@@ -163,6 +154,7 @@ import com.leonardobishop.quests.common.storage.StorageProvider;
import com.leonardobishop.quests.common.tasktype.TaskType;
import com.leonardobishop.quests.common.tasktype.TaskTypeManager;
import com.leonardobishop.quests.common.updater.Updater;
+import com.leonardobishop.quests.common.versioning.Version;
import com.mojang.authlib.GameProfile;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.BaseComponent;
@@ -191,6 +183,9 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.NavigableSet;
+import java.util.Objects;
+import java.util.TreeSet;
import java.util.function.BiFunction;
import java.util.function.BooleanSupplier;
import java.util.logging.Level;
@@ -198,6 +193,22 @@ import java.util.regex.Pattern;
public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
+ private static final NavigableSet<Version> VSH_SET = new TreeSet<>() {{
+ this.add(Version.V1_8);
+ this.add(Version.V1_9);
+ this.add(Version.V1_11);
+ this.add(Version.V1_11_2);
+ this.add(Version.V1_14);
+ this.add(Version.V1_15_2);
+ this.add(Version.V1_16);
+ this.add(Version.V1_17);
+ this.add(Version.V1_19_2);
+ this.add(Version.V1_20);
+ this.add(Version.V1_20_4);
+ this.add(Version.V1_21_6);
+ this.add(Version.V1_21_11);
+ }};
+
private QuestsLogger questsLogger;
private QuestManager questManager;
private TaskTypeManager taskTypeManager;
@@ -328,20 +339,6 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
e.printStackTrace();
}
- // Setup version specific compatibility layers
- int version;
- try {
- version = this.getServerVersion();
- this.questsLogger.info("Your server is running version 1." + version);
- } catch (final IllegalArgumentException e) {
- // all server supported versions by Quests fulfill this format,
- // so we assume that some future version can possibly break it,
- // and we want to load the latest and not the oldest handler
- version = Integer.MAX_VALUE;
-
- this.questsLogger.warning("Failed to resolve server version - some features may not work! (" + e.getMessage() + ")");
- }
-
// (titles)
this.setTitleHandle();
@@ -357,22 +354,23 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
// (skulls)
this.setSkullGetter();
- // (version specific handler)
- if (version <= 8) {
- this.versionSpecificHandler = new VersionSpecificHandler8();
- } else {
- this.versionSpecificHandler = switch (version) {
- case 9, 10 -> new VersionSpecificHandler9();
- case 11 -> new VersionSpecificHandler11();
- case 12, 13 -> new VersionSpecificHandler12();
- case 14, 15 -> new VersionSpecificHandler14();
- case 16 -> new VersionSpecificHandler16();
- case 17, 18, 19 -> new VersionSpecificHandler17();
- case 20 -> new VersionSpecificHandler20();
- default -> new VersionSpecificHandler21();
- };
+ // Resolve server version
+ Version serverVersion;
+ try {
+ serverVersion = Version.fromString(Bukkit.getBukkitVersion());
+ this.questsLogger.info("Your server is running version " + serverVersion);
+ } catch (final IllegalArgumentException e) {
+ // all server versions supported by Quests fulfill this format,
+ // so we assume that some future version can possibly break it,
+ // and we want to load the latest and not the oldest handler
+ serverVersion = Version.UNKNOWN;
+ this.questsLogger.warning("Failed to resolve server version - some features may not work! (" + e.getMessage() + ")");
}
+ // Set the latest supported version specific handler
+ this.versionSpecificHandler = constructVSH(serverVersion);
+ this.questsLogger.info("Using " + this.versionSpecificHandler.getClass().getSimpleName() + " for version compatibility!");
+
// Instantiate Projectile to ItemStack cache
this.projectile2ItemCache = new Projectile2ItemCache();
this.projectile2ItemCache.registerEvents(this);
@@ -574,25 +572,21 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
});
}
- /**
- * Gets the server minor version.
- *
- * @return the server minor version
- * @throws IllegalArgumentException with message set to the bukkit version if it could not be parsed successfully.
- */
- private int getServerVersion() throws IllegalArgumentException {
- final String bukkitVersion = this.getServer().getBukkitVersion();
+ private static VersionSpecificHandler constructVSH(final Version serverVersion) {
+ final Version vshVersion = Objects.requireNonNullElseGet(
+ VSH_SET.floor(serverVersion),
+ VSH_SET::first
+ );
- final String[] bukkitVersionParts = bukkitVersion.split("\\.", 3);
- if (bukkitVersionParts.length < 2) {
- throw new IllegalArgumentException(bukkitVersion, new ArrayIndexOutOfBoundsException(bukkitVersionParts.length));
- }
+ final String vshClazzName = String.format("%s_%s",
+ VersionSpecificHandler.class.getCanonicalName(),
+ vshVersion.toClassNameString()
+ );
- final String minorVersionPart = bukkitVersionParts[1].split("-")[0];
try {
- return Integer.parseInt(minorVersionPart);
- } catch (final NumberFormatException e) {
- throw new IllegalArgumentException(bukkitVersion, e);
+ return (VersionSpecificHandler) Class.forName(vshClazzName).getConstructor().newInstance();
+ } catch (final ReflectiveOperationException e) {
+ throw new IllegalStateException("Failed to construct version specific handler", e);
}
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java
index 48189513..2bf7da48 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java
@@ -1,5 +1,6 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.Keyed;
import org.bukkit.Material;
import org.bukkit.Tag;
@@ -9,6 +10,7 @@ import org.bukkit.block.data.type.CaveVinesPlant;
import org.bukkit.damage.DamageSource;
import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.Camel;
+import org.bukkit.entity.CamelHusk;
import org.bukkit.entity.Donkey;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Goat;
@@ -36,6 +38,7 @@ import org.bukkit.inventory.SmithingTransformRecipe;
import org.bukkit.inventory.SmithingTrimRecipe;
import org.jspecify.annotations.Nullable;
+import java.util.HashMap;
import java.util.List;
/**
@@ -46,7 +49,7 @@ import java.util.List;
public interface VersionSpecificHandler {
@SuppressWarnings("unused")
- int getMinecraftVersion();
+ Version getMinecraftVersion();
/**
* Elytra were introduced in {@code 1.9}.
@@ -63,6 +66,13 @@ public interface VersionSpecificHandler {
boolean isPlayerOnCamel(Player player);
/**
+ * Camel Husks were introduced in {@code 1.21.11}.
+ *
+ * @see CamelHusk
+ */
+ boolean isPlayerOnCamelHusk(Player player);
+
+ /**
* Donkeys were introduced in {@code 1.6.1}.
*
* <p>
@@ -170,8 +180,38 @@ public interface VersionSpecificHandler {
* the extra slots of player inventories.
*
* @apiNote This method is intended to be used as a check for item crafting related task types.
+ * @see VersionSpecificHandler#getStorageContents(PlayerInventory)
+ */
+ default int getAvailableSpace(Player player, ItemStack item) {
+ PlayerInventory inventory = player.getInventory();
+ HashMap<Integer, ? extends ItemStack> itemsOfType = inventory.all(item.getType());
+ int availableSpace = 0;
+
+ for (ItemStack existingItem : itemsOfType.values()) {
+ if (item.isSimilar(existingItem)) {
+ availableSpace += (item.getMaxStackSize() - existingItem.getAmount());
+ }
+ }
+
+ for (ItemStack existingItem : this.getStorageContents(inventory)) {
+ if (existingItem == null) {
+ availableSpace += item.getMaxStackSize();
+ }
+ }
+
+ return availableSpace;
+ }
+
+ /**
+ * Initially, the proper method to get an inventory contents except armor and other extra slots
+ * (not allowing player to store results of crafting actions) was {@link PlayerInventory#getContents()}.
+ * In {@code 1.9} {@link PlayerInventory#getStorageContents()} method was introduced superseding the old
+ * one. In newer versions {@link PlayerInventory#getContents()} method returns all the items including
+ * the extra slots of player inventories.
+ *
+ * @apiNote This method is intended to be used as a check for item crafting related task types.
*/
- int getAvailableSpace(Player player, ItemStack newItemStack);
+ @Nullable ItemStack[] getStorageContents(PlayerInventory inventory);
/**
* Initially, clicking with a number key on a crafting result made the item go to the selected slot.
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java
deleted file mode 100644
index 687da6fa..00000000
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.leonardobishop.quests.bukkit.hook.versionspecific;
-
-import com.leonardobishop.quests.bukkit.util.CompatUtils;
-import org.bukkit.damage.DamageSource;
-import org.bukkit.entity.Camel;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.inventory.SmithItemEvent;
-import org.bukkit.event.player.PlayerBucketEmptyEvent;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.Recipe;
-import org.bukkit.inventory.SmithingTransformRecipe;
-import org.bukkit.inventory.SmithingTrimRecipe;
-import org.jspecify.annotations.Nullable;
-
-public class VersionSpecificHandler20 extends VersionSpecificHandler17 implements VersionSpecificHandler {
-
- private static final boolean DAMAGE_SOURCE_API = CompatUtils.classExists("org.bukkit.damage.DamageSource");
-
- @Override
- public int getMinecraftVersion() {
- return 20;
- }
-
- @Override
- public boolean isPlayerOnCamel(Player player) {
- return player.getVehicle() instanceof Camel;
- }
-
- @Override
- public ItemStack getItem(PlayerBucketEmptyEvent event) {
- return event.getPlayer().getInventory().getItem(event.getHand());
- }
-
- @Override
- public ItemStack[] getSmithItems(SmithItemEvent event) {
- return new ItemStack[]{
- event.getInventory().getInputEquipment(),
- event.getInventory().getInputMineral(),
- event.getInventory().getInputTemplate()
- };
- }
-
- @Override
- public String getSmithMode(SmithItemEvent event) {
- Recipe recipe = event.getInventory().getRecipe();
- if (recipe instanceof SmithingTransformRecipe) {
- return "transform";
- } else if (recipe instanceof SmithingTrimRecipe) {
- return "trim";
- } else {
- return null;
- }
- }
-
- @Override
- public @Nullable Player getDamager(@Nullable EntityDamageEvent event) {
- if (!DAMAGE_SOURCE_API) {
- return super.getDamager(event);
- }
-
- if (event == null) {
- return null;
- }
-
- DamageSource source = event.getDamageSource();
- Entity causingEntity = source.getCausingEntity();
-
- if (causingEntity instanceof Player) {
- return (Player) causingEntity;
- }
-
- return null;
- }
-
- @Override
- public @Nullable Entity getDirectSource(@Nullable EntityDamageEvent event) {
- if (!DAMAGE_SOURCE_API) {
- return super.getDamager(event);
- }
-
- if (event == null) {
- return null;
- }
-
- DamageSource source = event.getDamageSource();
- return source.getDirectEntity();
- }
-}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java
deleted file mode 100644
index 6cb5e9e7..00000000
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.leonardobishop.quests.bukkit.hook.versionspecific;
-
-import com.leonardobishop.quests.bukkit.util.CompatUtils;
-import org.bukkit.entity.HappyGhast;
-import org.bukkit.entity.Nautilus;
-import org.bukkit.entity.Player;
-
-import java.util.function.Predicate;
-
-public class VersionSpecificHandler21 extends VersionSpecificHandler20 implements VersionSpecificHandler {
-
- // Introduced in 1.21.6
- private static final Predicate<Player> HAPPY_GHAST_PREDICATE;
-
- // Introduced in 1.21.11
- private static final Predicate<Player> NAUTILUS_PREDICATE;
-
- static {
- if (CompatUtils.classExists("org.bukkit.entity.HappyGhast")) {
- HAPPY_GHAST_PREDICATE = player -> player.getVehicle() instanceof HappyGhast;
- } else {
- HAPPY_GHAST_PREDICATE = player -> Boolean.FALSE;
- }
- }
-
- static {
- if (CompatUtils.classExists("org.bukkit.entity.Nautilus")) {
- NAUTILUS_PREDICATE = player -> player.getVehicle() instanceof Nautilus;
- } else {
- NAUTILUS_PREDICATE = player -> Boolean.FALSE;
- }
- }
-
- @Override
- public int getMinecraftVersion() {
- return 21;
- }
-
- @Override
- public boolean isPlayerOnHappyGhast(Player player) {
- return HAPPY_GHAST_PREDICATE.test(player);
- }
-
- @Override
- public boolean isPlayerOnNautilus(Player player) {
- return NAUTILUS_PREDICATE.test(player);
- }
-}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_11.java
index 53e0c86a..0e525c38 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_11.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.entity.Donkey;
-import org.bukkit.entity.Entity;
import org.bukkit.entity.Horse;
import org.bukkit.entity.Llama;
import org.bukkit.entity.Mule;
@@ -11,25 +11,11 @@ import org.bukkit.entity.ZombieHorse;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.List;
-
-public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements VersionSpecificHandler {
-
- private static Method getPassengersMethod;
-
- static {
- try {
- getPassengersMethod = Entity.class.getMethod("getPassengers");
- } catch (final NoSuchMethodException e) {
- // server version cannot support the method (doesn't work on 1.11, 1.11.1)
- }
- }
+public class VersionSpecificHandler_V1_11 extends VersionSpecificHandler_V1_9 {
@Override
- public int getMinecraftVersion() {
- return 11;
+ public Version getMinecraftVersion() {
+ return Version.V1_11;
}
@Override
@@ -76,18 +62,4 @@ public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements
return amountInStack - newAmountInStack;
}
-
- @SuppressWarnings("unchecked")
- @Override
- public List<Entity> getPassengers(Entity entity) {
- if (getPassengersMethod == null) {
- return super.getPassengers(entity);
- }
-
- try {
- return (List<Entity>) getPassengersMethod.invoke(entity);
- } catch (InvocationTargetException | IllegalAccessException e) {
- throw new IllegalStateException("Entity#getPassengers invocation failed", e);
- }
- }
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_11_2.java
index b887c01c..61514ddd 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_11_2.java
@@ -1,14 +1,15 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.entity.Entity;
import java.util.List;
-public class VersionSpecificHandler12 extends VersionSpecificHandler11 implements VersionSpecificHandler {
+public class VersionSpecificHandler_V1_11_2 extends VersionSpecificHandler_V1_11 {
@Override
- public int getMinecraftVersion() {
- return 12;
+ public Version getMinecraftVersion() {
+ return Version.V1_11_2;
}
@Override
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_14.java
index 6ebf1810..d8864715 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler14.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_14.java
@@ -1,12 +1,13 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.block.Biome;
-public class VersionSpecificHandler14 extends VersionSpecificHandler12 implements VersionSpecificHandler {
+public class VersionSpecificHandler_V1_14 extends VersionSpecificHandler_V1_11_2 {
@Override
- public int getMinecraftVersion() {
- return 14;
+ public Version getMinecraftVersion() {
+ return Version.V1_14;
}
@Override
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_15_2.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_15_2.java
new file mode 100644
index 00000000..2ea95950
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_15_2.java
@@ -0,0 +1,19 @@
+package com.leonardobishop.quests.bukkit.hook.versionspecific;
+
+import com.leonardobishop.quests.common.versioning.Version;
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.PlayerInventory;
+
+public class VersionSpecificHandler_V1_15_2 extends VersionSpecificHandler_V1_14 {
+
+ @Override
+ public Version getMinecraftVersion() {
+ return Version.V1_15_2;
+ }
+
+ @Override
+ public ItemStack getItemInEquipmentSlot(PlayerInventory inventory, EquipmentSlot slot) {
+ return inventory.getItem(slot);
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_16.java
index bb4eb6b8..6cd4a34a 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_16.java
@@ -1,18 +1,17 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.entity.Player;
import org.bukkit.entity.Strider;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.SmithItemEvent;
-import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.PlayerInventory;
-public class VersionSpecificHandler16 extends VersionSpecificHandler14 implements VersionSpecificHandler {
+public class VersionSpecificHandler_V1_16 extends VersionSpecificHandler_V1_15_2 {
@Override
- public int getMinecraftVersion() {
- return 16;
+ public Version getMinecraftVersion() {
+ return Version.V1_16;
}
@Override
@@ -26,16 +25,6 @@ public class VersionSpecificHandler16 extends VersionSpecificHandler14 implement
}
@Override
- public boolean isOffHandEmpty(Player player) {
- return player.getInventory().getItemInOffHand().getAmount() == 0;
- }
-
- @Override
- public ItemStack getItemInEquipmentSlot(PlayerInventory inventory, EquipmentSlot slot) {
- return inventory.getItem(slot);
- }
-
- @Override
public ItemStack[] getSmithItems(SmithItemEvent event) {
return new ItemStack[]{
event.getInventory().getInputEquipment(),
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler17.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_17.java
index 471e6a74..e9f53565 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler17.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_17.java
@@ -1,5 +1,6 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.data.BlockData;
@@ -7,13 +8,14 @@ import org.bukkit.block.data.type.CaveVinesPlant;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Goat;
-public class VersionSpecificHandler17 extends VersionSpecificHandler16 implements VersionSpecificHandler {
+public class VersionSpecificHandler_V1_17 extends VersionSpecificHandler_V1_16 {
@Override
- public int getMinecraftVersion() {
- return 17;
+ public Version getMinecraftVersion() {
+ return Version.V1_17;
}
+ @SuppressWarnings("deprecation")
@Override
public boolean isCaveVinesPlantWithBerries(BlockData blockData) {
return blockData instanceof CaveVinesPlant caveVinesPlant && caveVinesPlant.isBerries();
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_19_2.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_19_2.java
new file mode 100644
index 00000000..fdf19c48
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_19_2.java
@@ -0,0 +1,18 @@
+package com.leonardobishop.quests.bukkit.hook.versionspecific;
+
+import com.leonardobishop.quests.common.versioning.Version;
+import org.bukkit.event.player.PlayerBucketEmptyEvent;
+import org.bukkit.inventory.ItemStack;
+
+public class VersionSpecificHandler_V1_19_2 extends VersionSpecificHandler_V1_17 {
+
+ @Override
+ public Version getMinecraftVersion() {
+ return Version.V1_19_2;
+ }
+
+ @Override
+ public ItemStack getItem(PlayerBucketEmptyEvent event) {
+ return this.getItemInEquipmentSlot(event.getPlayer().getInventory(), event.getHand());
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20.java
new file mode 100644
index 00000000..d62df255
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20.java
@@ -0,0 +1,44 @@
+package com.leonardobishop.quests.bukkit.hook.versionspecific;
+
+import com.leonardobishop.quests.common.versioning.Version;
+import org.bukkit.entity.Camel;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.SmithItemEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.Recipe;
+import org.bukkit.inventory.SmithingTransformRecipe;
+import org.bukkit.inventory.SmithingTrimRecipe;
+
+public class VersionSpecificHandler_V1_20 extends VersionSpecificHandler_V1_19_2 {
+
+ @Override
+ public Version getMinecraftVersion() {
+ return Version.V1_20;
+ }
+
+ @Override
+ public boolean isPlayerOnCamel(Player player) {
+ return player.getVehicle() instanceof Camel;
+ }
+
+ @Override
+ public ItemStack[] getSmithItems(SmithItemEvent event) {
+ return new ItemStack[]{
+ event.getInventory().getInputEquipment(),
+ event.getInventory().getInputMineral(),
+ event.getInventory().getInputTemplate()
+ };
+ }
+
+ @Override
+ public String getSmithMode(SmithItemEvent event) {
+ Recipe recipe = event.getInventory().getRecipe();
+ if (recipe instanceof SmithingTransformRecipe) {
+ return "transform";
+ } else if (recipe instanceof SmithingTrimRecipe) {
+ return "trim";
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20_4.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20_4.java
new file mode 100644
index 00000000..042c7fbe
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_20_4.java
@@ -0,0 +1,42 @@
+package com.leonardobishop.quests.bukkit.hook.versionspecific;
+
+import com.leonardobishop.quests.common.versioning.Version;
+import org.bukkit.damage.DamageSource;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.jspecify.annotations.Nullable;
+
+public class VersionSpecificHandler_V1_20_4 extends VersionSpecificHandler_V1_20 {
+
+ @Override
+ public Version getMinecraftVersion() {
+ return Version.V1_20_4;
+ }
+
+ @Override
+ public @Nullable Player getDamager(@Nullable EntityDamageEvent event) {
+ if (event == null) {
+ return null;
+ }
+
+ DamageSource source = event.getDamageSource();
+ Entity causingEntity = source.getCausingEntity();
+
+ if (causingEntity instanceof Player) {
+ return (Player) causingEntity;
+ }
+
+ return null;
+ }
+
+ @Override
+ public @Nullable Entity getDirectSource(@Nullable EntityDamageEvent event) {
+ if (event == null) {
+ return null;
+ }
+
+ DamageSource source = event.getDamageSource();
+ return source.getDirectEntity();
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_11.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_11.java
new file mode 100644
index 00000000..e64e2a42
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_11.java
@@ -0,0 +1,24 @@
+package com.leonardobishop.quests.bukkit.hook.versionspecific;
+
+import com.leonardobishop.quests.common.versioning.Version;
+import org.bukkit.entity.CamelHusk;
+import org.bukkit.entity.Nautilus;
+import org.bukkit.entity.Player;
+
+public class VersionSpecificHandler_V1_21_11 extends VersionSpecificHandler_V1_21_6 {
+
+ @Override
+ public Version getMinecraftVersion() {
+ return Version.V1_21_11;
+ }
+
+ @Override
+ public boolean isPlayerOnCamelHusk(Player player) {
+ return player.getVehicle() instanceof CamelHusk;
+ }
+
+ @Override
+ public boolean isPlayerOnNautilus(Player player) {
+ return player.getVehicle() instanceof Nautilus;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_6.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_6.java
new file mode 100644
index 00000000..4eaae85f
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_21_6.java
@@ -0,0 +1,18 @@
+package com.leonardobishop.quests.bukkit.hook.versionspecific;
+
+import com.leonardobishop.quests.common.versioning.Version;
+import org.bukkit.entity.HappyGhast;
+import org.bukkit.entity.Player;
+
+public class VersionSpecificHandler_V1_21_6 extends VersionSpecificHandler_V1_20_4 {
+
+ @Override
+ public Version getMinecraftVersion() {
+ return Version.V1_21_6;
+ }
+
+ @Override
+ public boolean isPlayerOnHappyGhast(Player player) {
+ return player.getVehicle() instanceof HappyGhast;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_8.java
index 06657cb4..4567f548 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_8.java
@@ -1,5 +1,6 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -21,14 +22,13 @@ import org.bukkit.inventory.PlayerInventory;
import org.bukkit.projectiles.ProjectileSource;
import org.jspecify.annotations.Nullable;
-import java.util.HashMap;
import java.util.List;
-public class VersionSpecificHandler8 implements VersionSpecificHandler {
+public class VersionSpecificHandler_V1_8 implements VersionSpecificHandler {
@Override
- public int getMinecraftVersion() {
- return 8;
+ public Version getMinecraftVersion() {
+ return Version.V1_8;
}
@Override
@@ -41,7 +41,12 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
return false;
}
- @SuppressWarnings("deprecation")
+ @Override
+ public boolean isPlayerOnCamelHusk(Player player) {
+ return false;
+ }
+
+ @SuppressWarnings({"deprecation", "removal"})
@Override
public boolean isPlayerOnDonkey(Player player) {
return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.DONKEY;
@@ -52,7 +57,7 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
return false;
}
- @SuppressWarnings("deprecation")
+ @SuppressWarnings({"deprecation", "removal"})
@Override
public boolean isPlayerOnHorse(Player player) {
return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.HORSE;
@@ -63,7 +68,7 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
return false;
}
- @SuppressWarnings("deprecation")
+ @SuppressWarnings({"deprecation", "removal"})
@Override
public boolean isPlayerOnMule(Player player) {
return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.MULE;
@@ -74,7 +79,7 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
return false;
}
- @SuppressWarnings("deprecation")
+ @SuppressWarnings({"deprecation", "removal"})
@Override
public boolean isPlayerOnSkeletonHorse(Player player) {
return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.SKELETON_HORSE;
@@ -85,7 +90,7 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
return false;
}
- @SuppressWarnings("deprecation")
+ @SuppressWarnings({"deprecation", "removal"})
@Override
public boolean isPlayerOnZombieHorse(Player player) {
return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.UNDEAD_HORSE;
@@ -102,23 +107,8 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
}
@Override
- public int getAvailableSpace(Player player, ItemStack newItemStack) {
- int availableSpace = 0;
- PlayerInventory inventory = player.getInventory();
- HashMap<Integer, ? extends ItemStack> itemStacksWithSameMaterial = inventory.all(newItemStack.getType());
- for (ItemStack existingItemStack : itemStacksWithSameMaterial.values()) {
- if (newItemStack.isSimilar(existingItemStack)) {
- availableSpace += (newItemStack.getMaxStackSize() - existingItemStack.getAmount());
- }
- }
-
- for (ItemStack existingItemStack : inventory.getContents()) {
- if (existingItemStack == null) {
- availableSpace += newItemStack.getMaxStackSize();
- }
- }
-
- return availableSpace;
+ public @Nullable ItemStack[] getStorageContents(PlayerInventory inventory) {
+ return inventory.getContents();
}
@Override
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_9.java
index cf2f0a9c..ae90569a 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler9.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler_V1_9.java
@@ -1,19 +1,19 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
+import org.jspecify.annotations.Nullable;
-import java.util.HashMap;
-
-public class VersionSpecificHandler9 extends VersionSpecificHandler8 implements VersionSpecificHandler {
+public class VersionSpecificHandler_V1_9 extends VersionSpecificHandler_V1_8 {
@Override
- public int getMinecraftVersion() {
- return 9;
+ public Version getMinecraftVersion() {
+ return Version.V1_9;
}
@Override
@@ -22,23 +22,13 @@ public class VersionSpecificHandler9 extends VersionSpecificHandler8 implements
}
@Override
- public int getAvailableSpace(Player player, ItemStack newItemStack) {
- int availableSpace = 0;
- PlayerInventory inventory = player.getInventory();
- HashMap<Integer, ? extends ItemStack> itemStacksWithSameMaterial = inventory.all(newItemStack.getType());
- for (ItemStack existingItemStack : itemStacksWithSameMaterial.values()) {
- if (newItemStack.isSimilar(existingItemStack)) {
- availableSpace += (newItemStack.getMaxStackSize() - existingItemStack.getAmount());
- }
- }
-
- for (ItemStack existingItemStack : inventory.getStorageContents()) {
- if (existingItemStack == null) {
- availableSpace += newItemStack.getMaxStackSize();
- }
- }
+ public boolean isOffHandEmpty(Player player) {
+ return player.getInventory().getItemInOffHand().getAmount() == 0;
+ }
- return availableSpace;
+ @Override
+ public @Nullable ItemStack[] getStorageContents(PlayerInventory inventory) {
+ return inventory.getStorageContents();
}
@Override
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java
index 3af221d3..fcc1540a 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/SmithingTaskType.java
@@ -11,6 +11,7 @@ import com.leonardobishop.quests.common.player.QPlayer;
import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress;
import com.leonardobishop.quests.common.quest.Quest;
import com.leonardobishop.quests.common.quest.Task;
+import com.leonardobishop.quests.common.versioning.Version;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -37,7 +38,7 @@ public final class SmithingTaskType extends BukkitTaskType {
super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "data"));
super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "exact-match"));
- if (plugin.getVersionSpecificHandler().getMinecraftVersion() < 20) {
+ if (plugin.getVersionSpecificHandler().getMinecraftVersion().isLowerThan(Version.V1_20)) {
return;
}