効果付き雪球のコマンド

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年以上経過している古い記事だ。新しいバージョンに合わせて装置を作り直してスクショを取り直して解説を書き直す面倒臭さが君には分かるかい?