Adds some more fixes and improvements for vehicle teleportation
This commit is contained in:
		@@ -12,18 +12,6 @@ public class BloxPopulator {
 | 
				
			|||||||
    private Material nextMat;
 | 
					    private Material nextMat;
 | 
				
			||||||
    private Axis nextAxis;
 | 
					    private Axis nextAxis;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Instantiates a new block populator
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param blockLocation <p>The location to start from</p>
 | 
					 | 
				
			||||||
     * @param material      <p>The material to populate</p>
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public BloxPopulator(BlockLocation blockLocation, Material material) {
 | 
					 | 
				
			||||||
        this.blockLocation = blockLocation;
 | 
					 | 
				
			||||||
        nextMat = material;
 | 
					 | 
				
			||||||
        nextAxis = null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Instantiates a new block populator
 | 
					     * Instantiates a new block populator
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,6 +80,7 @@ public class VehicleEventListener implements Listener {
 | 
				
			|||||||
                Stargate.log.warning(Stargate.getString("prefox") + "Unable to find portal destination");
 | 
					                Stargate.log.warning(Stargate.getString("prefox") + "Unable to find portal destination");
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            Stargate.debug("vehicleTeleport", destinationPortal.getWorld() + " " + destinationPortal.getId());
 | 
				
			||||||
            destinationPortal.teleport(vehicle, entrancePortal);
 | 
					            destinationPortal.teleport(vehicle, entrancePortal);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -391,7 +391,7 @@ public class GateHandler {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param gateFolder <p>The folder containing gate config files</p>
 | 
					     * @param gateFolder <p>The folder containing gate config files</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static void populateDefaults(String gateFolder) {
 | 
					    private static void populateDefaults(String gateFolder) {
 | 
				
			||||||
        loadGateFromJar("nethergate.gate", gateFolder);
 | 
					        loadGateFromJar("nethergate.gate", gateFolder);
 | 
				
			||||||
        loadGateFromJar("watergate.gate", gateFolder);
 | 
					        loadGateFromJar("watergate.gate", gateFolder);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,18 @@ public class GateLayout {
 | 
				
			|||||||
        readLayout();
 | 
					        readLayout();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Gets two of the corners of the gate layout creating the smallest box the gate can be contained within
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return <p>Two of the gate's corners</p>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public RelativeBlockVector[] getCorners() {
 | 
				
			||||||
 | 
					        return new RelativeBlockVector[] {
 | 
				
			||||||
 | 
					                new RelativeBlockVector(0, 0, 0),
 | 
				
			||||||
 | 
					                new RelativeBlockVector(layout[0].length - 1, layout.length - 1, 1)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Gets the character array describing this layout
 | 
					     * Gets the character array describing this layout
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,7 @@ import net.knarcraft.stargate.utility.DirectionHelper;
 | 
				
			|||||||
import net.knarcraft.stargate.utility.EntityHelper;
 | 
					import net.knarcraft.stargate.utility.EntityHelper;
 | 
				
			||||||
import net.knarcraft.stargate.utility.SignHelper;
 | 
					import net.knarcraft.stargate.utility.SignHelper;
 | 
				
			||||||
import org.bukkit.Axis;
 | 
					import org.bukkit.Axis;
 | 
				
			||||||
 | 
					import org.bukkit.Chunk;
 | 
				
			||||||
import org.bukkit.Location;
 | 
					import org.bukkit.Location;
 | 
				
			||||||
import org.bukkit.Material;
 | 
					import org.bukkit.Material;
 | 
				
			||||||
import org.bukkit.World;
 | 
					import org.bukkit.World;
 | 
				
			||||||
@@ -38,6 +39,9 @@ import java.util.Random;
 | 
				
			|||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
import java.util.logging.Level;
 | 
					import java.util.logging.Level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This class represents a portal in space which points to one or several other portals
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
public class Portal {
 | 
					public class Portal {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Gate location block info
 | 
					    // Gate location block info
 | 
				
			||||||
@@ -54,6 +58,7 @@ public class Portal {
 | 
				
			|||||||
    private BlockLocation button;
 | 
					    private BlockLocation button;
 | 
				
			||||||
    private BlockLocation[] frame;
 | 
					    private BlockLocation[] frame;
 | 
				
			||||||
    private BlockLocation[] entrances;
 | 
					    private BlockLocation[] entrances;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Gate information
 | 
					    // Gate information
 | 
				
			||||||
    private String name;
 | 
					    private String name;
 | 
				
			||||||
    private String destination;
 | 
					    private String destination;
 | 
				
			||||||
@@ -551,7 +556,7 @@ public class Portal {
 | 
				
			|||||||
        // Close this gate, then the dest gate.
 | 
					        // Close this gate, then the dest gate.
 | 
				
			||||||
        Material closedType = gate.getPortalClosedBlock();
 | 
					        Material closedType = gate.getPortalClosedBlock();
 | 
				
			||||||
        for (BlockLocation inside : getEntrances()) {
 | 
					        for (BlockLocation inside : getEntrances()) {
 | 
				
			||||||
            Stargate.blockPopulatorQueue.add(new BloxPopulator(inside, closedType));
 | 
					            Stargate.blockPopulatorQueue.add(new BloxPopulator(inside, closedType, null));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        updatePortalClosedState();
 | 
					        updatePortalClosedState();
 | 
				
			||||||
@@ -663,6 +668,8 @@ public class Portal {
 | 
				
			|||||||
            exit = stargatePortalEvent.getExit();
 | 
					            exit = stargatePortalEvent.getExit();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        loadChunks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // If no event is passed in, assume it's a teleport, and act as such
 | 
					        // If no event is passed in, assume it's a teleport, and act as such
 | 
				
			||||||
        if (event == null) {
 | 
					        if (event == null) {
 | 
				
			||||||
            exit.setYaw(this.getRotation());
 | 
					            exit.setYaw(this.getRotation());
 | 
				
			||||||
@@ -698,8 +705,6 @@ public class Portal {
 | 
				
			|||||||
        Location traveller = vehicle.getLocation();
 | 
					        Location traveller = vehicle.getLocation();
 | 
				
			||||||
        Location exit = getExit(vehicle, traveller);
 | 
					        Location exit = getExit(vehicle, traveller);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        adjustRotation(traveller, exit, origin);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        double velocity = vehicle.getVelocity().length();
 | 
					        double velocity = vehicle.getVelocity().length();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Stop and teleport
 | 
					        // Stop and teleport
 | 
				
			||||||
@@ -707,7 +712,10 @@ public class Portal {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Get new velocity
 | 
					        // Get new velocity
 | 
				
			||||||
        final Vector newVelocity = new Vector(modX, 0.0F, modZ);
 | 
					        final Vector newVelocity = new Vector(modX, 0.0F, modZ);
 | 
				
			||||||
 | 
					        //-z
 | 
				
			||||||
 | 
					        Stargate.debug("teleport", modX + " " + modZ);
 | 
				
			||||||
        newVelocity.multiply(velocity);
 | 
					        newVelocity.multiply(velocity);
 | 
				
			||||||
 | 
					        adjustRotation(traveller, exit, origin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        List<Entity> passengers = vehicle.getPassengers();
 | 
					        List<Entity> passengers = vehicle.getPassengers();
 | 
				
			||||||
        World vehicleWorld = exit.getWorld();
 | 
					        World vehicleWorld = exit.getWorld();
 | 
				
			||||||
@@ -716,6 +724,8 @@ public class Portal {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        loadChunks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!passengers.isEmpty()) {
 | 
					        if (!passengers.isEmpty()) {
 | 
				
			||||||
            if (vehicle instanceof RideableMinecart || vehicle instanceof Boat) {
 | 
					            if (vehicle instanceof RideableMinecart || vehicle instanceof Boat) {
 | 
				
			||||||
                putPassengersInNewVehicle(vehicle, passengers, vehicleWorld, exit, newVelocity);
 | 
					                putPassengersInNewVehicle(vehicle, passengers, vehicleWorld, exit, newVelocity);
 | 
				
			||||||
@@ -770,6 +780,7 @@ public class Portal {
 | 
				
			|||||||
    private void handleVehiclePassengers(List<Entity> passengers, Vehicle targetVehicle, Location exit) {
 | 
					    private void handleVehiclePassengers(List<Entity> passengers, Vehicle targetVehicle, Location exit) {
 | 
				
			||||||
        for (Entity passenger : passengers) {
 | 
					        for (Entity passenger : passengers) {
 | 
				
			||||||
            passenger.eject();
 | 
					            passenger.eject();
 | 
				
			||||||
 | 
					            //TODO: Fix random java.lang.IllegalStateException: Removing entity while ticking!
 | 
				
			||||||
            if (!passenger.teleport(exit)) {
 | 
					            if (!passenger.teleport(exit)) {
 | 
				
			||||||
                Stargate.debug("handleVehiclePassengers", "Failed to teleport passenger");
 | 
					                Stargate.debug("handleVehiclePassengers", "Failed to teleport passenger");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -794,10 +805,12 @@ public class Portal {
 | 
				
			|||||||
            exitLocation = exit.modRelativeLoc(0D, 0D, 1, traveller.getYaw(),
 | 
					            exitLocation = exit.modRelativeLoc(0D, 0D, 1, traveller.getYaw(),
 | 
				
			||||||
                    traveller.getPitch(), modX * back, 1, modZ * back);
 | 
					                    traveller.getPitch(), modX * back, 1, modZ * back);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (entity != null) {
 | 
				
			||||||
                double entitySize = EntityHelper.getEntityMaxSize(entity);
 | 
					                double entitySize = EntityHelper.getEntityMaxSize(entity);
 | 
				
			||||||
                if (entitySize > 1) {
 | 
					                if (entitySize > 1) {
 | 
				
			||||||
                    exitLocation = preventExitSuffocation(relativeExit, exitLocation, entity);
 | 
					                    exitLocation = preventExitSuffocation(relativeExit, exitLocation, entity);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            Stargate.log.log(Level.WARNING, Stargate.getString("prefix") + "Missing destination point in .gate file " + gate.getFilename());
 | 
					            Stargate.log.log(Level.WARNING, Stargate.getString("prefix") + "Missing destination point in .gate file " + gate.getFilename());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -892,13 +905,16 @@ public class Portal {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Checks whether the chunk the portal is located at is loaded
 | 
					     * Loads the chunks at the portal's corners
 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return <p>True if the chunk containing the portal is loaded</p>
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public boolean isChunkLoaded() {
 | 
					    public void loadChunks() {
 | 
				
			||||||
        //TODO: Improve this in the case where the portal sits between two chunks
 | 
					        //TODO: Improve this in the case where the portal sits between two chunks
 | 
				
			||||||
        return getWorld().isChunkLoaded(topLeft.getBlock().getChunk());
 | 
					        for (RelativeBlockVector vector : gate.getLayout().getCorners()) {
 | 
				
			||||||
 | 
					            Chunk chunk = getBlockAt(vector).getChunk();
 | 
				
			||||||
 | 
					            if (!getWorld().isChunkLoaded(chunk)) {
 | 
				
			||||||
 | 
					                chunk.load();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					package net.knarcraft.stargate.portal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class PortalDirection {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -15,7 +15,6 @@ import be.seeseemelk.mockbukkit.MockBukkit;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class GateLayoutTest {
 | 
					public class GateLayoutTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,7 +39,7 @@ public class GateLayoutTest {
 | 
				
			|||||||
        expected.add(new RelativeBlockVector(1, 3, 0));
 | 
					        expected.add(new RelativeBlockVector(1, 3, 0));
 | 
				
			||||||
        expected.add(new RelativeBlockVector(2, 3, 0));
 | 
					        expected.add(new RelativeBlockVector(2, 3, 0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Set<RelativeBlockVector> exits = layout.getExits().keySet();
 | 
					        List<RelativeBlockVector> exits = layout.getExits();
 | 
				
			||||||
        exits.forEach((blockVector) -> assertTrue(expected.contains(blockVector)));
 | 
					        exits.forEach((blockVector) -> assertTrue(expected.contains(blockVector)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user