🐺

【Minecraft】人狼プラグイン開発日記 #1 【Daka】

に公開

人狼プラグイン開発日記 #1

この記事ではゲームクラスの作成とゲーム参加処理、役職割り当て処理を実装します。

目指すもの

  • コマンドでゲームを開始、終了できるようにする
  • ワールドの特定の場所にいるプレイヤーをゲームに参加させる
  • 参加したプレイヤーに役職を割り当てる

作業開始

参加するための場所づくり

建造物があった方が楽しいので村の近くに作ることにします。


村の一角に参加用の場所を作りました。startコマンドを実行したとき、ここにいるプレイヤーを参加させます。また、プラグイン側で管理するのでゲーム内の昼夜サイクルルールをfalseにしました。その後ワールドデータをプラグインサーバに移動させ、座標を確認してconfigファイルに座標を書きました。

座標取得中の様子

プログラミング

ファイルの数が多いのでソースコードを一部だけ載せます。その代わりに今回の作業で使ったコードの機能や用語を以下に示します。検索やAIに聞くときに活用してください。

  • コマンド追加
  • 列挙型(enum)クラス
  • configファイル(Configuration)
WerewolfGame.java
public class WerewolfGame {

    private final ArrayList<CustomPlayer> participants;
    private GameState gameState;

    private final Location lobbyLoc1;
    private final Location lobbyLoc2;

    public WerewolfGame(ConfigManager configManager) {
        this.participants = new ArrayList<>();
        this.gameState = GameState.WAITING;
        ArrayList<Location> lobbyLocations = configManager.getLobbyLocations();
        this.lobbyLoc1 = lobbyLocations.get(0);
        this.lobbyLoc2 = lobbyLocations.get(1);
    }

    public ArrayList<CustomPlayer> getParticipants() {return participants;}
    public int getParticipantsNumber() {return participants.size();}

    public GameState getGameState() {return gameState;}

    public void join(Player player) {
        CustomPlayer joinedPlayer = new CustomPlayer(player);
        participants.add(joinedPlayer);
    }

    public void leave(CustomPlayer cp) {
        participants.remove(cp);
    }

    private CustomPlayer getCustomPlayer(Player player) {
        for (CustomPlayer cp : participants) {
            if(cp.getPlayer().equals(player)) return cp;
        }
        return null;
    }

    public void assignRole() {
        Random random = new Random();
        Role[] roles = Role.values();

        for (CustomPlayer cp : participants) {
            Role randomRole = roles[random.nextInt(roles.length)];
            cp.setRole(randomRole);
        }
    }

    public void notifyRole() {
        for (CustomPlayer cp : participants) {
            String ownRoleName = cp.getRole().getRoleName();
            cp.sendMessage("あなたの役職は§e"+ownRoleName+"§fです");
        }
    }

    public void clearParticipants() {
        for (CustomPlayer cp : participants) {
            cp.sendMessage("ゲームから退出しました");
        }
        participants.clear();
    }

    public void start() {
        if(!gameState.equals(GameState.WAITING)) {
            return;
        }
        this.gameState = GameState.RUNNING;
    }

    public void finish() {
        if(!gameState.equals(GameState.RUNNING)) {
            return;
        }
        this.gameState = GameState.WAITING;
    }

    public boolean isParticipateArea(Player player) {
        double x = player.getLocation().getX();
        double z = player.getLocation().getZ();
        boolean isX = x >= lobbyLoc1.getX() && x <= lobbyLoc2.getX();
        boolean isY = z >= lobbyLoc1.getZ() && z <= lobbyLoc2.getZ();
        return isX && isY;
    }
}

現状

https://youtu.be/vGfJbXI1Akg

簡易版クラス図

次回

次回はタイマー機能の実装と昼のターン、投票ターン、夜のターンの移動処理を実装します。
次 -> 製作中

Discussion