在Minecraft中实现自动出租马匹
简述
CKBPlugin是在Minecraft服务器(SpigotMC服务器)上实现自动租借马匹的插件。本篇文章主要对CKBPlugin的技术概述进行了解释,并附上了插件代码在GitHub上的信息。
希望的受众
-
- Spigotプラグインの開発について理解を深めたい方
- 馬好きの方(?)
插件开发的背景
之前,我在Minecraft中发布了以下内容关于火车的自动驾驶的文章。
这个插件是为了在游戏中补充除铁路之外的移动方式而开发的。可以用现在的说法称之为微移动吗(?)
插件的主要规格
-
- 専用の馬(エンティティ)を右クリックすることで貸し出された馬に騎乗する
- 貸し出された馬から降りると、自動的に当該の馬をデスポーンさせる
租借场地用马实体的规格与实施方案
不,就像铁路运输车一样,右键单击也可以使用专用标志牌吗?
但是觉得那样有点无聊,所以我们将下述规格的马作为专用马。
・马的名字是特定的(CKB Station)。
・没有设定AI,这个规格有点可怕。
以下是生成出租场所所用的马的实施方案。
// とりあえず馬をスポーンさせる
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));
办理借贷手续
在处理上与生成出借场所的马时有一些相似之处,但会设定移动速度和体力参数,使其成为一匹好马。
// とりあえずプレイヤーの位置に馬をスポーンさせる
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 + " ご利用ありがとうございます。どうぞご安全に!");
下车时的处理方法
一旦下車即表示租借結束。
// 降りたのがプレイヤーか確認
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)
闲聊
插件的灵感来自于《最终幻想14》中的陆行鸟驿站。
真正的陆行鸟拼写是“chocobo”,这是个秘密。
最后
享受愉快的騎馬生活吧!