Gives all passengers the same exit velocity as the root vehicle

This commit is contained in:
Kristian Knarvik 2022-02-09 16:23:45 +01:00
parent a481ccf017
commit 5f4a90aabb
4 changed files with 22 additions and 10 deletions

View File

@ -49,6 +49,10 @@ public class PlayerTeleporter extends Teleporter {
} }
} }
//Calculate the exit velocity of the player
Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw());
Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity());
//Load chunks to make sure not to teleport to the void //Load chunks to make sure not to teleport to the void
loadChunks(); loadChunks();
@ -56,7 +60,7 @@ public class PlayerTeleporter extends Teleporter {
TeleportHelper.teleportLeashedCreatures(player, origin, portal); TeleportHelper.teleportLeashedCreatures(player, origin, portal);
if (player.eject()) { if (player.eject()) {
TeleportHelper.handleEntityPassengers(passengers, player, origin, portal, exit.getDirection()); TeleportHelper.handleEntityPassengers(passengers, player, origin, portal, exit.getDirection(), newVelocity);
} }
//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
@ -69,8 +73,6 @@ public class PlayerTeleporter extends Teleporter {
//Set the velocity of the teleported player after the teleportation is finished //Set the velocity of the teleported player after the teleportation is finished
Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw());
Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity());
player.setVelocity(newVelocity); player.setVelocity(newVelocity);
}, 1); }, 1);
} }

View File

@ -19,6 +19,7 @@ import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.util.Vector;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -83,7 +84,8 @@ public abstract class Teleporter {
loadChunks(); loadChunks();
if (teleportedEntity.eject()) { if (teleportedEntity.eject()) {
TeleportHelper.handleEntityPassengers(passengers, teleportedEntity, origin, portal, exit.getDirection()); TeleportHelper.handleEntityPassengers(passengers, teleportedEntity, origin, portal, exit.getDirection(),
new Vector());
} }
teleportedEntity.teleport(exit); teleportedEntity.teleport(exit);
return true; return true;

View File

@ -133,7 +133,8 @@ public class VehicleTeleporter extends EntityTeleporter {
*/ */
private void teleportVehicle(List<Entity> passengers, Location exit, Vector newVelocity, Portal origin) { private void teleportVehicle(List<Entity> passengers, Location exit, Vector newVelocity, Portal origin) {
if (teleportingVehicle.eject()) { if (teleportingVehicle.eject()) {
TeleportHelper.handleEntityPassengers(passengers, teleportingVehicle, origin, portal, exit.getDirection()); TeleportHelper.handleEntityPassengers(passengers, teleportingVehicle, origin, portal, exit.getDirection(),
newVelocity);
} }
Stargate.debug("VehicleTeleporter::teleportVehicle", "Teleporting " + teleportingVehicle + Stargate.debug("VehicleTeleporter::teleportVehicle", "Teleporting " + teleportingVehicle +
" to final location " + exit + " with direction " + exit.getDirection()); " to final location " + exit + " with direction " + exit.getDirection());
@ -172,7 +173,8 @@ public class VehicleTeleporter extends EntityTeleporter {
} }
//Remove the old vehicle //Remove the old vehicle
if (teleportingVehicle.eject()) { if (teleportingVehicle.eject()) {
TeleportHelper.handleEntityPassengers(passengers, newVehicle, origin, portal, exit.getDirection()); TeleportHelper.handleEntityPassengers(passengers, newVehicle, origin, portal, exit.getDirection(),
newVelocity);
} }
teleportingVehicle.remove(); teleportingVehicle.remove();
scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> newVehicle.setVelocity(newVelocity), 1); scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> newVehicle.setVelocity(newVelocity), 1);

View File

@ -79,8 +79,10 @@ public final class TeleportHelper {
* @param targetVehicle <p>The entity to add the passenger to</p> * @param targetVehicle <p>The entity to add the passenger to</p>
* @param passenger <p>The passenger to teleport and add</p> * @param passenger <p>The passenger to teleport and add</p>
* @param exitDirection <p>The direction of any passengers exiting the stargate</p> * @param exitDirection <p>The direction of any passengers exiting the stargate</p>
* @param newVelocity <p>The new velocity of the teleported passenger</p>
*/ */
public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection) { public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection,
Vector newVelocity) {
Location passengerExit = targetVehicle.getLocation().clone().setDirection(exitDirection); Location passengerExit = targetVehicle.getLocation().clone().setDirection(exitDirection);
if (!passenger.teleport(passengerExit)) { if (!passenger.teleport(passengerExit)) {
Stargate.debug("TeleportHelper::handleVehiclePassengers", "Failed to teleport passenger" + Stargate.debug("TeleportHelper::handleVehiclePassengers", "Failed to teleport passenger" +
@ -96,6 +98,9 @@ public final class TeleportHelper {
Stargate.debug("TeleportHelper::handleVehiclePassengers", "Added passenger " + passenger + Stargate.debug("TeleportHelper::handleVehiclePassengers", "Added passenger " + passenger +
" to " + targetVehicle); " to " + targetVehicle);
} }
Stargate.debug("VehicleTeleporter::teleportVehicle", "Setting velocity " + newVelocity +
" for passenger " + passenger);
passenger.setVelocity(newVelocity);
} }
/** /**
@ -106,9 +111,10 @@ public final class TeleportHelper {
* @param origin <p>The portal the entity teleported from</p> * @param origin <p>The portal the entity teleported from</p>
* @param target <p>The portal the entity is teleporting to</p> * @param target <p>The portal the entity is teleporting to</p>
* @param exitRotation <p>The rotation of any passengers exiting the stargate</p> * @param exitRotation <p>The rotation of any passengers exiting the stargate</p>
* @param newVelocity <p>The new velocity of the teleported passengers</p>
*/ */
public static void handleEntityPassengers(List<Entity> passengers, Entity entity, Portal origin, Portal target, public static void handleEntityPassengers(List<Entity> passengers, Entity entity, Portal origin, Portal target,
Vector exitRotation) { Vector exitRotation, Vector newVelocity) {
for (Entity passenger : passengers) { for (Entity passenger : passengers) {
List<Entity> passengerPassengers = passenger.getPassengers(); List<Entity> passengerPassengers = passenger.getPassengers();
if (!passengerPassengers.isEmpty()) { if (!passengerPassengers.isEmpty()) {
@ -117,14 +123,14 @@ public final class TeleportHelper {
} }
if (passenger.eject()) { if (passenger.eject()) {
//Teleport any passengers of the passenger //Teleport any passengers of the passenger
handleEntityPassengers(passengerPassengers, passenger, origin, target, exitRotation); handleEntityPassengers(passengerPassengers, passenger, origin, target, exitRotation, newVelocity);
} }
Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
if (passenger instanceof Player player) { if (passenger instanceof Player player) {
//Teleport any creatures leashed by the player in a 15-block range //Teleport any creatures leashed by the player in a 15-block range
teleportLeashedCreatures(player, origin, target); teleportLeashedCreatures(player, origin, target);
} }
teleportAndAddPassenger(entity, passenger, exitRotation); teleportAndAddPassenger(entity, passenger, exitRotation, newVelocity);
}, passenger instanceof Player ? Stargate.getGateConfig().waitForPlayerAfterTeleportDelay() : 0); }, passenger instanceof Player ? Stargate.getGateConfig().waitForPlayerAfterTeleportDelay() : 0);
} }
} }