diff options
| author | Krakenied <krakenied1@gmail.com> | 2026-01-19 11:24:06 +0100 |
|---|---|---|
| committer | Krakenied <krakenied1@gmail.com> | 2026-01-19 22:38:20 +0100 |
| commit | 574ffa99bd822c983c2ae6e805197cae7c4bd601 (patch) | |
| tree | 307e711b3f03db69ca57a1e995666db12b49549c /bukkit | |
| parent | 6f8d1d3bd8cefe7ec75bd568b5c5a7586ff1db08 (diff) | |
Prepare for Mojang version mess
New API to be used in server version detection and version specific handlers
Diffstat (limited to 'bukkit')
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; } |
