diff options
| author | Krakenied <Krakenied1@gmail.com> | 2023-03-10 20:36:40 +0100 |
|---|---|---|
| committer | Leonardo Bishop <13875753+LMBishop@users.noreply.github.com> | 2023-04-02 12:20:10 +0100 |
| commit | 59dbcfbe352fb27f31cf5583737777086f272ae6 (patch) | |
| tree | 0e13e5ec952436475d845aebb3acaeec275f0347 /bukkit/src/main/java/com | |
| parent | efa6d10f2d6f407daaff993af84901b8464adc3a (diff) | |
Improve breeding task type 1.10+ versions support
Diffstat (limited to 'bukkit/src/main/java/com')
| -rw-r--r-- | bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java | 119 |
1 files changed, 69 insertions, 50 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<Entity> 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; + } - if (entList.isEmpty()) { - 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; + List<Entity> entities = event.getEntity().getNearbyEntities(10.0d, 10.0d, 10.0d); + for (Entity entity : entities) { + if (entity instanceof Player player) { + handle(player, event.getEntityType()); } + } + } + } - 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(); + private void handle(Player player, EntityType entityType) { + if (player.hasMetadata("NPC")) { + return; + } - super.debug("Player detected near bred animal", quest.getId(), task.getId(), player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + return; + } - List<String> configEntities = TaskUtils.getConfigStringList(task, task.getConfigValues().containsKey("mob") ? "mob" : "mobs"); + for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskUtils.TaskConstraint.WORLD)) { + Quest quest = pendingTask.quest(); + Task task = pendingTask.task(); + TaskProgress taskProgress = pendingTask.taskProgress(); - if (!configEntities.isEmpty()) { - super.debug("List of required entities exists; mob type is " + current.getType(), quest.getId(), task.getId(), player.getUniqueId()); + super.debug("Player detected near bred animal", 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) { - } - } + List<String> 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()); - if (!validMob) { - super.debug("Mob is not in list of required mobs, continuing...", quest.getId(), task.getId(), player.getUniqueId()); - continue; + 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); } } } |
