ursinn/DeadByDaylightMC

View on GitHub
src/main/java/noahnok/dbdl/files/game/events/MainEvents.java

Summary

Maintainability
F
3 days
Test Coverage
package noahnok.dbdl.files.game.events;

import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import noahnok.dbdl.files.DeadByDaylight;
import noahnok.dbdl.files.game.DGame;
import noahnok.dbdl.files.game.STATUS;
import noahnok.dbdl.files.game.generators.Generator;
import noahnok.dbdl.files.game.levers.DLever;
import noahnok.dbdl.files.player.DPlayer;
import noahnok.dbdl.files.player.PlayerStatus;
import noahnok.dbdl.files.utils.pagenation.Page;
import noahnok.dbdl.files.utils.pagenation.buttons.SkullItem;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;

public class MainEvents implements Listener {

    private final DeadByDaylight main;

    public MainEvents(DeadByDaylight main) {
        this.main = main;
    }

    @EventHandler
    public void canMove(PlayerMoveEvent e) {
        DPlayer dPlayer = main.getDPlayerManager().getPlayer(e.getPlayer().getUniqueId());
        if (dPlayer == null) {
            return;
        }

        DGame game = dPlayer.getCurrentGame();
        if (game == null) {
            return;
        }

        if (game.getStatus() == STATUS.INGAME || game.getStatus() == STATUS.STARTING) {
            if (!game.canPlayerMove(e.getPlayer().getUniqueId())) {
                Location location = e.getFrom();
                location.setPitch(e.getTo().getPitch());
                location.setYaw(e.getTo().getYaw());
                e.setTo(location);

            }

            if (game.isCanOpenGates() && game.isCanEscape()) {
                for (Location loc : game.getArena().getExitArea()) {
                    if (e.getPlayer().getLocation().getBlock().equals(loc.getBlock()) &&
                            dPlayer.getStatus() == PlayerStatus.HUNTED) {
                        game.announce(e.getPlayer().getName() + " has escaped!");
                        main.getPlayerStateManager().survivorEscapes(dPlayer);

                        dPlayer.setEscapes(dPlayer.getEscapes() + 1);
                        dPlayer.addToScore(1000);
                        game.moveToEscaped(e.getPlayer().getUniqueId());

                        if (game.getStatus() == STATUS.INGAME) {
                            dPlayer.startSpectating(game);
                        }
                    }
                }

            }
        }
    }

    @EventHandler
    public void blockInteract(PlayerInteractEvent e) {

        DGame game = main.getGameManager().getGamePlayerIsIn(e.getPlayer());
        if (game != null && game.getStatus() == STATUS.INGAME) {
            if (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.LEFT_CLICK_BLOCK) {
                DPlayer player = main.getDPlayerManager().getPlayer(e.getPlayer().getUniqueId());
                e.setCancelled(true);

                //Generator operation
                if (e.getClickedBlock().getType() == Material.FURNACE && !game.isCanOpenGates()) {
                    if (player.getStatus() == PlayerStatus.HUNTER) {
                        return;
                    }

                    Generator gen = game.isGenerator(e.getClickedBlock());
                    if (gen != null) {
                        if (!gen.isFinished()) {
                            gen.increment(player);
                        }
                        e.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR,
                                TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',
                                        "&7Generator is at: &6" + gen.getPercentDone() + "%")));
                    }
                }

                //Lever operation
                if (e.getClickedBlock().getType() == Material.LEVER && game.isCanOpenGates()) {
                    if (player.getStatus() == PlayerStatus.HUNTER) {
                        return;
                    }

                    DLever lever = game.getLeverAtBlock(e.getClickedBlock());
                    if (lever != null) {
                        if (!lever.isFinished()) {
                            lever.increment(player);

                            e.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR,
                                    TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&',
                                            "&7Lever is at: &6" + lever.getPercentDone() + "%")));
                        }
                    }

                }
            }
        }
    }


    @EventHandler
    public void preventGameDamage(EntityDamageEvent e) {
        if (e.getEntity() instanceof Player) {
            DPlayer player = main.getDPlayerManager().getPlayer(e.getEntity().getUniqueId());
            if (player != null && player.getCurrentGame() != null && !player.isPlayerASurvivorAndAlive()) {
                e.setCancelled(true);

                //TODO Methods for states here!
            }
        }
    }

    @EventHandler
    public void sneakMenu(PlayerToggleSneakEvent e) {

        if (!e.isSneaking()) {
            DGame game = main.getGameManager().getGamePlayerIsIn(e.getPlayer());
            if (game != null && game.getStatus() == STATUS.INGAME) {
                DPlayer dplayer = game.getPlayer(e.getPlayer().getUniqueId());
                if (!dplayer.isSpectating()) {
                    return;
                }

                if (dplayer.isSpectating() && dplayer.getSpectate() != null) {
                    dplayer.spectateNext(dplayer.getSpectate());
                }

                Page page = new Page("Players", null);

                int index = 0;
                for (DPlayer player : game.getPlayers()) {
                    if (player == dplayer) {
                        continue;
                    }

                    SkullItem pageItem = new SkullItem();
                    pageItem.setDisplayName(player.getName());


                    if (!player.isHunter()) {
                        if (player.isDead()) {
                            pageItem.addLore("&4&lDead/Escaped");
                        } else {
                            pageItem.addClickAction(p -> {
                                p.closeInventory();
                                dplayer.spectateNext(player);
                            });
                        }
                    } else {
                        pageItem.addLore("&f&lKiller");
                    }

                    pageItem.setSkull(player.getId());
                    page.addPageItem(pageItem, index);
                    index++;
                }
                e.getPlayer().openInventory(page.getInventory());
            }
        } else {
            DPlayer dplayer = main.getDPlayerManager().getPlayer(e.getPlayer().getUniqueId());
            if (dplayer.getCurrentGame() != null) {
                if (dplayer.getPlayerState().isCrawling()) {
                    e.setCancelled(true);
                }
            }
        }
    }

    //Put dead players into spectator
    @EventHandler
    public void huntedDies(EntityDamageByEntityEvent e) {
        if (e.getEntity() instanceof Player && e.getDamager() instanceof Firework) {
            if (e.getDamager().getCustomName().equals("DBDL-FIREWORK")) {
                e.setCancelled(true);
            }
        }

        if (e.getEntity() instanceof Player && e.getDamager() instanceof Player) {
            DPlayer damaged = main.getDPlayerManager().getPlayer(e.getEntity().getUniqueId());
            DPlayer damager = main.getDPlayerManager().getPlayer(e.getDamager().getUniqueId());

            if (damaged == null || damager == null) {
                return;
            }

            if (damaged.getCurrentGame() != null && damager.getCurrentGame() != null &&
                    damaged.getCurrentGame().equals(damager.getCurrentGame())) {
                if (!damaged.getCurrentGame().isHunter(damaged.getId()) &&
                        !damager.getCurrentGame().isHunter(damager.getId())) {
                    e.setCancelled(true);
                }
            }
        }

        if (e.getEntity() instanceof Player) {
            Player player = (Player) e.getEntity();

            if (!(e.getFinalDamage() >= player.getHealth())) {
                DGame game = main.getGameManager().getGamePlayerIsIn(player);
                if (game != null && game.getStatus() == STATUS.INGAME) {

                    e.setCancelled(true);
                    DPlayer dplayer = game.getPlayer(player.getUniqueId());
                    if (dplayer != null) {
                        main.getPlayerStateManager().survivorHit(dplayer);
                    }
                }
            } else {
                DGame game = main.getGameManager().getGamePlayerIsIn(player);
                if (game != null && game.getStatus() == STATUS.INGAME) {

                    e.setCancelled(true);
                    DPlayer dplayer = game.getPlayer(player.getUniqueId());
                    if (dplayer != null) {

                        // Only applied if the Hunter has a specific perk //TODO Perks for insta kill
                        /*
                        dplayer.setStatus(PlayerStatus.DEAD);


                        //Check for spectators and move the mif there are any!
                        if (main.getdPlayerManager().hasSpectators(dplayer)){
                            DPlayer newPlayerToSpectate = null;
                            for (DPlayer toBe : game.getHunted()){
                                if (toBe.isPlayerASurvivorAndAlive() && toBe != dplayer){
                                    newPlayerToSpectate = toBe;
                                    break;
                                }
                            }

                            if (newPlayerToSpectate == null){
                                main.getGameManager().canGameEnd(game);
                                return;
                            }

                            for (DPlayer spectator : main.getdPlayerManager().getSpectators(dplayer)){
                                spectator.spectateNext(newPlayerToSpectate);
                            }
                        }
                         */


                        //Have the player start spectating


                    }
                }
            }
        }
    }

    //Handle players leaving (disconnecting) during an active game
    @EventHandler
    public void onPlayerDisconnectDuringGame(PlayerQuitEvent e) {
        DPlayer player = main.getDPlayerManager().getPlayer(e.getPlayer().getUniqueId());
        if (player != null && player.getCurrentGame() != null) {
            main.getGameManager().removePlayerFromGame(player.getPlayer(), player.getCurrentGame());
        }
    }
}