diff --git a/init.lua b/init.lua index 4595ab2..674aa8e 100644 --- a/init.lua +++ b/init.lua @@ -6,7 +6,7 @@ basic_robot.call_limit = 32; -- how many execution calls per script execution al basic_robot.bad_inventory_blocks = { ["craft_guide:sign_wall"] = true, } - +basic_robot.version = "11/14a"; basic_robot.data = {}; @@ -95,6 +95,11 @@ function getSandboxEnv (name) end end, + remove = function() + basic_robot.data[name].obj:remove(); + basic_robot.data[name].obj=nil; + end, + spam = function (mode) -- allow more than one msg per "say" if mode == 1 then basic_robot.data[name].allow_spam = true @@ -670,17 +675,20 @@ local on_receive_robot_form = function(pos, formname, fields, sender) "**BOOKS/CODE\nbook.read(i) returns contents of book at i-th position in library \nbook.write(i,text) writes book at i-th position\n".. "code.set(text) replaces current bytecode of robot\n".. "find_nodes(\"default:dirt\",3) is true if node can be found at radius 3 around robot, otherwise false\n".. + "**PLAYERS\n".. "find_player(3) finds player and returns his name in radius 3 around robot, if not returns false\n".. "attack(target) attempts to attack target player if nearby \n".. - "self.pos() returns table {x=pos.x,y=pos.y,z=pos.z}\n".. - "self.spawnpos() returns position of spawner block\n".. - "self.viewdir() returns vector of view for robot\n".. + "player.getpos(name) return position of player, player.connected() returns list of players\n".. + "**ROBOT\n".. + "say(\"hello\") will speak\n".. "self.listen(mode) (de)attaches chat listener to robot\n".. "listen_msg() retrieves last chat message if robot listens\n".. - "player.getpos(name) return position of player, player.connected() returns list of players\n".. - "fire = function(speed, pitch,gravity) fires a projectile from robot\n".. - "say(\"hello\") will speak"; - + "self.pos() returns table {x=pos.x,y=pos.y,z=pos.z}\n".. + "self.spam(1) enable message repeat to all\n".. + "self.remove() removes robot\n".. + "self.spawnpos() returns position of spawner block\n".. + "self.viewdir() returns vector of view for robot\n".. + "fire = function(speed, pitch,gravity) fires a projectile from robot\n"; text = minetest.formspec_escape(text); @@ -744,8 +752,23 @@ minetest.register_on_player_receive_fields( if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return 0 end on_receive_robot_form(pos,formname, fields, sender) + return end end + + local robot_formname = "robot_control_"; + if string.find(formname,robot_formname) then + local name = string.sub(formname, string.len(robot_formname)+1); + local sender = minetest.get_player_by_name(name); if not sender then return end + if fields.OK and fields.code then + local item = sender:get_wielded_item(); --set_wielded_item(item) + item:set_metadata(fields.code); + sender:set_wielded_item(item); + end + return + end + + end ) @@ -818,6 +841,59 @@ minetest.register_node("basic_robot:spawner", { }) +-- remote control +minetest.register_craftitem("basic_robot:control", { + description = "Robot remote control", + inventory_image = "control.png", + groups = {book = 1, not_in_creative_inventory = 1}, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + + local name = user:get_player_name(); + if user:get_player_control().sneak then + + local code = minetest.formspec_escape(itemstack:get_metadata()); + local form = + "size[9.5,1]" .. -- width, height + "textarea[1.25,-0.25;8.75,3;code;;".. code.."]".. + "button_exit[-0.25,-0.25;1.25,1;OK;SAVE]"; + minetest.show_formspec(name, "robot_control_" .. name, form); + return + end + + if basic_robot.data[name] and basic_robot.data[name].sandbox then + + else + minetest.chat_send_player(name, "#remote control: your robot must be running"); + return + end + + script = itemstack:get_metadata(); + local ScriptFunc, CompileError = loadstring( script ) + if CompileError then + minetest.chat_send_player(name, "#remote control: compile error " .. CompileError ) + return + end + + setfenv( ScriptFunc, basic_robot.data[name].sandbox ) + + local Result, RuntimeError = pcall( ScriptFunc ); + if RuntimeError then + minetest.chat_send_player(name, "#remote control: run error " .. RuntimeError ) + return + end + end, +}) + +minetest.register_craft({ + output = "basic_robot:control", + recipe = { + {"default:stick"}, + {"default:mese_crystal"} + } +}) + + minetest.register_craft({ output = "basic_robot:spawner",