石橋を叩いて壊すブログ

モンスターを生み出し、装備を持たせたりステータス効果をつけたりする

前回の記事で書いたボスモンスタープラグインを作りながら思ったことを色々書く。
ちなみにBukkitのAPIはここで公開されているので、そちらでご確認を。

コマンドでプラグインの処理を実行するには

コマンドからプラグインの処理を実行したい場合は、プラグインのメインとなるクラス
(JavaPluginクラスを拡張したクラス)に以下のようなコードを書けばよい。

	/**
	 * コマンドが実行されたら呼び出される
	 */
	public boolean onCommand(CommandSender sender, Command cmd,
			String commandLabel, String[] args) {

		// コマンドを実行したプレイヤーを特定する
		Player player = sender.getServer().getPlayerExact(sender.getName());

		// 万一プレイヤーを特定できなかったら失敗
		if (player == null) {
			log.warning("コマンドを実行したプレイヤー(" + sender.getName() + ")を特定できませんでした。");
			return true;
		}

		// ボスモンスターを呼び出すコマンドか
		if (commandLabel.equalsIgnoreCase("boss")) {

			//ここに処理したいコードを書く

		}
	}

また、プラグインの設定ファイル(plugin.yml)に以下のように書いておく。

commands:
   boss:
      description: 【管理者専用】ボスモンスターを配置します
      usage: /boss <Level>
      permission: Protecter.basic
      permission-message: You don't have <permission>
      default: op

このあたりはいわゆる「おまじない」の世界なので、なぜこう書くのか?はあまり疑問を持たず
こう書けばとりあえず動くと思っておけばいい。

コードを書いて「/boss」コマンドを実行すると、onCommandメソッドが呼び出される。
このとき、sender.getName()でコマンドを実行したキャラクターの名前を取得できる。

さらに、ServerクラスのgetPlayerExactメソッドは、指定された名前のプレイヤーオブジェクトを返すので、
sender.getServer().getPlayerExact(sender.getName())とすることで、コマンドを実行したプレイヤーのオブジェクトを得ることが出来る。

ただし、ひとつ注意点がある。
マインクラフトのゲーム内からコマンドを打つと、sender.getName()の戻り値はプレイヤーの名前になるが、
サーバーのコンソールから「boss」コマンドを打つと、sender.getName()の戻り値はCONSOLEになる。
この場合、sender.getServer().getPlayerExact(sender.getName())の戻り値はnullとなるので、
実際の処理に移る前に変数がnullでないかをチェックする必要がある。


コンソールからbossコマンドを実行したところ。
プレイヤーが見つからないというエラーが表示されている。

ちなみに、plugin.ymlで「default: op」と書いてあるので、このコマンドはOP権限もちプレイヤーでないと実行できない。
このあたりの権限チェック処理はBukkit側で既に行われているので、プラグイン側で何かする必要はない。
もし心配なら、PlayerクラスのisOPメソッドでOP権限もちプレイヤーか否かを調べられる。

モンスターを生み出すには

コマンドを実行したプレイヤーの場所にモンスターを生み出すには、以下のようにする。

boss = (Creature) player.getWorld().spawnEntity(player.getLocation(), EntityType.SKELETON);

一番後ろの「SKELETON」の部分を変えると、ゾンビ(ZOMBIE)やジャイアント(GIANT)、果ては着火したTNT(PRIMED_TNT)などが生み出せる。
具体的には、上記したBukkitの公開されているAPIの情報からEntityTypeクラスの説明を読めばいろいろ書いてある。

アイテムを生み出すには

アイテムを生み出すには以下のようにすればいい。

ItemStack weapon = new ItemStack(Material.BOW);

ちなみにBOWとは日本語で「弓」である。
これも、一番後ろの「BOW」の部分を変えると、鉄の剣(IRON_SWORD)やダイヤの剣(DIAMOND_SWORD)などあらゆるものが生み出せる。
何が生み出せるかはMaterialクラスの説明を読めば書いてある。

アイテムをエンチャントするには

アイテムをエンチャントしたい場合は、上記のようにしてアイテムのオブジェクトを作ったあと、以下のようにすればよい。

weapon.addEnchantment(Enchantment.ARROW_DAMAGE, 2);

ここでは、弓にレベル2の矢のダメージ増加エンチャントを追加している。
ちなみに、ありえないエンチャントの組み合わせ(たとえば卵にノックバック効果)やありえないレベル(レベル0やレベル999)を指定すると、
IllegalArgumentExceptionが起きてエンチャントは付与できないので、Minecraft Wikiでエンチャントの詳細を確認しておくといい。

モンスターに武器や防具を持たせるには

さて、上記でアイテムを生み出しエンチャントをかけるところまではできた。
実際にボスにこれらのアイテムを装備してもらうには、以下のようにする。

boss.getEquipment().setItemInHand(weapon);

setItemInHandでは、手に持つアイテム(武器)を指定する。

防具は以下のように装備する。
ちなみにゾンビやスケルトンは日光に当たると燃えてしまうが、ヘルメットをかぶっていると燃えない。

boss.getEquipment().setHelmet(new ItemStack(Material.IRON_HELMET));
boss.getEquipment().setChestplate(new ItemStack(Material.IRON_CHESTPLATE));
boss.getEquipment().setLeggings(new ItemStack(Material.IRON_LEGGINGS));
boss.getEquipment().setBoots(new ItemStack(Material.IRON_BOOTS));

setHelmetはヘルメット、setChestplateはチェストプレート(上着)、setLeggingsはレギンス(ズボン)、setBootsはブーツを指定する。
今回は防具はエンチャントしていないので一箇所一行で済ませたが、エンチャントしたい場合は武器と同様のコードを書けばいい。

注意点として、ゾンビやクリーパーは武器を持たなくても問題ないが、
スケルトンは弓を持たないと、ゾンビのように体当たりで攻撃するようになる。
スケルトンに矢を撃ってもらいたい場合は、必ず弓を装備させること。


弓を持たないスケルトン。ゾンビのように積極的に体当たりしてくる。


ちなみにクリーパーやジャイアントに鉄の剣を持たせてみたが、表示されないようだ。

ボスに名前を表示するには

ボスには名前が欲しい。名前を表示するには以下のようにする。

boss.setCustomName("ゴルゴ・サーティワン");
boss.setCustomNameVisible(true);

setCustomNameメソッドで名前を決めると、モンスターの頭上に名前が表示されるようになる。
ただしこれだけだと、ゲーム内でカーソルを合わせたモンスターしか名前が表示されない。
常に名前を表示させたい場合は、setCustomNameVisible(true)を設定する必要がある。


setCustomNameVisible(true)を実行していない場合。
カーソルを合わせたモンスターの名前しか表示されない。


setCustomNameVisible(true)を実行した場合。
カーソルを合わせなくても名前が表示される。

ボスのヒットポイント(HP)を増やすには

ボスの最大HPを多くするには、このようにする。

boss.setMaxHealth(100);
boss.setHealth(boss.getMaxHealth());

setMaxHealthで、最大HPを設定できる。
setHealthで、現在のHPを設定できる。

ボスにステータス効果をかけるには

さらにボスを強くするには、ボスに補助魔法(ステータス効果)をかける。以下のようにする。

boss.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,3600 * 20, 2, false));

例ではSPEED(移動速度増加)ステータス効果をかけている。
例によってSPEEDの部分を書き換えると、攻撃力増加(INCREASE_DAMAGE)や移動速度低下(SLOW)といった効果を付与できる。

こちらも例によってMinecraft Wikiにステータス効果の詳細が書かれている。

ひとつ面白いことに、武器のエンチャントでは限界(たとえばダメージ増加はレベル5までとか)があるのに対し、
ステータス効果にはなぜか限界がないか、相当ゆるく設定されている。

このためゾンビに攻撃力上昇効果レベル20などを設定すると、ダイヤ防具でかためたプレイヤーでさえ一撃でノックアウトになったり、
移動速度上昇効果レベル20などをつけた日には新幹線も真っ青のスピードでゾンビが突っ走ったりと
大変に不条理な展開が発生してしまうので、十分に注意して設定したほうがいい。

せっかくなので、ここまでに書いたことをBukkit Wikiにも書いておいた。

この記事を評価

127 92

コメント

  1. 【だれか】 ガンバ [2014/7/3 20:37]
  2. 【カイロ】 もっと詳しく説明してください [2019/3/21 21:28]
  3. 【石橋】 習うより慣れろって感じで。この記事は記事冒頭のプラグインのソースを書きながらピックアップ的に説明したものなんで
    プラグインのソースを見て気になるところを好きなように改造したりしたほうが覚えますよ。 [2019/4/7 21:50]

【この記事にコメント】
お名前:
コメント:

277,008

記事カテゴリー

最近の記事

  1. FF14を翻訳したら国によって結構特色が違った[12/11]
  2. ゼロから始めるFactorioの回路構築(実践例編)[7/24]
  3. ゼロから始めるFactorioの回路構築(条件回路・論理演算編)[7/24]
  4. ゼロから始めるFactorioの回路構築(定数回路・算術回路編)[7/24]
  5. ゼロから始めるFactorioの回路構築(入力・出力・混合編)[7/24]

RSS1.0 RSS2.0

最近のコメント

  1. 天晴れ!押したらポーションのモヤモヤでまし…[5/26]
  2. 習うより慣れろって感じで。この記事は記事冒…[4/7]
  3. もっと詳しく説明してください[3/21]
  4. みなさんと同じです、
    すみません
    [11/21]
  5. 上と同じ理由です。
    すみません
    [9/26]

記事を検索


管理人

石橋

石橋を叩いて壊す慎重派