diff --git a/libs/mypet-3.12.jar b/libs/mypet-3.12.jar
deleted file mode 100644
index cf77adb5e..000000000
Binary files a/libs/mypet-3.12.jar and /dev/null differ
diff --git a/pom.xml b/pom.xml
index b033d29c6..a22b75501 100644
--- a/pom.xml
+++ b/pom.xml
@@ -176,11 +176,9 @@
de.keyle
- mypet
- 3.11-SNAPSHOT
- system
-
- ${basedir}/libs/mypet-3.12.jar
+ mypet-api
+ 4.0.0
+ provided
@@ -272,10 +270,10 @@
https://repo.codemc.io/repository/EvenMoreFish/
-
-
-
-
+
+ mypet-releases
+ https://repo.userderezzed.dev/releases
+
diff --git a/src/main/java/com/gamingmesh/jobs/hooks/MyPet/MyPetManager.java b/src/main/java/com/gamingmesh/jobs/hooks/MyPet/MyPetManager.java
index bf394224e..8236ecb06 100644
--- a/src/main/java/com/gamingmesh/jobs/hooks/MyPet/MyPetManager.java
+++ b/src/main/java/com/gamingmesh/jobs/hooks/MyPet/MyPetManager.java
@@ -1,48 +1,113 @@
package com.gamingmesh.jobs.hooks.MyPet;
+import java.lang.reflect.Method;
import java.util.UUID;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import de.Keyle.MyPet.MyPetApi;
-import de.Keyle.MyPet.api.entity.MyPet;
-import de.Keyle.MyPet.api.entity.MyPetBukkitEntity;
-import de.Keyle.MyPet.api.player.MyPetPlayer;
-import de.Keyle.MyPet.api.repository.PlayerManager;
+import de.Keyle.MyPet.api.entity.Pet;
public class MyPetManager {
- private final PlayerManager mp = MyPetApi.getPlayerManager();
+ private final boolean legacyApi;
+ private final LegacyApi legacy;
+
+ public MyPetManager() {
+ boolean legacyApi = false;
+ LegacyApi legacy = null;
+
+ try {
+ MyPetApi.class.getMethod("getPetManager");
+ } catch (NoSuchMethodException ignored) {
+ legacyApi = true;
+ legacy = LegacyApi.create();
+ }
+
+ this.legacyApi = legacyApi;
+ this.legacy = legacy;
+ }
public boolean isMyPet(Entity entity, Player owner) {
- if (owner == null) {
- return entity instanceof MyPetBukkitEntity;
- }
+ UUID petOwner = getOwner(entity);
+ return petOwner != null && (owner == null || petOwner.equals(owner.getUniqueId()));
+ }
+
+ public UUID getOwnerOfPet(Entity entity) {
+ return getOwner(entity);
+ }
- if (!mp.isMyPetPlayer(owner)) {
- return false;
- }
+ private UUID getOwner(Entity entity) {
+ if (legacyApi) {
+ return legacy == null ? null : legacy.getOwner(entity);
+ }
+ return ModernApi.getOwner(entity);
+ }
- MyPetPlayer myPetPlayer = mp.getMyPetPlayer(owner);
- if (!myPetPlayer.hasMyPet()) {
- return false;
- }
+ private static final class ModernApi {
- java.util.Optional opt = myPetPlayer.getMyPet().getEntity();
- return opt.isPresent() && opt.get().getType() == entity.getType();
+ private static UUID getOwner(Entity entity) {
+ Pet pet = MyPetApi.getPetManager().getPetFromEntity(entity);
+ return pet == null || pet.getOwner() == null ? null : pet.getOwner().getUniqueId();
+ }
}
- public UUID getOwnerOfPet(Entity ent) {
- if (!(ent instanceof MyPetBukkitEntity))
- return null;
+ private static final class LegacyApi {
+
+ private final Class> petEntityClass;
+ private final Method getMyPet;
+ private final Method getOwner;
+ private final Method getPlayer;
+
+ private LegacyApi(Class> petEntityClass, Method getMyPet, Method getOwner, Method getPlayer) {
+ this.petEntityClass = petEntityClass;
+ this.getMyPet = getMyPet;
+ this.getOwner = getOwner;
+ this.getPlayer = getPlayer;
+ }
+
+ private static LegacyApi create() {
+ try {
+ ClassLoader classLoader = MyPetApi.class.getClassLoader();
+ Class> petEntityClass = Class.forName("de.Keyle.MyPet.api.entity.MyPetBukkitEntity", false,
+ classLoader);
+ Class> myPetClass = Class.forName("de.Keyle.MyPet.api.entity.MyPet", false, classLoader);
+ Class> myPetPlayerClass = Class.forName("de.Keyle.MyPet.api.player.MyPetPlayer", false,
+ classLoader);
+
+ return new LegacyApi(
+ petEntityClass,
+ petEntityClass.getMethod("getMyPet"),
+ myPetClass.getMethod("getOwner"),
+ myPetPlayerClass.getMethod("getPlayer"));
+ } catch (ReflectiveOperationException e) {
+ MyPetApi.getLogger().warning("Jobs could not initialize its MyPet 3 integration: " + e.getMessage());
+ return null;
+ }
+ }
+
+ private UUID getOwner(Entity entity) {
+ if (!petEntityClass.isInstance(entity)) {
+ return null;
+ }
+
+ try {
+ Object pet = getMyPet.invoke(entity);
+ if (pet == null) {
+ return null;
+ }
- MyPet myPet = ((MyPetBukkitEntity) ent).getMyPet();
+ Object owner = getOwner.invoke(pet);
+ if (owner == null) {
+ return null;
+ }
- try {
- return myPet.getOwner().getPlayer().getUniqueId();
- } catch (Exception e) {
- return null;
- }
+ Object player = getPlayer.invoke(owner);
+ return player instanceof Player ? ((Player) player).getUniqueId() : null;
+ } catch (ReflectiveOperationException | ClassCastException e) {
+ return null;
+ }
+ }
}
}