From b8aa8d735f0ea289b31e2f999a0cfc5e10656625 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Fri, 14 Sep 2018 15:14:34 +0300 Subject: [PATCH] Some fixes/improvements, Solar Generators --- elepower_machines/machines/bases/storage.lua | 2 +- elepower_papi/helpers.lua | 16 +- elepower_papi/machine.lua | 3 +- elepower_solar/crafting.lua | 10 ++ elepower_solar/depends.txt | 2 + elepower_solar/generator.lua | 155 ++++++++++++++++++ elepower_solar/init.lua | 11 ++ elepower_solar/mod.conf | 3 + elepower_solar/register.lua | 14 ++ .../textures/elesolar_simple_top.png | Bin 0 -> 6835 bytes 10 files changed, 199 insertions(+), 17 deletions(-) create mode 100644 elepower_solar/crafting.lua create mode 100644 elepower_solar/depends.txt create mode 100644 elepower_solar/generator.lua create mode 100644 elepower_solar/init.lua create mode 100644 elepower_solar/mod.conf create mode 100644 elepower_solar/register.lua create mode 100644 elepower_solar/textures/elesolar_simple_top.png diff --git a/elepower_machines/machines/bases/storage.lua b/elepower_machines/machines/bases/storage.lua index 71116d9..b41ad20 100644 --- a/elepower_machines/machines/bases/storage.lua +++ b/elepower_machines/machines/bases/storage.lua @@ -144,7 +144,7 @@ function elepm.register_storage(nodename, nodedef) end for i = 0, levels do - local cpdef = ele.helpers.table_copy(nodedef) + local cpdef = table.copy(nodedef) -- Add overlay to the tile texture if cpdef.tiles and cpdef.tiles[6] and i > 0 then diff --git a/elepower_papi/helpers.lua b/elepower_papi/helpers.lua index 6769030..98dd06d 100644 --- a/elepower_papi/helpers.lua +++ b/elepower_papi/helpers.lua @@ -5,18 +5,6 @@ ele.helpers = {} -function ele.helpers.table_copy(tab) - local retval = {} - for k, v in pairs(tab) do - if type(v) == "table" then - retval[k] = ele.helpers.table_copy(v) - else - retval[k] = v - end - end - return retval -end - function ele.helpers.round(v) return math.floor(v + 0.5) end @@ -25,7 +13,7 @@ function ele.helpers.swap_node(pos, noded) local node = minetest.get_node(pos) if type(noded) ~= "table" then - local n = ele.helpers.table_copy(node) + local n = table.copy(node) n.name = noded noded = n end @@ -90,7 +78,7 @@ end function ele.helpers.face_front(pos, fd) local back = minetest.facedir_to_dir(fd) - local front = ele.helpers.table_copy(back) + local front = table.copy(back) front.x = front.x * -1 + pos.x front.y = front.y * -1 + pos.y diff --git a/elepower_papi/machine.lua b/elepower_papi/machine.lua index 039f906..7a2c336 100644 --- a/elepower_papi/machine.lua +++ b/elepower_papi/machine.lua @@ -391,7 +391,7 @@ function ele.register_base_device(nodename, nodedef) -- Register an active variant if configured. if nodedef.ele_active_node then - local active_nodedef = ele.helpers.table_copy(nodedef) + local active_nodedef = table.copy(nodedef) active_name = nodename.."_active" if nodedef.ele_active_node ~= true then @@ -413,7 +413,6 @@ function ele.register_base_device(nodename, nodedef) minetest.register_node(active_name, active_nodedef) end - -- tubelib support if tlsupp then local extras = {} diff --git a/elepower_solar/crafting.lua b/elepower_solar/crafting.lua new file mode 100644 index 0000000..f9692dd --- /dev/null +++ b/elepower_solar/crafting.lua @@ -0,0 +1,10 @@ + +-- Solar Generator +minetest.register_craft({ + output = "elepower_solar:solar_generator", + recipe = { + {"group:glass", "elepower_dynamics:pv_cell", "group:glass"}, + {"elepower_dynamics:pv_cell", "group:glass", "elepower_dynamics:pv_cell"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) diff --git a/elepower_solar/depends.txt b/elepower_solar/depends.txt new file mode 100644 index 0000000..327f62b --- /dev/null +++ b/elepower_solar/depends.txt @@ -0,0 +1,2 @@ +elepower_papi +elepower_dynamics diff --git a/elepower_solar/generator.lua b/elepower_solar/generator.lua new file mode 100644 index 0000000..b8964c9 --- /dev/null +++ b/elepower_solar/generator.lua @@ -0,0 +1,155 @@ + +local function get_formspec_default(power, percent, state) + if not percent then percent = 0 end + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + ele.formspec.state_switcher(7, 0, state).. + "image[3.5,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (percent)..":default_furnace_fire_fg.png]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + default.get_hotbar_bg(0, 4.25) +end + +-- A generator that creates power using sunlight +function elesolar.register_solar_generator(nodename, nodedef) + -- Enable de-dusting mechanics + local dedust = nodedef.ele_solar_dust == nil or nodedef.ele_solar_dust ~= false + + -- Allow for custom formspec + local get_formspec = get_formspec_default + if nodedef.get_formspec then + get_formspec = nodedef.get_formspec + nodedef.get_formspec = nil + end + + local defaults = { + groups = { + ele_provider = 1, + oddly_breakable_by_hand = 1, + ele_solar_generator = 1, + }, + tube = false, + ele_usage = 8, + on_timer = function (pos, elapsed) + local refresh = true + local meta = minetest.get_meta(pos) + local nodename = nodename + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + local generation = ele.helpers.get_node_property(meta, pos, "usage") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + + local state = meta:get_int("state") + local is_enabled = ele.helpers.state_enabled(meta, pos, state) + + local pow_buffer = {capacity = capacity, storage = storage, usage = 0} + local status = "Idle" + local solarp = 0 + + while true do + if not is_enabled then + status = "Off" + break + end + + if storage + generation > capacity then + break + end + + -- Raycasting: Make sure the solar generator is not obstructed + -- The ray is only casted every 5 seconds instead of every second + local raystep = meta:get_int("ray_timer") + local rayokay = meta:get_int("ray_success") + local pos1 = vector.add(pos, {x=0,y=1,z=0}) + local pos2 = vector.add(pos1, {x=0,y=8,z=0}) + + if raystep == 5 then + local ray = minetest.raycast(pos1, pos2, false, true) + local found_obstruction = false + + -- Take 8 samples + for i = 1, 8 do + local pointed_thing = ray:next() + if pointed_thing and pointed_thing.type ~= "nothing" then + found_obstruction = true + break + end + end + + if found_obstruction and rayokay == 1 then + rayokay = 0 + elseif not found_obstruction and rayokay == 0 then + rayokay = 1 + end + + meta:set_int("ray_timer", 0) + else + meta:set_int("ray_timer", raystep + 1) + end + + meta:set_int("ray_success", rayokay) + + if rayokay == 0 then break end + + local light = minetest.get_node_light(pos1, nil) or 0 + local time_of_day = minetest.get_timeofday() + + -- turn on array only during day time and if sufficient light + solarp = light / (minetest.LIGHT_MAX + 1) + + if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 then + pow_buffer.usage = math.floor(solarp * generation) + if pow_buffer.usage > 0 then + pow_buffer.storage = pow_buffer.storage + pow_buffer.usage + status = "Active" + end + end + + solarp = math.floor(100 * solarp) + + break + end + + meta:set_string("formspec", get_formspec(pow_buffer, solarp, state)) + meta:set_string("infotext", ("%s %s\n%s\nLight: %s"):format(nodedef.description, status, + ele.capacity_text(capacity, pow_buffer.storage), solarp .. " %")) + + meta:set_int("storage", pow_buffer.storage) + + return refresh + end, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + + meta:set_string("formspec", get_formspec({capacity = capacity, storage = storage, usage = 0}, 0)) + end + } + + for key,val in pairs(defaults) do + if not nodedef[key] then + nodedef[key] = val + end + end + + ele.register_machine(nodename, nodedef) +end + +minetest.register_lbm({ + label = "Enable Solar Generators on load", + name = "elepower_solar:solar_generators", + nodenames = {"group:ele_solar_generator"}, + run_at_every_load = true, + action = function (pos) + local t = minetest.get_node_timer(pos) + if not t:is_started() then + t:start(1.0) + end + end, +}) diff --git a/elepower_solar/init.lua b/elepower_solar/init.lua new file mode 100644 index 0000000..11f6fd1 --- /dev/null +++ b/elepower_solar/init.lua @@ -0,0 +1,11 @@ +-- A Elepower Mod +-- Copyright 2018 Evert "Diamond" Prants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +elesolar = rawget(_G, "elesolar") or {} +elesolar.modpath = modpath + +dofile(modpath.."/generator.lua") +dofile(modpath.."/register.lua") +dofile(modpath.."/crafting.lua") diff --git a/elepower_solar/mod.conf b/elepower_solar/mod.conf new file mode 100644 index 0000000..b94e21b --- /dev/null +++ b/elepower_solar/mod.conf @@ -0,0 +1,3 @@ +name = elepower_solar +description = Harvest the sun! +depends = elepower_papi,elepower_dynamics diff --git a/elepower_solar/register.lua b/elepower_solar/register.lua new file mode 100644 index 0000000..1b20a7d --- /dev/null +++ b/elepower_solar/register.lua @@ -0,0 +1,14 @@ + +elesolar.register_solar_generator("elepower_solar:solar_generator", { + description = "Solar Generator", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, 0.5000, -0.4375, 0.5000} + } + }, + tiles = { + "elesolar_simple_top.png", "elepower_machine_top.png^elepower_power_port.png", "elepower_machine_top.png" + } +}) diff --git a/elepower_solar/textures/elesolar_simple_top.png b/elepower_solar/textures/elesolar_simple_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfbd2b269fd9a987d6100ba93b3fe81eee83743 GIT binary patch literal 6835 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 Q^M^n%T|Att9Yd4;4pPS?ga7~l literal 0 HcmV?d00001