public static void teleportVehicle() { final List<BungeeQueue> vehicleQueue = Plugin.bungeeCordVehicleInQueue; final Iterator<BungeeQueue> it = vehicleQueue.iterator(); while (it.hasNext()) { final BungeeQueue queue = it.next(); // Spawn incoming BungeeCord vehicle final Location destination = queue.getDestination(); final World world = destination.getWorld(); checkChunkLoad(destination.getBlock()); Entity entity = null; String entityItemStack = null; // Parse passenger info if (queue.getQueueType() == BungeeQueueType.PASSENGER) { if (queue.getEntityType().isSpawnable()) { entity = world.spawnEntity(destination, queue.getEntityType()); EntityUtil.setEntityTypeData(entity, queue.getEntityTypeData()); entity.teleport(destination); } // Parse vehicle contents } else if (queue.getItemStack() != null) { entityItemStack = queue.getItemStack(); } final Entity passenger = entity; // Create new velocity final Vector newVelocity = destination.getDirection(); newVelocity.multiply(queue.getVelocity()); if (passenger != null) { final Vehicle v = (Vehicle) world.spawnEntity(destination, queue.getVehicleType()); Plugin.instance.getServer().getScheduler().scheduleSyncDelayedTask(Plugin.instance, new Runnable() { @Override public void run() { v.setPassenger(passenger); v.setVelocity(newVelocity); } }, 2); } else { final Vehicle mc = (Vehicle) world.spawnEntity(destination, queue.getVehicleType()); if (mc instanceof StorageMinecart && entityItemStack != null) { final StorageMinecart smc = (StorageMinecart) mc; smc.getInventory().setContents(ItemStackUtil.stringToItemStack(entityItemStack)); } else if (mc instanceof HopperMinecart && entityItemStack != null) { final HopperMinecart hmc = (HopperMinecart) mc; hmc.getInventory().setContents(ItemStackUtil.stringToItemStack(entityItemStack)); } mc.setVelocity(newVelocity); } // Remove from queue it.remove(); } }
@EventHandler public void onItemMove(InventoryMoveItemEvent event) { try { // Check for nulls if (event.getSource() == null || event.getSource().getHolder() == null) { return; } if (event.getDestination() == null || event.getDestination().getHolder() == null) { return; } // Debug debug("onItemMove(%s, %s, %s)", event.getItem().getType(), event.getSource().getHolder(), event.getDestination().getHolder()); // Check if destination is a hopper minecart. If it isn't, the transaction is always valid. if (!(event.getDestination().getHolder() instanceof HopperMinecart)) { debug("onItemMove() returning because destination is not a HopperMinecart"); return; } final HopperMinecart hopper = (HopperMinecart) event.getDestination().getHolder(); final InventoryHolder source = event.getSource().getHolder(); if (isValidSource(source)) { final Location sourceLocation = event.getSource().getLocation(); if (sourceLocation == null) { error("Failed to find location of source InventoryHolder: %s", source); return; } final BlockProtection sourceProt = this.module.getProtection(sourceLocation).orElse(null); if (sourceProt == null) { debug("onItemMove() returning because sourceProt is null"); return; } // Check if destination hopper is also protected final EntityProtection destProt = this.module.getProtection(hopper.getUniqueId()).orElse(null); if (destProt == null) { // HopperMinecart is not protected, so we don't know from whom the hopper is coming // from. Because the source is protected, we have to protect its content from being // taken by an unknown minecrat. Therefore, the event needs to be cancelled. debug("onItemMove() returning because destProt is null"); event.setCancelled(true); return; } // The HopperMinecart is protected, so we can check if the owner of that is allowed to // take items from the protected source StoredPlayer hopperOwner = destProt.getOwner(); if (!this.module.isAllowedToInteract(sourceProt, hopperOwner)) { // Seems like the owner of the HopperMinecart is not allowed to interact with the source debug("onItemMove() cancelling because hopperOwner can not access sourecProt"); event.setCancelled(true); return; } } } catch (Exception e) { report("Failed to handle InventoryMoveItemEvent", e); } }