Generalizes the ray tracing used for finding the portal a player is looking at
This commit is contained in:
@@ -5,12 +5,11 @@ import net.TheDgtl.Stargate.manager.PermissionManager;
|
|||||||
import net.TheDgtl.Stargate.network.Network;
|
import net.TheDgtl.Stargate.network.Network;
|
||||||
import net.TheDgtl.Stargate.network.RegistryAPI;
|
import net.TheDgtl.Stargate.network.RegistryAPI;
|
||||||
import net.TheDgtl.Stargate.network.portal.RealPortal;
|
import net.TheDgtl.Stargate.network.portal.RealPortal;
|
||||||
import org.bukkit.Location;
|
import net.knarcraft.stargatecommand.util.PortalFinderHelper;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.util.Vector;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,16 +64,7 @@ public class CommandDial implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Find any Stargate block in the player's line of sight
|
//Find any Stargate block in the player's line of sight
|
||||||
RealPortal originPortal = null;
|
RealPortal originPortal = (RealPortal) PortalFinderHelper.findPortalByRaytrace(registryAPI, player, 10);
|
||||||
Location playerLocation = player.getLocation().add(0, player.getEyeHeight(), 0);
|
|
||||||
Vector playerDirection = player.getLocation().getDirection();
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
playerLocation.add(playerDirection);
|
|
||||||
originPortal = registryAPI.getPortal(playerLocation);
|
|
||||||
if (originPortal != null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (originPortal == null) {
|
if (originPortal == null) {
|
||||||
player.sendMessage("You need to look at a portal to dial");
|
player.sendMessage("You need to look at a portal to dial");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package net.knarcraft.stargatecommand.util;
|
||||||
|
|
||||||
|
import net.TheDgtl.Stargate.network.RegistryAPI;
|
||||||
|
import net.TheDgtl.Stargate.network.portal.Portal;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class for helping with finding portals in the world
|
||||||
|
*/
|
||||||
|
public class PortalFinderHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the portal a living entity is looking at using a single traced ray
|
||||||
|
*
|
||||||
|
* @param registryAPI <p>The registry used for looking up portals</p>
|
||||||
|
* @param livingEntity <p>The living entity to ray trace from</p>
|
||||||
|
* @param rayLength <p>The maximum length of the ray before giving up</p>
|
||||||
|
* @return <p>The portal the player is looking at, or null if no portal was found</p>
|
||||||
|
*/
|
||||||
|
public static Portal findPortalByRaytrace(RegistryAPI registryAPI, LivingEntity livingEntity, int rayLength) {
|
||||||
|
Location entityLocation = livingEntity.getLocation().add(0, livingEntity.getEyeHeight(), 0);
|
||||||
|
Vector entityDirection = livingEntity.getLocation().getDirection();
|
||||||
|
Portal foundPortal = null;
|
||||||
|
|
||||||
|
//Follow the ray outwards from the entity until a portal is found
|
||||||
|
for (int i = 0; i < rayLength; i++) {
|
||||||
|
entityLocation.add(entityDirection);
|
||||||
|
foundPortal = registryAPI.getPortal(entityLocation);
|
||||||
|
//Stop if a portal is found. Also, don't trace through solid blocks.
|
||||||
|
if (foundPortal != null || !entityLocation.getBlock().getType().isAir()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return foundPortal;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user