ursinn/DeadByDaylightMC

View on GitHub
src/main/java/noahnok/dbdl/files/game/player/states/PlayerStateManager.java

Summary

Maintainability
A
3 hrs
Test Coverage
package noahnok.dbdl.files.game.player.states;

import noahnok.dbdl.files.DeadByDaylight;
import noahnok.dbdl.files.game.runnables.BleedingRunnable;
import noahnok.dbdl.files.player.DPlayer;
import noahnok.dbdl.files.player.PlayerStatus;

public class PlayerStateManager {

    private final DeadByDaylight main;

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

    public void survivorHit(DPlayer survivor) {
        if (survivor.getPlayerState().isCrawling()) {
            survivor.setStatus(PlayerStatus.DEAD);
            survivor.startSpectating(survivor.getCurrentGame());
            main.getGameManager().canGameEnd(survivor.getCurrentGame());
            return;
        }

        if (!survivor.getPlayerState().isInjured()) {
            survivorHitToInjured(survivor);
            return;
        }
        survivorHitToCrawling(survivor);
    }

    private void survivorHitToInjured(DPlayer survivor) {
        setBleeding(survivor);
        survivor.getPlayerState().setInjured(true);
        injureSpeed(survivor);
    }

    private void survivorHitToCrawling(DPlayer survivor) {
        setBleeding(survivor);
        survivor.getPlayerState().setInjured(false);
        survivor.getPlayerState().setCrawling(true);

        survivor.getPlayer().setSneaking(true);

        crawlSpeed(survivor);
    }

    public void survivorPickedUpByHunter(DPlayer survivor) {
        survivor.getPlayerState().setCrawling(false);
        survivor.getPlayerState().setInjured(false);
        survivor.getPlayerState().setCarried(true);

        noSpeed(survivor);
    }

    // atWill mean the survivor escaped them selves and wasn't dropped by the killer purposely
    public void survivorEscapeHunterPickup(DPlayer survivor, boolean atWill) {
        survivor.getPlayerState().setCarried(false);
        if (atWill) {
            survivorHitToInjured(survivor);
        } else {
            survivorHitToCrawling(survivor);
        }
    }

    public void survivorHooked(DPlayer survivor) {
        survivor.getPlayerState().setHooked(true);
        survivor.getPlayerState().setCarried(false);

        stopBleeding(survivor);

        // TODO: Fix

//        switch (survivor.getPlayerState().getHookedStage()) {
//            case HookedStages.NOT_HOOKED:
//                survivor.getPlayerState().setHookedStage(HookedStages.STAGE_1);
//                break;
//
//            case HookedStages.STAGE_1:
//                survivor.getPlayerState().setHookedStage(HookedStages.STAGE_2);
//                break;
//
//            case HookedStages.STAGE_2:
//                // Survivor has been taken by the Entity
//                survivor.getPlayerState().setHookedStage(HookedStages.DEAD);
//                survivor.getPlayerState().setEndGameState(EndGameStates.SACRIFICED);
//                survivor.getPlayerState().setBleeding(false);
//                break;
//        }
    }

    public void survivorUnhooked(DPlayer survivor) {
        survivor.getPlayerState().setHooked(false);
        survivor.getPlayerState().setInjured(true);

        setBleeding(survivor);
    }

    public void survivorHealingStart(DPlayer survivor) {
        survivor.getPlayerState().setBeingHealed(true);
    }

    public void survivorHealingStop(DPlayer survivor) {
        survivor.getPlayerState().setBeingHealed(false);
    }

    public void survivorHealed(DPlayer survivor, boolean fullHealth) {
        if (fullHealth) {
            stopBleeding(survivor);
            survivor.getPlayerState().setInjured(false);
            normalSpeed(survivor);
            return;
        }
        survivor.getPlayerState().setCrawling(false);
        survivor.getPlayerState().setInjured(true);
        injureSpeed(survivor);
    }

    public void survivorKilledByHuntersHand(DPlayer survivor) {
        survivor.getPlayerState().setCrawling(false);
        stopBleeding(survivor);
        survivor.getPlayerState().setEndGameState(EndGameStates.DEAD);
    }

    public void survivorEscapes(DPlayer survivor) {
        survivor.getPlayerState().setEndGameState(EndGameStates.ESCAPED);
        stopBleeding(survivor);
    }

    public boolean isSurvivorDead(DPlayer survivor) {
        return survivor.getPlayerState().getEndGameState() == EndGameStates.DEAD;
    }

    public boolean isSurvivorHooked(DPlayer survivor) {
        return survivor.getPlayerState().isHooked();
    }

    public boolean hasSurvivorEscape(DPlayer survivor) {
        return survivor.getPlayerState().getEndGameState() == EndGameStates.ESCAPED;
    }

    public boolean isSurvivorSacrificed(DPlayer survivor) {
        return survivor.getPlayerState().getEndGameState() == EndGameStates.SACRIFICED;
    }

    // The following are only available to the HUNTER/KILLER
    public void hunterStartCarrying(DPlayer hunter) {
        hunter.getPlayerState().setCarrying(true);
    }

    // atWill means if the Hunter decided to put the survivor down themselves or if they escaped
    public void hunterStopCarrying(DPlayer hunter, boolean atWill) {
        hunter.getPlayerState().setCarrying(false);

        if (!atWill) {
            hunterStunned(hunter);
        }
    }

    public void hunterStunned(DPlayer hunter) {
        hunter.getPlayerState().setStunned(true);
    }

    public void hunterUnStunned(DPlayer hunter) {
        hunter.getPlayerState().setStunned(false);
    }

    public void hunterBlinded(DPlayer hunter) {
        hunter.getPlayerState().setBlind(true);
    }

    public void hunterUnBlinded(DPlayer hunter) {
        hunter.getPlayerState().setBlind(false);
    }

    public void hunterFatigued(DPlayer hunter) {
        hunter.getPlayerState().setFatigued(true);
    }

    public void hunterUnFatigued(DPlayer hunter) {
        hunter.getPlayerState().setFatigued(false);
    }

    private void crawlSpeed(DPlayer survivor) {
        survivor.getPlayer().setWalkSpeed((float) 0.1);
    }

    private void injureSpeed(DPlayer survivor) {
        survivor.getPlayer().setWalkSpeed((float) 0.15);
    }

    private void normalSpeed(DPlayer survivor) {
        survivor.getPlayer().setWalkSpeed((float) 0.2);
    }

    private void noSpeed(DPlayer survivor) {
        survivor.getPlayer().setWalkSpeed(0);
    }

    private void setBleeding(DPlayer player) {
        if (player.getPlayerState().getBleedingRunnable() == null) {
            player.getPlayerState().setBleedingRunnable(
                    new BleedingRunnable(player.getPlayer(), main).runTaskTimer(main, 0, 30));
        }
    }

    private void stopBleeding(DPlayer player) {
        if (player.getPlayerState().getBleedingRunnable() != null) {
            player.getPlayerState().getBleedingRunnable().cancel();
            player.getPlayerState().setBleedingRunnable(null);
        }
    }
}