1

これは、私が抱えている問題の簡略版です。

[bot0.lua]

function OnHit(bot)

// Where the bot structure and vec3 
// generated using SWIG and registered to a 
// "global" lua_State that I maintain.
bot.color = vec3( 1.0, 0.0, 0.0)
end;

[bot1.lua]

function OnHit(bot)

bot.color = vec3( 0.0, 1.0, 0.0)
end;

読み込み時に、スクリプトごとに最初に次のことを行います (疑似コード)。

bot->script->L = lua_newthread( <Global lua_State where vec3 etc... are registered> )

luaL_loadbuffer( bot->script->L, botXXX.lua ...

lua_call( bot->script->L, ...

次に、実行時にボットがヒットしたときにプログラムから次のように呼び出します。

luaL_dostring( bot->script->L, "OnHit(GetBot(\"<the bot name>\")" );

(ここで、GetBot はグローバル lua_State に登録された関数でもあります)。

問題は、bot1.lua OnHit が最後に読み込まれたボット ファイルにあるため、ボットが常に緑色になることです。lua_newthread を使用することで、作成された「スレッド」ごとに OnHit の新しい定義を作成して、ボットに適切な色を割り当てることができると考えました。しかし実際には、読み込まれた最新の OnHit は、グローバル lua_State 環境内の前のものを上書きします。

私の質問は次のとおりです。スクリプトごとに異なる環境を作成して、正しいボット->スクリプト->L に対して正しい OnHit が呼び出され、すべての関数 (vec3、GetBot など) にアクセスできる場所を作成するにはどうすればよいですか?など... 関数) は、作成した「グローバル」lua_State 環境内に登録されていますか?

[編集]

さらに調査した結果、必要なのはCで「サンドボックス化」できることだと思います。私は正しいですか?

[編集]

スクリプト環境でルックアップが失敗した場合、グローバル環境に対してルックアップが行われるようにしたいので、実際にはサンドボックス化ではありません。それは可能ですか?

4

1 に答える 1

0

bot0.lua

local bot = {}

function bot:OnHit()
  self.color = vec3( 1.0, 0.0, 0.0)
end

return bot

bot1.lua

local bot = {}

function bot:OnHit()
  self.color = vec3( 0.0, 1.0, 0.0)
end

return bot

main.lua

all_bots = {[0]=require"bot0", require"bot1"}

function GetBot(name)
  if name == "bot #0" then
    return all_bots[0]
  elseif name == "bot #1" then
    return all_bots[1]
  end
end

Cプログラム内

luaL_dostring( bot->script->L, "GetBot('<the bot name>'):OnHit()" );
于 2013-04-16T05:46:46.187 に答える