Make PassengerUtil non static.

Some more handling of multiple passengers, incomplete.
This commit is contained in:
asofold 2017-04-02 20:05:59 +02:00
parent 30c3a40622
commit 5e751e492b
2 changed files with 51 additions and 26 deletions

View File

@ -53,7 +53,7 @@ import fr.neatmonster.nocheatplus.checks.moving.velocity.SimpleEntry;
import fr.neatmonster.nocheatplus.components.entity.IEntityAccessLastPositionAndLook;
import fr.neatmonster.nocheatplus.components.location.IGetLocationWithLook;
import fr.neatmonster.nocheatplus.components.location.SimplePositionWithLook;
import fr.neatmonster.nocheatplus.components.registry.event.IGenericInstanceHandle;
import fr.neatmonster.nocheatplus.components.registry.event.IHandle;
import fr.neatmonster.nocheatplus.logging.StaticLog;
import fr.neatmonster.nocheatplus.logging.Streams;
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
@ -100,10 +100,11 @@ public class VehicleChecks extends CheckListener {
/** Auxiliary functionality. */
private final AuxMoving aux = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstance(AuxMoving.class);
private final PassengerUtil passengerUtil = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstance(PassengerUtil.class);
/** Access last position fields for an entity. Updated on setMCAccess. */
// TODO: Useless.
private final IGenericInstanceHandle<IEntityAccessLastPositionAndLook> lastPosLook = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstanceHandle(IEntityAccessLastPositionAndLook.class);
private final IHandle<IEntityAccessLastPositionAndLook> lastPosLook = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstanceHandle(IEntityAccessLastPositionAndLook.class);
/** The vehicle more packets check. */
private final VehicleMorePackets vehicleMorePackets = addCheck(new VehicleMorePackets());
@ -134,7 +135,7 @@ public class VehicleChecks extends CheckListener {
// Do ignore events for vehicles inside of other vehicles.
return;
}
final Player player = PassengerUtil.getFirstPlayerPassenger(vehicle);
final Player player = passengerUtil.getFirstPlayerPassenger(vehicle);
if (player == null) {
return;
}
@ -203,7 +204,7 @@ public class VehicleChecks extends CheckListener {
// Workaround for pigs and other (1.5.x and before)!
// Note that with 1.6 not even PlayerMove fires for horses and pigs.
// (isInsideVehicle is the faster check without object creation, do re-check though, if it changes to only check for Vehicle instances.)
final Entity vehicle = PassengerUtil.getLastNonPlayerVehicle(player);
final Entity vehicle = passengerUtil.getLastNonPlayerVehicle(player);
if (data.debug) {
debug(player, "onPlayerMoveVehicle: vehicle: " + vehicle);
}
@ -271,7 +272,7 @@ public class VehicleChecks extends CheckListener {
// Do ignore events for vehicles inside of other vehicles.
return;
}
final Player player = PassengerUtil.getFirstPlayerPassenger(vehicle);
final Player player = passengerUtil.getFirstPlayerPassenger(vehicle);
if (player == null || player.isDead()) {
return;
}
@ -658,7 +659,7 @@ public class VehicleChecks extends CheckListener {
debug(player, "Vehicle enter: first vehicle: " + vehicle.getClass().getName());
}
// Check for nested vehicles.
final Entity lastVehicle = PassengerUtil.getLastNonPlayerVehicle(vehicle, true);
final Entity lastVehicle = passengerUtil.getLastNonPlayerVehicle(vehicle, true);
if (lastVehicle == null) {
data.clearVehicleData();
if (data.debug) {
@ -761,7 +762,7 @@ public class VehicleChecks extends CheckListener {
public void onVehicleDestroyLowest(final VehicleDestroyEvent event) {
// Prevent destroying ones own vehicle.
final Entity attacker = event.getAttacker();
if (attacker instanceof Player && attacker.equals(event.getVehicle().getPassenger())) {
if (attacker instanceof Player && passengerUtil.isPassenger(attacker, event.getVehicle())) {
final Player player = (Player) attacker;
final MovingData data = MovingData.getData(player);
final MovingConfig cc = MovingConfig.getConfig(player);
@ -778,9 +779,10 @@ public class VehicleChecks extends CheckListener {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onVehicleDestroy(final VehicleDestroyEvent event) {
final Entity entity = event.getVehicle().getPassenger();
if (entity instanceof Player) {
onPlayerVehicleLeave((Player) entity, event.getVehicle());
for (final Entity entity : passengerUtil.handleVehicle.getHandle().getEntityPassengers(event.getVehicle())) {
if (entity instanceof Player) {
onPlayerVehicleLeave((Player) entity, event.getVehicle());
}
}
}

View File

@ -14,32 +14,55 @@
*/
package fr.neatmonster.nocheatplus.utilities.entity;
import java.util.List;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.NCPAPIProvider;
import fr.neatmonster.nocheatplus.components.entity.IEntityAccessVehicle;
import fr.neatmonster.nocheatplus.components.registry.event.IHandle;
/**
* Vehicle/passenger related static utility.
* Vehicle/passenger related static utility. Registered as generic instance for
* now.
*
* @author asofold
*
*/
public class PassengerUtil {
public final IHandle<IEntityAccessVehicle> handleVehicle = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstanceHandle(IEntityAccessVehicle.class);
/**
* Test if the given entity is a passenger of the given vehicle.
*
* @param entity
* @param vehicle
* @return
*/
public boolean isPassenger(final Entity entity, final Entity vehicle) {
return handleVehicle.getHandle().getEntityPassengers(vehicle).contains(entity);
}
/**
* Check getPassenger recursively until a player is found, return that one
* or null.
* or null. This is intended to be the player in charge of steering the
* vehicle.
*
* @param entity
* the entity
* @return the first player passenger
* The vehicle.
* @return The first player found amongst passengers recursively, excludes
* the given entity.
*/
public static Player getFirstPlayerPassenger(final Entity entity) {
Entity passenger = entity.getPassenger();
while (passenger != null){
if (passenger instanceof Player){
return (Player) passenger;
public Player getFirstPlayerPassenger(Entity entity) {
List<Entity> passengers = handleVehicle.getHandle().getEntityPassengers(entity);
while (!passengers.isEmpty()){
entity = passengers.get(0); // The one in charge.
if (entity instanceof Player){
return (Player) entity;
}
passenger = passenger.getPassenger();
passengers = handleVehicle.getHandle().getEntityPassengers(entity);
}
return null;
}
@ -50,9 +73,9 @@ public class PassengerUtil {
*
* @param passenger
* The passenger of vehicles. Typically the player.
* @return the last non player vehicle
* @return Supposedly the vehicle that is steered.
*/
public static Entity getLastNonPlayerVehicle(final Entity passenger) {
public Entity getLastNonPlayerVehicle(final Entity passenger) {
return getLastNonPlayerVehicle(passenger, false);
}
@ -64,11 +87,11 @@ public class PassengerUtil {
* The passenger of vehicles. Typically the player.
* @param includePassenger
* If set to true, the passenger is counted as a vehicle as well
* (meaning: vehicle enter, ther player is not in a vehicle, test
* (meaning: vehicle enter, the player is not in a vehicle, test
* with this set to true and the vehicle returned by the event).
* @return the last non player vehicle
* @return Supposedly the vehicle that is steered.
*/
public static Entity getLastNonPlayerVehicle(final Entity passenger, final boolean includePassenger) {
public Entity getLastNonPlayerVehicle(final Entity passenger, final boolean includePassenger) {
Entity vehicle = includePassenger ? passenger : passenger.getVehicle();
while (vehicle != null){
if (vehicle instanceof Player){
@ -92,7 +115,7 @@ public class PassengerUtil {
// * the entity
// * @return the player passenger recursively
// */
// public static Player getFirstPlayerIncludingPassengersRecursively(Entity entity) {
// public Player getFirstPlayerIncludingPassengersRecursively(Entity entity) {
// while (entity != null) {
// if (entity instanceof Player) {
// // Scrap the case of players riding players for the moment.