Fix teleport handler consistency, more blockbreak blacklist defaults

This commit is contained in:
Esophose 2019-06-01 11:24:13 -06:00
parent cdef4b98ff
commit 2638044f3d
6 changed files with 104 additions and 91 deletions

View File

@ -104,7 +104,7 @@ public class GUIOverview extends AbstractGUI {
ItemMeta hookmeta = hook.getItemMeta();
hookmeta.setDisplayName(plugin.getLocale().getMessage("interface.hopper.synchopper"));
ArrayList<String> lorehook = new ArrayList<>();
parts = plugin.getLocale().getMessage("interface.hopper.synclore", hopper.getLinkedBlocks().size()).split("\\|");
parts = plugin.getLocale().getMessage("interface.hopper.synclore", hopper.getLinkedBlocks().stream().distinct().count()).split("\\|");
for (String line : parts) {
lorehook.add(Methods.formatText(line));
}

View File

@ -14,7 +14,6 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryHolder;
import java.util.Date;
import java.util.HashMap;
@ -23,71 +22,75 @@ import java.util.UUID;
public class TeleportHandler {
//Teleport from - teleport 2
private final Map<Location, Location> teleportFrom = new HashMap<>();
private final Map<UUID, Long> lastTeleports = new HashMap<>();
private EpicHoppers instance;
public TeleportHandler(EpicHoppers instance) {
this.instance = instance;
Bukkit.getScheduler().scheduleSyncRepeatingTask(instance, this::teleportRunner, 0, instance.getConfig().getLong("Main.Amount of Ticks Between Teleport"));
this.instance = instance;
Bukkit.getScheduler().scheduleSyncRepeatingTask(instance, this::teleportRunner, 0, instance.getConfig().getLong("Main.Amount of Ticks Between Teleport"));
}
private void teleportRunner() {
for (World world : Bukkit.getWorlds()) {
for (Entity entity : world.getEntities()) {
if (!(entity instanceof LivingEntity) ||entity.getType() == EntityType.ARMOR_STAND) continue;
if (!instance.getConfig().getBoolean("Main.Allow Players To Teleport Through Hoppers")
|| entity instanceof Player && !((Player)entity).hasPermission("EpicHoppers.Teleport")) {
if (!(entity instanceof LivingEntity) || entity.getType() == EntityType.ARMOR_STAND)
continue;
if (!this.instance.getConfig().getBoolean("Main.Allow Players To Teleport Through Hoppers")
|| (entity instanceof Player && !entity.hasPermission("EpicHoppers.Teleport")))
continue;
}
Location location = entity.getLocation().getBlock().getRelative(BlockFace.DOWN).getLocation();
if (!instance.getHopperManager().isHopper(location)) {
if (!this.instance.getHopperManager().isHopper(location))
continue;
}
Hopper hopper = instance.getHopperManager().getHopper(location);
Hopper hopper = this.instance.getHopperManager().getHopper(location);
if (hopper.getTeleportTrigger() != TeleportTrigger.WALK_ON) continue;
if (hopper.getTeleportTrigger() != TeleportTrigger.WALK_ON)
continue;
if (lastTeleports.containsKey(entity.getUniqueId())) {
long duration = (new Date()).getTime() - new Date(lastTeleports.get(entity.getUniqueId())).getTime();
if (duration <= 5 * 1000) {
if (this.lastTeleports.containsKey(entity.getUniqueId())) {
long duration = (new Date()).getTime() - new Date(this.lastTeleports.get(entity.getUniqueId())).getTime();
if (duration <= 5 * 1000)
continue;
}
}
tpEntity(entity, hopper);
lastTeleports.put(entity.getUniqueId(), System.currentTimeMillis());
this.tpEntity(entity, hopper);
this.lastTeleports.put(entity.getUniqueId(), System.currentTimeMillis());
}
}
}
public void tpEntity(Entity entity, Hopper hopper) {
if (hopper == null || !instance.getHopperManager().isHopper(hopper.getLocation())) return;
if (hopper == null || !this.instance.getHopperManager().isHopper(hopper.getLocation()))
return;
EpicHoppers instance = EpicHoppers.getInstance();
Hopper lastHopper = hopper;
for (int i = 0; i < 15; i++) {
boolean empty = lastHopper.getLinkedBlocks().isEmpty();
if (empty && i == 0) {
if (teleportFrom.containsKey(hopper.getLocation()))
doTeleport(entity, teleportFrom.get(hopper.getLocation()).clone());
return;
}
Hopper lastHopper = this.getChain(hopper, 1);
if (hopper != lastHopper)
this.doTeleport(entity, lastHopper.getLocation());
}
if (empty) break;
Location nextHopper = lastHopper.getLinkedBlocks().get(0);
if (!(nextHopper.getBlock().getState() instanceof InventoryHolder)) break;
lastHopper = instance.getHopperManager().getHopper(nextHopper);
/**
* Recursively gets the next hopper in the linked hopper chain
* @param lastHopper The previous hopper found in the chain
* @param currentChainLength The current length of the chain, used to cap the search length
* @return The hopper at the end of the chain (or up to 15 in depth)
*/
private Hopper getChain(Hopper lastHopper, int currentChainLength) {
if (currentChainLength > 15)
return lastHopper;
for (Location nextHopperLocation : lastHopper.getLinkedBlocks()) {
if (nextHopperLocation.getBlock().getState() instanceof org.bukkit.block.Hopper) {
Hopper hopper = this.instance.getHopperManager().getHopper(nextHopperLocation);
if (hopper != null)
return this.getChain(hopper, currentChainLength + 1);
}
}
teleportFrom.put(lastHopper.getLocation(), hopper.getLocation());
doTeleport(entity, lastHopper.getLocation());
return lastHopper;
}
private void doTeleport(Entity entity, Location location) {
@ -95,14 +98,14 @@ public class TeleportHandler {
location.setPitch(entity.getLocation().getPitch());
location.setDirection(entity.getLocation().getDirection());
if (instance.isServerVersionAtLeast(ServerVersion.V1_12)) {
if (this.instance.isServerVersionAtLeast(ServerVersion.V1_12)) {
Methods.doParticles(entity, location);
Methods.doParticles(entity, entity.getLocation().getBlock().getRelative(BlockFace.DOWN).getLocation());
}
entity.teleport(location);
if (instance.isServerVersionAtLeast(ServerVersion.V1_12))
if (this.instance.isServerVersionAtLeast(ServerVersion.V1_12))
entity.getWorld().playSound(entity.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 10, 10);
}
}

View File

@ -20,9 +20,18 @@ public class HopperManager {
registeredHoppers.put(roundLocation(location), hopper);
}
/**
* Removes a hopper and unlinks it from any other hoppers
* @param location The location of the hopper to remove
* @return The removed hopper, or null if none was removed
*/
public Hopper removeHopper(Location location) {
return registeredHoppers.remove(location);
Hopper removed = this.registeredHoppers.remove(location);
for (Hopper hopper : this.registeredHoppers.values())
hopper.removeLinkedBlock(location);
return removed;
}

View File

@ -50,57 +50,57 @@ public class InteractListeners implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockInteract(PlayerInteractEvent e) {
Player player = e.getPlayer();
if (e.getAction() != Action.LEFT_CLICK_BLOCK
|| e.getClickedBlock() == null
|| player.isSneaking()
|| !player.hasPermission("EpicHoppers.overview")
|| !(e.getClickedBlock().getState() instanceof InventoryHolder || e.getClickedBlock().getType().equals(Material.ENDER_CHEST))) {
return;
Player player = e.getPlayer();
if (e.getAction() != Action.LEFT_CLICK_BLOCK
|| e.getClickedBlock() == null
|| player.isSneaking()
|| !player.hasPermission("EpicHoppers.overview")
|| !(e.getClickedBlock().getState() instanceof InventoryHolder || e.getClickedBlock().getType().equals(Material.ENDER_CHEST))) {
return;
}
if (e.getClickedBlock().getType() == Material.CHEST && Methods.isSync(player)) {
ItemStack item = e.getPlayer().getInventory().getItemInHand();
if (item.getItemMeta().getLore().size() == 2) {
player.sendMessage(instance.getLocale().getMessage("event.hopper.desyncchest", item.getType().toString()));
instance.enchantmentHandler.createSyncTouch(item, null);
} else {
player.sendMessage(instance.getLocale().getMessage("event.hopper.syncchest", item.getType().toString()));
instance.enchantmentHandler.createSyncTouch(item, e.getClickedBlock());
}
e.setCancelled(true);
return;
}
if (e.getClickedBlock().getType() == Material.CHEST && Methods.isSync(player)) {
ItemStack item = e.getPlayer().getInventory().getItemInHand();
if (item.getItemMeta().getLore().size() == 2) {
player.sendMessage(instance.getLocale().getMessage("event.hopper.desyncchest", item.getType().toString()));
instance.enchantmentHandler.createSyncTouch(item, null);
} else {
player.sendMessage(instance.getLocale().getMessage("event.hopper.syncchest", item.getType().toString()));
instance.enchantmentHandler.createSyncTouch(item, e.getClickedBlock());
}
e.setCancelled(true);
return;
}
PlayerData playerData = instance.getPlayerDataManager().getPlayerData(player);
PlayerData playerData = instance.getPlayerDataManager().getPlayerData(player);
if (playerData.getSyncType() == null) {
if (e.getClickedBlock().getType() == Material.HOPPER) {
if (instance.isLiquidtanks() && net.arcaniax.liquidtanks.object.LiquidTankAPI.isLiquidTank(e.getClickedBlock().getLocation()))
return;
Hopper hopper = instance.getHopperManager().getHopper(e.getClickedBlock());
playerData.setLastHopper(hopper);
if (!player.getInventory().getItemInHand().getType().name().contains("PICKAXE")) {
hopper.overview(player);
e.setCancelled(true);
return;
}
}
return;
}
if (e.getClickedBlock().getState() instanceof InventoryHolder || e.getClickedBlock().getType().equals(Material.ENDER_CHEST) && instance.getConfig().getBoolean("Main.Support Enderchests")) {
Hopper hopper = playerData.getLastHopper();
if (playerData.getSyncType() != null && e.getClickedBlock().getLocation().equals(playerData.getLastHopper().getLocation())) {
player.sendMessage(instance.getLocale().getMessage("event.hopper.syncself"));
} else if (playerData.getSyncType() != null) {
hopper.link(e.getClickedBlock(), playerData.getSyncType() == SyncType.FILTERED, player);
}
e.setCancelled(true);
int amountLinked = hopper.getLevel().getLinkAmount();
if (hopper.getLinkedBlocks().size() >= amountLinked) {
playerData.setSyncType(null);
if (playerData.getSyncType() == null) {
if (e.getClickedBlock().getType() == Material.HOPPER) {
if (instance.isLiquidtanks() && net.arcaniax.liquidtanks.object.LiquidTankAPI.isLiquidTank(e.getClickedBlock().getLocation()))
return;
Hopper hopper = instance.getHopperManager().getHopper(e.getClickedBlock());
playerData.setLastHopper(hopper);
if (!player.getInventory().getItemInHand().getType().name().contains("PICKAXE")) {
hopper.overview(player);
e.setCancelled(true);
return;
}
}
return;
}
if (e.getClickedBlock().getState() instanceof InventoryHolder || (e.getClickedBlock().getType().equals(Material.ENDER_CHEST) && instance.getConfig().getBoolean("Main.Support Enderchests"))) {
Hopper hopper = playerData.getLastHopper();
if (playerData.getSyncType() != null && e.getClickedBlock().getLocation().equals(playerData.getLastHopper().getLocation())) {
player.sendMessage(instance.getLocale().getMessage("event.hopper.syncself"));
} else if (playerData.getSyncType() != null) {
hopper.link(e.getClickedBlock(), playerData.getSyncType() == SyncType.FILTERED, player);
}
e.setCancelled(true);
int amountLinked = hopper.getLevel().getLinkAmount();
if (hopper.getLinkedBlocks().size() >= amountLinked) {
playerData.setSyncType(null);
}
}
}
}

View File

@ -50,7 +50,8 @@ public enum Setting {
BLOCKBREAK_PARTICLE("Main.BlockBreak Particle Type", "LAVA",
"The particle shown when the block break module performs a block break."),
BLACKLIST("Main.BlockBreak Blacklisted Blocks", Arrays.asList("BEDROCK", "END_PORTAL", "ENDER_PORTAL", "END_PORTAL_FRAME", "ENDER_PORTAL_FRAME", "PISTON_HEAD", "PISTON_EXTENSION"),
BLACKLIST("Main.BlockBreak Blacklisted Blocks",
Arrays.asList("BEDROCK", "END_PORTAL", "ENDER_PORTAL", "END_PORTAL_FRAME", "ENDER_PORTAL_FRAME", "PISTON_HEAD", "PISTON_EXTENSION", "RAIL", "RAILS", "ACTIVATOR_RAIL", "DETECTOR_RAIL", "POWERED_RAIL"),
"Anything listed here will not be broken by the block break module."),
AUTOSELL_PRICES("Main.AutoSell Prices",

View File

@ -27,7 +27,7 @@ interface.hopper.autosell = "&7AutoSell: Every &6%seconds%s"
interface.hopper.linkamount = "&7Link Overflow: &6%amount%"
interface.hopper.blockbreak = "&7Block Break: &6Every %ticks% ticks"
interface.hopper.alreadymaxed = "&7This hopper is already maxed out!"
interface.hopper.synclore = "|&7Left-Click then click a another|&7hopper or chest to link!||&7Right-Click to unlink.|&7Currently linked to &6%amount% hopper(s)&7."
interface.hopper.synclore = "|&7Left-Click then click a another|&7hopper or chest to link!||&7Right-Click to unlink.|&7Currently linked to &6%amount% container(s)&7."
interface.hopper.perltitle = "&6Click to Teleport"
interface.hopper.perllore2 = "|&7Left-Click to teleport to|&7the end of the chain.||&7Right-Click to switch the|&7teleport trigger mode.|&7Currently set to: &a%type%&7."
interface.hopper.filtertitle = "&cClick to Filter"