From 59dbcfbe352fb27f31cf5583737777086f272ae6 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Fri, 10 Mar 2023 20:36:40 +0100 Subject: Improve breeding task type 1.10+ versions support --- .../bukkit/tasktype/type/BreedingTaskType.java | 125 ++++++++++++--------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java index 41d6c41e..c5ee26f0 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java @@ -9,11 +9,12 @@ import com.leonardobishop.quests.common.quest.Quest; import com.leonardobishop.quests.common.quest.Task; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import java.util.List; @@ -28,71 +29,89 @@ public final class BreedingTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useEntityListConfigValidator(this, "mob", "mobs")); + + try { + Class.forName("org.bukkit.event.entity.EntityBreedEvent"); + plugin.getServer().getPluginManager().registerEvents(new BreedingTaskType.EntityBreedListener(), plugin); + } catch (ClassNotFoundException ignored) { + // server version cannot support the event, so we use CreatureSpawnEvent instead + plugin.getServer().getPluginManager().registerEvents(new BreedingTaskType.CreatureSpawnListener(), plugin); + } } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBreed(CreatureSpawnEvent e) { - if (!e.getSpawnReason().equals(SpawnReason.BREEDING)) { - return; + private final class EntityBreedListener implements Listener { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onEntityBreed(org.bukkit.event.entity.EntityBreedEvent event) { + LivingEntity breeder = event.getBreeder(); + if (breeder instanceof Player player) { + handle(player, event.getEntityType()); + } } + } - Entity ent = e.getEntity(); - List entList = ent.getNearbyEntities(10, 10, 10); + private final class CreatureSpawnListener implements Listener { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onCreatureSpawn(CreatureSpawnEvent event) { + if (event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.BREEDING) { + return; + } + + List entities = event.getEntity().getNearbyEntities(10.0d, 10.0d, 10.0d); + for (Entity entity : entities) { + if (entity instanceof Player player) { + handle(player, event.getEntityType()); + } + } + } + } - if (entList.isEmpty()) { + private void handle(Player player, EntityType entityType) { + if (player.hasMetadata("NPC")) { return; } - // Check if there is a player in the list, otherwise: return. - for (Entity current : entList) { - if (current instanceof Player player && !current.hasMetadata("NPC")) { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); - if (qPlayer == null) { - continue; - } - for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player.getPlayer(), qPlayer, this, TaskUtils.TaskConstraint.WORLD)) { - Quest quest = pendingTask.quest(); - Task task = pendingTask.task(); - TaskProgress taskProgress = pendingTask.taskProgress(); - - super.debug("Player detected near bred animal", quest.getId(), task.getId(), player.getUniqueId()); - - List configEntities = TaskUtils.getConfigStringList(task, task.getConfigValues().containsKey("mob") ? "mob" : "mobs"); - - if (!configEntities.isEmpty()) { - super.debug("List of required entities exists; mob type is " + current.getType(), quest.getId(), task.getId(), player.getUniqueId()); - - boolean validMob = false; - for (String entry : configEntities) { - super.debug("Checking against mob '" + entry + "'", quest.getId(), task.getId(), player.getUniqueId()); - try { - EntityType entity = EntityType.valueOf(entry); - if (current.getType() == entity) { - super.debug("Mob is valid", quest.getId(), task.getId(), player.getUniqueId()); - validMob = true; - break; - } - } catch (IllegalArgumentException ignored) { - } - } + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } - if (!validMob) { - super.debug("Mob is not in list of required mobs, continuing...", quest.getId(), task.getId(), player.getUniqueId()); - continue; + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskUtils.TaskConstraint.WORLD)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); + + super.debug("Player detected near bred animal", quest.getId(), task.getId(), player.getUniqueId()); + + List configEntities = TaskUtils.getConfigStringList(task, task.getConfigValues().containsKey("mob") ? "mob" : "mobs"); + if (!configEntities.isEmpty()) { + super.debug("List of required entities exists; mob type is " + entityType.name(), quest.getId(), task.getId(), player.getUniqueId()); + + boolean validMob = false; + for (String configEntity : configEntities) { + super.debug("Checking against mob '" + configEntity + "'", quest.getId(), task.getId(), player.getUniqueId()); + try { + EntityType configEntityType = EntityType.valueOf(configEntity); + if (configEntityType == entityType) { + super.debug("Mob is valid", quest.getId(), task.getId(), player.getUniqueId()); + validMob = true; + break; } - } - + } catch (IllegalArgumentException ignored) {} + } - int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); - super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); + if (!validMob) { + super.debug("Mob is not in list of required mobs, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + } - int breedingNeeded = (int) task.getConfigValue("amount"); + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); - if (progress >= breedingNeeded) { - super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); - taskProgress.setCompleted(true); - } - } + int amount = (int) task.getConfigValue("amount"); + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); + taskProgress.setCompleted(true); } } } -- cgit v1.2.3-70-g09d2