local machines_timer=5 local machines_minstep = 1 -- BATTERY local battery_update_meta = function(pos) local meta = minetest.get_meta(pos); local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z local capacity = meta:get_float("capacity"); local maxpower = meta:get_float("maxpower"); local energy = math.ceil(10*meta:get_float("energy"))/10; local form = "size[8,6.5]" .. -- width, height "label[0,0;FUEL] ".."label[6,0;UPGRADE] ".. "label[1,0;ENERGY ".. energy .."/ ".. capacity..", maximum power output ".. maxpower .."]".. "label[1,1;UPGRADE LEVEL ".. meta:get_int("upgrade") .. " (mese and diamond block)]".. "list["..list_name..";fuel;0.,0.5;1,1;]".. "list["..list_name..";upgrade;6.,0.5;2,1;]" .. "list[current_player;main;0,2.5;8,4;]".. "button[4.5,0.35;1.5,1;OK;REFRESH]"; meta:set_string("formspec", form); end --[power crystal name] = energy provided basic_machines.energy_crystals = { ["basic_machines:power_cell"]=1, ["basic_machines:power_block"]=11, ["basic_machines:power_rod"]=100, } battery_recharge = function(pos) local meta = minetest.get_meta(pos); local energy = meta:get_float("energy"); local capacity = meta:get_float("capacity"); local inv = meta:get_inventory(); local stack = inv:get_stack("fuel", 1); local item = stack:get_name(); local crystal = false; local add_energy=0; add_energy = basic_machines.energy_crystals[item] or 0; if add_energy>0 then crystal = true; if energy+add_energy<=capacity then stack:take_item(1); inv:set_stack("fuel", 1, stack) else meta:set_string("infotext", "recharge problem: capacity " .. capacity .. ", needed " .. energy+add_energy) end else -- try do determine caloric value local fuellist = inv:get_list("fuel");if not fuellist then return energy end local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) if fueladd.time > 0 then add_energy = fueladd.time/40; if energy+add_energy<=capacity then inv:set_stack("fuel", 1, afterfuel.items[1]); end end end if add_energy>0 then if energy+add_energy<=capacity then energy=energy+add_energy meta:set_float("energy",energy); meta:set_string("infotext", "(R) energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); --TODO2: add entity power status display minetest.sound_play("electric_zap", {pos=pos,gain=0.05,max_hear_distance = 8,}) end end return energy; -- new battery energy level end battery_upgrade = function(pos) local meta = minetest.get_meta(pos); local inv = meta:get_inventory(); local count1,count2;count1=0;count2=0; local stack,item,count; for i=1,2 do stack = inv:get_stack("upgrade", i);item = stack:get_name();count= stack:get_count(); if item == "default:mese" then count1=count1+count elseif item == "default:diamondblock" then count2=count2+count end end if count1=1 then -- need at least 1 energy pos.y=pos.y+1; local node = minetest.get_node(pos).name; if node== "default:furnace" or node=="default:furnace_active" then local fmeta = minetest.get_meta(pos); local fuel_totaltime = fmeta:get_float("fuel_totaltime") or 0; local fuel_time = fmeta:get_float("fuel_time") or 0; local t0 = meta:get_int("ftime"); -- furnace time local t1 = minetest.get_gametime(); if t1-t04 then -- accelerated cooking local src_time = fmeta:get_float("src_time") or 0 energy = energy - 0.25*upgrade; -- use energy to accelerate burning fmeta:set_float("src_time",src_time+machines_timer*upgrade); -- with max 99 upgrades battery furnace works 6x faster --end if fuel_time>40 or fuel_totaltime == 0 or node=="default:furnace" then -- must burn for at least 40 secs or furnace out of fuel fmeta:set_float("fuel_totaltime",60);fmeta:set_float("fuel_time",0) -- add 60 second burn time to furnace energy=energy-0.5; -- use up energy to add fuel -- make furnace start if not already started if node~="default:furnace_active" and machines_activate_furnace then machines_activate_furnace(pos) end -- update energy display end meta:set_float("energy",energy); meta:set_string("infotext", "energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); if energy>=1 then -- no need to recharge yet, will still work next time return else local infotext = meta:get_string("infotext"); local new_infotext = "furnace needs at least 1 energy"; if new_infotext~=infotext then -- dont update unnecesarilly meta:set_string("infotext", new_infotext); pos.y=pos.y-1; -- so that it points to battery again! end end else pos.y=pos.y-1; end end -- try to recharge by converting inserted fuel/power cells into energy if energy= 99 then crystal = "basic_machines:power_rod" text = "high upgrade: power rod"; elseif upgrade >=20 then crystal ="basic_machines:power_block" text = "medium upgrade: power block"; else crystal ="basic_machines:power_cell" text = "low upgrade: power cell"; end local morecrystal = ItemStack(crystal) stack:add_item(morecrystal); inv:set_stack("fuel", 1, stack) meta:set_string("infotext",text) end }) -- API for power distribution function basic_machines.check_power(pos, power_draw) -- mover checks power source - battery --minetest.chat_send_all(" battery: check_power " .. minetest.pos_to_string(pos) .. " " .. power_draw) if minetest.get_node(pos).name ~= "basic_machines:battery" then return 0 end local meta = minetest.get_meta(pos); local energy = meta:get_float("energy"); local capacity = meta:get_float("capacity"); local maxpower = meta:get_float("maxpower"); if power_draw>maxpower then meta:set_string("infotext", "Power draw required : " .. power_draw .. " maximum power output " .. maxpower .. ". Please upgrade battery") return 0; end if power_draw>energy then energy = battery_recharge(pos); -- try recharge battery and continue operation immidiately end energy = energy-power_draw; if energy<0 then meta:set_string("infotext", "used fuel provides too little power for current power draw ".. power_draw); return 0 end -- recharge wasnt enough, needs to be repeated manually, return 0 power available meta:set_float("energy", energy); -- update energy display meta:set_string("infotext", "energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); return power_draw; end ------------------------ -- CRAFTS ------------------------ minetest.register_craft({ output = "basic_machines:battery", recipe = { {"","default:steel_ingot",""}, {"default:steel_ingot","default:mese","default:steel_ingot"}, {"","default:diamond",""}, } }) minetest.register_craft({ output = "basic_machines:generator", recipe = { {"","",""}, {"default:diamondblock","basic_machines:battery","default:diamondblock"}, {"default:diamondblock","default:diamondblock","default:diamondblock"} } }) minetest.register_craftitem("basic_machines:power_cell", { description = "Power cell - provides 1 power", inventory_image = "power_cell.png", stack_max = 25 }) minetest.register_craftitem("basic_machines:power_block", { description = "Power block - provides 11 power", inventory_image = "power_block.png", stack_max = 25 }) minetest.register_craftitem("basic_machines:power_rod", { description = "Power rod - provides 100 power", inventory_image = "power_rod.png", stack_max = 25 })