src/main/java/de/viper/survivalplus/listeners/SitListener.java aktualisiert

This commit is contained in:
2025-08-06 17:59:05 +00:00
parent 4f3bfd0403
commit 24a017d794

View File

@@ -1,128 +1,128 @@
package de.viper.survivalplus.listeners; package de.viper.survivalplus.listeners;
import de.viper.survivalplus.SurvivalPlus; import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.ArmorStand; import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
public class SitListener implements Listener { public class SitListener implements Listener {
private final SurvivalPlus plugin; private final SurvivalPlus plugin;
private final Map<UUID, ArmorStand> sittingPlayers = new HashMap<>(); private final Map<UUID, ArmorStand> sittingPlayers = new HashMap<>();
public SitListener(SurvivalPlus plugin) { public SitListener(SurvivalPlus plugin) {
this.plugin = plugin; this.plugin = plugin;
} }
public boolean isSitting(Player player) { public boolean isSitting(Player player) {
return sittingPlayers.containsKey(player.getUniqueId()); return sittingPlayers.containsKey(player.getUniqueId());
} }
public void sitPlayer(Player player, Location location) { public void sitPlayer(Player player, Location location) {
if (sittingPlayers.containsKey(player.getUniqueId())) { if (sittingPlayers.containsKey(player.getUniqueId())) {
return; return;
} }
// Erstelle einen unsichtbaren ArmorStand als Sitz // Erstelle einen unsichtbaren ArmorStand als Sitz
ArmorStand armorStand = player.getWorld().spawn(location, ArmorStand.class); ArmorStand armorStand = player.getWorld().spawn(location, ArmorStand.class);
armorStand.setGravity(false); armorStand.setGravity(false);
armorStand.setMarker(true); armorStand.setMarker(true);
armorStand.setInvisible(true); armorStand.setInvisible(true);
armorStand.setInvulnerable(true); armorStand.setInvulnerable(true);
armorStand.addPassenger(player); armorStand.addPassenger(player);
sittingPlayers.put(player.getUniqueId(), armorStand); sittingPlayers.put(player.getUniqueId(), armorStand);
FileConfiguration lang = plugin.getLangConfig(); FileConfiguration lang = plugin.getLangConfig();
player.sendMessage(lang.getString("sit.success", "§aDu hast dich hingesetzt!")); player.sendMessage(lang.getString("sit.success", "§aDu hast dich hingesetzt!"));
plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " sitzt bei " + locationToString(location)); plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " sitzt bei " + locationToString(location));
} }
public void standUp(Player player) { public void standUp(Player player) {
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
ArmorStand armorStand = sittingPlayers.remove(playerId); ArmorStand armorStand = sittingPlayers.remove(playerId);
if (armorStand != null) { if (armorStand != null) {
armorStand.remove(); armorStand.remove();
FileConfiguration lang = plugin.getLangConfig(); FileConfiguration lang = plugin.getLangConfig();
player.sendMessage(lang.getString("sit.stand-up", "§aDu bist aufgestanden!")); player.sendMessage(lang.getString("sit.stand-up", "§aDu bist aufgestanden!"));
plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " ist aufgestanden"); plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " ist aufgestanden");
} }
} }
@EventHandler @EventHandler
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getHand() != EquipmentSlot.HAND || event.getAction() != Action.RIGHT_CLICK_BLOCK) { if (event.getHand() != EquipmentSlot.HAND || event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return; return;
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
FileConfiguration lang = plugin.getLangConfig(); FileConfiguration lang = plugin.getLangConfig();
if (!player.hasPermission("survivalplus.sit")) { if (!player.hasPermission("survivalplus.sit")) {
player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!")); player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!"));
return; return;
} }
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
if (block == null || !isStair(block.getType())) { if (block == null || !isStair(block.getType())) {
return; return;
} }
// Wenn der Spieler bereits sitzt, stehe auf // Wenn der Spieler bereits sitzt, stehe auf
if (sittingPlayers.containsKey(player.getUniqueId())) { if (sittingPlayers.containsKey(player.getUniqueId())) {
standUp(player); standUp(player);
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
// Setze den Spieler genau auf der Treppenstufe // Setze den Spieler genau auf der Treppenstufe
Location location = block.getLocation(); Location location = block.getLocation();
location.setX(location.getX() + 0.5); location.setX(location.getX() + 0.5);
location.setY(location.getY() + 0.5); // Genau auf der Treppenstufe (halbe Blockhöhe) location.setY(location.getY() + 0.5); // Genau auf der Treppenstufe (halbe Blockhöhe)
location.setZ(location.getZ() + 0.5); location.setZ(location.getZ() + 0.5);
sitPlayer(player, location); sitPlayer(player, location);
event.setCancelled(true); // Verhindere andere Interaktionen mit der Treppe event.setCancelled(true); // Verhindere andere Interaktionen mit der Treppe
} }
@EventHandler @EventHandler
public void onPlayerMove(PlayerMoveEvent event) { public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
if (!sittingPlayers.containsKey(playerId)) { if (!sittingPlayers.containsKey(playerId)) {
return; return;
} }
// Prüfe, ob der Spieler sich bewegt hat (nur Positionsänderung, nicht Kopfbewegung) // Prüfe, ob der Spieler sich bewegt hat (nur Positionsänderung, nicht Kopfbewegung)
Location from = event.getFrom(); Location from = event.getFrom();
Location to = event.getTo(); Location to = event.getTo();
if (from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ()) { if (from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ()) {
standUp(player); standUp(player);
} }
} }
@EventHandler @EventHandler
public void onPlayerQuit(PlayerQuitEvent event) { public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
standUp(player); standUp(player);
} }
private boolean isStair(Material material) { private boolean isStair(Material material) {
return material.name().endsWith("_STAIRS"); return material.name().endsWith("_STAIRS");
} }
private String locationToString(Location loc) { private String locationToString(Location loc) {
return String.format("x=%.2f, y=%.2f, z=%.2f, world=%s", loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName()); return String.format("x=%.2f, y=%.2f, z=%.2f, world=%s", loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
} }
} }