Fixes some old bugs and renames rotX to yaw
Fixes the direction of minecarts sent through a portal. This prevent the minecarts to go back through the portal and causing a lot of confusion
This commit is contained in:
		@@ -70,13 +70,13 @@ public class BlockLocation extends Location {
 | 
			
		||||
     * @param x    <p>The x position relative to this block's position</p>
 | 
			
		||||
     * @param y    <p>The y position relative to this block's position</p>
 | 
			
		||||
     * @param z    <p>The z position relative to this block's position</p>
 | 
			
		||||
     * @param rotX <p>The x rotation of the location</p>
 | 
			
		||||
     * @param yaw <p>The yaw of the location</p>
 | 
			
		||||
     * @param rotY <p>The y rotation of the location</p>
 | 
			
		||||
     * @return <p>A new location</p>
 | 
			
		||||
     */
 | 
			
		||||
    public Location makeRelativeLoc(double x, double y, double z, float rotX, float rotY) {
 | 
			
		||||
    public Location makeRelativeLoc(double x, double y, double z, float yaw, float rotY) {
 | 
			
		||||
        Location newLocation = this.clone();
 | 
			
		||||
        newLocation.setYaw(rotX);
 | 
			
		||||
        newLocation.setYaw(yaw);
 | 
			
		||||
        newLocation.setPitch(rotY);
 | 
			
		||||
        return newLocation.add(x, y, z);
 | 
			
		||||
    }
 | 
			
		||||
@@ -105,15 +105,15 @@ public class BlockLocation extends Location {
 | 
			
		||||
     * @param right    <p></p>
 | 
			
		||||
     * @param depth    <p>The y position relative to the current position</p>
 | 
			
		||||
     * @param distance <p>The distance away from the previous location to the new location</p>
 | 
			
		||||
     * @param rotX     <p>The yaw of the location</p>
 | 
			
		||||
     * @param yaw     <p>The yaw of the location</p>
 | 
			
		||||
     * @param rotY     <p>Unused</p>
 | 
			
		||||
     * @param modX     <p>x modifier. Defines movement along the x-axis. 0 for no movement</p>
 | 
			
		||||
     * @param modY     <p>Unused</p>
 | 
			
		||||
     * @param modZ     <p>z modifier. Defines movement along the z-axis. 0 for no movement</p>
 | 
			
		||||
     * @return A new location relative to this block location
 | 
			
		||||
     */
 | 
			
		||||
    public Location modRelativeLoc(double right, double depth, double distance, float rotX, float rotY, int modX, int modY, int modZ) {
 | 
			
		||||
        return makeRelativeLoc(0.5 + -right * modX + distance * modZ, depth, 0.5 + -right * modZ + -distance * modX, rotX, 0);
 | 
			
		||||
    public Location modRelativeLoc(double right, double depth, double distance, float yaw, float rotY, int modX, int modY, int modZ) {
 | 
			
		||||
        return makeRelativeLoc(0.5 + -right * modX + distance * modZ, depth, 0.5 + -right * modZ + -distance * modX, yaw, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ import net.knarcraft.stargate.listener.BungeeCordListener;
 | 
			
		||||
import net.knarcraft.stargate.listener.EntityEventListener;
 | 
			
		||||
import net.knarcraft.stargate.listener.PlayerEventListener;
 | 
			
		||||
import net.knarcraft.stargate.listener.PluginEventListener;
 | 
			
		||||
import net.knarcraft.stargate.listener.PortalEventListener;
 | 
			
		||||
import net.knarcraft.stargate.listener.VehicleEventListener;
 | 
			
		||||
import net.knarcraft.stargate.listener.WorldEventListener;
 | 
			
		||||
import net.knarcraft.stargate.portal.Gate;
 | 
			
		||||
@@ -540,6 +541,7 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
 | 
			
		||||
        pm.registerEvents(new VehicleEventListener(), this);
 | 
			
		||||
        pm.registerEvents(new EntityEventListener(), this);
 | 
			
		||||
        pm.registerEvents(new PortalEventListener(), this);
 | 
			
		||||
        pm.registerEvents(new WorldEventListener(), this);
 | 
			
		||||
        pm.registerEvents(new PluginEventListener(this), this);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,4 +61,5 @@ public class EntityEventListener implements Listener {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ import org.bukkit.event.Event;
 | 
			
		||||
import org.bukkit.event.EventHandler;
 | 
			
		||||
import org.bukkit.event.Listener;
 | 
			
		||||
import org.bukkit.event.block.Action;
 | 
			
		||||
import org.bukkit.event.entity.EntityTeleportEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerInteractEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerJoinEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerMoveEvent;
 | 
			
		||||
@@ -84,16 +83,6 @@ public class PlayerEventListener implements Listener {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @EventHandler
 | 
			
		||||
    public void onEntityTeleport(EntityTeleportEvent event) {
 | 
			
		||||
        //Prevent any entities from teleporting through stargates
 | 
			
		||||
        Portal entryPortal = PortalHandler.getByAdjacentEntrance(event.getFrom());
 | 
			
		||||
        Portal exitPortal = PortalHandler.getByAdjacentEntrance(event.getTo());
 | 
			
		||||
        if (!event.isCancelled() && entryPortal != null && exitPortal != null && exitPortal == entryPortal.getDestination()) {
 | 
			
		||||
            event.setCancelled(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This event handler detects if a player moves into a portal
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ public class Portal {
 | 
			
		||||
    private final BlockLocation topLeft;
 | 
			
		||||
    private final int modX;
 | 
			
		||||
    private final int modZ;
 | 
			
		||||
    private final float rotX;
 | 
			
		||||
    private final float yaw;
 | 
			
		||||
    private final Axis rot;
 | 
			
		||||
 | 
			
		||||
    // Block references
 | 
			
		||||
@@ -83,7 +83,7 @@ public class Portal {
 | 
			
		||||
     * @param topLeft     <p>The top-left block of the portal. This is used to decide the positions of the rest of the portal</p>
 | 
			
		||||
     * @param modX        <p></p>
 | 
			
		||||
     * @param modZ        <p></p>
 | 
			
		||||
     * @param rotX        <p></p>
 | 
			
		||||
     * @param yaw        <p></p>
 | 
			
		||||
     * @param id          <p>The location of the portal's id block, which is the sign which activated the portal</p>
 | 
			
		||||
     * @param button      <p>The location of the portal's open button</p>
 | 
			
		||||
     * @param destination <p>The destination defined on the sign's destination line</p>
 | 
			
		||||
@@ -95,14 +95,14 @@ public class Portal {
 | 
			
		||||
     * @param ownerName   <p>The name of the gate's owner</p>
 | 
			
		||||
     * @param options     <p>A map containing all possible portal options</p>
 | 
			
		||||
     */
 | 
			
		||||
    Portal(BlockLocation topLeft, int modX, int modZ, float rotX, BlockLocation id, BlockLocation button,
 | 
			
		||||
    Portal(BlockLocation topLeft, int modX, int modZ, float yaw, BlockLocation id, BlockLocation button,
 | 
			
		||||
           String destination, String name, boolean verified, String network, Gate gate, UUID ownerUUID,
 | 
			
		||||
           String ownerName, Map<PortalOption, Boolean> options) {
 | 
			
		||||
        this.topLeft = topLeft;
 | 
			
		||||
        this.modX = modX;
 | 
			
		||||
        this.modZ = modZ;
 | 
			
		||||
        this.rotX = rotX;
 | 
			
		||||
        this.rot = rotX == 0.0F || rotX == 180.0F ? Axis.X : Axis.Z;
 | 
			
		||||
        this.yaw = yaw;
 | 
			
		||||
        this.rot = yaw == 0.0F || yaw == 180.0F ? Axis.X : Axis.Z;
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.destination = destination;
 | 
			
		||||
        this.button = button;
 | 
			
		||||
@@ -229,7 +229,7 @@ public class Portal {
 | 
			
		||||
     * @return <p>The rotation of the portal</p>
 | 
			
		||||
     */
 | 
			
		||||
    public float getRotation() {
 | 
			
		||||
        return rotX;
 | 
			
		||||
        return yaw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -653,13 +653,13 @@ public class Portal {
 | 
			
		||||
        Location exit = getExit(player, traveller);
 | 
			
		||||
 | 
			
		||||
        //Rotate the player to face out from the portal
 | 
			
		||||
        adjustRotation(traveller, exit, origin);
 | 
			
		||||
        adjustRotation(exit, origin);
 | 
			
		||||
 | 
			
		||||
        //Call the StargatePortalEvent to allow plugins to change destination
 | 
			
		||||
        if (!origin.equals(this)) {
 | 
			
		||||
            StargatePortalEvent stargatePortalEvent = new StargatePortalEvent(player, origin, this, exit);
 | 
			
		||||
            Stargate.server.getPluginManager().callEvent(stargatePortalEvent);
 | 
			
		||||
            // Teleport is cancelled
 | 
			
		||||
            //Teleport is cancelled. Teleport the player back to where it came from
 | 
			
		||||
            if (stargatePortalEvent.isCancelled()) {
 | 
			
		||||
                origin.teleport(player, origin, event);
 | 
			
		||||
                return;
 | 
			
		||||
@@ -672,7 +672,6 @@ public class Portal {
 | 
			
		||||
 | 
			
		||||
        // If no event is passed in, assume it's a teleport, and act as such
 | 
			
		||||
        if (event == null) {
 | 
			
		||||
            exit.setYaw(this.getRotation());
 | 
			
		||||
            player.teleport(exit);
 | 
			
		||||
        } else {
 | 
			
		||||
            // The new method to teleport in a move event is set the "to" field.
 | 
			
		||||
@@ -683,16 +682,17 @@ public class Portal {
 | 
			
		||||
    /**
 | 
			
		||||
     * Adjusts the rotation of the player to face out from the portal
 | 
			
		||||
     *
 | 
			
		||||
     * @param entry  <p>The location the player entered from</p>
 | 
			
		||||
     * @param exit   <p>The location the player will exit from</p>
 | 
			
		||||
     * @param origin <p>The portal the player entered from</p>
 | 
			
		||||
     */
 | 
			
		||||
    private void adjustRotation(Location entry, Location exit, Portal origin) {
 | 
			
		||||
        int adjust = 180;
 | 
			
		||||
    private void adjustRotation(Location exit, Portal origin) {
 | 
			
		||||
        int adjust = 0;
 | 
			
		||||
        if (isBackwards() != origin.isBackwards()) {
 | 
			
		||||
            adjust = 0;
 | 
			
		||||
            adjust = 180;
 | 
			
		||||
        }
 | 
			
		||||
        exit.setYaw(entry.getYaw() - origin.getRotation() + this.getRotation() + adjust);
 | 
			
		||||
        float newYaw = (this.getRotation() + adjust) % 360;
 | 
			
		||||
        Stargate.debug("Portal::adjustRotation", "Setting exit yaw to " + newYaw);
 | 
			
		||||
        exit.setYaw(newYaw);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -711,11 +711,9 @@ public class Portal {
 | 
			
		||||
        vehicle.setVelocity(new Vector());
 | 
			
		||||
 | 
			
		||||
        //Get new velocity
 | 
			
		||||
        final Vector newVelocity = new Vector(modX, 0.0F, modZ);
 | 
			
		||||
        //-z
 | 
			
		||||
        Stargate.debug("teleport", modX + " " + modZ);
 | 
			
		||||
        newVelocity.multiply(velocity);
 | 
			
		||||
        adjustRotation(traveller, exit, origin);
 | 
			
		||||
        Vector newVelocityDirection = getVectorFromYaw(this.getRotation());
 | 
			
		||||
        Vector newVelocity = newVelocityDirection.multiply(velocity);
 | 
			
		||||
        adjustRotation(exit, origin);
 | 
			
		||||
 | 
			
		||||
        List<Entity> passengers = vehicle.getPassengers();
 | 
			
		||||
        World vehicleWorld = exit.getWorld();
 | 
			
		||||
@@ -739,6 +737,30 @@ public class Portal {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a direction vector given a yaw
 | 
			
		||||
     * @param yaw <p>The yaw to use</p>
 | 
			
		||||
     * @return <p>The direction vector of the yaw</p>
 | 
			
		||||
     */
 | 
			
		||||
    private Vector getVectorFromYaw(double yaw) {
 | 
			
		||||
        while (yaw < 0) {
 | 
			
		||||
            yaw += 360;
 | 
			
		||||
        }
 | 
			
		||||
        yaw = yaw % 360;
 | 
			
		||||
 | 
			
		||||
        if (yaw == 0) {
 | 
			
		||||
            return new Vector(0, 0, 1);
 | 
			
		||||
        } else if (yaw == 90) {
 | 
			
		||||
            return new Vector(-1, 0, 0);
 | 
			
		||||
        } else if (yaw == 180) {
 | 
			
		||||
            return new Vector(0, 0, -1);
 | 
			
		||||
        } else if (yaw == 270) {
 | 
			
		||||
            return new Vector(1, 0, 0);
 | 
			
		||||
        } else {
 | 
			
		||||
            throw new IllegalArgumentException("Invalid yaw given");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Teleport a vehicle which is not a minecart or a boat
 | 
			
		||||
     *
 | 
			
		||||
@@ -768,7 +790,8 @@ public class Portal {
 | 
			
		||||
        vehicle.remove();
 | 
			
		||||
        vehicle.setRotation(exit.getYaw(), exit.getPitch());
 | 
			
		||||
        handleVehiclePassengers(passengers, newVehicle);
 | 
			
		||||
        Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> newVehicle.setVelocity(newVelocity), 1);
 | 
			
		||||
        Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate,
 | 
			
		||||
                () -> newVehicle.setVelocity(newVelocity), 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -950,8 +973,8 @@ public class Portal {
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The rotation of this portal</p>
 | 
			
		||||
     */
 | 
			
		||||
    public float getRotX() {
 | 
			
		||||
        return this.rotX;
 | 
			
		||||
    public float getYaw() {
 | 
			
		||||
        return this.yaw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -237,24 +237,24 @@ public class PortalHandler {
 | 
			
		||||
        // Moved the layout check so as to avoid invalid messages when not making a gate
 | 
			
		||||
        int modX = 0;
 | 
			
		||||
        int modZ = 0;
 | 
			
		||||
        float rotX = 0f;
 | 
			
		||||
        float yaw = 0f;
 | 
			
		||||
        BlockFace buttonFacing = BlockFace.DOWN;
 | 
			
		||||
 | 
			
		||||
        if (idParent.getX() > id.getBlock().getX()) {
 | 
			
		||||
            modZ -= 1;
 | 
			
		||||
            rotX = 90f;
 | 
			
		||||
            yaw = 90f;
 | 
			
		||||
            buttonFacing = BlockFace.WEST;
 | 
			
		||||
        } else if (idParent.getX() < id.getBlock().getX()) {
 | 
			
		||||
            modZ += 1;
 | 
			
		||||
            rotX = 270f;
 | 
			
		||||
            yaw = 270f;
 | 
			
		||||
            buttonFacing = BlockFace.EAST;
 | 
			
		||||
        } else if (idParent.getZ() > id.getBlock().getZ()) {
 | 
			
		||||
            modX += 1;
 | 
			
		||||
            rotX = 180f;
 | 
			
		||||
            yaw = 180f;
 | 
			
		||||
            buttonFacing = BlockFace.NORTH;
 | 
			
		||||
        } else if (idParent.getZ() < id.getBlock().getZ()) {
 | 
			
		||||
            modX -= 1;
 | 
			
		||||
            rotX = 0f;
 | 
			
		||||
            yaw = 0f;
 | 
			
		||||
            buttonFacing = BlockFace.SOUTH;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -376,7 +376,7 @@ public class PortalHandler {
 | 
			
		||||
 | 
			
		||||
        BlockLocation button = null;
 | 
			
		||||
        Portal portal;
 | 
			
		||||
        portal = new Portal(topLeft, modX, modZ, rotX, id, button, destinationName, name, false, network,
 | 
			
		||||
        portal = new Portal(topLeft, modX, modZ, yaw, id, button, destinationName, name, false, network,
 | 
			
		||||
                gate, player.getUniqueId(), player.getName(), portalOptions);
 | 
			
		||||
 | 
			
		||||
        int cost = Stargate.getCreateCost(player, gate);
 | 
			
		||||
@@ -654,7 +654,7 @@ public class PortalHandler {
 | 
			
		||||
                builder.append(':');
 | 
			
		||||
                builder.append(portal.getModZ());
 | 
			
		||||
                builder.append(':');
 | 
			
		||||
                builder.append(portal.getRotX());
 | 
			
		||||
                builder.append(portal.getYaw());
 | 
			
		||||
                builder.append(':');
 | 
			
		||||
                builder.append(portal.getTopLeft().toString());
 | 
			
		||||
                builder.append(':');
 | 
			
		||||
@@ -829,7 +829,7 @@ public class PortalHandler {
 | 
			
		||||
        BlockLocation button = (portalData[2].length() > 0) ? new BlockLocation(world, portalData[2]) : null;
 | 
			
		||||
        int modX = Integer.parseInt(portalData[3]);
 | 
			
		||||
        int modZ = Integer.parseInt(portalData[4]);
 | 
			
		||||
        float rotX = Float.parseFloat(portalData[5]);
 | 
			
		||||
        float yaw = Float.parseFloat(portalData[5]);
 | 
			
		||||
        BlockLocation topLeft = new BlockLocation(world, portalData[6]);
 | 
			
		||||
        Gate gate = GateHandler.getGateByName(portalData[7]);
 | 
			
		||||
        if (gate == null) {
 | 
			
		||||
@@ -864,7 +864,7 @@ public class PortalHandler {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Creates the new portal
 | 
			
		||||
        Portal portal = new Portal(topLeft, modX, modZ, rotX, sign, button, destination, name, false,
 | 
			
		||||
        Portal portal = new Portal(topLeft, modX, modZ, yaw, sign, button, destination, name, false,
 | 
			
		||||
                network, gate, ownerUUID, ownerName, getPortalOptions(portalData));
 | 
			
		||||
 | 
			
		||||
        registerPortal(portal);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user