🐺
【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;
}
}
現状

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