-- rnd 2015, power outlet -- used to power basic_machines using remaining available power from technic:switching_station. Just place it below mover but within 10 block distance of technich switching station. Each power outlet adds 500 to the power demand. If switching station has not enough unused power ( after technic machines demand), it wont supply power to mover. -- outlet -> change to battery -- power plant block: costly to make: 8 diamondblocks, battery in center -- -upgradeable, each diamondblock+lava_bucket will add ammount of energy cells produced in cycle ( 5 seconds) and increase its internal energy storage capacity -- initially produces 1 power cell, storage capacity 10, with each level of upgrade it adds 1 power cell, 10 storage capacity -- when it generates power it will also fill the battery on top of it ( if any), speed of refill equalls speed of power generation, it will put all energy -- possible in battery until is filled, will make recharge sound - electric discharge like in factorio game? -- 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"]=10, ["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) end else -- try do determine caloric value local fuellist = inv:get_list("fuel");if not fuellist then return 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.03,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 -- twice as fast cooking local src_time = fmeta:get_float("src_time") or 0 fmeta:set_float("src_time",src_time+5); end if fuel_time>40 or fuel_totaltime == 0 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-1; -- use up one energy meta:set_float("energy",energy); -- update energy display meta:set_string("infotext", "energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); end 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 = "upgrade level 99: generating power rod"; elseif upgrade >=20 then crystal ="basic_machines:power_block" text = "upgrade level 20: generating power block"; else crystal ="basic_machines:power_cell" text = "upgrade level 0: generating 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 10 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 })