tacigar / maidroid

Minetest modpack: Provides cute maid robots
GNU Lesser General Public License v2.1
14 stars 12 forks source link

Improve maidroid's dummy item system. #145

Closed tacigar closed 7 years ago

tacigar commented 7 years ago

New algorithm.

  1. on_activate of maidroid must creates a dummy item and attach it by set_attach every time.
  2. The dummy item must be removed in get_staticdata every time.
tacigar commented 7 years ago

get_staticdata が, オブジェクトが消えるタイミングだけじゃなくて, 生成のタイミングでも呼ばれているっぽくてこのままじゃ無理と判明.

tacigar commented 7 years ago

dummy_imem が on_step で毎回近くの maidroid を探して, ない場合は remove という処理をしているのに倣って, maidroid の on_step でも毎回 dummy_item を探し, ない場合は生成するという風にする. また, dummy_item が複数 maidroid に引っ付かないように, dummy_item の on_activate で, チェックする.

tacigar commented 7 years ago

あ〜, on_activateget_staticdata という順で呼び出されているんですね... なので, 一番最初の on_activate の時だけは staticdata は空文字なので, 消されないと... 素晴らしいです!

ghost commented 7 years ago

すみません、間違っていたかもしれないので消しました…。 やっぱり出来るかもしれません。

get_staticdata = function(self)
  return "remove"
end

on_activate = function(self, staticdata)
  if staticdata == "remove" then
    self.object:remove()
    return
  end
end
chu-hai commented 7 years ago

BBSに書いたときは

  1. add_entity()を呼び出してエンティティ作成
  2. on_activate(), get_staticdata()が呼び出される
  3. 制御がadd_entity()の後に戻るので戻り値のobjを経由してエンティティを初期化
  4. 消えるときのget_staticdata()では初期化済みならremove() ってなことをイメージしてました。
tacigar commented 7 years ago

なるほど!ありがとうございます

tacigar commented 7 years ago

get_staticdataself.object:remove を呼び出しても上手く削除されないっぽいっす... remove は一応呼び出されてるっぽいですが, どんどん dummy_item が増えていってしまう...

ghost commented 7 years ago

的外れでした、すみません…。(get_activateとは…)
tacigar commented 7 years ago

get_activate... どっちだ... 😅

ghost commented 7 years ago

混乱している…(笑) さっきのon_activateで消すコードを使うのはいかがでしょう?動くか確認はしていませんが…。

tacigar commented 7 years ago

そうですね... 試したところちゃんと動きました!

chu-hai commented 7 years ago

うちではget_staticdata()でremove()を呼んで消えていますが、バージョンの差異? ちと見直してみます……

tacigar commented 7 years ago

get_staticdataで動かないのって、呼び出しの時点で既にself.objectは削除されているってことなんでしょうかね。

remove 自体は呼び出せるので削除はされてないと思います... ちょっと謎ですね...

うちではget_staticdata()でremove()を呼んで消えていますが、バージョンの差異?

ほんとですか! 当方 Mac で version 0.4.14 で試しています.

chu-hai commented 7 years ago

遠くに行った場合はOKだけど、ログアウト・ログインの場合はダメっぽいですね。 remove()を呼んでも残ってました。

tacigar commented 7 years ago

自分の環境では遠くへ行った場合もダメでした... 😢