Skip to content

Commit 48352eb

Browse files
Refactor entity targeting to use ray tracing API
Replaces custom vector math and bounding box intersection logic for targeting entities with Bukkit's built-in rayTraceEntities API across multiple commands and utility classes. This simplifies code, improves maintainability, and leverages native engine support for line-of-sight entity detection.
1 parent 1649d95 commit 48352eb

File tree

12 files changed

+268
-604
lines changed

12 files changed

+268
-604
lines changed

src/main/java/me/eccentric_nz/TARDIS/commands/dev/MountCommand.java

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
import me.eccentric_nz.TARDIS.enumeration.TardisModule;
66
import me.eccentric_nz.TARDIS.flight.vehicle.InterpolatedAnimation;
77
import me.eccentric_nz.TARDIS.flight.vehicle.VehicleUtility;
8-
import me.eccentric_nz.TARDIS.sonic.actions.TARDISSonicFreeze;
9-
import me.eccentric_nz.TARDIS.utility.TARDISVector3D;
108
import org.bukkit.Location;
119
import org.bukkit.Material;
1210
import org.bukkit.entity.*;
1311
import org.bukkit.inventory.ItemStack;
1412
import org.bukkit.inventory.meta.ItemMeta;
13+
import org.bukkit.util.RayTraceResult;
1514

1615
public class MountCommand {
1716

@@ -25,34 +24,22 @@ public boolean test(Player player, boolean mount) {
2524
if (mount) {
2625
// get the armour stand the player is looking at
2726
Location observerPos = player.getEyeLocation();
28-
TARDISVector3D observerDir = new TARDISVector3D(observerPos.getDirection());
29-
TARDISVector3D observerStart = new TARDISVector3D(observerPos);
30-
TARDISVector3D observerEnd = observerStart.add(observerDir.multiply(16));
31-
ArmorStand as = null;
32-
// Get nearby entities
33-
for (Entity target : player.getNearbyEntities(8.0d, 8.0d, 8.0d)) {
34-
// Bounding box of the given player
35-
TARDISVector3D targetPos = new TARDISVector3D(target.getLocation());
36-
TARDISVector3D minimum = targetPos.add(-0.5, 0, -0.5);
37-
TARDISVector3D maximum = targetPos.add(0.5, 1.67, 0.5);
38-
if (target.getType().equals(EntityType.ARMOR_STAND) && TARDISSonicFreeze.hasIntersection(observerStart, observerEnd, minimum, maximum)) {
39-
if (as == null || as.getLocation().distanceSquared(observerPos) > target.getLocation().distanceSquared(observerPos)) {
40-
as = (ArmorStand) target;
41-
}
42-
}
43-
}
44-
if (as == null) {
27+
RayTraceResult result = observerPos.getWorld().rayTraceEntities(observerPos, observerPos.getDirection(), 16.0d, (s) -> s.getType() == EntityType.ARMOR_STAND);
28+
if (result == null) {
4529
plugin.getMessenger().send(player, TardisModule.TARDIS, "WA_STAND");
4630
return true;
4731
}
48-
ItemStack box = ItemStack.of(Material.BLUE_DYE, 1);
49-
ItemMeta im = box.getItemMeta();
50-
im.setItemModel(ChameleonVariant.BLUE_CLOSED.getKey());
51-
box.setItemMeta(im);
52-
ItemDisplay display = VehicleUtility.getItemDisplay(player, box, 1.75f);
53-
int period = 40;
54-
plugin.getTrackerKeeper().setAnimateTask(plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new InterpolatedAnimation(display, period), 5, period));
55-
as.addPassenger(player);
32+
ArmorStand as = (ArmorStand) result.getHitEntity();
33+
if (as != null) {
34+
ItemStack box = ItemStack.of(Material.BLUE_DYE, 1);
35+
ItemMeta im = box.getItemMeta();
36+
im.setItemModel(ChameleonVariant.BLUE_CLOSED.getKey());
37+
box.setItemMeta(im);
38+
ItemDisplay display = VehicleUtility.getItemDisplay(player, box, 1.75f);
39+
int period = 40;
40+
plugin.getTrackerKeeper().setAnimateTask(plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new InterpolatedAnimation(display, period), 5, period));
41+
as.addPassenger(player);
42+
}
5643
} else {
5744
// unmount
5845
for (Entity e : player.getPassengers()) {

src/main/java/me/eccentric_nz/TARDIS/commands/dev/RomanCommand.java

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,33 @@
11
package me.eccentric_nz.TARDIS.commands.dev;
22

33
import me.eccentric_nz.TARDIS.TARDIS;
4-
import me.eccentric_nz.TARDIS.sonic.actions.TARDISSonicFreeze;
4+
import me.eccentric_nz.TARDIS.enumeration.TardisModule;
55
import me.eccentric_nz.TARDIS.utility.TARDISStringUtils;
6-
import me.eccentric_nz.TARDIS.utility.TARDISVector3D;
76
import me.eccentric_nz.tardisweepingangels.TARDISWeepingAngels;
87
import me.eccentric_nz.tardisweepingangels.equip.ArmourStandEquipment;
98
import net.kyori.adventure.text.Component;
109
import org.bukkit.Location;
1110
import org.bukkit.Material;
1211
import org.bukkit.NamespacedKey;
1312
import org.bukkit.entity.ArmorStand;
14-
import org.bukkit.entity.Entity;
1513
import org.bukkit.entity.EntityType;
1614
import org.bukkit.entity.Player;
1715
import org.bukkit.inventory.ItemStack;
1816
import org.bukkit.inventory.meta.ItemMeta;
1917
import org.bukkit.persistence.PersistentDataType;
18+
import org.bukkit.util.RayTraceResult;
2019

2120
public class RomanCommand {
2221

2322
public void equip(Player player, String which) {
2423
// get the armour stand player is looking at
2524
Location observerPos = player.getEyeLocation();
26-
TARDISVector3D observerDir = new TARDISVector3D(observerPos.getDirection());
27-
TARDISVector3D observerStart = new TARDISVector3D(observerPos);
28-
TARDISVector3D observerEnd = observerStart.add(observerDir.multiply(16));
29-
ArmorStand as = null;
30-
// get nearby entities
31-
for (Entity target : player.getNearbyEntities(8.0d, 8.0d, 8.0d)) {
32-
// Bounding box of the given player
33-
TARDISVector3D targetPos = new TARDISVector3D(target.getLocation());
34-
TARDISVector3D minimum = targetPos.add(-0.5, 0, -0.5);
35-
TARDISVector3D maximum = targetPos.add(0.5, 1.67, 0.5);
36-
if (target.getType().equals(EntityType.ARMOR_STAND) && TARDISSonicFreeze.hasIntersection(observerStart, observerEnd, minimum, maximum)) {
37-
if (as == null || as.getLocation().distanceSquared(observerPos) > target.getLocation().distanceSquared(observerPos)) {
38-
as = (ArmorStand) target;
39-
}
40-
}
25+
RayTraceResult result = observerPos.getWorld().rayTraceEntities(observerPos, observerPos.getDirection(), 16.0d, (s) -> s.getType() == EntityType.ARMOR_STAND);
26+
if (result == null) {
27+
TARDIS.plugin.getMessenger().send(player, TardisModule.TARDIS, "WA_STAND");
28+
return;
4129
}
30+
ArmorStand as = (ArmorStand) result.getHitEntity();
4231
if (as != null) {
4332
as.setArms(false);
4433
as.getPersistentDataContainer().set(TARDISWeepingAngels.MONSTER_HEAD, PersistentDataType.INTEGER, 1);

0 commit comments

Comments
 (0)