Player Seat #3
@ -56,6 +56,7 @@ public class LobbySystem extends JavaPlugin {
|
||||
new ParticleListener();
|
||||
new InventoryInteraction();
|
||||
new WorldInteraction();
|
||||
new PlayerSeatListener();
|
||||
|
||||
new AlphaWall(l -> l.getX() > 1199, AlphaWall.REFLECT_X);
|
||||
new AlphaWall(l -> l.getX() < 2977, AlphaWall.REFLECT_X);
|
||||
|
110
src/de/steamwar/lobby/listener/PlayerSeatListener.java
Normale Datei
110
src/de/steamwar/lobby/listener/PlayerSeatListener.java
Normale Datei
@ -0,0 +1,110 @@
|
||||
package de.steamwar.lobby.listener;
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
|
||||
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.Bisected;
|
||||
import org.bukkit.block.data.type.Stairs;
|
||||
import org.bukkit.entity.AbstractArrow;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.spigotmc.event.entity.EntityDismountEvent;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
public class PlayerSeatListener extends BasicListener{
|
||||
|
||||
private static class SeatLocation {
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Hierfür wird keine eigene Klasse benötigt, Location/Block reicht vollkommen aus. Hierfür wird keine eigene Klasse benötigt, Location/Block reicht vollkommen aus.
|
||||
|
||||
private int x;
|
||||
private int y;
|
||||
private int z;
|
||||
|
||||
public SeatLocation(int x, int y, int z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (!(o instanceof SeatLocation)) return false;
|
||||
SeatLocation that = (SeatLocation) o;
|
||||
return x == that.x &&
|
||||
y == that.y &&
|
||||
z == that.z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(x, y, z);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Set<SeatLocation> seats = new HashSet<>();
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||
return;
|
||||
|
||||
if (!event.getClickedBlock().getType().name().toLowerCase().contains("stairs"))
|
||||
return;
|
||||
|
||||
if (event.getPlayer().getGameMode() != GameMode.ADVENTURE && event.getPlayer().getGameMode() != GameMode.SURVIVAL)
|
||||
return;
|
||||
|
||||
if (((Stairs) event.getClickedBlock().getBlockData()).getHalf() != Bisected.Half.BOTTOM)
|
||||
return;
|
||||
|
||||
if (((Stairs) event.getClickedBlock().getBlockData()).getShape() != Stairs.Shape.STRAIGHT)
|
||||
return;
|
||||
|
||||
if (event.getPlayer().isInsideVehicle())
|
||||
event.getPlayer().getVehicle().remove();
|
||||
|
||||
if (event.getClickedBlock().getRelative(0, 1, 0).getType() != Material.AIR)
|
||||
Lixfel
hat
Könnten wir hier vor dem Entfernen noch darauf prüfen, dass es sich um einen Pfeil handelt (wie auch unten?). Ggf. könnte man das dann auch in eine separate Funktion auslagern. Könnten wir hier vor dem Entfernen noch darauf prüfen, dass es sich um einen Pfeil handelt (wie auch unten?). Ggf. könnte man das dann auch in eine separate Funktion auslagern.
YoyoNow
hat
Sollte jetzt behoben sein. Sollte jetzt behoben sein.
|
||||
return;
|
||||
|
||||
Location location = event.getClickedBlock().getLocation();
|
||||
SeatLocation seatLocation = getSeatLocation(location);
|
||||
if (seats.contains(seatLocation))
|
||||
return;
|
||||
seats.add(seatLocation);
|
||||
|
||||
Arrow arrow = (Arrow) event.getPlayer().getWorld().spawnEntity(location.add(0.5, 0, 0.5), EntityType.ARROW);
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Lixfel
hat
ggf. hier nochmal mit der Lebenszeit des Arrows schauen, das war bislang immer ein Problem. ggf. hier nochmal mit der Lebenszeit des Arrows schauen, das war bislang immer ein Problem.
|
||||
arrow.setGravity(false);
|
||||
arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
|
||||
arrow.addPassenger(event.getPlayer());
|
||||
arrow.setPersistent(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntityDismount(EntityDismountEvent event) {
|
||||
seats.remove(getSeatLocation(event.getDismounted().getLocation()));
|
||||
|
||||
if (event.getEntityType() != EntityType.PLAYER)
|
||||
return;
|
||||
|
||||
event.getDismounted().remove();
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Das ist zu allgemein (es sollte darauf geprüft werden, dass es tatsächlich ein Sitz ist), da ggf. später noch Bootsrennen in die Lobby kommen und da die Boote nicht unbedingt despawnen sollten. Das ist zu allgemein (es sollte darauf geprüft werden, dass es tatsächlich ein Sitz ist), da ggf. später noch Bootsrennen in die Lobby kommen und da die Boote nicht unbedingt despawnen sollten.
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
if (event.getPlayer().isInsideVehicle())
|
||||
event.getPlayer().getVehicle().remove();
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Lixfel
hat
Siehe oben. Siehe oben.
|
||||
}
|
||||
|
||||
public SeatLocation getSeatLocation(Location location) {
|
||||
return new SeatLocation(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
}
|
||||
|
||||
}
|
In neuem Issue referenzieren
Einen Benutzer sperren
Lizenz-Header