Heavily simplifies sign drawing and cleans up vehicle teleportation code

This commit is contained in:
Kristian Knarvik 2021-02-24 17:48:01 +01:00
parent 2b52759e00
commit 378a59586d

View File

@ -490,11 +490,7 @@ public class Portal {
Location exit = getExit(player, traveller); Location exit = getExit(player, traveller);
//Rotate the player to face out from the portal //Rotate the player to face out from the portal
int adjust = 180; adjustRotation(traveller, exit, origin);
if (isBackwards() != origin.isBackwards()) {
adjust = 0;
}
exit.setYaw(traveller.getYaw() - origin.getRotation() + this.getRotation() + adjust);
// Call the StargatePortalEvent to allow plugins to change destination // Call the StargatePortalEvent to allow plugins to change destination
if (!origin.equals(this)) { if (!origin.equals(this)) {
@ -519,15 +515,28 @@ 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;
if (isBackwards() != origin.isBackwards()) {
adjust = 0;
}
exit.setYaw(entry.getYaw() - origin.getRotation() + this.getRotation() + adjust);
}
/** /**
* Teleports a vehicle to this portal * Teleports a vehicle to this portal
* *
* @param vehicle <p>The vehicle to teleport</p> * @param vehicle <p>The vehicle to teleport</p>
*/ */
public void teleport(final Vehicle vehicle) { public void teleport(final Vehicle vehicle) {
Location traveller = new Location(this.world, vehicle.getLocation().getX(), vehicle.getLocation().getY(), Location traveller = vehicle.getLocation();
vehicle.getLocation().getZ());
Stargate.log.info(Stargate.getString("prefix") + "Location of vehicle is " + traveller);
Location exit = getExit(vehicle, traveller); Location exit = getExit(vehicle, traveller);
double velocity = vehicle.getVelocity().length(); double velocity = vehicle.getVelocity().length();
@ -548,36 +557,60 @@ public class Portal {
if (!passengers.isEmpty()) { if (!passengers.isEmpty()) {
if (vehicle instanceof RideableMinecart || vehicle instanceof Boat) { if (vehicle instanceof RideableMinecart || vehicle instanceof Boat) {
putPlayerInNewVehicle(vehicle, passengers, vehicleWorld, exit, newVelocity); putPassengersInNewVehicle(vehicle, passengers, vehicleWorld, exit, newVelocity);
return; } else {
} teleportLivingVehicle(vehicle, exit, passengers);
vehicle.eject(); }
handleVehiclePassengers(vehicle, passengers, vehicle, exit);
vehicle.teleport(exit);
Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> vehicle.setVelocity(newVelocity), 3);
} else { } else {
Stargate.log.info(Stargate.getString("prefix") + "Teleported vehicle to " + exit);
vehicle.teleport(exit); vehicle.teleport(exit);
Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> { Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> vehicle.setVelocity(newVelocity), 1);
vehicle.setVelocity(newVelocity);
}, 1);
} }
} }
private void putPlayerInNewVehicle(Vehicle vehicle, List<Entity> passengers, World vehicleWorld, Location exit, Vector newVelocity) { /**
* Teleport a vehicle which is not a minecart or a boat
*
* @param vehicle <p>The vehicle to teleport</p>
* @param exit <p>The location the vehicle will exit</p>
* @param passengers <p>The passengers of the vehicle</p>
*/
private void teleportLivingVehicle(Vehicle vehicle, Location exit, List<Entity> passengers) {
vehicle.eject();
vehicle.teleport(exit);
handleVehiclePassengers(passengers, vehicle, exit);
}
/**
* Creates a new vehicle equal to the player's previous vehicle and
*
* @param vehicle <p>The player's old vehicle</p>
* @param passengers <p>A list of all passengers in the vehicle</p>
* @param vehicleWorld <p>The world to spawn the new vehicle in</p>
* @param exit <p>The exit location to spawn the new vehicle on</p>
* @param newVelocity <p>The new velocity of the new vehicle</p>
*/
private void putPassengersInNewVehicle(Vehicle vehicle, List<Entity> passengers, World vehicleWorld, Location exit,
Vector newVelocity) {
Vehicle newVehicle = vehicleWorld.spawn(exit, vehicle.getClass()); Vehicle newVehicle = vehicleWorld.spawn(exit, vehicle.getClass());
vehicle.eject(); vehicle.eject();
vehicle.remove(); vehicle.remove();
handleVehiclePassengers(vehicle, passengers, newVehicle, exit); vehicle.setRotation(exit.getYaw(), exit.getPitch());
handleVehiclePassengers(passengers, newVehicle, exit);
Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> newVehicle.setVelocity(newVelocity), 1); Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> newVehicle.setVelocity(newVelocity), 1);
} }
private void handleVehiclePassengers(Vehicle sourceVehicle, List<Entity> passengers, Vehicle targetVehicle, Location exit) { /**
* Ejects, teleports and adds all passengers to the target vehicle
*
* @param passengers <p>The passengers to handle</p>
* @param targetVehicle <p>The vehicle the passengers should be put into</p>
* @param exit <p>The exit location to teleport the passengers to</p>
*/
private void handleVehiclePassengers(List<Entity> passengers, Vehicle targetVehicle, Location exit) {
for (Entity passenger : passengers) { for (Entity passenger : passengers) {
passenger.eject(); passenger.eject();
Stargate.log.info("Teleporting passenger" + passenger + " to " + exit);
if (!passenger.teleport(exit)) { if (!passenger.teleport(exit)) {
Stargate.log.info("Failed to teleport passenger"); Stargate.debug("handleVehiclePassengers", "Failed to teleport passenger");
} }
Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> targetVehicle.addPassenger(passenger), 1); Stargate.server.getScheduler().scheduleSyncDelayedTask(Stargate.stargate, () -> targetVehicle.addPassenger(passenger), 1);
} }
@ -590,7 +623,7 @@ public class Portal {
* @param traveller <p>The location of the entity travelling</p> * @param traveller <p>The location of the entity travelling</p>
* @return <p>The location the entity should be teleported to.</p> * @return <p>The location the entity should be teleported to.</p>
*/ */
public Location getExit(Entity entity, Location traveller) { private Location getExit(Entity entity, Location traveller) {
Location exitLocation = null; Location exitLocation = null;
// Check if the gate has an exit block // Check if the gate has an exit block
if (gate.getLayout().getExit() != null) { if (gate.getLayout().getExit() != null) {
@ -790,6 +823,9 @@ public class Portal {
drawSign(); drawSign();
} }
/**
* Draws the sign on this portal
*/
public final void drawSign() { public final void drawSign() {
BlockState state = id.getBlock().getState(); BlockState state = id.getBlock().getState();
if (!(state instanceof Sign)) { if (!(state instanceof Sign)) {
@ -797,97 +833,150 @@ public class Portal {
Stargate.debug("Portal::drawSign", "Block: " + id.getBlock().getType() + " @ " + id.getBlock().getLocation()); Stargate.debug("Portal::drawSign", "Block: " + id.getBlock().getType() + " @ " + id.getBlock().getLocation());
return; return;
} }
Sign sign = (Sign) state; Sign sign = (Sign) state;
//Clear sign
for (int index = 0; index <= 3; index++) {
sign.setLine(index, "");
}
Stargate.setLine(sign, 0, "-" + name + "-"); Stargate.setLine(sign, 0, "-" + name + "-");
int max = destinations.size() - 1;
int done = 0;
if (!isActive()) { if (!isActive()) {
Stargate.setLine(sign, ++done, Stargate.getString("signRightClick")); //Default sign text
Stargate.setLine(sign, ++done, Stargate.getString("signToUse")); drawInactiveSign(sign);
if (!isNoNetwork()) {
Stargate.setLine(sign, ++done, "(" + network + ")");
}
} else { } else {
// Awesome new logic for Bungee gates
if (isBungee()) { if (isBungee()) {
Stargate.setLine(sign, ++done, Stargate.getString("bungeeSign")); //Bungee sign
Stargate.setLine(sign, ++done, ">" + destination + "<"); drawBungeeSign(sign);
Stargate.setLine(sign, ++done, "[" + network + "]");
} else if (isFixed()) { } else if (isFixed()) {
if (isRandom()) { //Sign pointing at one other portal
Stargate.setLine(sign, ++done, "> " + Stargate.getString("signRandom") + " <"); drawFixedSign(sign);
} else { } else {
Stargate.setLine(sign, ++done, ">" + destination + "<"); //Networking stuff
drawNetworkSign(sign);
} }
if (isNoNetwork()) {
Stargate.setLine(sign, ++done, "");
} else {
Stargate.setLine(sign, ++done, "(" + network + ")");
}
Portal dest = PortalHandler.getByName(destination, network);
if (dest == null && !isRandom()) {
Stargate.setLine(sign, ++done, Stargate.getString("signDisconnected"));
} else {
Stargate.setLine(sign, ++done, "");
}
} else {
int index = destinations.indexOf(destination);
if ((index == max) && (max > 1) && (++done <= 3)) {
if (EconomyHandler.useEconomy() && EconomyHandler.freeGatesGreen) {
Portal dest = PortalHandler.getByName(destinations.get(index - 2), network);
boolean green = Stargate.isFree(activePlayer, this, dest);
Stargate.setLine(sign, done, (green ? ChatColor.DARK_GREEN : "") + destinations.get(index - 2));
} else {
Stargate.setLine(sign, done, destinations.get(index - 2));
}
}
if ((index > 0) && (++done <= 3)) {
if (EconomyHandler.useEconomy() && EconomyHandler.freeGatesGreen) {
Portal dest = PortalHandler.getByName(destinations.get(index - 1), network);
boolean green = Stargate.isFree(activePlayer, this, dest);
Stargate.setLine(sign, done, (green ? ChatColor.DARK_GREEN : "") + destinations.get(index - 1));
} else {
Stargate.setLine(sign, done, destinations.get(index - 1));
}
}
if (++done <= 3) {
if (EconomyHandler.useEconomy() && EconomyHandler.freeGatesGreen) {
Portal dest = PortalHandler.getByName(destination, network);
boolean green = Stargate.isFree(activePlayer, this, dest);
Stargate.setLine(sign, done, (green ? ChatColor.DARK_GREEN : "") + ">" + destination + "<");
} else {
Stargate.setLine(sign, done, " >" + destination + "< ");
}
}
if ((max >= index + 1) && (++done <= 3)) {
if (EconomyHandler.useEconomy() && EconomyHandler.freeGatesGreen) {
Portal dest = PortalHandler.getByName(destinations.get(index + 1), network);
boolean green = Stargate.isFree(activePlayer, this, dest);
Stargate.setLine(sign, done, (green ? ChatColor.DARK_GREEN : "") + destinations.get(index + 1));
} else {
Stargate.setLine(sign, done, destinations.get(index + 1));
}
}
if ((max >= index + 2) && (++done <= 3)) {
if (EconomyHandler.useEconomy() && EconomyHandler.freeGatesGreen) {
Portal dest = PortalHandler.getByName(destinations.get(index + 2), network);
boolean green = Stargate.isFree(activePlayer, this, dest);
Stargate.setLine(sign, done, (green ? ChatColor.DARK_GREEN : "") + destinations.get(index + 2));
} else {
Stargate.setLine(sign, done, destinations.get(index + 2));
}
}
}
}
for (done++; done <= 3; done++) {
sign.setLine(done, "");
} }
sign.update(); sign.update();
} }
/**
* Draws a sign with chooseable network locations
*
* @param sign <p>The sign to draw on</p>
*/
private void drawNetworkSign(Sign sign) {
int maxIndex = destinations.size() - 1;
int signLineIndex = 0;
int destinationIndex = destinations.indexOf(destination);
boolean freeGatesGreen = EconomyHandler.useEconomy() && EconomyHandler.freeGatesGreen;
//Last entry, and not only entry. Draw the entry two previously
if ((destinationIndex == maxIndex) && (maxIndex > 1)) {
drawNetworkSignLine(freeGatesGreen, sign, ++signLineIndex, destinationIndex - 2);
}
//Not first entry. Draw the previous entry
if (destinationIndex > 0) {
drawNetworkSignLine(freeGatesGreen, sign, ++signLineIndex, destinationIndex - 1);
}
//Draw the chosen entry (line 2 or 3)
drawNetworkSignChosenLine(freeGatesGreen, sign, ++signLineIndex);
//Has another entry and space on the sign
if ((maxIndex >= destinationIndex + 1) && (++signLineIndex <= 3)) {
drawNetworkSignLine(freeGatesGreen, sign, signLineIndex, destinationIndex + 1);
}
//Has another entry and space on the sign
if ((maxIndex >= destinationIndex + 2) && (++signLineIndex <= 3)) {
drawNetworkSignLine(freeGatesGreen, sign, signLineIndex, destinationIndex + 2);
}
}
/**
* Draws the chosen destination on one sign line
*
* @param freeGatesGreen <p>Whether to display free gates in a green color</p>
* @param sign <p>The sign to draw on</p>
* @param signLineIndex <p>The line to draw on</p>
*/
private void drawNetworkSignChosenLine(boolean freeGatesGreen, Sign sign, int signLineIndex) {
if (freeGatesGreen) {
Portal destination = PortalHandler.getByName(this.destination, network);
boolean green = Stargate.isFree(activePlayer, this, destination);
Stargate.setLine(sign, signLineIndex, (green ? ChatColor.DARK_GREEN : "") + ">" + this.destination + "<");
} else {
Stargate.setLine(sign, signLineIndex, " >" + destination + "< ");
}
}
/**
* Draws one network destination on one sign line
*
* @param freeGatesGreen <p>Whether to display free gates in a green color</p>
* @param sign <p>The sign to draw on</p>
* @param signLineIndex <p>The line to draw on</p>
* @param destinationIndex <p>The index of the destination to draw</p>
*/
private void drawNetworkSignLine(boolean freeGatesGreen, Sign sign, int signLineIndex, int destinationIndex) {
if (freeGatesGreen) {
Portal destination = PortalHandler.getByName(destinations.get(destinationIndex), network);
boolean green = Stargate.isFree(activePlayer, this, destination);
Stargate.setLine(sign, signLineIndex, (green ? ChatColor.DARK_GREEN : "") + destinations.get(destinationIndex));
} else {
Stargate.setLine(sign, signLineIndex, destinations.get(destinationIndex));
}
}
/**
* Draws a bungee sign
*
* @param sign <p>The sign to draw on</p>
*/
private void drawBungeeSign(Sign sign) {
Stargate.setLine(sign, 1, Stargate.getString("bungeeSign"));
Stargate.setLine(sign, 2, ">" + destination + "<");
Stargate.setLine(sign, 3, "[" + network + "]");
}
/**
* Draws an inactive sign
*
* @param sign <p>The sign to draw on</p>
*/
private void drawInactiveSign(Sign sign) {
Stargate.setLine(sign, 1, Stargate.getString("signRightClick"));
Stargate.setLine(sign, 2, Stargate.getString("signToUse"));
if (!isNoNetwork()) {
Stargate.setLine(sign, 3, "(" + network + ")");
} else {
Stargate.setLine(sign, 3, "");
}
}
/**
* Draws a sign pointing to a fixed location
*
* @param sign <p>The sign to draw on</p>
*/
private void drawFixedSign(Sign sign) {
if (isRandom()) {
Stargate.setLine(sign, 1, "> " + Stargate.getString("signRandom") + " <");
} else {
Stargate.setLine(sign, 1, ">" + destination + "<");
}
if (isNoNetwork()) {
Stargate.setLine(sign, 2, "");
} else {
Stargate.setLine(sign, 2, "(" + network + ")");
}
Portal destination = PortalHandler.getByName(this.destination, network);
if (destination == null && !isRandom()) {
Stargate.setLine(sign, 3, Stargate.getString("signDisconnected"));
} else {
Stargate.setLine(sign, 3, "");
}
}
/** /**
* Gets the block at a relative block vector location * Gets the block at a relative block vector location
* *
@ -914,18 +1003,20 @@ public class Portal {
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj) {
return true; return true;
if (obj == null) }
return false; if (obj == null || getClass() != obj.getClass()) {
if (getClass() != obj.getClass())
return false; return false;
}
Portal other = (Portal) obj; Portal other = (Portal) obj;
if (name == null) { if (name == null) {
if (other.name != null) if (other.name != null) {
return false; return false;
} else if (!name.equalsIgnoreCase(other.name)) }
} else if (!name.equalsIgnoreCase(other.name)) {
return false; return false;
}
if (network == null) { if (network == null) {
return other.network == null; return other.network == null;
} else { } else {