diff options
Diffstat (limited to 'src/main/java/org/bukkit/craftbukkit/util/CraftRayTraceResult.java')
-rw-r--r-- | src/main/java/org/bukkit/craftbukkit/util/CraftRayTraceResult.java | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftRayTraceResult.java b/src/main/java/org/bukkit/craftbukkit/util/CraftRayTraceResult.java new file mode 100644 index 00000000..d500824b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftRayTraceResult.java @@ -0,0 +1,42 @@ +package org.bukkit.craftbukkit.util; + +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.entity.Entity; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; +import net.minecraft.server.BlockPosition; +import net.minecraft.server.MovingObjectPosition; +import net.minecraft.server.MovingObjectPosition.EnumMovingObjectType; +import net.minecraft.server.Vec3D; + +public class CraftRayTraceResult { + + private CraftRayTraceResult() {} + + public static RayTraceResult fromNMS(World world, MovingObjectPosition nmsHitResult) { + if (nmsHitResult == null || nmsHitResult.type == EnumMovingObjectType.MISS) return null; + + Vec3D nmsHitPos = nmsHitResult.pos; + Vector hitPosition = new Vector(nmsHitPos.x, nmsHitPos.y, nmsHitPos.z); + BlockFace hitBlockFace = null; + + if (nmsHitResult.direction != null) { + hitBlockFace = CraftBlock.notchToBlockFace(nmsHitResult.direction); + } + + if (nmsHitResult.entity != null) { + Entity hitEntity = nmsHitResult.entity.getBukkitEntity(); + return new RayTraceResult(hitPosition, hitEntity, hitBlockFace); + } + + Block hitBlock = null; + BlockPosition nmsBlockPos = nmsHitResult.a(); // PAIL: getBlockPosition + if (nmsBlockPos != null && world != null) { + hitBlock = world.getBlockAt(nmsBlockPos.getX(), nmsBlockPos.getY(), nmsBlockPos.getZ()); + } + return new RayTraceResult(hitPosition, hitBlock, hitBlockFace); + } +} |