From 8b1c74e31d2c51cb62eeff6b3840451d0fd5cd62 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Mon, 4 Oct 2021 15:26:10 +0200 Subject: [PATCH] Implement teleport in TeleportPortal --- src/de/steamwar/lobby/portal/Portal.java | 11 ++++++ .../steamwar/lobby/portal/TeleportPortal.java | 36 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/de/steamwar/lobby/portal/Portal.java b/src/de/steamwar/lobby/portal/Portal.java index 9c9e849..36149d9 100644 --- a/src/de/steamwar/lobby/portal/Portal.java +++ b/src/de/steamwar/lobby/portal/Portal.java @@ -32,6 +32,7 @@ public class Portal implements PortalHandler, ConfigurationSerializable { private static final Map portals = new HashMap<>(); private static final Map posMap = new HashMap<>(); + public static final Vector NORMAL = new Vector(0, 0, 1); public static List getPortals() { return new ArrayList<>(portals.values()); @@ -55,6 +56,11 @@ public class Portal implements PortalHandler, ConfigurationSerializable { private final PortalType type; private final PortalHandler handler; + public Vector v1; + public Vector v2; + public Vector dv; + public double degree; + public Portal(Map map) { this.id = (String) map.get("id"); this.pos1 = (Location) map.get("pos1"); @@ -87,6 +93,11 @@ public class Portal implements PortalHandler, ConfigurationSerializable { } } } + + v1 = getPos1().toVector(); + v2 = getPos2().toVector(); + dv = v2.clone().subtract(v1); + this.degree = NORMAL.angle(dv); } @Override diff --git a/src/de/steamwar/lobby/portal/TeleportPortal.java b/src/de/steamwar/lobby/portal/TeleportPortal.java index 0f2b4af..b938b3a 100644 --- a/src/de/steamwar/lobby/portal/TeleportPortal.java +++ b/src/de/steamwar/lobby/portal/TeleportPortal.java @@ -22,6 +22,8 @@ package de.steamwar.lobby.portal; import de.steamwar.lobby.listener.Portals; import org.bukkit.Location; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.util.Vector; import java.util.*; @@ -62,7 +64,39 @@ public class TeleportPortal implements PortalHandler { } protected void teleport(Player player, Location from, Portal target) { - player.sendMessage("Symbolisierter teleport zu " + target.getId()); + Vector vector = from.toVector(); + + double yaw = from.getYaw(); + Vector lookVector = Portal.NORMAL.clone().rotateAroundY(Math.toRadians(yaw)).normalize(); + double portalDegreeDelta = portal.degree - Portal.NORMAL.angle(lookVector); + // System.out.println(Math.toDegrees(degree) + " " + Math.toDegrees(portalDegreeDelta) + " " + Math.toDegrees(destination.degree)); + + double relativeSectionX = vector.clone().subtract(portal.v1).getX() / portal.dv.getX(); + double relativeSectionZ = vector.clone().subtract(portal.v1).getZ() / portal.dv.getZ(); + double relativeHeight = (vector.getY() - portal.v1.getY()) / portal.dv.getY(); + + + Vector destinationSection = target.v1.clone(); + Vector now = target.dv.clone(); + if (Double.isFinite(relativeSectionX)) { + now.setX(now.getX() * relativeSectionX); + } + if (Double.isFinite(relativeSectionZ)) { + now.setZ(now.getZ() * relativeSectionZ); + } + destinationSection.add(now); + Vector v = destinationSection.clone(); + v.setX(v.getBlockX()); + v.setY(target.v1.getY()); + v.setZ(v.getBlockZ()); + + double destinationHeight = portal.dv.getY() * relativeHeight; + + Location location = destinationSection.toLocation(from.getWorld()); + location.setPitch(from.getPitch()); + location.setYaw((float) Math.toDegrees(target.degree + portalDegreeDelta)); + location.add(0, destinationHeight, 0); + player.teleport(location, PlayerTeleportEvent.TeleportCause.PLUGIN); } @Override