Dieser Commit ist enthalten in:
Ursprung
f0741dbc19
Commit
05c01e25e2
@ -85,29 +85,39 @@ public class SmartPlaceListener implements Plain, Listener {
|
|||||||
private static final Reflection.MethodInvoker packetExecutor = Reflection.getMethod(playerConnectionClazz, null, useItem);
|
private static final Reflection.MethodInvoker packetExecutor = Reflection.getMethod(playerConnectionClazz, null, useItem);
|
||||||
|
|
||||||
private static final Set<Player> SMART_PLACING = new HashSet<>();
|
private static final Set<Player> SMART_PLACING = new HashSet<>();
|
||||||
|
private static final Set<Player> WAS_EXECUTED = new HashSet<>();
|
||||||
|
|
||||||
public SmartPlaceListener() {
|
public SmartPlaceListener() {
|
||||||
TinyProtocol.instance.addFilter(useItem, (player, object) -> {
|
TinyProtocol.instance.addFilter(useItem, (player, packet) -> {
|
||||||
if (!Config.getInstance().get(player).getPlainValueOrDefault("smartPlace", false)) return object;
|
if (!Config.getInstance().get(player).getPlainValueOrDefault("smartPlace", false)) return packet;
|
||||||
|
|
||||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
|
||||||
Block block = player.getTargetBlockExact(6);
|
Block block = player.getTargetBlockExact(6);
|
||||||
boolean shouldSneak = !(block != null && (block.getType().isInteractable() || block.getType() == Material.NOTE_BLOCK) && !CONTAINERS.contains(block.getType()) && !IGNORED.contains(block.getType()));
|
boolean shouldSneak = !(block != null && (block.getType().isInteractable() || block.getType() == Material.NOTE_BLOCK) && !CONTAINERS.contains(block.getType()) && !IGNORED.contains(block.getType()));
|
||||||
|
|
||||||
boolean sneaking = player.isSneaking();
|
boolean sneaking = player.isSneaking();
|
||||||
if (sneaking) SMART_PLACING.add(player);
|
run(player, packet, true, sneaking, shouldSneak);
|
||||||
player.setSneaking(shouldSneak || sneaking);
|
|
||||||
packetExecutor.invoke(playerConnection.get(getHandle.invoke(player)), object);
|
|
||||||
SMART_PLACING.remove(player);
|
|
||||||
player.setSneaking(sneaking);
|
|
||||||
}, 0);
|
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void run(Player player, Object packet, boolean first, boolean sneaking, boolean shouldSneak) {
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
|
|
||||||
|
if (sneaking) SMART_PLACING.add(player);
|
||||||
|
player.setSneaking(shouldSneak || sneaking);
|
||||||
|
packetExecutor.invoke(playerConnection.get(getHandle.invoke(player)), packet);
|
||||||
|
SMART_PLACING.remove(player);
|
||||||
|
player.setSneaking(sneaking);
|
||||||
|
|
||||||
|
if (!WAS_EXECUTED.contains(player) && first) {
|
||||||
|
run(player, packet, false, sneaking, shouldSneak);
|
||||||
|
}
|
||||||
|
WAS_EXECUTED.remove(player);
|
||||||
|
}, first ? 0 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("smartPlace", false)) return;
|
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("smartPlace", false)) return;
|
||||||
|
WAS_EXECUTED.add(event.getPlayer());
|
||||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
|
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
|
||||||
if (event.getPlayer().getGameMode() == GameMode.SPECTATOR) return;
|
if (event.getPlayer().getGameMode() == GameMode.SPECTATOR) return;
|
||||||
if (!event.getPlayer().isSneaking()) return;
|
if (!event.getPlayer().isSneaking()) return;
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren