diff --git a/commands.lua b/commands.lua index 453d59b..c5c42a0 100644 --- a/commands.lua +++ b/commands.lua @@ -47,11 +47,14 @@ end local check_operations = function(name, quit) if basic_robot.maxoperations~=0 then local data = basic_robot.data[name]; - local operations = data.operations; - if operations > 0 then data.operations = operations-1 else + local operations = data.operations-1; + if operations >= 0 then + data.operations = operations + else if quit then - error("robot out of available operations in one step."); return + error("robot out of available operations in one step."); return false end + return false end end end @@ -83,14 +86,25 @@ end basic_robot.commands.turn = function (name, angle) local obj = basic_robot.data[name].obj; - local yaw = obj:getyaw()+angle; + local yaw; + -- more precise turns by 1 degree resolution + local mult = math.pi/180; + local yaw = obj:getyaw(); + yaw = math.floor((yaw+angle)/mult+0.5)*mult; obj:setyaw(yaw); end + +basic_robot.digcosts = { -- 1 energy = 1 coal + ["default:stone"] = 1/25, + +} + + basic_robot.commands.dig = function(name,dir) local energy = 0; - check_operations(name); + check_operations(name,true) local obj = basic_robot.data[name].obj; local pos = pos_in_dir(obj, dir) @@ -104,28 +118,20 @@ basic_robot.commands.dig = function(name,dir) local spos = obj:get_luaentity().spawnpos; local inv = minetest.get_meta(spos):get_inventory(); - --require coal to dig - if nodename == "default:stone" and basic_robot.use_coal then - local meta = minetest.get_meta(spos); - local fuel = meta:get_int("fuel")-1; - if fuel<0 then -- attempt to refuel - local stack = ItemStack("default:coal_lump 10"); - if inv:contains_item("main", stack) then - meta:set_int("fuel",50) -- 50 digs with 10 coal - inv:remove_item("main", stack) - else - error("#OUT OF FUEL: please insert 10 coal lumps to dig") - basic_robot.data[name].obj:remove(); - basic_robot.data[name].obj=nil; - return + --require energy to dig + if basic_robot.dig_require_energy then + local digcost = basic_robot.digcosts[nodename]; + if digcost then + local data = basic_robot.data[name]; + local energy = (data.menergy or 0) - digcost; + if energy<0 then + return false, "need " .. digcost .. " energy " end - else - meta:set_int("fuel",fuel) + data.menergy = energy; end end - if not inv then return end --inv:add_item("main",ItemStack( nodename )); @@ -357,7 +363,7 @@ end basic_robot.commands.attack = function(name, target) -- attack range 4, damage 5 local energy = 0; - check_operations(name); + check_operations(name,true); local reach = 4; local damage = 5; @@ -402,7 +408,8 @@ basic_robot.commands.grab = function(name,target) end basic_robot.commands.read_book = function (itemstack) -- itemstack should contain book - local data = minetest.deserialize(itemstack:get_metadata()) + local data = itemstack:get_meta():to_table().fields -- 0.4.16 + --local data = minetest.deserialize(itemstack:get_metadata()) -- pre 0.4.16 if data then return data.title,data.text; else @@ -423,9 +430,10 @@ basic_robot.commands.write_book = function(name,title,text) -- returns itemstack data.page = 1 data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp) data.owner = name - local data_str = minetest.serialize(data) + --local data_str = minetest.serialize(data) -- pre 0.4.16 + --new_stack:set_metadata(data_str); + new_stack:get_meta():from_table({fields = data}) -- 0.4.16 - new_stack:set_metadata(data_str); return new_stack; end @@ -519,6 +527,7 @@ basic_robot.commands.activate = function(name,mode, dir) local effector=table.mesecons.effector; + if not mode then mode = 1 end if mode > 0 then if not effector.action_on then return false end effector.action_on(tpos,node,16) @@ -597,9 +606,11 @@ basic_robot.commands.keyboard = { end end, - set = function(spos,pos,type) + set = function(data,pos,type) + + local owner = data.owner; + if minetest.is_protected(pos,owner) then return false end -- with fast protect checks this shouldnt be problem! - if math.abs(pos.x-spos.x)>10 or math.abs(pos.y-spos.y)>10 or math.abs(pos.z-spos.z)>10 then return false end local nodename; if type == 0 then nodename = "air" @@ -796,16 +807,16 @@ basic_robot.commands.machine = { local stack = ItemStack(input); if not inv:contains_item("main",stack) then return nil,"2: no input material" end - -- read energy value of input + -- read energy value of input ( coal lump = 1) local add_energy = basic_robot.technic.fuels[input]; if not add_energy then -- lookup fuel value local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = {stack}}) if fueladd.time > 0 then - add_energy = fueladd.time; + add_energy = fueladd.time/40; -- fix by kurik else return nil, "3: material can not be used as a fuel" end - if add_energy>0 then basic_robot.technic.fuels[input] = add_energy/40 end + if add_energy>0 then basic_robot.technic.fuels[input] = add_energy end end inv:remove_item("main", stack); diff --git a/init.lua b/init.lua index 966cc7d..2147b3e 100644 --- a/init.lua +++ b/init.lua @@ -8,8 +8,8 @@ basic_robot.call_limit = 48; -- how many execution calls per script run allowed basic_robot.bad_inventory_blocks = { -- disallow taking from these nodes inventories ["craft_guide:sign_wall"] = true, } -basic_robot.maxoperations = 1; -- how many operations available per run, 0 = unlimited -basic_robot.use_coal = true; -- does robot require coal to dig stone? +basic_robot.maxoperations = 1; -- how many operations (dig, generate energy,..) available per run, 0 = unlimited +basic_robot.dig_require_energy = true; -- does robot require energy to dig? ---------------------- @@ -276,7 +276,7 @@ function getSandboxEnv (name) keyboard = { get = function() return commands.keyboard.get(name) end, - set = function(pos,type) return commands.keyboard.set(basic_robot.data[name].spawnpos,pos,type) end, + set = function(pos,type) return commands.keyboard.set(basic_robot.data[name],pos,type) end, read = function(pos) return minetest.get_node(pos).name end, }, @@ -1246,7 +1246,8 @@ local on_receive_robot_form = function(pos, formname, fields, sender) local text = ""; for i=1,16 do local itemstack = inv:get_stack("library", i); - local data = minetest.deserialize(itemstack:get_metadata()) + local data = itemstack:get_meta():to_table().fields -- 0.4.16 + --local data = minetest.deserialize(itemstack:get_metadata()) -- pre 0.4.16 if data then text = string.sub(data.title or "",1,32); else @@ -1376,7 +1377,7 @@ minetest.register_on_player_receive_fields( return end - local robot_formname = "robot_book_"; + local robot_formname = "robot_book_"; -- book editing gui if string.find(formname,robot_formname) then local p = string.find(formname,":"); local sel = tonumber(string.sub(formname, string.len(robot_formname)+1,p-1)) or 1; @@ -1388,7 +1389,7 @@ minetest.register_on_player_receive_fields( local meta = minetest.get_meta(libpos); local inv = minetest.get_meta(libpos):get_inventory();local itemstack = inv:get_stack("library", sel); if itemstack then - local data = minetest.deserialize(itemstack:get_metadata()) + local data = itemstack:get_meta():to_table().fields -- 0.4.16, old minetest.deserialize(itemstack:get_metadata()) if not data then data = {} end local text = fields.book or ""; data.text = text or "" @@ -1398,9 +1399,12 @@ minetest.register_on_player_receive_fields( data.owner = data.owner or "" local lpp = 14 data.page_max = math.ceil((#text:gsub("[^\n]", "") + 1) / lpp) - local data_str = minetest.serialize(data) + + --local data_str = minetest.serialize(data) local new_stack = ItemStack("default:book_written") - new_stack:set_metadata(data_str); + + new_stack:get_meta():from_table({fields = data}) -- 0.4.16 + --new_stack:set_metadata(data_str); inv:set_stack("library",sel, new_stack); end end @@ -1411,7 +1415,7 @@ minetest.register_on_player_receive_fields( --minetest.chat_send_all(fields.book or "") local inv = minetest.get_meta(libpos):get_inventory();local itemstack = inv:get_stack("library", sel); if itemstack then - local data = minetest.deserialize(itemstack:get_metadata()) or {}; + local data = itemstack:get_meta():to_table().fields -- 0.4.16, old minetest.deserialize(itemstack:get_metadata()) or {}; meta:set_string("code", data.text or "") robot_spawner_update_form(libpos); minetest.chat_send_player(player:get_player_name(),"#robot: program loaded from book") @@ -1431,6 +1435,7 @@ function(name, message) data.listen_msg = message; data.listen_speaker = name; end + return false end ) diff --git a/misc_commands.lua b/misc_commands.lua deleted file mode 100644 index 12cce7b..0000000 --- a/misc_commands.lua +++ /dev/null @@ -1,54 +0,0 @@ -//lua minetest.get_player_by_name("rnd"):set_properties({visual_size = {x=1,y=1}}) - -local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "upright_sprite"});player:set_properties({textures={"default_tool_diamondpick.png"}}) - - -// change to robot -local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "cube"});player:set_properties({textures={"arrow.png^[transformR90","basic_machine_side.png","basic_machine_side.png","basic_machine_side.png","face.png","basic_machine_side.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}}) - -//LawnGreen - -local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "sprite"});player:set_properties({textures={"farming_bottle_ethanol.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}});player:set_properties({visual_size = {x=2,y=2}}) - -//farming_blueberry_muffin -local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "cube"});player:set_properties({textures={"farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}}) - ---nyan cat -//lua local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "cube"});player:set_properties({textures = {"nyancat_side.png", "nyancat_side.png", "nyancat_side.png","nyancat_side.png", "nyancat_front.png", "nyancat_back.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}}) - - - -local name = "rnd1"; local player = minetest.get_player_by_name(name); player:set_nametag_attributes({text = "Friend of Giorge"}); - -//lua local player = minetest.get_player_by_name("pro2");minetest.sound_play("nyan",{object = player,gain = 1.0,max_hear_distance = 8,loop = false}) - - -//lua local player = minetest.get_player_by_name("rnd");player:set_properties({visual = "mesh",textures = {"mobs_spider.png"},mesh = "mobs_spider.x",visual_size = {x=7,y=7}}) - - -//lua local player = minetest.get_player_by_name("rnd");player:set_properties({visual = "mesh",textures = {"mobs_dungeon_master.png"},mesh = "mobs_dungeon_master.b3d",visual_size = {x=1,y=1}}) - -//lua local player = minetest.get_player_by_name("best");player:set_properties({visual = "mesh",textures = {"zmobs_mese_monster.png"},mesh = "zmobs_mese_monster.x",visual_size = {x=1,y=1}}) - -//lua local player = minetest.get_player_by_name("rnd1");player:set_properties({visual = "mesh",textures = {"mobs_oerkki.png"},mesh = "mobs_oerkki.b3d",visual_size = {x=1,y=1}}) - -//lua local player = minetest.get_player_by_name("rnd1");player:set_properties({visual = "mesh",textures = {"mobs_stone_monster.png"},mesh = "mobs_stone_monster.b3d",visual_size = {x=1,y=1}}) - - -mesh = "zmobs_lava_flan.x", - textures = { - {"zmobs_lava_flan.png"}, - {"zmobs_lava_flan2.png"}, - {"zmobs_lava_flan3.png"}, - }, ----------------------------------------------- - - - -//lua local player = minetest.get_player_by_name("towner");player:set_physics_override({speed=0.05}) - - - - - -