Add Seats #20
@ -40,6 +40,7 @@ public class LobbySystem extends JavaPlugin {
|
||||
pm.registerEvents(new PlayerWorldInteractionListener(), instance);
|
||||
pm.registerEvents(new DoubleJumpListener(), instance);
|
||||
pm.registerEvents(new ParticleListener(), instance);
|
||||
pm.registerEvents(new PlayerSeatListener(), instance);
|
||||
pm.registerEvents(new EnderPearlListener(), instance);
|
||||
|
||||
getCommand("fly").setExecutor(new FlyCommand());
|
||||
|
130
src/de/steamwar/lobby/listener/PlayerSeatListener.java
Normale Datei
130
src/de/steamwar/lobby/listener/PlayerSeatListener.java
Normale Datei
@ -0,0 +1,130 @@
|
||||
/*
|
||||
This file is a part of the SteamWar software.
|
||||
|
||||
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.lobby.listener;
|
||||
|
||||
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.Listener;
|
||||
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 implements Listener {
|
||||
|
||||
private static class SeatLocation {
|
||||
|
||||
|
||||
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)
|
||||
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);
|
||||
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();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
if (event.getPlayer().isInsideVehicle())
|
||||
event.getPlayer().getVehicle().remove();
|
||||
}
|
||||
|
||||
public SeatLocation getSeatLocation(Location location) {
|
||||
return new SeatLocation(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
}
|
||||
|
||||
}
|
In neuem Issue referenzieren
Einen Benutzer sperren
Warum sollte Block nicht gehen?
Weil .equals() darauf auf den internen Double nicht Mapped und ich brauche nur int als Sache. Ich glaube so würde das zu weniger Fehler führen.
und Vector?
Genauso double