ABMの勉強

MinetestのABMを勉強中

フォーラムにあったサンプルを動かしてみる
ブロックは私のセラミックMOD


砂岩がセラミックブロックに変わりました(^^)




次のは
もともと草ブロックにジャングルの草が生えるというABMサンプル
今回はセラミックブロックです



でも、草が映えるのはブロックの判定だけだったので、
上手く一番上だけ生やす事ができなかったけど、
いろいろやっていたら
出来ました(^^)




次はちょっとチート気味のものです

名前は「Copy Pot」

セラミック製のポットの上にコピーしたいブロックを置きます



2段目から1段目のコピーが始まり、10段目で止まります(リミットが10と設定してある為)



Ruiさんとういんどさんに作っていただいたフラワーポットMODが気に入って
いつかは自分でも作ってみようかな・・・と思っていましたが、
まさかこんなコピーポットができるなんて思ってもみませんでした(^^)

ABM機能恐るべし!!

ナイショ話:
実はここだけの話し、
花やスイカもコピーできます
0.4.13から入ったキノコも出来ました(^^)


では、また次回!(^^)

P.S.
このMODにはバグがあり未だに直せません
コピーポットの上にコピーポットを置くと・・・
止まりません

公開は考え中(^^)

追記:
バグ修正済のものができました
ブログで紹介しました
ブログはこちらからどうぞ(^^)


コメント

  1. ABM使えると便利ですよね!
    やはり理解のスピードが早い...

    無限コピーバグはノード名を取得(minetest.get_node(pos).name)して判断するようにすると直せると思います。

    返信削除
  2. コードを読んでいませんが、推測するに…
    1:「一番下のコピーポッドが10段コピーして仕事を終わる」
    2:「上から2番目のコピーポッドの上にコピーポッドが乗っている」
    3:「”上から2番目のコピーポッド”の上には1個しか乗っていないので10段コピーする」
    4:「『上から2番目”になった”コピーポッド』がコピーをするので2:に戻る」
    という無限ループかと。バグというより仕様の不具合だと思います。
    『コピーポッドでコピーポッドをコピーしないようにする』のが一番の対策かと。
    あるいは、コピーポッドの下にコピーポッドがある時はコピーをしない制御をかけるか。

    返信削除
  3. 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

    変数名など色々変ですが、これ出来ると思います。
    (動作は未確認です)

    返信削除
  4. すみません、3行目は==ではなく~=です...

    返信削除
  5. ういんどさん、Ruiさんありがとうございます

    https://www.dropbox.com/s/kp50xj9so023ssd/copy_pot.zip?dl=0
    このリンクが開発中のものです

    Growing部分はRuiさんのMODから使用したものに変数などを書き換えたものです

    私にはハードルが高い!
    まだあまり理解していないので、
    公開します


    これができたら、
    次はx,z方向にコピーしてフロア自動作成とかにしたいです
    (現在のものでは、ポットを並べてy方向に伸びて壁は作れるので・・・)

    バグありなので、要注意です
    自己責任でお願いします

    返信削除
  6. このコメントは投稿者によって削除されました。

    返信削除
  7. 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ブロックずつ伸びるように改善しました。

    返信削除

コメントを投稿

このブログの人気の投稿

Minetestのメニュー言語の変え方 2017/06/17

MODを入れよう!

額縁MOD