0コメント

【Minecraft】連続で攻撃すると覚醒≪オーバードライブ≫するシステムつくった

こにゃにゃちわ=^_^=

今日何か新しい機能を作りたいなと考え付いたのがこれ。
早速functionの中身張り付けていきます

※attack_triggerはminecraft.damage_dealtかなんかで、攻撃すると自動でダメージを与える設定になっている。また、下記三行で「攻撃してから若干の猶予を与え0.25秒経過でリセットする」という仕組みを構成している
(間に四回実行できるので、さらに後記するOverDrive加算値が4になる理屈にもなっている)
#execute as @e[scores={attack_trigger=1..}] run scoreboard players add @s at.management 1
#execute as @e[scores={attack_trigger=1..,at.management=5..}] run scoreboard players set @s attack_trigger 0
#execute as @e[scores={at.management=5..}] run scoreboard players set @s at.management 0
簡単に説明すれば、攻撃判定(scores={attack_trigger=1..})でat.managementを加算しat.management=5..で0.25秒の猶予を与えた後attack_triggerをリセットしat.managementもリセットする。

ちなみに0.25秒の猶予の中にもう一度攻撃するとリセットされず既存の値に上書きする形で二度目攻撃ダメージ値が代入される

が、mobに存在する攻撃直後の無敵時間などから複数mobに超高速連打でもしない限りリセット前に代入されてタイミングが狂うという現象は起きないし、万が一起きてもあまり致命打にはならないためこのままとする。

例:一度目の攻撃後、0.15秒(3tick)の間隔があいてから二度目の攻撃を行う場合、
attack→(1tick未満)→at.management+1→〃→〃→attack→(1tick未満)→この時点で既にat.managementは4→5になった時点でリセット
つまり、二度目のattackの後猶予は2tickしか与えられておらずOverDrive値は二回目の攻撃でも4加算されるはずが2しか加算されないというバグがあるが凄く細かい問題なので今回はする―。という訳だ


function本文
scoreboard objectives add OverDrive dummy
scoreboard objectives add OverDrivePulse dummy
scoreboard objectives add OverDrivePulse2 dummy
execute as @a[tag=!ODmode] run scoreboard players add @s OverDrive 0
execute as @a[tag=!ODmode] if score @s attack_trigger matches 1.. run scoreboard players add @s OverDrive 1
execute as @a[tag=!ODmode] run scoreboard players add @s OverDrivePulse 1
execute as @a[tag=!ODmode] run scoreboard players operation @s OverDrivePulse2 = @s OverDrivePulse
execute as @a[tag=!ODmode] run scoreboard players operation @s OverDrivePulse2 %= s20 s20
execute as @a[tag=!ODmode] if score @s OverDrivePulse2 matches 0 if score @s OverDrive matches 1.. run scoreboard players remove @s OverDrive 1
execute as @a[tag=!ODmode] if score @s OverDrive >= @s OverDriveMax run tag @s add ODmode
execute as @a[tag=ODmode] if score @s OverDrive >= @s OverDriveMax run scoreboard players set @s OverDrivePulse 0
execute as @a[tag=ODmode] if score @s OverDrive >= @s OverDriveMax at @s run playsound minecraft:block.anvil.place ambient @a ~ ~ ~ 2 2
execute as @a[tag=ODmode] if score @s OverDrive >= @s OverDriveMax run tellraw @s {"text":"オーバードライブ発動","color":"dark_red"}
execute as @a[tag=ODmode] if score @s OverDrive >= @s OverDriveMax at @s run summon lightning_bolt
execute as @a[tag=ODmode] if score @s OverDrive >= @s OverDriveMax run scoreboard players remove @s OverDrive 1
execute as @a[tag=ODmode] run scoreboard players add @s OverDrivePulse 1
execute as @a[tag=ODmode] run scoreboard players operation @s OverDrivePulse2 = @s OverDrivePulse
execute as @a[tag=ODmode] run scoreboard players operation @s OverDrivePulse2 %= s3 s3
execute as @a[tag=ODmode] if score @s OverDrivePulse2 matches 0 run scoreboard players remove @s OverDrive 1
execute as @a[tag=ODmode] run effect give @s resistance 1 3 true
execute as @a[tag=ODmode] run effect give @s strength 1 4 true
execute as @a[tag=ODmode] run effect give @s speed 1 3 true
execute as @a[tag=ODmode] run effect give @s water_breathing 1 3 true
execute as @a[tag=ODmode] run effect give @s saturation 20 255 true
execute as @a[tag=ODmode] run effect give @s night_vision 1 3 true
execute as @a[tag=ODmode] run effect give @s regeneration 1 5 true
execute as @a[tag=ODmode] run effect give @s jump_boost 1 1 true
execute as @a[tag=ODmode] at @s run particle minecraft:dust 0 1 0 1 ~ ~ ~ 1 1 1 0 10 force
execute as @a[tag=ODmode] run scoreboard players add @s MPprocess1 3
execute as @a[tag=ODmode] if score @s OverDrive matches ..0 run tag @s remove ODmode
scoreboard objectives add OverDriveMax dummy
execute as @a unless score @s OverDriveMax matches 0.. run scoreboard players set @s OverDriveMax 100

宣言部。OverDriveはOverDriveを管理する値を格納するための変数。
OverDrivePulseはOverDriveが未発動時1秒ごとに1減算する処理を行う為に20秒間隔をとるためのベースとなるスコアを格納する変数。
OverDrivePulse2はOverDrivePulseを代入し20で割り、つまり1秒ごとにスコアが0になる毎秒間隔管理のための変数。
1秒間に一回という指定をOverDrivePulse2 matches 0として実行することで管理する
OverDriveに数字を所持していないと表示系でバグるので一応0を加算する
といった初期処理のみ。

②attack_triggerつまり攻撃時を判定し、OverDriveを加算する。さっき説明した通り5tickの猶予が出来るので(最後tickは既にat.,managementがリセットされているため実行されず)4回、OverDriveを4加算するという設定
あとは・・・なんか・・・見て分かる通り毎秒OverDriveを減算する処理(s20 s20には20を代入)

③OverDriveがOverDriveMaxを超えたらODmodeタグを付与しオーバードライブ中動作を管理します。
OverDriveMaxは後から追加したおまけで、プレイヤーがMax値を変えてオーバードライブ発動までのスコアを管理できるように設定できるようにしたもの。もともとはOverDrive matches 100..で100以上であれば、という固定だった

ちなみにこれはOverDriveMaxに100を代入しても同じ結果となる。

そんでODmodeが付与された直後を if score @s OverDrive >= @s OverDriveMaxで指定しOverDriveを減算してODmodeタグを付与した状態でOverDriveがOverDriveMax未満つまり、実行中という判断を行う流れになっている。
OverDrivePulse2とOverDrivePulse(一応リセットしてあるが)を使って3を代入したs3 s3でまた3tick(0.15秒)毎にOverDriveを減算させていくという流れ。その後は④

④ODmode中にプレイヤーにバフを与えまくる。これ見ての通り、割と時間中はチート性能を発揮する。時間は短いけどね(OverDriveMaxが100であれば、1スコア0.15秒ごとに減少させるという事で15秒しか持続しない。300であれば45秒持続する。
で減算し0になるとODmodeタグを削除する。削除するだけで非モード時の「攻撃するとOverDriveを加算する」という方に切り替えられる。

⑤OverDriveMaxをつかさどる。こちらは基本外部的に設定できる値なので、0未満などの異常な値の場合に100に設定される。



〇実行結果
プレイヤーは敵に攻撃するとOverDriveが4加算されます。また、毎秒1ずつ減算されていくため持続して攻撃しないとスコアはたまりません。
そこからOverDriveMaxの値までOverDriveの値が加算されるとオーバードライブが発動。既存の攻撃時OverDrive加算などの処理を一切遮断し(tag=!ODmode)、一方的にスコアを減算し(0.15秒/スコア)、様々なバフを付与。スコアが0になったらモード解除。


という流れだ。


何だこのシステムはって思うだろう

しかし、昔プレステ3でFF13かFF14だったか忘れたが、主人公がライトニングの方(曖昧)
で敵に攻撃するとブレイク状態にして物理攻撃耐性を破壊するってのがあったんですよね。

敵の防御を削っているわけじゃないのでこれとは異なるけど、攻撃し続けると何か起きる、という点での発想てなわけです。


・・・しかし、防御破壊か


敵キャラを作るとき、防具のほかにgeneric.armor値も設定して物理攻撃耐性を持たせるようにしているので、究極魔法とかそれこそ攻撃し続けると防御破壊を起こすとか

そういう機構も作ってみると面白いかも?


今回は文章だけになってしまったけど、ここら辺で。


まああまり活用例がなくとも、自分で見返したとき割とブログってのは役に立つもんだからね

サーバー機がウィルスでやられたとき、シェルスクリプトが全部いかれたわけだがブログに若干書き記した部分があったので、それを見返して再構築したりしておりました。

まあ備忘録みたいなもんですね。


まあ何か活用できるのであればありがたいですけど。

(^o^)ノ < おやすみー

この記事へのコメント