-craft(item) robot can now craft any item if it has ingredients for it ( group items are problem )
-read_text can now read (int) numbers from node meta extra: -robot can now fertilize farming:soil_wet by inserting farming:fertilizer into it
This commit is contained in:
parent
873f32dfbf
commit
4c169bb517
68
commands.lua
68
commands.lua
@ -3,7 +3,7 @@ basic_robot.commands = {};
|
|||||||
-- set up nodes for planting (for example seeds -> plant) : [nodename] = plant_name
|
-- set up nodes for planting (for example seeds -> plant) : [nodename] = plant_name
|
||||||
basic_robot.plant_table = {["farming:seed_barley"]="farming:barley_1",["farming:beans"]="farming:beanpole_1", -- so it works with farming redo mod
|
basic_robot.plant_table = {["farming:seed_barley"]="farming:barley_1",["farming:beans"]="farming:beanpole_1", -- so it works with farming redo mod
|
||||||
["farming:blueberries"]="farming:blueberry_1",["farming:carrot"]="farming:carrot_1",["farming:cocoa_beans"]="farming:cocoa_1",
|
["farming:blueberries"]="farming:blueberry_1",["farming:carrot"]="farming:carrot_1",["farming:cocoa_beans"]="farming:cocoa_1",
|
||||||
["farming:coffee_beans"]="farming:coffee_1",["farming:corn"]="farming:corn_1",["farming:blueberries"]="farming:blueberry_1",
|
["farming:coffee_beans"]="farming:coffee_1",["farming:corn"]="farming:corn_1",
|
||||||
["farming:seed_cotton"]="farming:cotton_1",["farming:cucumber"]="farming:cucumber_1",["farming:grapes"]="farming:grapes_1",
|
["farming:seed_cotton"]="farming:cotton_1",["farming:cucumber"]="farming:cucumber_1",["farming:grapes"]="farming:grapes_1",
|
||||||
["farming:melon_slice"]="farming:melon_1",["farming:potato"]="farming:potato_1",["farming:pumpkin_slice"]="farming:pumpkin_1",
|
["farming:melon_slice"]="farming:melon_1",["farming:potato"]="farming:potato_1",["farming:pumpkin_slice"]="farming:pumpkin_1",
|
||||||
["farming:raspberries"]="farming:raspberry_1",["farming:rhubarb"]="farming:rhubarb_1",["farming:tomato"]="farming:tomato_1",
|
["farming:raspberries"]="farming:raspberry_1",["farming:rhubarb"]="farming:rhubarb_1",["farming:tomato"]="farming:tomato_1",
|
||||||
@ -132,6 +132,20 @@ basic_robot.commands.insert_item = function(name,item, inventory,dir)
|
|||||||
local tmeta = minetest.get_meta(tpos);
|
local tmeta = minetest.get_meta(tpos);
|
||||||
|
|
||||||
local inv = minetest.get_meta(pos):get_inventory();
|
local inv = minetest.get_meta(pos):get_inventory();
|
||||||
|
|
||||||
|
-- fertilize if soil
|
||||||
|
if item == "farming:fertilizer" then
|
||||||
|
local stack = ItemStack(item);
|
||||||
|
if minetest.get_node(tpos).name == "farming:soil_wet" and (meta:get_int("admin")==1 or inv:contains_item("main", stack)) then
|
||||||
|
inv:remove_item("main", stack);
|
||||||
|
local nutrient = tmeta:get_int("nutrient"); nutrient = nutrient + 10; if nutrient>20 then nutrient = 20 end
|
||||||
|
tmeta:set_int("nutrient",nutrient);
|
||||||
|
minetest.set_node({x=tpos.x,y=tpos.y+1,z=tpos.z},{name = "air"})
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local tinv = minetest.get_meta(tpos):get_inventory();
|
local tinv = minetest.get_meta(tpos):get_inventory();
|
||||||
|
|
||||||
if not inventory then inventory = "main"; end
|
if not inventory then inventory = "main"; end
|
||||||
@ -251,13 +265,17 @@ basic_robot.commands.read_node = function(name,dir)
|
|||||||
return minetest.get_node(pos).name or ""
|
return minetest.get_node(pos).name or ""
|
||||||
end
|
end
|
||||||
|
|
||||||
basic_robot.commands.read_text = function(name,dir,stringname)
|
basic_robot.commands.read_text = function(name,mode,dir,stringname)
|
||||||
|
if not mode then mode = 0 end
|
||||||
local obj = basic_robot.data[name].obj;
|
local obj = basic_robot.data[name].obj;
|
||||||
local pos = pos_in_dir(obj, dir)
|
local pos = pos_in_dir(obj, dir)
|
||||||
|
|
||||||
if stringname == nil then
|
if stringname == nil then
|
||||||
stringname = "infotext"
|
stringname = "infotext"
|
||||||
end
|
end
|
||||||
return minetest.get_meta(pos):get_string(stringname) or ""
|
|
||||||
|
if mode == 1 then return minetest.get_meta(pos):get_int(stringname) else
|
||||||
|
return minetest.get_meta(pos):get_string(stringname) or "" end
|
||||||
end
|
end
|
||||||
|
|
||||||
basic_robot.commands.write_text = function(name,dir,text)
|
basic_robot.commands.write_text = function(name,dir,text)
|
||||||
@ -549,3 +567,47 @@ basic_robot.commands.keyboard = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
basic_robot.commands.craftcache = {};
|
||||||
|
basic_robot.commands.craft = function(item, name)
|
||||||
|
if not item then return end
|
||||||
|
|
||||||
|
local cache = basic_robot.commands.craftcache[name];
|
||||||
|
if not cache then basic_robot.commands.craftcache[name] = {}; cache = basic_robot.commands.craftcache[name] end
|
||||||
|
local itemlist = {};
|
||||||
|
if cache.item == item then-- read cache
|
||||||
|
itemlist = cache.itemlist;
|
||||||
|
else
|
||||||
|
--local table = minetest.registered_items[nodename];
|
||||||
|
local craft = minetest.get_craft_recipe(item);
|
||||||
|
if craft and craft.type == "normal" and craft.items then else return end
|
||||||
|
local items = craft.items;
|
||||||
|
for _,item in pairs(items) do
|
||||||
|
itemlist[item]=(itemlist[item] or 0)+1;
|
||||||
|
end
|
||||||
|
cache.item = item;
|
||||||
|
cache.itemlist = itemlist;
|
||||||
|
end
|
||||||
|
|
||||||
|
--minetest.chat_send_all(item)
|
||||||
|
--minetest.chat_send_all(dump(itemlist))
|
||||||
|
|
||||||
|
-- check if all items from itemlist..
|
||||||
|
-- craft item
|
||||||
|
|
||||||
|
local pos = basic_robot.data[name].spawnpos; -- position of spawner block
|
||||||
|
local inv = minetest.get_meta(pos):get_inventory();
|
||||||
|
|
||||||
|
for item,quantity in pairs(itemlist) do
|
||||||
|
local stack = ItemStack(item .. " " .. quantity);
|
||||||
|
if not inv:contains_item("main",stack) then return false end
|
||||||
|
end
|
||||||
|
|
||||||
|
for item,quantity in pairs(itemlist) do
|
||||||
|
local stack = ItemStack(item .. " " .. quantity);
|
||||||
|
inv:remove_item("main",stack);
|
||||||
|
end
|
||||||
|
|
||||||
|
inv:add_item("main",ItemStack(item))
|
||||||
|
return true
|
||||||
|
end
|
29
init.lua
29
init.lua
@ -13,7 +13,7 @@ basic_robot.maxenergy = 1; -- how much energy available per run, 0 = unlimited
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
basic_robot.version = "01/18a";
|
basic_robot.version = "02/07a";
|
||||||
|
|
||||||
basic_robot.data = {}; -- stores all robot data
|
basic_robot.data = {}; -- stores all robot data
|
||||||
--[[
|
--[[
|
||||||
@ -114,6 +114,9 @@ function getSandboxEnv (name)
|
|||||||
return commands.pickup(r, name);
|
return commands.pickup(r, name);
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
craft = function(item)
|
||||||
|
return commands.craft(item, name)
|
||||||
|
end,
|
||||||
|
|
||||||
self = {
|
self = {
|
||||||
pos = function() return basic_robot.data[name].obj:getpos() end,
|
pos = function() return basic_robot.data[name].obj:getpos() end,
|
||||||
@ -221,7 +224,10 @@ function getSandboxEnv (name)
|
|||||||
find_nodes =
|
find_nodes =
|
||||||
function(nodename,r)
|
function(nodename,r)
|
||||||
if r>8 then return false end
|
if r>8 then return false end
|
||||||
return (minetest.find_node_near(basic_robot.data[name].obj:getpos(), r, nodename)~=nil)
|
local q = minetest.find_node_near(basic_robot.data[name].obj:getpos(), r, nodename);
|
||||||
|
if q==nil then return false end
|
||||||
|
local p = basic_robot.data[name].obj:getpos()
|
||||||
|
return math.sqrt((p.x-q.x)^2+(p.y-q.y)^2+(p.z-q.z)^2)
|
||||||
end, -- in radius around position
|
end, -- in radius around position
|
||||||
|
|
||||||
find_player =
|
find_player =
|
||||||
@ -269,12 +275,12 @@ function getSandboxEnv (name)
|
|||||||
},
|
},
|
||||||
|
|
||||||
read_text = { -- returns text
|
read_text = { -- returns text
|
||||||
left = function(stringname) return commands.read_text(name,1,stringname ) end,
|
left = function(stringname,mode) return commands.read_text(name,mode,1,stringname ) end,
|
||||||
right = function(stringname) return commands.read_text(name,2,stringname) end,
|
right = function(stringname,mode) return commands.read_text(name,mode,2,stringname) end,
|
||||||
forward = function(stringname) return commands.read_text(name,3,stringname) end,
|
forward = function(stringname,mode) return commands.read_text(name,mode,3,stringname) end,
|
||||||
backward = function(stringname) return commands.read_text(name,4,stringname) end,
|
backward = function(stringname,mode) return commands.read_text(name,mode,4,stringname) end,
|
||||||
down = function(stringname) return commands.read_text(name,6,stringname) end,
|
down = function(stringname,mode) return commands.read_text(name,mode,6,stringname) end,
|
||||||
up = function(stringname) return commands.read_text(name,5,stringname) end,
|
up = function(stringname,mode) return commands.read_text(name,mode,5,stringname) end,
|
||||||
},
|
},
|
||||||
|
|
||||||
write_text = { -- returns text
|
write_text = { -- returns text
|
||||||
@ -1036,13 +1042,14 @@ local on_receive_robot_form = function(pos, formname, fields, sender)
|
|||||||
" if index>0 it returns itemname\n"..
|
" if index>0 it returns itemname\n"..
|
||||||
"activate.direction(mode) activates target block\n"..
|
"activate.direction(mode) activates target block\n"..
|
||||||
"pickup(r) picks up all items around robot in radius r<8 and returns list or nil\n"..
|
"pickup(r) picks up all items around robot in radius r<8 and returns list or nil\n"..
|
||||||
|
"craft(item) crafts item if required materials are present in inventory\n"..
|
||||||
"take.direction(item, inventory) takes item from target inventory into robot inventory\n"..
|
"take.direction(item, inventory) takes item from target inventory into robot inventory\n"..
|
||||||
"read_text.direction(stringname) reads text of signs, chests and other blocks, optional stringname for other meta\n"..
|
"read_text.direction(stringname,mode) reads text of signs, chests and other blocks, optional stringname for other meta,\n mode 1 read number\n"..
|
||||||
"write_text.direction(text) writes text to target block as infotext\n"..
|
"write_text.direction(text,mode) writes text to target block as infotext\n"..
|
||||||
" **BOOKS/CODE\ntitle,text=book.read(i) returns title,contents of book at i-th position in library \nbook.write(i,title,text) writes book at i-th position at spawner library\n"..
|
" **BOOKS/CODE\ntitle,text=book.read(i) returns title,contents of book at i-th position in library \nbook.write(i,title,text) writes book at i-th position at spawner library\n"..
|
||||||
"code.run(text) compiles and runs the code in sandbox\n"..
|
"code.run(text) compiles and runs the code in sandbox\n"..
|
||||||
"code.set(text) replaces current bytecode of robot\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"..
|
"find_nodes(\"default:dirt\",3) returns distance to node in radius 3 around robot, or false if none\n"..
|
||||||
" **PLAYERS\n"..
|
" **PLAYERS\n"..
|
||||||
"find_player(3) finds players in radius 3 around robot and returns list, if none returns nil\n"..
|
"find_player(3) finds players in radius 3 around robot and returns list, if none returns nil\n"..
|
||||||
"attack(target) attempts to attack target player if nearby \n"..
|
"attack(target) attempts to attack target player if nearby \n"..
|
||||||
|
Loading…
x
Reference in New Issue
Block a user