効果付き雪球のコマンド

PvPでよく使われる"雪球"ってダメージが付いてませんよね。今回はそんな雪球に、コマンドでダメージ等の効果を付与する能力を与える方法を解説します。要するにダメージ付き雪球の作り方です。
なお、「基礎講座」と書いてますが要するに内容薄いってことです。一記事にいろいろ詰め込むよりはテクニックごとに小さな記事を書いていこう、という方針に転換したんで記事は短いですがご了承下さい!

スポンサーリンク
お待ち! この記事は最後の更新から1年以上経過している古い記事だ。新しいバージョンに合わせて装置を作り直してスクショを取り直して解説を書き直す面倒臭さが君には分かるかい? 分からないなら読まないほうがいいぜ。

効果付きの雪球となるアイテムをgiveコマンドで入手

今回は例として、2種類の雪球を作ってみます。

ダメージを与える「ダメージ付き雪球」を入手するコマンド
ダメージ付き雪球
/give @p minecraft:snowball 16 0 {display:{Name:"ダメージ付き雪球",Lore:["右クリックで撃ちます","即席ダメージを与えます"]}}
毒と鈍化効果を与える「毒と鈍化効果付き雪球」を入手するコマンド
毒と鈍化付き雪球
/give @p minecraft:snowball 16 0 {display:{Name:"毒と鈍化効果付き雪球",Lore:["右クリックで撃ちます","毒と鈍化効果を与えます"]}}

Lore:["1行目","2行目"]とすることで複数行の説明文を書けます。


この装置を動かす基盤となる、雪球のスコアを操作する装置を用意しておこう

今回作る「効果付き雪球」、単純そうに見えますが事前にちょっと複雑な装置を用意しておく必要があります。何故なら「雪球を使った人を0.45秒間撃った雪球からの効果から守る」仕組みを実現させるためです。

スコアボードを作成
/scoreboard objectives add useSB stat.useItem.minecraft.snowball

こちらの記事で解説した、アイテムの使用などを検知するstat機能を使います。

下準備の装置

コマブロを2つ設置して、以下のコマンドを入力します。

[2016年8月4日追記] ▲一番左のコマブロは"常時実行"なのでレッドストーンブロックは要りません!

「1」Repeat(リピート)Unconditional(無条件)Always Active(常時実行)
/scoreboard players add @a[score_useSB_min=1,score_useSB=9] useSB 1
雪球を使うと、useSBが10になるまでスコアが増えます。
「2」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/scoreboard players remove @a[score_useSB_min=10] useSB 10
useSBが10まで増えたら0にします。
スコアの動き

上記2つのコマンドを常時動かすことで、雪球を使うと0.45秒間の間で0→1→2→...9→0という風にスコアが変化します。これにより、後で雪球に効果を付けた際に、雪球を撃った後しばらくの間は撃った本人を保護する、という仕組みが作れるのです。

なお、この2つのコマンドは以下で解説する2パターンの雪球どちらの動作にも共通して必要です。


[追記] 以下で解説する雪球を使う際は、使うプレイヤー全員がいる状態で以下のコマンドを一度実行する必要があります。

その時処理範囲にいる全員の「useSB」を0にセットして引数の検知対象にする
/scoreboard players set @a useSB 0

このコマンドを実行すると、その時点で処理範囲内の全員の「useSB」が0になり、そうすることで初めて保護機能が使えるようになります。


ダメージを与える雪球のコマンドを解説

コマンド4つ

まずは「当たったMobやプレイヤーにダメージを与える雪球」のコマンドを解説します。

[2016年8月4日追記] ▲一番左のコマブロは"常時実行"なのでレッドストーンブロックは要りません!

※マウスオーバーすると説明が出る箇所を用意しています。
「1」Repeat(リピート)Unconditional(無条件)Always Active(常時実行)
/scoreboard players tag @a add hasDamageSB {SelectedItem:{id:"minecraft:snowball",tag:{display:{Name:"ダメージ付き雪球",Lore:["右クリックで撃ちます","即席ダメージを与えます"]}}}}
「ダメージ付き雪球(説明文も合致)」を持っている人に、hasDamageSBタグを付与します。
「2」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/execute @a[tag=hasDamageSB] ~ ~ ~ scoreboard players tag @e[c=1,type=Snowball,r=3] add isDamageSB
hasDamageSBタグを持つ人の近くの雪球エンティティ(=その人が撃った雪球)に、isDamageSBタグを付与します。
「3」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/execute @e[c=1,tag=isDamageSB] ~ ~ ~ effect @e[score_useSB=0,r=2] minecraft:instant_damage 1 0
isDamageSBタグが付いた雪球は、雪球を使ったプレイヤー以外の近くのエンティティにダメージを与えます。「r=2」って範囲が広すぎるように思えますが、これくらい広くしないと雪球が速すぎて効果が付与されません。
「4」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/scoreboard players tag @a remove hasDamageSB
プレイヤーのhasDamageSBタグを消去します。
図解

仕組みを図で示すとこんな感じ。タグを付けて、タグを付けて...タグ機能ってほんと便利ですよね。

新システム「tag」の使い方の解説記事
Tag機能の使い方
https://napoan.com/howtouse-tag-system/

え、タグの使い方がいまいち分からないって? 安心して下さい、書いてますよ。解説。
余談ですがとにかく明るい安村ってもう古いんですかね、404ページで思いっきり滑ってる気がしてならないんです


この装置、一つ特徴というか欠点がございまして、雪球を撃ちまくればダメージから身を守れちゃうんです...(useSBが増えてダメージ対象ではなくなるため)だからといって保護しなかったら撃った本人に自分の雪球のダメージが入ってしまいますし、難しいところです... まあ、"雪球を互いに撃つことで効果を相殺できます"とPvPのプレイヤーに説明すれば大丈夫でしょう。

[追記] もう一度言いますが、雪球を使う前にプレイヤー皆が揃っている状態で以下のコマンドを一回実行する必要があります。

その時処理範囲にいる全員の「useSB」を0にセットして引数の検知対象にする
/scoreboard players set @a useSB 0

▲このコマンドを実行しないと「useSB」スコアをコマンドの引数として使えないので、必ずプレイヤーを集めてから一度実行して下さい。


毒と鈍化効果を与える雪球のコマンドを解説

複数の効果を付与するコマンド達

次は複数の効果を付与する「毒と鈍化効果付き雪球」のコマンドを解説します。

[2016年8月4日追記] ▲一番左のコマブロは"常時実行"なのでレッドストーンブロックは要りません!

※マウスオーバーすると説明が出る箇所を用意しています。
「あ」Repeat(リピート)Unconditional(無条件)Always Active(常時実行)
/scoreboard players tag @a add hasChaosSB {SelectedItem:{id:"minecraft:snowball",tag:{display:{Name:"毒と鈍化効果付き雪球",Lore:["右クリックで撃ちます","毒と鈍化効果を与えます"]}}}}
「毒と鈍化効果付き雪球(説明文も合致)」を持っている人に、hasChaosSBタグを付与します。
「い」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/execute @a[tag=hasChaosSB] ~ ~ ~ scoreboard players tag @e[c=1,type=Snowball,r=3] add isChaosSB
hasChaosSBタグを持つ人の近くの雪球エンティティ(=その人が撃った雪球)に、isChaosSBタグを付与します。
「う」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/execute @e[c=1,tag=isChaosSB] ~ ~ ~ effect @e[score_useSB=0,r=2] minecraft:poison 20 2
isDamageSBタグが付いた雪球は、雪球を使ったプレイヤー以外の近くのエンティティにを与えます。
「え」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/execute @e[c=1,tag=isChaosSB] ~ ~ ~ effect @e[score_useSB=0,r=2] minecraft:slowness 20 0
同様に、鈍化効果も与えます。
「お」Chain(チェーン)Unconditional(無条件)Always Active(常時実行)
/scoreboard players tag @a remove hasChaosSB
プレイヤーのhasChaosSBタグを消去します。
1つのタグで2つの効果

hasChaosSBというタグを与えておくことで、後はどんどん付与する効果を追加することが可能です。




いかがでしたか。マルチプレイでしたらプラグインで解決できる問題ですが、それでもコマンドで実現してみるのは楽しいものです。「こんな仕掛けをコマンドで作って欲しい」等ありましたら、コメントやTwitterでお気軽にお伝え下さい。

スポンサーリンク

毎度毎度ツイート、コメント等ありがとうございます。Twitterではブログの更新状況など色々呟いてます。気軽にフォロー下さい。

スポンサーリンク

コメント

お待ち! この記事は最後の更新から1年以上経過している古い記事だ。新しいバージョンに合わせて装置を作り直してスクショを取り直して解説を書き直す面倒臭さが君には分かるかい?
  • りくせん@Hon J.

    記事のトップ(タイトル?)などに対応バージョンなどを書いて欲しいです…

    • ハルトムの実況チャンネル!!

      おそらく1.9 1.10だとおもいます。

    • コメントありがとうございます。記事タイトル右上に対応バージョンの表記を追加しました。まだコマンド解説記事だけですが…

  • リタリン

    /execute @e[c=1,tag=isDamageSB] ~ ~ ~ effect @e[score_useSB=0,r=2] minecraft:instant_damage 1 0
    これってすべてのエンティティに前もってuseSBのスコアをつけとかないとだめでは?
    /execute @a[score_useSB=0] ~ ~ ~ /execute @e[c=1,tag=isDamageSB] ~ ~ ~ effect @e[tag=!hasChaosSB,r=2] minecraft:instant_damage 1 0
    のほうがいい気がします。勘違いだったらすみません。

    • useSBのスコアについてご指摘ありがとうございます。追記しました。
      それとそのコマンドだと、カオス雪球を持つだけでダメージから身を守れてしまいます…

      • リタリン

        そうでしたね…
        あと/scoreboard players set @a useSB 0ではなくて/scoreboard players set @e useSB 0でないとエンティティに対してエフェクトが付与されないかと思います。

        • 雪球を使った人を保護する機能なので、プレイヤー以外のエンティティにセットする必要はないかと思います

          • リタリン

            effect @e[score_useSB=0,r=2] minecraft:instant_damage 1 0の部分でエンティティに対する引数としてuseSBが使われていると思います。

          • そこを@aにすると、別途@eのコマンドを用意しないとエンティティに対して使えなくなるので、引数はプレイヤー用ですがあえて@eにしているんです。コマンドを最小限に抑えたいので…

          • リタリン

            /scoreboard players set @e useSB 0 してあげないとどちらにせよエンティティに対してeffect @e[score_useSB=0,r=2] minecraft:instant_damage 1 0は使えないと思います。
            あと雪球を使った人を保護するだけであれば前もって/scoreboard players set @a useSB 0しなくとも雪玉を使った時点でuseSBのスコアが増えるので問題ないかと…

          • スコアの0セットについては最初の返信の時に追記済みです。それとuseSBが1になる時を手掛かりにするということは、常時0に戻して使ったタイミングを取るしかないので、結果的にスコアが1になるのは0.05秒間だけになってしまい、その保護時間の間に雪球のダメージ範囲が、撃った人から離れるのは困難です

          • リタリン

            自分に文章力がなくて言いたいことが伝わらないみたいです…すみませんでした。
            色々とお答えいただきありがとうございました。

  • Bucchi

    これだとエンティティすれすれに雪玉が通るとそのエンティティにもついちゃいますが、
    それは我慢しないとダメですよね。
    今のコマンドじゃあ当たったエンティティにだけ、というのは難しいですし。

  • 実況者ピンポン₂⁴¹₆

    これって雪玉投げた直後の人に雪玉他の人が当てても効かないのでは?

  • nig65

    今配布マップ作ってるんですが手に何も持ってない状態を検知できないでしょうか?

    • nig65

      あ、できればコマンドブロックだけで検知できませんかね?

      • ookiikuma

        ヒント:「「手に何か持っている」の否定」を考えてみましょう。

  • たけとんぼ

    雪玉の範囲に入ったエンティティに地形が壊れない爆発するには
    ダメージを与える雪球のコマンドを解説の「4」で
    即時爆発するクリーパーをスポーンさせるコマンドにして
    ゲームルールを/gamerule mobGriefing falseにすればできますか?

  • たけとんぼ

    間違えました。「3」でしたね。すみません

  • mizuyu^^

    いつもお世話になっております。
    ダメージを与える雪玉の「2」のところなんですが、雪玉にスコアボードを与えられません。
    なぜかプレイヤーにタグを与えようとして実行に失敗しています。
    コマンドはコピペで、マウスオーバーの部分はきちんと消しましたし、コマンドブロックもリピート+チェーン×3です。
    ちなみに本体verは1.9.2です。
    どなたか分かる方、解説おねがいします。

  • 人間です

    コマンドで特定のエンティティが違う他のエンティティを攻撃させるならどうすればいいですか?わかる方どなたか教えてくださいお願いします

  • 黒瀬春太

    このコマンド、動画で紹介してもいいでしょうか?

  • 1210 レイノ

    1.11.2じゃ使えないんですか?