ABMの勉強
MinetestのABMを勉強中
フォーラムにあったサンプルを動かしてみる
ブロックは私のセラミックMOD
砂岩がセラミックブロックに変わりました(^^)
次のは
もともと草ブロックにジャングルの草が生えるというABMサンプル
今回はセラミックブロックです
でも、草が映えるのはブロックの判定だけだったので、
上手く一番上だけ生やす事ができなかったけど、
いろいろやっていたら
出来ました(^^)
次はちょっとチート気味のものです
名前は「Copy Pot」
セラミック製のポットの上にコピーしたいブロックを置きます
2段目から1段目のコピーが始まり、10段目で止まります(リミットが10と設定してある為)
Ruiさんとういんどさんに作っていただいたフラワーポットMODが気に入って
いつかは自分でも作ってみようかな・・・と思っていましたが、
まさかこんなコピーポットができるなんて思ってもみませんでした(^^)
ABM機能恐るべし!!
ナイショ話:
実はここだけの話し、
花やスイカもコピーできます
0.4.13から入ったキノコも出来ました(^^)
では、また次回!(^^)
P.S.
このMODにはバグがあり未だに直せません
コピーポットの上にコピーポットを置くと・・・
止まりません
公開は考え中(^^)
追記:
バグ修正済のものができました
ブログで紹介しました
ブログはこちらからどうぞ(^^)
フォーラムにあったサンプルを動かしてみる
ブロックは私のセラミックMOD
砂岩がセラミックブロックに変わりました(^^)
次のは
もともと草ブロックにジャングルの草が生えるというABMサンプル
今回はセラミックブロックです
でも、草が映えるのはブロックの判定だけだったので、
上手く一番上だけ生やす事ができなかったけど、
いろいろやっていたら
出来ました(^^)
次はちょっとチート気味のものです
名前は「Copy Pot」
セラミック製のポットの上にコピーしたいブロックを置きます
2段目から1段目のコピーが始まり、10段目で止まります(リミットが10と設定してある為)
Ruiさんとういんどさんに作っていただいたフラワーポットMODが気に入って
いつかは自分でも作ってみようかな・・・と思っていましたが、
まさかこんなコピーポットができるなんて思ってもみませんでした(^^)
ナイショ話:
実はここだけの話し、
花やスイカもコピーできます
0.4.13から入ったキノコも出来ました(^^)
では、また次回!(^^)
P.S.
このMODにはバグがあり未だに直せません
コピーポットの上にコピーポットを置くと・・・
止まりません
公開は考え中(^^)
追記:
バグ修正済のものができました
ブログで紹介しました
ブログはこちらからどうぞ(^^)
ABM使えると便利ですよね!
返信削除やはり理解のスピードが早い...
無限コピーバグはノード名を取得(minetest.get_node(pos).name)して判断するようにすると直せると思います。
コードを読んでいませんが、推測するに…
返信削除1:「一番下のコピーポッドが10段コピーして仕事を終わる」
2:「上から2番目のコピーポッドの上にコピーポッドが乗っている」
3:「”上から2番目のコピーポッド”の上には1個しか乗っていないので10段コピーする」
4:「『上から2番目”になった”コピーポッド』がコピーをするので2:に戻る」
という無限ループかと。バグというより仕様の不具合だと思います。
『コピーポッドでコピーポッドをコピーしないようにする』のが一番の対策かと。
あるいは、コピーポッドの下にコピーポッドがある時はコピーをしない制御をかけるか。
pos.y = pos.y + 1
返信削除local node = minetest.get_node(pos)
if node.name == "air"
and node.name ~= "copypot:copypot" then
for i = 1, 10 do
pos.y = pos.y + 1
local node2 = minetest.get_node(pos)
if node2.name ~= "air"
and node2.name ~= node.name then
break
end
minetest.set_node(pos, node)
end
end
変数名など色々変ですが、これ出来ると思います。
(動作は未確認です)
すみません、3行目は==ではなく~=です...
返信削除ういんどさん、Ruiさんありがとうございます
返信削除https://www.dropbox.com/s/kp50xj9so023ssd/copy_pot.zip?dl=0
このリンクが開発中のものです
Growing部分はRuiさんのMODから使用したものに変数などを書き換えたものです
私にはハードルが高い!
まだあまり理解していないので、
公開します
これができたら、
次はx,z方向にコピーしてフロア自動作成とかにしたいです
(現在のものでは、ポットを並べてy方向に伸びて壁は作れるので・・・)
バグありなので、要注意です
自己責任でお願いします
このコメントは投稿者によって削除されました。
返信削除pos.y = pos.y + 1
返信削除local node = minetest.get_node(pos)
if node.name ~= "air"
and node.name ~= "copy_pot:copy_pot" then
for i = 1, 10 do
pos.y = pos.y + 1
local node2 = minetest.get_node(pos)
if node2.name == "air" then
minetest.set_node(pos, node)
break
elseif node2.name ~= node.name then
break
end
end
end
さっきのコードは一気に10ブロック伸びてたので、1ブロックずつ伸びるように改善しました。