forked from SteamWar/SteamWar
Improve SelectAdjacent
This commit is contained in:
+10
-15
@@ -23,6 +23,7 @@ import de.steamwar.bausystem.BauSystem;
|
|||||||
import de.steamwar.bausystem.region.Point;
|
import de.steamwar.bausystem.region.Point;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||||
|
import de.steamwar.core.SWPlayer;
|
||||||
import de.steamwar.core.WorldEditRenderer;
|
import de.steamwar.core.WorldEditRenderer;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import de.steamwar.linkage.MinVersion;
|
import de.steamwar.linkage.MinVersion;
|
||||||
@@ -35,13 +36,10 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
@@ -71,32 +69,23 @@ public class SelectAdjacent implements Listener {
|
|||||||
new Vector(0, -1, -1),
|
new Vector(0, -1, -1),
|
||||||
};
|
};
|
||||||
|
|
||||||
private Map<Player, Selector> selectors = new HashMap<>();
|
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
if (!event.hasItem()) return;
|
if (!event.hasItem()) return;
|
||||||
if (event.getItem().getType() != Material.WOODEN_AXE) return;
|
if (event.getItem().getType() != Material.WOODEN_AXE) return;
|
||||||
Selector selector = selectors.get(event.getPlayer());
|
|
||||||
if (selector != null) selector.cancel();
|
|
||||||
if (!event.getPlayer().isSneaking()) return;
|
if (!event.getPlayer().isSneaking()) return;
|
||||||
if (event.getAction() != Action.LEFT_CLICK_BLOCK) return;
|
if (event.getAction() != Action.LEFT_CLICK_BLOCK) return;
|
||||||
Material material = event.getPlayer().getInventory().getItemInOffHand().getType();
|
Material material = event.getPlayer().getInventory().getItemInOffHand().getType();
|
||||||
|
Selector selector;
|
||||||
if (material.isAir()) {
|
if (material.isAir()) {
|
||||||
selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true);
|
selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true);
|
||||||
} else {
|
} else {
|
||||||
selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material);
|
selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material);
|
||||||
}
|
}
|
||||||
selectors.put(event.getPlayer(), selector);
|
SWPlayer.of(event.getPlayer()).setComponent(selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
private class Selector implements SWPlayer.Component {
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
|
||||||
Selector selector = selectors.remove(event.getPlayer());
|
|
||||||
if (selector != null) selector.cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Selector {
|
|
||||||
|
|
||||||
private static final int MAX_BLOCKS = 500_000;
|
private static final int MAX_BLOCKS = 500_000;
|
||||||
|
|
||||||
@@ -154,6 +143,7 @@ public class SelectAdjacent implements Listener {
|
|||||||
if (toCalc.isEmpty() || seen.size() > MAX_BLOCKS) {
|
if (toCalc.isEmpty() || seen.size() > MAX_BLOCKS) {
|
||||||
bukkitTask.cancel();
|
bukkitTask.cancel();
|
||||||
player.sendTitle("§aDone", "§e" + volume + " §7Blocks", 0, 20, 5);
|
player.sendTitle("§aDone", "§e" + volume + " §7Blocks", 0, 20, 5);
|
||||||
|
SWPlayer.of(player).removeComponent(Selector.class);
|
||||||
}
|
}
|
||||||
}, 1, 1);
|
}, 1, 1);
|
||||||
}
|
}
|
||||||
@@ -190,5 +180,10 @@ public class SelectAdjacent implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUnmount(SWPlayer player) {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user