bug fixes by kurik:

fail at initial energy read from fuel time
protection check for keyboard set
master
rnd1 2017-07-16 23:27:52 +02:00
parent 08f61c0865
commit 5d6e7326b6
3 changed files with 56 additions and 94 deletions

View File

@ -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);

View File

@ -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
)

View File

@ -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})