Implement teleport in TeleportPortal
Dieser Commit ist enthalten in:
Ursprung
fe6e963d4c
Commit
8b1c74e31d
@ -32,6 +32,7 @@ public class Portal implements PortalHandler, ConfigurationSerializable {
|
||||
|
||||
private static final Map<String, Portal> portals = new HashMap<>();
|
||||
private static final Map<Vector, Portal> posMap = new HashMap<>();
|
||||
public static final Vector NORMAL = new Vector(0, 0, 1);
|
||||
|
||||
public static List<Portal> 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<String, Object> 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
|
||||
|
@ -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
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren