aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'bukkit/src/main/java/com')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java9
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java28
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java30
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java38
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java10
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java16
6 files changed, 85 insertions, 46 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java
index f6f5b628..c84bc315 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java
@@ -15,6 +15,7 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.SkeletonHorse;
import org.bukkit.entity.Strider;
import org.bukkit.entity.ZombieHorse;
+import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.SmithItemEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
@@ -27,6 +28,7 @@ import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.SmithingInventory;
import org.bukkit.inventory.SmithingTransformRecipe;
import org.bukkit.inventory.SmithingTrimRecipe;
+import org.jspecify.annotations.Nullable;
import java.util.List;
@@ -233,5 +235,10 @@ public interface VersionSpecificHandler {
/**
* {@link Entity#getPassengers()} method was introduced in {@code 1.11.2}.
*/
- List<Entity> getPassengers(final Entity entity);
+ List<Entity> getPassengers(Entity entity);
+
+ /**
+ * DamageSources were introduced in {@code 1.20.4}.
+ */
+ @Nullable Player getDamager(@Nullable EntityDamageEvent lastDamageCause);
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java
index d9553694..5e7065dd 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java
@@ -1,16 +1,23 @@
package com.leonardobishop.quests.bukkit.hook.versionspecific;
+import com.leonardobishop.quests.bukkit.util.CompatUtils;
+import org.bukkit.damage.DamageSource;
import org.bukkit.entity.Camel;
+import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
+import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.inventory.SmithItemEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.SmithingTransformRecipe;
import org.bukkit.inventory.SmithingTrimRecipe;
+import org.jspecify.annotations.Nullable;
public class VersionSpecificHandler20 extends VersionSpecificHandler17 implements VersionSpecificHandler {
+ private static final boolean DAMAGE_SOURCE_API = CompatUtils.classExists("org.bukkit.damage.DamageSource");
+
@Override
public int getMinecraftVersion() {
return 20;
@@ -46,4 +53,25 @@ public class VersionSpecificHandler20 extends VersionSpecificHandler17 implement
return null;
}
}
+
+ @SuppressWarnings("UnstableApiUsage")
+ @Override
+ public @Nullable Player getDamager(@Nullable EntityDamageEvent event) {
+ if (!DAMAGE_SOURCE_API) {
+ return super.getDamager(event);
+ }
+
+ if (event == null) {
+ return null;
+ }
+
+ DamageSource source = event.getDamageSource();
+ Entity causingEntity = source.getCausingEntity();
+
+ if (causingEntity instanceof Player) {
+ return (Player) causingEntity;
+ }
+
+ return null;
+ }
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java
index 74e7deb9..70e02257 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java
@@ -4,6 +4,9 @@ import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Horse;
import org.bukkit.entity.Player;
+import org.bukkit.entity.Projectile;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.SmithItemEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
@@ -13,6 +16,8 @@ import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
+import org.bukkit.projectiles.ProjectileSource;
+import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.List;
@@ -192,7 +197,30 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler {
@SuppressWarnings("deprecation")
@Override
public List<Entity> getPassengers(Entity entity) {
- final Entity passenger = entity.getPassenger();
+ Entity passenger = entity.getPassenger();
return passenger != null ? List.of(passenger) : List.of();
}
+
+ @Override
+ public @Nullable Player getDamager(@Nullable EntityDamageEvent event) {
+ if (!(event instanceof EntityDamageByEntityEvent byEntityEvent)) {
+ return null;
+ }
+
+ Entity damager = byEntityEvent.getDamager();
+
+ if (damager instanceof Player) {
+ return (Player) damager;
+ }
+
+ if (damager instanceof Projectile projectile) {
+ ProjectileSource shooter = projectile.getShooter();
+
+ if (shooter instanceof Player) {
+ return (Player) shooter;
+ }
+ }
+
+ return null;
+ }
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java
index 1be17aa0..1a9c384b 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/DealDamageTaskType.java
@@ -15,12 +15,10 @@ import org.bukkit.entity.Creature;
import org.bukkit.entity.Damageable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
-import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.projectiles.ProjectileSource;
public final class DealDamageTaskType extends BukkitTaskType {
@@ -41,29 +39,11 @@ public final class DealDamageTaskType extends BukkitTaskType {
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
- Entity damager = event.getDamager();
- ItemStack weapon = null;
- Player player;
-
- if (damager instanceof Player) {
- player = (Player) damager;
-
- // It can be set there, but unfortunately we are unable to handle bows properly
- weapon = player.getInventory().getItemInMainHand();
- } else if (damager instanceof Projectile projectile) {
- ProjectileSource source = projectile.getShooter();
-
- if (source instanceof Player) {
- player = (Player) source;
- } else {
- return;
- }
- } else {
- return;
- }
+ public void onEntityDamage(EntityDamageEvent event) {
+ Entity entity = event.getEntity();
+ Player player = plugin.getVersionSpecificHandler().getDamager(event);
- if (player.hasMetadata("NPC")) {
+ if (player == null || player.hasMetadata("NPC")) {
return;
}
@@ -72,7 +52,6 @@ public final class DealDamageTaskType extends BukkitTaskType {
return;
}
- Entity entity = event.getEntity();
if (!(entity instanceof Damageable damageable)) {
return;
}
@@ -103,12 +82,13 @@ public final class DealDamageTaskType extends BukkitTaskType {
}
if (task.hasConfigKey("item")) {
- if (weapon == null) {
+ ItemStack item = plugin.getVersionSpecificHandler().getItemInMainHand(player);
+ if (item == null) {
super.debug("Specific item is required, player has no item in hand; continuing...", quest.getId(), task.getId(), player.getUniqueId());
continue;
}
- super.debug("Specific item is required; player held item is of type '" + weapon.getType() + "'", quest.getId(), task.getId(), player.getUniqueId());
+ super.debug("Specific item is required; player held item is of type '" + item.getType() + "'", quest.getId(), task.getId(), player.getUniqueId());
QuestItem qi;
if ((qi = fixedQuestItemCache.get(quest.getId(), task.getId())) == null) {
@@ -118,7 +98,7 @@ public final class DealDamageTaskType extends BukkitTaskType {
}
boolean exactMatch = TaskUtils.getConfigBoolean(task, "exact-match", true);
- if (!qi.compareItemStack(weapon, exactMatch)) {
+ if (!qi.compareItemStack(item, exactMatch)) {
super.debug("Item does not match required item, continuing...", quest.getId(), task.getId(), player.getUniqueId());
continue;
} else {
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java
index 28f78554..ab53e5a2 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MobkillingTaskType.java
@@ -19,6 +19,7 @@ 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.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.inventory.ItemStack;
@@ -62,7 +63,8 @@ public final class MobkillingTaskType extends BukkitTaskType {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDeath(EntityDeathEvent event) {
LivingEntity entity = event.getEntity();
- Player player = entity.getKiller();
+ EntityDamageEvent damageEvent = entity.getLastDamageCause();
+ Player player = plugin.getVersionSpecificHandler().getDamager(damageEvent);
handle(player, entity, 1);
}
@@ -84,11 +86,7 @@ public final class MobkillingTaskType extends BukkitTaskType {
}
private void handle(Player player, LivingEntity entity, int eventAmount) {
- if (player == null) {
- return;
- }
-
- if (player.hasMetadata("NPC")) {
+ if (player == null || player.hasMetadata("NPC")) {
return;
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java
index c6d4eb9d..6df513a5 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/PlayerkillingTaskType.java
@@ -8,11 +8,11 @@ import com.leonardobishop.quests.common.player.QPlayer;
import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress;
import com.leonardobishop.quests.common.quest.Quest;
import com.leonardobishop.quests.common.quest.Task;
-import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
-import org.bukkit.event.entity.EntityDeathEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.PlayerDeathEvent;
public final class PlayerkillingTaskType extends BukkitTaskType {
@@ -27,14 +27,12 @@ public final class PlayerkillingTaskType extends BukkitTaskType {
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onMobKill(EntityDeathEvent event) {
- Player killer = event.getEntity().getKiller();
- Entity mob = event.getEntity();
+ public void onPlayerDeath(PlayerDeathEvent event) {
+ Player killed = event.getPlayer();
+ EntityDamageEvent damageEvent = killed.getLastDamageCause();
+ Player killer = plugin.getVersionSpecificHandler().getDamager(damageEvent);
- if (!(mob instanceof Player)
- || killer == null
- || killer.hasMetadata("NPC")
- || mob == killer) {
+ if (killer == null || killer.hasMetadata("NPC") || killer == killed) {
return;
}