aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrakenied <Krakenied1@gmail.com>2023-03-10 20:36:40 +0100
committerLeonardo Bishop <13875753+LMBishop@users.noreply.github.com>2023-04-02 12:20:10 +0100
commit59dbcfbe352fb27f31cf5583737777086f272ae6 (patch)
tree0e13e5ec952436475d845aebb3acaeec275f0347
parentefa6d10f2d6f407daaff993af84901b8464adc3a (diff)
Improve breeding task type 1.10+ versions support
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BreedingTaskType.java119
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);
}
}
}