5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Minecraftサーバ開発・運営Advent Calendar 2021

Day 12

マインクラフトで馬の自動貸出をする

Last updated at Posted at 2021-12-11

概要

CKBPluginは、Minecraftサーバ(SpigotMCサーバー)上で馬の自動貸出を行うプラグインです。
本記事では主にCKBPluginの技術概要について説明し、添付資料としてプラグインコードのGitHub情報を掲載する。

想定する読者

  • Spigotプラグインの開発について理解を深めたい方
  • 馬好きの方(?)

プラグインの開発背景

以前、マイクラ内でのトロッコの自動運行に関する下記の記事を投稿しました。

本プラグインはゲームプレイ上、鉄道以外に移動手段を補完する目的で開発されました。
今風に言えばマイクロモビリティです(?)

プラグインの主な仕様

  • 専用の馬(エンティティ)を右クリックすることで貸し出された馬に騎乗する
  • 貸し出された馬から降りると、自動的に当該の馬をデスポーンさせる

貸出場所用の馬エンティティの仕様と実装

いや、トロッコと同じように専用の看板を右クリックでもいいんですよ?
でもなんかそれだと味気ないので下記仕様の馬を専用馬としました。

・馬につけられている名前が特定のもの(CKB Station)であること。
・AIが設定されていないこと 地味に恐ろしい仕様

貸出場所用の馬をスポーンさせる実装は下記の通りです。

抜粋:CommandExe.java
// とりあえず馬をスポーンさせる
World world = player.getWorld();
Entity entity = world.spawnEntity(player.getLocation(), EntityType.HORSE);

// 馬がスポーンしたかチェックする (WorldGuradなどでスポーン禁止されている場合などを想定)
if (entity == null || !(entity instanceof Horse)) {
    player.sendMessage(ChatColor.RED + "[CKB] 馬の生成に失敗しました。");
    return;
}
Horse horse = (Horse)entity;

// 不死にする(デスポーン無効化含む)
horse.setInvulnerable(true);
horse.setRemoveWhenFarAway(false);

// AIを無効化する
horse.setAI(false);

// 飼いならした状態にする
horse.setTamed(true);

// 専用の名前をつける
horse.setCustomName("CKB Station");

// 成体でないと乗れないので、そうでなければ成体にする
if (!horse.isAdult()) {
    horse.setAdult();
}

// 鞍をつける
horse.getInventory().setSaddle(new ItemStack(Material.SADDLE, 1));

借りるときの処理

処理としては貸出場所用の馬をスポーンさせるときと同じところもありますが、移動速度や体力のパラメータを設定してイイ馬にしておきます。

抜粋:EventListener.java
// とりあえずプレイヤーの位置に馬をスポーンさせる
Location loc = player.getLocation();

// スポーンしたかチェックする
Entity se = player.getWorld().spawnEntity(loc, EntityType.HORSE);
if (se == null || !(se instanceof Horse)) {
    return;
}
Horse pHorse = (Horse)se;

// 貸出用の名前をつけておく
pHorse.setCustomName("CKB Rental");

// AI無効化
pHorse.setAI(false);

// 成体化
pHorse.setAdult();

// 鞍を装備させる
pHorse.getInventory().setSaddle(new ItemStack(Material.SADDLE, 1));

// 各種パラメータを調整する
pHorse.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(30.0);
pHorse.setHealth(30.0);
pHorse.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(0.45);

// 所有者をプレイヤーにする
pHorse.setOwner(player);

// 乗せ込み+個別チャットメッセージ送信
pHorse.addPassenger(player);
player.sendMessage(ChatColor.GREEN + "[CKB]" + ChatColor.WHITE + " ご利用ありがとうございます。どうぞご安全に!");

降りるときの処理

降りた時点でレンタル終了とします。

抜粋:EventListener.java
// 降りたのがプレイヤーか確認
Entity e = event.getExited();
if (!(e instanceof Player)) {
    return;
}
Player player = (Player)e;

// プレイヤーが降りたのが馬からか確認
Vehicle v = event.getVehicle();
if (!(v instanceof Horse)) {
    return;
}
Horse horse = (Horse)v;

// レンタル用の馬でなければreturn
if (!EventListener.isRentalHorse(horse)) return;

// 馬のデスポーン、個別チャットメッセージ送信
horse.remove();
player.sendMessage(ChatColor.GREEN + "[CKB]" + ChatColor.WHITE + " ご利用ありがとうございました。この後もご安全に!");

その他の機能

  • インベントリから鞍を盗まれないようにする対策
  • 貸出場所用馬の移動モード(権限者のみ変更コマンドを実行可)

プラグインソースコード(GitHub)

トリビア

プラグイン名の元ネタはFF14のチョコボポーターです。
本当のチョコボの綴りは "chocobo" なのは秘密。

さいごに

楽しい乗馬ライフを!

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?