Free4All/src/main/java/eu/univento/free4all/listeners/PlayerEvents.java

136 lines
6.1 KiB
Java

/*
* Copyright (c) 2018 univento.eu - All rights reserved
* You are not allowed to use, distribute or modify this code
*/
package eu.univento.free4all.listeners;
import eu.univento.commons.player.currency.CurrencyType;
import eu.univento.core.Core;
import eu.univento.core.api.player.CustomPlayer;
import eu.univento.free4all.Free4All;
import eu.univento.free4all.utils.RespawnHelper;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author joethei
* @version 0.1
*/
public class PlayerEvents implements Listener{
private Map<CustomPlayer, LinkedHashMap<CustomPlayer, BukkitTask>> lastDamage = new LinkedHashMap<>();
private Map<CustomPlayer, RespawnHelper> helpers = new LinkedHashMap<>();
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
CustomPlayer p = CustomPlayer.getPlayer(e.getEntity());
if(p.getKiller() != null) {
CustomPlayer killer = CustomPlayer.getPlayer(p.getKiller());
e.setDeathMessage(p.getDatabasePlayer().getRank().getColor() + p.getDisplayName() + " §awurde von " + killer.getDatabasePlayer().getRank().getColor() + killer.getDisplayName() + " §agetötet.");
killer.getDatabasePlayer().addCurrency(CurrencyType.Vents, 10);
for(CustomPlayer players : Core.getOnlinePlayers()) {
players.playEffect(killer.getLocation(), Effect.CHORUS_FLOWER_DEATH, 5, 2, 0.5F, 0.0F, 0.5F, 0.1F, 20, 5);
}
}else if(lastDamage.containsKey(p)){
for(Map.Entry<CustomPlayer, BukkitTask> entry : lastDamage.get(p).entrySet()) {
CustomPlayer killer = entry.getKey();
e.setDeathMessage(p.getDatabasePlayer().getRank().getColor() + p.getDisplayName() + " §a wurde von " + killer.getDatabasePlayer().getRank().getColor() + killer.getDisplayName() + " §cgetötet.");
killer.getDatabasePlayer().addCurrency(CurrencyType.Vents, 10);
}
}else {
e.setDeathMessage(p.getDatabasePlayer().getRank().getColor() + p.getDisplayName() + " §cist nun tot.");
}
}
@EventHandler
public void onPlayerRespawn(PlayerRespawnEvent e) {
CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer());
RespawnHelper helper = helpers.get(p);
e.setRespawnLocation(helper.getRespawnLocation());
helper.setRespawnInventory();
}
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
if(e.getEntity() instanceof Player) {
CustomPlayer p = CustomPlayer.getPlayer((Player) e.getEntity());
if(e.getDamager() instanceof Player) {
CustomPlayer damager = CustomPlayer.getPlayer((Player) e.getEntity());
BukkitTask task = new BukkitRunnable() {
@Override
public void run() {
if(lastDamage.containsKey(p)) lastDamage.remove(p);
}
}.runTaskLater(Free4All.getInstance(), 10 * 20L);
LinkedHashMap<CustomPlayer, BukkitTask> map = new LinkedHashMap<>();
map.put(damager, task);
lastDamage.put(p, map);
}
if(e.getDamager() instanceof Projectile) {
CustomPlayer damager = CustomPlayer.getPlayer((Player) ((Projectile) e.getDamager()).getShooter());
BukkitTask task = new BukkitRunnable() {
@Override
public void run() {
if(lastDamage.containsKey(p)) lastDamage.remove(p);
}
}.runTaskLater(Free4All.getInstance(), 10 * 20L);
LinkedHashMap<CustomPlayer, BukkitTask> map = new LinkedHashMap<>();
map.put(damager, task);
lastDamage.put(p, map);
}
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer());
helpers.put(p, new RespawnHelper(p));
e.setJoinMessage(null);
p.getDatabasePlayer().getRankAsync().whenComplete((rank, throwable) -> Bukkit.broadcastMessage(rank.getColor() + p.getDisplayName() + " §aist dem Spiel beigetreten."));
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent e) {
CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer());
for(Map.Entry<CustomPlayer, LinkedHashMap<CustomPlayer, BukkitTask>> entry : lastDamage.entrySet()) {
entry.getValue().entrySet().stream().filter(mapEntry -> mapEntry.equals(p)).forEach(mapEntry -> lastDamage.remove(entry.getKey()));
}
if(lastDamage.containsKey(p)) {
for(Map.Entry<CustomPlayer, BukkitTask> entry : lastDamage.get(p).entrySet()) {
CustomPlayer killer = entry.getKey();
killer.getDatabasePlayer().addCurrency(CurrencyType.Vents, 10);
}
e.setQuitMessage("§cDer Spieler " + p.getDatabasePlayer().getRank().getColor() + p.getDisplayName() + " §chat sich während eines Kampfes ausgeloggt.");
lastDamage.remove(p);
}
e.setQuitMessage("§cDer Spieler " + p.getDatabasePlayer().getRank().getColor() + p.getDisplayName() + " §c hat das Spiel verlassen.");
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer());
if(e.getTo().getBlock().getRelative(BlockFace.UP).getType() == Material.STATIONARY_WATER) {
p.damage(0.5D);
}
}
}