aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com/leonardobishop
diff options
context:
space:
mode:
Diffstat (limited to 'bukkit/src/main/java/com/leonardobishop')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java5
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java64
2 files changed, 57 insertions, 12 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 39dd4159..acfab123 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -342,8 +342,9 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
taskTypeManager.registerTaskType(new CitizensInteractTaskType(this));
}
if (Bukkit.getPluginManager().isPluginEnabled("MythicMobs")) {
- if (Bukkit.getPluginManager().getPlugin("MythicMobs").getDescription().getVersion().startsWith("5")) {
- taskTypeManager.registerTaskType(new MythicMobsKillingType(this));
+ String mythicMobsVersion = Bukkit.getPluginManager().getPlugin("MythicMobs").getDescription().getVersion();
+ if (mythicMobsVersion.startsWith("4") || mythicMobsVersion.startsWith("5")) {
+ taskTypeManager.registerTaskType(new MythicMobsKillingType(this, mythicMobsVersion));
}
}
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java
index 17683e25..973d7175 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/MythicMobsKillingType.java
@@ -9,13 +9,15 @@ import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress;
import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress;
import com.leonardobishop.quests.common.quest.Quest;
import com.leonardobishop.quests.common.quest.Task;
-import io.lumine.mythic.bukkit.events.MythicMobDeathEvent;
import org.bukkit.entity.Entity;
+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.jetbrains.annotations.NotNull;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -24,9 +26,26 @@ public final class MythicMobsKillingType extends BukkitTaskType {
private final BukkitQuestsPlugin plugin;
- public MythicMobsKillingType(BukkitQuestsPlugin plugin) {
+ public MythicMobsKillingType(BukkitQuestsPlugin plugin, String mythicMobsVersion) {
super("mythicmobs_killing", TaskUtils.TASK_ATTRIBUTION_STRING, "Kill a set amount of a MythicMobs entity.");
this.plugin = plugin;
+
+ // MythicMobs 4
+ try {
+ Class.forName("io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent");
+ plugin.getServer().getPluginManager().registerEvents(new MythicMobs4Listener(), plugin);
+ return;
+ } catch (ClassNotFoundException | NoSuchFieldException ignored) { } // MythicMobs version cannot support task type
+
+ // MythicMobs 5
+ try {
+ Class.forName("io.lumine.mythic.bukkit.events.MythicMobDeathEvent");
+ plugin.getServer().getPluginManager().registerEvents(new MythicMobs5Listener(), plugin);
+ return;
+ } catch (ClassNotFoundException ignored) { } // MythicMobs version cannot support task type
+
+ plugin.getLogger().severe("Failed to register event handler for MythicMobs task type!");
+ plugin.getLogger().severe("MythicMobs version detected: " + mythicMobsVersion);
}
@Override
@@ -40,21 +59,46 @@ public final class MythicMobsKillingType extends BukkitTaskType {
return problems;
}
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onMobKill(MythicMobDeathEvent event) {
- Entity killer = event.getKiller();
- Entity mob = event.getEntity();
+ private final class MythicMobs4Listener implements Listener {
- if (mob == null || mob instanceof Player) {
- return;
+ private final Field levelField;
+
+ public MythicMobs4Listener() throws ClassNotFoundException, NoSuchFieldException {
+ // Fixes https://github.com/LMBishop/Quests/issues/318
+ levelField = Class.forName("io.lumine.xikage.mythicmobs.mobs.ActiveMob").getDeclaredField("level");
+ levelField.setAccessible(true);
}
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onMythicMobs4MobDeath(io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent event) {
+ // Fixes https://github.com/LMBishop/Quests/issues/318
+ double level;
+ try {
+ level = ((Number) levelField.get(event.getMob())).doubleValue();
+ } catch (Exception ignored) {
+ // It should never happen
+ return;
+ }
+
+ handle(event.getKiller(), event.getEntity(), event.getMobType().getInternalName(), level);
+ }
+ }
+
+ private final class MythicMobs5Listener implements Listener {
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onMythicMobs5MobDeath(io.lumine.mythic.bukkit.events.MythicMobDeathEvent event) {
+ handle(event.getKiller(), event.getEntity(), event.getMobType().getInternalName(), event.getMobLevel());
+ }
+ }
+
+ private void handle(LivingEntity killer, Entity mob, String mobName, double level) {
if (killer == null) {
return;
}
- String mobName = event.getMobType().getInternalName();
- double level = event.getMobLevel();
+ if (mob == null || mob instanceof Player) {
+ return;
+ }
QPlayer qPlayer = plugin.getPlayerManager().getPlayer(killer.getUniqueId());
if (qPlayer == null) {