From de2c0a15eac3ea65b32a52b620daa9b938c910c8 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Mon, 18 Jun 2018 10:09:43 +0300 Subject: [PATCH] Initial commit --- LICENSE | 21 + README.md | 27 ++ elepower_dynamics/conduits.lua | 6 + elepower_dynamics/crafting.lua | 110 +++++ elepower_dynamics/craftitems.lua | 44 ++ elepower_dynamics/dusts.lua | 82 ++++ elepower_dynamics/init.lua | 15 + elepower_dynamics/mod.conf | 4 + elepower_dynamics/nodes.lua | 16 + .../textures/elepower_carbon_fiber.png | Bin 0 -> 6185 bytes .../textures/elepower_carbon_fiber_sheet.png | Bin 0 -> 6091 bytes .../textures/elepower_conduit.png | Bin 0 -> 5878 bytes elepower_dynamics/textures/elepower_dust.png | Bin 0 -> 329 bytes .../textures/elepower_iron_ingot.png | Bin 0 -> 5634 bytes .../textures/elepower_lead_ingot.png | Bin 0 -> 490 bytes .../textures/elepower_lead_lump.png | Bin 0 -> 406 bytes .../textures/elepower_mineral_lead.png | Bin 0 -> 410 bytes .../textures/elepower_tool_ironaxe.png | Bin 0 -> 6354 bytes .../textures/elepower_tool_ironpick.png | Bin 0 -> 6527 bytes .../textures/elepower_tool_ironshovel.png | Bin 0 -> 6459 bytes .../textures/elepower_tool_ironsword.png | Bin 0 -> 6358 bytes .../textures/elepower_tool_leadaxe.png | Bin 0 -> 6383 bytes .../textures/elepower_tool_leadpick.png | Bin 0 -> 6583 bytes .../textures/elepower_tool_leadshovel.png | Bin 0 -> 6546 bytes .../textures/elepower_tool_leadsword.png | Bin 0 -> 6367 bytes elepower_dynamics/tools.lua | 122 ++++++ elepower_dynamics/worldgen.lua | 39 ++ elepower_farming/init.lua | 8 + elepower_farming/mod.conf | 3 + elepower_machines/bases/crafter.lua | 128 ++++++ elepower_machines/bases/generator.lua | 86 ++++ elepower_machines/bases/init.lua | 4 + elepower_machines/bases/storage.lua | 52 +++ elepower_machines/craft.lua | 127 ++++++ elepower_machines/formspec.lua | 65 +++ elepower_machines/init.lua | 13 + elepower_machines/mod.conf | 3 + elepower_machines/nodes.lua | 8 + elepower_machines/register.lua | 162 +++++++ .../textures/elepower_alloy_furnace.png | Bin 0 -> 5915 bytes .../elepower_alloy_furnace_active.png | Bin 0 -> 6125 bytes .../textures/elepower_furnace.png | Bin 0 -> 6691 bytes .../textures/elepower_furnace_active.png | Bin 0 -> 6692 bytes .../textures/elepower_generator.png | Bin 0 -> 6451 bytes .../textures/elepower_generator_active.png | Bin 0 -> 6829 bytes .../textures/elepower_grinder.png | Bin 0 -> 6764 bytes .../textures/elepower_grinder_active.png | Bin 0 -> 6789 bytes .../textures/elepower_gui_bar.png | Bin 0 -> 10793 bytes .../textures/elepower_gui_barbg.png | Bin 0 -> 201 bytes .../textures/elepower_gui_gauge.png | Bin 0 -> 489 bytes .../textures/elepower_machine_base.png | Bin 0 -> 5510 bytes .../textures/elepower_machine_side.png | Bin 0 -> 6144 bytes .../textures/elepower_machine_top.png | Bin 0 -> 5939 bytes .../textures/elepower_power_cell.png | Bin 0 -> 6406 bytes .../textures/elepower_power_level_1.png | Bin 0 -> 5421 bytes .../textures/elepower_power_level_2.png | Bin 0 -> 5432 bytes .../textures/elepower_power_level_3.png | Bin 0 -> 5440 bytes .../textures/elepower_power_level_4.png | Bin 0 -> 5458 bytes .../textures/elepower_power_level_5.png | Bin 0 -> 5478 bytes .../textures/elepower_power_level_6.png | Bin 0 -> 5482 bytes .../textures/elepower_power_level_7.png | Bin 0 -> 5486 bytes .../textures/elepower_power_level_8.png | Bin 0 -> 5492 bytes .../textures/elepower_power_port.png | Bin 0 -> 5716 bytes elepower_nuclear/init.lua | 7 + elepower_nuclear/mod.conf | 3 + elepower_papi/conductor.lua | 62 +++ elepower_papi/formspec.lua | 9 + elepower_papi/helpers.lua | 74 ++++ elepower_papi/init.lua | 19 + elepower_papi/machine.lua | 238 +++++++++++ elepower_papi/mod.conf | 3 + elepower_papi/network.lua | 398 ++++++++++++++++++ elepower_papi/power/init.lua | 6 + elepower_papi/tool.lua | 0 elepower_tools/init.lua | 8 + elepower_tools/mod.conf | 3 + modpack.txt | 0 77 files changed, 1975 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 elepower_dynamics/conduits.lua create mode 100644 elepower_dynamics/crafting.lua create mode 100644 elepower_dynamics/craftitems.lua create mode 100644 elepower_dynamics/dusts.lua create mode 100644 elepower_dynamics/init.lua create mode 100644 elepower_dynamics/mod.conf create mode 100644 elepower_dynamics/nodes.lua create mode 100644 elepower_dynamics/textures/elepower_carbon_fiber.png create mode 100644 elepower_dynamics/textures/elepower_carbon_fiber_sheet.png create mode 100644 elepower_dynamics/textures/elepower_conduit.png create mode 100644 elepower_dynamics/textures/elepower_dust.png create mode 100644 elepower_dynamics/textures/elepower_iron_ingot.png create mode 100644 elepower_dynamics/textures/elepower_lead_ingot.png create mode 100644 elepower_dynamics/textures/elepower_lead_lump.png create mode 100644 elepower_dynamics/textures/elepower_mineral_lead.png create mode 100644 elepower_dynamics/textures/elepower_tool_ironaxe.png create mode 100644 elepower_dynamics/textures/elepower_tool_ironpick.png create mode 100644 elepower_dynamics/textures/elepower_tool_ironshovel.png create mode 100644 elepower_dynamics/textures/elepower_tool_ironsword.png create mode 100644 elepower_dynamics/textures/elepower_tool_leadaxe.png create mode 100644 elepower_dynamics/textures/elepower_tool_leadpick.png create mode 100644 elepower_dynamics/textures/elepower_tool_leadshovel.png create mode 100644 elepower_dynamics/textures/elepower_tool_leadsword.png create mode 100644 elepower_dynamics/tools.lua create mode 100644 elepower_dynamics/worldgen.lua create mode 100644 elepower_farming/init.lua create mode 100644 elepower_farming/mod.conf create mode 100644 elepower_machines/bases/crafter.lua create mode 100644 elepower_machines/bases/generator.lua create mode 100644 elepower_machines/bases/init.lua create mode 100644 elepower_machines/bases/storage.lua create mode 100644 elepower_machines/craft.lua create mode 100644 elepower_machines/formspec.lua create mode 100644 elepower_machines/init.lua create mode 100644 elepower_machines/mod.conf create mode 100644 elepower_machines/nodes.lua create mode 100644 elepower_machines/register.lua create mode 100644 elepower_machines/textures/elepower_alloy_furnace.png create mode 100644 elepower_machines/textures/elepower_alloy_furnace_active.png create mode 100644 elepower_machines/textures/elepower_furnace.png create mode 100644 elepower_machines/textures/elepower_furnace_active.png create mode 100644 elepower_machines/textures/elepower_generator.png create mode 100644 elepower_machines/textures/elepower_generator_active.png create mode 100644 elepower_machines/textures/elepower_grinder.png create mode 100644 elepower_machines/textures/elepower_grinder_active.png create mode 100644 elepower_machines/textures/elepower_gui_bar.png create mode 100644 elepower_machines/textures/elepower_gui_barbg.png create mode 100644 elepower_machines/textures/elepower_gui_gauge.png create mode 100644 elepower_machines/textures/elepower_machine_base.png create mode 100644 elepower_machines/textures/elepower_machine_side.png create mode 100644 elepower_machines/textures/elepower_machine_top.png create mode 100644 elepower_machines/textures/elepower_power_cell.png create mode 100644 elepower_machines/textures/elepower_power_level_1.png create mode 100644 elepower_machines/textures/elepower_power_level_2.png create mode 100644 elepower_machines/textures/elepower_power_level_3.png create mode 100644 elepower_machines/textures/elepower_power_level_4.png create mode 100644 elepower_machines/textures/elepower_power_level_5.png create mode 100644 elepower_machines/textures/elepower_power_level_6.png create mode 100644 elepower_machines/textures/elepower_power_level_7.png create mode 100644 elepower_machines/textures/elepower_power_level_8.png create mode 100644 elepower_machines/textures/elepower_power_port.png create mode 100644 elepower_nuclear/init.lua create mode 100644 elepower_nuclear/mod.conf create mode 100644 elepower_papi/conductor.lua create mode 100644 elepower_papi/formspec.lua create mode 100644 elepower_papi/helpers.lua create mode 100644 elepower_papi/init.lua create mode 100644 elepower_papi/machine.lua create mode 100644 elepower_papi/mod.conf create mode 100644 elepower_papi/network.lua create mode 100644 elepower_papi/power/init.lua create mode 100644 elepower_papi/tool.lua create mode 100644 elepower_tools/init.lua create mode 100644 elepower_tools/mod.conf create mode 100644 modpack.txt diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..175341e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2018 Evert "Diamond" Prants + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8e4ac9d --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Elepower +A new *powerful* modpack for [Minetest](http://minetest.net)! + +**I do not recommend using this modpack with technic or pipeworks, as this modpack aims to become the all-in-one solution. However, compatibility might be added at a later date.** + +## Features + +### Universal Electric Power API +How is this any different from technic I hear you asking? Well, first of all, I have eliminated the concept of "tiers" in the **technic** sense, as all types of machines will now be accepting any conduit. Machines can be upgraded for speed and efficiency. + +### (Planned) Universal Fluid Transfer API +Exactly what it sounds like. Pipeworks failed to do this. + +### (Planned) Universal Item Transfer API +Also exactly what it sounds like. /might/ be backwards-compatible with pipeworks, currently undecided. + +### Machinery +Machines for doubling your ore output and helping you create more powerful materials. + +### Tools +Powered tools that you can simply recharge instead of crafting them again. + +### (Planned) Farming +Farming automation machines. + +### (Planned) Nuclear +Nuclear power. Both fission and fusion will be presented! diff --git a/elepower_dynamics/conduits.lua b/elepower_dynamics/conduits.lua new file mode 100644 index 0000000..10fc5df --- /dev/null +++ b/elepower_dynamics/conduits.lua @@ -0,0 +1,6 @@ + +ele.register_conduit("elepower_dynamics:conduit", { + description = "Power Conduit", + tiles = {"elepower_conduit.png"}, + groups = {oddly_breakable_by_hand = 1, cracky = 1} +}) diff --git a/elepower_dynamics/crafting.lua b/elepower_dynamics/crafting.lua new file mode 100644 index 0000000..cd7d78d --- /dev/null +++ b/elepower_dynamics/crafting.lua @@ -0,0 +1,110 @@ + +--------------- +-- Overrides -- +--------------- + +minetest.clear_craft({type = "cooking", output = "default:steel_ingot"}) + +----------- +-- Tools -- +----------- + +-- Pickaxes + +minetest.register_craft({ + output = 'elepower_dynamics:pick_iron', + recipe = { + {'elepower_dynamics:iron_ingot', 'elepower_dynamics:iron_ingot', 'elepower_dynamics:iron_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'elepower_dynamics:pick_lead', + recipe = { + {'elepower_dynamics:lead_ingot', 'elepower_dynamics:lead_ingot', 'elepower_dynamics:lead_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +-- Shovels + +minetest.register_craft({ + output = 'elepower_dynamics:shovel_iron', + recipe = { + {'elepower_dynamics:iron_ingot'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'elepower_dynamics:shovel_lead', + recipe = { + {'elepower_dynamics:lead_ingot'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +-- Axes + +minetest.register_craft({ + output = 'elepower_dynamics:axe_iron', + recipe = { + {'elepower_dynamics:iron_ingot', 'elepower_dynamics:iron_ingot'}, + {'elepower_dynamics:iron_ingot', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'elepower_dynamics:axe_lead', + recipe = { + {'elepower_dynamics:lead_ingot', 'elepower_dynamics:lead_ingot'}, + {'elepower_dynamics:lead_ingot', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +-- Swords + +minetest.register_craft({ + output = 'elepower_dynamics:sword_iron', + recipe = { + {'elepower_dynamics:iron_ingot'}, + {'elepower_dynamics:iron_ingot'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'elepower_dynamics:sword_lead', + recipe = { + {'elepower_dynamics:lead_ingot'}, + {'elepower_dynamics:lead_ingot'}, + {'group:stick'}, + } +}) + +----------- +-- Items -- +----------- + +-------------- +-- Smelting -- +-------------- + +minetest.register_craft({ + type = "cooking", + output = "elepower_dynamics:iron_ingot", + recipe = "default:iron_lump" +}) + +minetest.register_craft({ + type = "cooking", + output = "elepower_dynamics:lead_lump", + recipe = "elepower_dynamics:lead_ingot" +}) diff --git a/elepower_dynamics/craftitems.lua b/elepower_dynamics/craftitems.lua new file mode 100644 index 0000000..b2c9316 --- /dev/null +++ b/elepower_dynamics/craftitems.lua @@ -0,0 +1,44 @@ + +---------------- +-- Craftitems -- +---------------- + +-- Ingots + +minetest.register_craftitem("elepower_dynamics:lead_ingot", { + description = "Lead Ingot", + inventory_image = "elepower_lead_ingot.png", + groups = {lead = 1, ingot = 1} +}) + +minetest.register_craftitem("elepower_dynamics:iron_ingot", { + description = "Iron Ingot", + inventory_image = "elepower_iron_ingot.png", + groups = {iron = 1, ingot = 1} +}) + +-- Lumps + +minetest.register_craftitem("elepower_dynamics:lead_lump", { + description = "Lead Lump", + inventory_image = "elepower_lead_lump.png", + groups = {lead = 1, lump = 1} +}) + +-- Other + +minetest.register_craftitem("elepower_dynamics:carbon_fiber", { + description = "Carbon Fibers", + inventory_image = "elepower_carbon_fiber.png", + groups = {carbon_fiber = 1} +}) + +minetest.register_craftitem("elepower_dynamics:carbon_sheet", { + description = "Carbon Fiber Sheet", + inventory_image = "elepower_carbon_fiber_sheet.png", + groups = {carbon_fiber_sheet = 1, sheet = 1} +}) + +--------------- +-- Overrides -- +--------------- diff --git a/elepower_dynamics/dusts.lua b/elepower_dynamics/dusts.lua new file mode 100644 index 0000000..dc2f2a9 --- /dev/null +++ b/elepower_dynamics/dusts.lua @@ -0,0 +1,82 @@ + +---------------------- +-- Ground materials -- +---------------------- + +elepd.registered_dusts = {} + +function elepd.register_dust(mat, data) + local mod = minetest.get_current_modname() + local itemname = mod..":"..mat.."_dust" + + data.item = itemname + elepd.registered_dusts[mat] = data + + minetest.register_craftitem(itemname, { + description = "Pulverized " .. data.description, + inventory_image = "elepower_dust.png^[multiply:" .. data.color, + groups = {["dust_" .. mat] = 1, dust = 1} + }) +end + +-- Default dust list + +elepd.register_dust("bronze", { + description = "Bronze", + color = "#fa7b26" +}) + +elepd.register_dust("copper", { + description = "Copper", + color = "#fcb15f" +}) + +elepd.register_dust("gold", { + description = "Gold", + color = "#ffff47" +}) + +elepd.register_dust("steel", { + description = "Steel", + color = "#ffffff" +}) + +elepd.register_dust("tin", { + description = "Tin", + color = "#c1c1c1" +}) + +elepd.register_dust("mithril", { + description = "Mithril", + color = "#8686df" +}) + +elepd.register_dust("silver", { + description = "Silver", + color = "#d7e2e8" +}) + +elepd.register_dust("lead", { + description = "Lead", + color = "#aeaedc" +}) + +elepd.register_dust("iron", { + description = "Iron", + color = "#dddddd" +}) + +elepd.register_dust("coal", { + description = "Coal", + color = "#222222" +}) + +elepd.register_dust("diamond", { + description = "Diamond", + color = "#02c1e8" +}) + +elepd.register_dust("energium", { + description = "Energium", + color = "#ff1111" +}) diff --git a/elepower_dynamics/init.lua b/elepower_dynamics/init.lua new file mode 100644 index 0000000..61ba282 --- /dev/null +++ b/elepower_dynamics/init.lua @@ -0,0 +1,15 @@ +-- A Elepower Mod +-- Copyright 2018 Evert "Diamond" Prants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +elepd = rawget(_G, "elepd") or {} +elepd.modpath = modpath + +dofile(modpath.."/conduits.lua") +dofile(modpath.."/craftitems.lua") +dofile(modpath.."/tools.lua") +dofile(modpath.."/nodes.lua") +dofile(modpath.."/dusts.lua") +dofile(modpath.."/worldgen.lua") +dofile(modpath.."/crafting.lua") diff --git a/elepower_dynamics/mod.conf b/elepower_dynamics/mod.conf new file mode 100644 index 0000000..dd369b1 --- /dev/null +++ b/elepower_dynamics/mod.conf @@ -0,0 +1,4 @@ +name = elepower_dynamics +description = Elepower Dynamics. Conduits and materials! +depends = elepower_papi,default +optional_depends = moreores diff --git a/elepower_dynamics/nodes.lua b/elepower_dynamics/nodes.lua new file mode 100644 index 0000000..ff6118b --- /dev/null +++ b/elepower_dynamics/nodes.lua @@ -0,0 +1,16 @@ + +--------------- +-- Overrides -- +--------------- + +----------- +-- Nodes -- +----------- + +minetest.register_node("elepower_dynamics:stone_with_lead", { + description = "Lead Ore", + tiles = {"default_stone.png^elepower_mineral_lead.png"}, + groups = {cracky = 2}, + drop = 'elepower_dynamics:lead_lump', + sounds = default.node_sound_stone_defaults(), +}) diff --git a/elepower_dynamics/textures/elepower_carbon_fiber.png b/elepower_dynamics/textures/elepower_carbon_fiber.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a9595268a2a108f226173e6b595a68bb3a5ae6 GIT binary patch literal 6185 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 literal 0 HcmV?d00001 diff --git a/elepower_dynamics/textures/elepower_carbon_fiber_sheet.png b/elepower_dynamics/textures/elepower_carbon_fiber_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..cd204fd78aa630ecbd6803005c56e579f8816326 GIT binary patch literal 6091 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 literal 0 HcmV?d00001 diff --git a/elepower_dynamics/textures/elepower_conduit.png b/elepower_dynamics/textures/elepower_conduit.png new file mode 100644 index 0000000000000000000000000000000000000000..900095576398ab5f46aacd0db9371ff029241bc3 GIT binary patch literal 5878 zcmeHKc~}$I79aHiVHIl?1jP`cY9-r{gd`FW2ts5F5Q$W@43h~7WHSjSAT1&)sECL= z3gQE0QCz?Us)AN3s8|-o{Yk|Fiim)ZTE*o}0#$s^XP@8q`k(o}NpkP~o!>e4H|Lx? zvxXb!V{T$&0sw$H$Cn*~{#xoTj3N3x_30Z301Or<@D`{;APrWblnccY1gnl$AXr2z z76O3w)-k?VIWWWQWy8!4jIXa#EmWFqTi;h0-hJxSfv1iz-)t;g{BY~v$gg%+r#?5e zDnB-t!rp!AM1=#VEj{q);KfIruxn3W9_DwpR8)RTT0Qxj6G?NE&d)x7Z{zRj*Wu}K z#8k7r-!I;Lo!C#V>7!S;+WBN0AG6GCXQCOyEf;x1SQdV*(AsVrx8dcIyF{Db=nk)l z$V0g+ewiup>NS2<7dBcOJHE*D(woN*o}Z}P2a=X(es#)q9mhPQX+ngH)i#}=aeM`#rK8mvpV9QJt4!;3bGP>*zi?LltWBi@TWY8D7SaOCI&&001?*M3 z%ss*s{CPE*OES6n{wXhFX3d}TWzXbBkiV2?ZaA&RH)7izP;N6hLTTPsz8_qFP|a=+Oq&1#2@0>TLT3W6F)$SkN=i z>_PWRQ-S?_8E~O(S1P@3^zY|glCSZ??w*^m($X`>#kU%>3at4exF#qw&H7>&kJl30 zSi~vUd@tPo>}=e^4D8E~Jn#~l9U$nWXsn!zqCr=Nwn7|+3PyT6h$j^#wh;jc> zx-r9waL~7@&2Pq$f~;9PyGnSaRjX}cODdPB%;WDQn&OXNRTgG&yPA&;+9h-scP4Xf zWp$1Be5{u^IQN&{+Bk6e)l^=7z7272M~!0t>LyFVc*>bt|{0RQ9C!TK}yF zcS1z_?m4tD1+BjMwe{qNoc=4{2 zC@}I#D#m4HYL)3(% zfKD6cL^Xir?=2++`W@(rI+>9THASrI{Mkuzoo~>*ZgTtV0T<)m6(Kv?)``z;uoD|a zoeMVI!t7>?FzXlb9e#XmxcKz(lna+c5tofclk4|f?V7l)?V&~b*wiu2hC4jY=jNXA zuBuRMTCDhW2W`$X=tjuK(u4Qm>Bl?k+}HrSaau=idVb%)z-prx%@(EM4gTeo&<7Ctp!>YV_TSpu|Mu1IlPMOc{J0_ zYMVW2PR-!XlK#=)!Y|vSzE8Xg0AszxXkT9t;Ln8RQUWB9Mv%S8X{rinPL9-@wA;T8mNv0ic|f~62B1QOm`D_#oX+)S{pN`a6W!k#-! zfsR->ky@=_5{Vj(hM;jK$d%DVGK0Y&l0YH|;!y-%6)#gmTD(j(O-C`r!A4ZD64g#D zmtl3BP?S7Q&BEc(b?h*?PFZg)Iyvk>H`ddu)B++09Z=Bypa3FBBGK_A5DzklBkj@E zfPlBwGS#q(sGdYEq#%+BB%)OMo`p*7z4V>G4_c^r=LXbicMB&LaDiu$G zs0=(rf=PG=ok2nvAQePtQ6s20GL;&V!HA9uB`1hc9+EQ%Qw3xgk2sTrcnTs!@C;{~ z5bxqbMPMojp;<~EK@p@Bqp1x^Mn5<+P5h^0_8LR842^$TdoOfMw@spU$ZTrOeZ zbOB&>mikh_x(+8f(_aolx?<3S5rM8whAYJriYDrZuEdXl|AQ%1B-hCPH=cLUw=5n? zwMMRt4N?Y0#UQZy<2)Y%zhw$Rdz4D8jOYBxrv44*I+T^ZsI6QXKf-?~vSes9)JP;^ zy;NANzId4stW%MNQ$b4+f&LbtIu0$tB1jgEpj~pfME;l;e;`{S2x2hk5R4bn5gMLC z)1_DxiHfI^Ac#z-3Wd%>`uprExlpZvl!!+(T0`i4Mk`2vpRqIaNjCF+v_^!WLCzvM zGf5=e(Cx*#5_OI6kL|hYT17wrbEE*Sx>myE=rSxcPN9&95#{^B{E;aC1vkQeI4S?k zd?akh+Dop8M{8504${az>iz@3AqIajjL1~-kA*%GG9=50^8$@|XbwGx&|{7G_FNlI z3ti>>g`eSc`wKmw)SsPvlD?ni`YhKcDey_)&)M}^u1`|nlfa*|>;EQ~$-6gWM20@- zY0&rHmKl*)^qtu-%Fl-lv;plvC)08s7o9Oy_=c+hz;wLs8UfVij;m32VMywWLb&)zCv+IOuNjn}EEALr5+(@oD5!*Ge zpFc1!Et0}458Lk-e5x$M&3Sk0g>PMJCvKl#WLWQXv9GUTZmxUqd`Fz|?EF^uBesWQ z51;*o5@XL?5feE|4Q$lr7cEa~95wOG)(P1AeU+7CG<{9j^(&| zvvFq!&2}TwECVYuErFK*P)4{mMQS`knT_N)wtDIVwk12Zm z`i7wo=E+KKq|laHR5Ag1p8U@QpN?I%jOrt7?_+c3S3mu2efIsXgyfhsVl;i%LAZM$ z8}DnlCl$)R5k$t3oet%B#b1PF`1YEtqZGIA1)vu zWfP0FZfL=+ifFYDw~Dx;qP1G66a}pXTxxkUfnt2mXP>{{>wjjQd+v9>d*+*S&Yj7R zjtsRlb1);3NS4AdK@9$HO?*e2;J;2!1_2VuczJqUA{GN^$fy#Lz%q!8rJ)cR(!vrF zNqggA!o07iyIK7Hv#qb;hQzfe9GG5@9#_b&-0Catn$%KqBKSz=c(Th!!rx*a_Bzdf znUg0>g?3ue_+LIQO`*71WG;v*LoP~=4&?b}*&X`E)t(YS@Af!IMb>#-eNtSq%Pl}r zW&7QJw_m#jH&%0HM$LCUr#D#K-<4RqD@>c@+5KT12-{^X_YJ(>{i3o;ajeRL?p#@+ z{>k!o?!Ez<$T4xURnrxN2D<{V>ieYDhe;K+7UAvLf_vW^Z6+Nx7T%w7dwN0d_>aSm zPn`9TSGU#V0 z)j2ym%+|?_XLe4SN4nW|52it9XRiqyP1(tHnc6N8lF!qpX?-Xui!X zVo6WC-hA+N%e3ZlvmKQ0Y?G27yA&nHbbK%&EqQ()=W=4~mfYyYTd#MPA)CJ|<_GSY z?R9JEwNI^lwpY@wdhT+%LEjVdIj1uGA31-BEMt1tnmKfw9DDwl{ba)*mofZnN=>Ew zbxiNl$>m+APMMu0!KS>8Cg7qAY|+iGyFJIt=gufwp6xY?@-&L^rHLA046HxUlDGq2 zfUzbyz})ifqpp{1*_)koE5vpc&(Z4#Y2)+7cN1O=?xz@3ImXmi7yfK*H)qPF{SJO- zS`xonesR{z&Tm7j?AAM`GCzy^enU~D&8Qp~qsO%oT-Q6xK3C0XF;{J{9^08wceIS# zSaHTWD!O;81-v%gA$}7DDG#^~s;7mxPd!*7us&tpuRdb)W!$;`L(lyU>3${I?d>nn zrm2<>+jcegK<`t|;io zX|&2VwX&dmW4X=Kp!ST>J&oyypMH{s8gG3*FTN>h$(5V6&kDCck}Z7cy27gQxrgS| z;Ob?w*Y`f%lr^~Iil2SPmiX3%gH!R2wBU`c2u3lGXhjjiLzXN2ExLV1IZt1LWvjy+ zzM0jwP~f(5k4w|R&Wg5)?Z?n3CuSdc7BD+@O-6I|oNa5aw)$Qzd|BQ!7wC&0=glg% z?evPN=_8S>f?&MqB}RnvK}1di#E1x@Y2_#$0*U19r$qrU6~f3OND3=_D7}Z9C}ddd zLrLI7Fe1<(C^IJ^Kc*3qjlF946)L4-*cw@fUd<3Z_G z*7pe&MnsSJ5Hd<(IjZv@(E3O*ID$jfN|_EL2I-ItlH-A>aAxLfc-());f<%GBi9MV z7a*XTU=a#@C`15!F#^J3{?H-U699NjkSb;Y0F}+-a;YM&1fl|579;`KOg0zr(4!J6 zR2ZNDA%Y4gr@=T61c0DK%wSSE60Rqe%>;Nxa zR0Ne6r(*M%fLP3CQyFY7hsx&QM*tINW=hyBE?dOoF}!#>DneL(K(x?@!lE%=S)yeC zCP9>PA4)i^P-|aJ#KCeX76S;;m>d?5>B;1Hu{a#A2Wu!a9bY`8RN+}ma55P*md;xY z@ zPKGNb5RlS!LvQ-q!2iJ%n}TQ*{~OOM=m<-I64M~c)F@??XfXt0Z|8Xvc!Vhi?@=mD znI`;;llnKD_fS@b;l7A6O>g~JXvxrMsFBEEom6D9u6X$XNT}#TQ2|RKvF;M!Iu1>N zDS$!>;azgLMEmQoNS+Xi229P=_J%y2(@-{mg~TJyPvrkz_%Y}S;G z?%PpT|8iZ(EcpcEfnGq~pLVGJiTNLt7N@>hS*@u%@Q-{SNdR7NsKdETR{WlZ2&)mVhmq7s{2yJm<_nKxyT(kkyYx;>h@i7}>dZ}QO#?5J}R zH}{ENRb$c_XG!P^;|=%EX}38UtST%${gZut0ahM3cYD-2=_Cy_>e%!t_ZU6hCYx3j z+LP+XdVJcjxAHi8C52x>`E&(I{=&lFHaO|{*B@Lj4H&rE+Nd@L{Oz+(E;%WmgQD6! zHVBg*010qNS#tmYE+YT{E+YYWr9XB6000McNliru;sy^0Av1j^(2@WE02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B}-L_t(I%e|9HN&`_8MNgTZ zs?-9M48)O2;R;g37Hps}iKuIFBd)*=C@2axASj_S5J#F!95{?_z~r}%DmEmgAb6+$ zo%=42`@OyW1OB2h{-|FW_^*NUUjsMnP2_>a7vK4Q$ky%}##j!IPMx(DT~=PMf#?=p zp&;1aNhp;BLX4r5VXKj#wdMHa%mL`K^2B!#pixf<0)g)r(Av`PTeQ|ZKX++&9@$t= zIKMdiNRWZ`S^|LQc~}d^IHc6v-8}#hMRP2TPavfvu2e}|O*cqT+f2B*O#xV3h|$_` zf8WL!O%%-mAf?0@jZ*3(wdfYz%JM44z`}eCK&SHrz|73-P%v#Z`Er9^?~PvXjZ!Hj z41J<#n#-$eCMTyxf`bIQth}_4nJ=qZCRW5rVYGN2%PiKnkC`y)1f4i%B5Q4{w7g(OQ{BTAg}b8}PkN*J7rQWHy3 zQxwWGOEMJPJ$(bh8~Mb6ivD@JIEGl9zB|b-{ykW(~ay7dRC#WIXuCJH5a) zUAtA)e4}C6v{E(k4rU?WDe--7{>K07E$5%#qjb3Y7kk5p<%#q3LtPkCC2Sl8Hr>7U z=?bgs#4MTp8*eV@*rL*@%+tEaKWdnlQseiNMf#M-K&E=c;*l#~^Rf z_oj}ex$Fy+eWz~P6Bx?5%5c@8msd`_;69$Lu2lT1&hPRWO|E`J?mhDrgbMb*ek}3* w_v)0$RjZnc*|M1#_}cj^cd;j*uHSs>{{MCPK1Z2jK%vgy>FVdQ&MBb@0BW+GW&i*H literal 0 HcmV?d00001 diff --git a/elepower_dynamics/textures/elepower_mineral_lead.png b/elepower_dynamics/textures/elepower_mineral_lead.png new file mode 100644 index 0000000000000000000000000000000000000000..df7b246d872ce7947631fa67d748ab19f1b2254b GIT binary patch literal 410 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 literal 0 HcmV?d00001 diff --git a/elepower_dynamics/textures/elepower_tool_ironpick.png b/elepower_dynamics/textures/elepower_tool_ironpick.png new file mode 100644 index 0000000000000000000000000000000000000000..a12f20a8d79b15e8d051e68e3e1e27c1f0385f61 GIT binary patch literal 6527 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 literal 0 HcmV?d00001 diff --git a/elepower_dynamics/textures/elepower_tool_ironshovel.png b/elepower_dynamics/textures/elepower_tool_ironshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..87bc35310d8e96bc3fb072342eeb293c23aea7d9 GIT binary patch literal 6459 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 bch32|Q(BE@k?SKcWsWK$F1&K|q?!K$^OgzH literal 0 HcmV?d00001 diff --git a/elepower_dynamics/textures/elepower_tool_leadpick.png b/elepower_dynamics/textures/elepower_tool_leadpick.png new file mode 100644 index 0000000000000000000000000000000000000000..70973a5bd5382ff5ceb0960a581381c6f4190233 GIT binary patch literal 6583 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 d(?|ZQ|ERO+Q;Y)lKPHu>h`j0q?J@c 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 t@S^x^Oe8b7%*jyDrj2ZwkdNL{|mT02crN0 literal 0 HcmV?d00001 diff --git a/elepower_dynamics/tools.lua b/elepower_dynamics/tools.lua new file mode 100644 index 0000000..2b5d102 --- /dev/null +++ b/elepower_dynamics/tools.lua @@ -0,0 +1,122 @@ + +-- Pickaxes + +minetest.register_tool("elepower_dynamics:pick_iron", { + description = "Iron Pickaxe", + inventory_image = "elepower_tool_ironpick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=3.90, [2]=1.50, [3]=0.60}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("elepower_dynamics:pick_lead", { + description = "Lead Pickaxe", + inventory_image = "elepower_tool_leadpick.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=3.90, [2]=1.60, [3]=0.50}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +-- Shovels + +minetest.register_tool("elepower_dynamics:shovel_iron", { + description = "Iron Shovel", + inventory_image = "elepower_tool_ironshovel.png", + wield_image = "elepower_tool_ironshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.40, [2]=0.80, [3]=0.20}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("elepower_dynamics:shovel_lead", { + description = "Lead Shovel", + inventory_image = "elepower_tool_leadshovel.png", + wield_image = "elepower_tool_leadshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.50, [3]=0.10}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +-- Axes + +minetest.register_tool("elepower_dynamics:axe_iron", { + description = "Iron Axe", + inventory_image = "elepower_tool_ironaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.40, [2]=1.30, [3]=0.80}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("elepower_dynamics:axe_lead", { + description = "Lead Axe", + inventory_image = "elepower_tool_leadaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.40, [2]=1.20, [3]=0.70}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +-- Swords + +minetest.register_tool("elepower_dynamics:sword_iron", { + description = "Iron Sword", + inventory_image = "elepower_tool_ironsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.4, [2]=1.10, [3]=0.2}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=5}, + }, + sound = {breaks = "default_tool_breaks"}, +}) + +minetest.register_tool("elepower_dynamics:sword_lead", { + description = "Lead Sword", + inventory_image = "elepower_tool_leadsword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.2, [2]=1.00, [3]=0.1}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=7}, + }, + sound = {breaks = "default_tool_breaks"}, +}) diff --git a/elepower_dynamics/worldgen.lua b/elepower_dynamics/worldgen.lua new file mode 100644 index 0000000..950d5e7 --- /dev/null +++ b/elepower_dynamics/worldgen.lua @@ -0,0 +1,39 @@ + +-------------- +-- Worldgen -- +-------------- + +-- Lead + +minetest.register_ore({ + ore_type = "scatter", + ore = "elepower_dynamics:stone_with_lead", + wherein = "default:stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 12, + clust_size = 3, + y_max = 31000, + y_min = 1025, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "elepower_dynamics:stone_with_lead", + wherein = "default:stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 5, + clust_size = 3, + y_max = 0, + y_min = -31000, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "elepower_dynamics:stone_with_lead", + wherein = "default:stone", + clust_scarcity = 18 * 18 * 18, + clust_num_ores = 5, + clust_size = 3, + y_max = -128, + y_min = -31000, +}) diff --git a/elepower_farming/init.lua b/elepower_farming/init.lua new file mode 100644 index 0000000..517c1ff --- /dev/null +++ b/elepower_farming/init.lua @@ -0,0 +1,8 @@ +-- A Elepower Mod +-- Copyright 2018 Evert "Diamond" Prants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +elefarm = rawget(_G, "elefarm") or {} +elefarm.modpath = modpath + diff --git a/elepower_farming/mod.conf b/elepower_farming/mod.conf new file mode 100644 index 0000000..61c2ef5 --- /dev/null +++ b/elepower_farming/mod.conf @@ -0,0 +1,3 @@ +name = elepower_farming +description = Electric Farming Automation! +depends = elepower_papi, elepower_tools diff --git a/elepower_machines/bases/crafter.lua b/elepower_machines/bases/crafter.lua new file mode 100644 index 0000000..8195f07 --- /dev/null +++ b/elepower_machines/bases/crafter.lua @@ -0,0 +1,128 @@ +-- This is a crafter type machine base. +-- It accepts a recipe type registered beforehand. + +function elepm.register_crafter(nodename, nodedef) + local craft_type = nodedef.craft_type + if not craft_type or not elepm.craft.types[craft_type] then + return nil + end + + if not nodedef.groups then + nodedef.groups = {} + end + + nodedef.groups["ele_machine"] = 1 + nodedef.groups["ele_user"] = 1 + + nodedef.on_timer = function (pos, elapsed) + local refresh = false + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local machine_node = nodename + local machine_speed = nodedef.craft_speed or 1 + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + + while true do + local result = elepm.get_recipe(craft_type, inv:get_list("src")) + local usage = ele.helpers.get_node_property(meta, pos, "usage") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + + local pow_percent = math.floor((storage / capacity) * 100) + + local power_operation = false + + -- Determine if there is enough power for this action + if result and storage >= usage then + power_operation = true + end + + if not result or not power_operation then + ele.helpers.swap_node(pos, machine_node) + + if not result then + meta:set_string("formspec", ele.formspec.get_crafter_formspec(craft_type, pow_percent)) + meta:set_int("src_time", 0) + meta:set_string("infotext", ("%s Idle"):format(nodedef.description)) + else + local pct = math.floor((ele.helpers.round(result.time * 10) / meta:get_int("src_time")) * 100) + meta:set_string("formspec", ele.formspec.get_crafter_formspec(craft_type, pow_percent, pct)) + meta:set_string("infotext", ("%s Out of Power!"):format(nodedef.description)) + end + + break + end + + refresh = true + + -- One step + meta:set_int("storage", storage - usage) + pow_percent = math.floor((storage / capacity) * 100) + meta:set_int("src_time", meta:get_int("src_time") + ele.helpers.round(machine_speed * 10)) + meta:set_string("infotext", ("%s Active"):format(nodedef.description)) + + if nodedef.ele_active_node then + local active_node = nodename.."_active" + if nodedef.ele_active_node ~= true then + active_node = nodedef.ele_active_node + end + + ele.helpers.swap_node(pos, active_node) + end + + if meta:get_int("src_time") <= ele.helpers.round(result.time * 10) then + local pct = math.floor((meta:get_int("src_time") / ele.helpers.round(result.time * 10)) * 100) + meta:set_string("formspec", ele.formspec.get_crafter_formspec(craft_type, pow_percent, pct)) + break + end + + local output = result.output + if type(output) ~= "table" then output = { output } end + local output_stacks = {} + for _, o in ipairs(output) do + table.insert(output_stacks, ItemStack(o)) + end + + local room_for_output = true + inv:set_size("dst_tmp", inv:get_size("dst")) + inv:set_list("dst_tmp", inv:get_list("dst")) + + for _, o in ipairs(output_stacks) do + if not inv:room_for_item("dst_tmp", o) then + room_for_output = false + break + end + inv:add_item("dst_tmp", o) + end + + if not room_for_output then + ele.helpers.swap_node(pos, machine_node) + meta:set_string("formspec", ele.formspec.get_crafter_formspec(craft_type, pow_percent)) + meta:set_int("src_time", ele.helpers.round(result.time*10)) + meta:set_string("infotext", ("%s Output Full!"):format(nodedef.description)) + break + end + + meta:set_int("src_time", meta:get_int("src_time") - ele.helpers.round(result.time*10)) + inv:set_list("src", result.new_input) + inv:set_list("dst", inv:get_list("dst_tmp")) + end + + return refresh + end + + local sizes = elepm.craft.types[craft_type] + nodedef.on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", sizes.inputs) + inv:set_size("dst", 4) + + local storage = ele.helpers.get_node_property(meta, pos, "storage") + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + meta:set_string("formspec", ele.formspec.get_crafter_formspec(craft_type, capacity, storage)) + end + + ele.register_machine(nodename, nodedef) +end diff --git a/elepower_machines/bases/generator.lua b/elepower_machines/bases/generator.lua new file mode 100644 index 0000000..e1ef6e1 --- /dev/null +++ b/elepower_machines/bases/generator.lua @@ -0,0 +1,86 @@ + +function elepm.register_fuel_generator(nodename, nodedef) + if not nodedef.groups then + nodedef.groups = {} + end + + nodedef.groups["ele_machine"] = 1 + nodedef.groups["ele_provider"] = 1 + + nodedef.on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + + local burn_time = meta:get_int("burn_time") + local burn_totaltime = meta:get_int("burn_totaltime") + + 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") + + -- If more to burn and the energy produced was used: produce some more + if burn_time > 0 then + if storage + generation > capacity then + return false + end + + meta:set_int("storage", storage + generation) + + burn_time = burn_time - 1 + meta:set_int("burn_time", burn_time) + end + + local pow_percent = math.floor((storage / capacity) * 100) + + -- Burn another piece of fuel + if burn_time == 0 then + local inv = meta:get_inventory() + if not inv:is_empty("src") then + local fuellist = inv:get_list("src") + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if not fuel or fuel.time == 0 then + ele.helpers.swap_node(pos, nodename) + return false + end + + meta:set_int("burn_time", fuel.time) + meta:set_int("burn_totaltime", fuel.time) + inv:set_stack("src", 1, afterfuel.items[1]) + + if nodedef.ele_active_node then + local active_node = nodename.."_active" + if nodedef.ele_active_node ~= true then + active_node = nodedef.ele_active_node + end + + ele.helpers.swap_node(pos, active_node) + end + else + meta:set_string("formspec", ele.formspec.get_generator_formspec(pow_percent, 0)) + meta:set_string("infotext", ("%s Idle"):format(nodedef.description)) + ele.helpers.swap_node(pos, nodename) + return false + end + end + if burn_totaltime == 0 then burn_totaltime = 1 end + + local percent = math.floor((burn_time / burn_totaltime) * 100) + meta:set_string("formspec", ele.formspec.get_generator_formspec(pow_percent, percent)) + meta:set_string("infotext", ("%s Active"):format(nodedef.description)) + + return true + end + + nodedef.on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 1) + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + + meta:set_string("formspec", ele.formspec.get_generator_formspec(math.floor((storage / capacity) * 100), 0)) + end + + ele.register_machine(nodename, nodedef) +end diff --git a/elepower_machines/bases/init.lua b/elepower_machines/bases/init.lua new file mode 100644 index 0000000..b2dd317 --- /dev/null +++ b/elepower_machines/bases/init.lua @@ -0,0 +1,4 @@ + +dofile(elepm.modpath.."/bases/crafter.lua") +dofile(elepm.modpath.."/bases/generator.lua") +dofile(elepm.modpath.."/bases/storage.lua") diff --git a/elepower_machines/bases/storage.lua b/elepower_machines/bases/storage.lua new file mode 100644 index 0000000..4c65821 --- /dev/null +++ b/elepower_machines/bases/storage.lua @@ -0,0 +1,52 @@ + +function elepm.register_storage(nodename, nodedef) + local levels = nodedef.ele_levels or 8 + local level_overlay = nodedef.ele_overlay or "elepower_power_level_" + if not nodedef.groups then + nodedef.groups = {} + end + + nodedef.groups["ele_machine"] = 1 + nodedef.groups["ele_storage"] = 1 + nodedef.groups["ele_provider"] = 1 + + nodedef.on_timer = function (pos, elapsed) + 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") + + local percent = storage / capacity + local level = math.floor(percent * levels) + local rounded = math.floor(percent * 100) + + ele.helpers.swap_node(pos, nodename .. "_" .. level) + meta:set_string("formspec", ele.formspec.get_storage_formspec(rounded)) + meta:set_string("infotext", ("%s Active"):format(nodedef.description)) + + return false + end + + nodedef.on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 1) + meta:set_string("formspec", ele.formspec.get_storage_formspec(0)) + end + + for i = 0, levels do + local cpdef = ele.helpers.table_copy(nodedef) + + -- Add overlay to the tile texture + if cpdef.tiles and cpdef.tiles[6] and i > 0 then + cpdef.tiles[6] = cpdef.tiles[6] .. "^" .. level_overlay .. i ..".png" + end + + if i > 0 then + cpdef.groups["not_in_creative_inventory"] = 1 + end + + ele.register_machine(nodename .. "_" .. i, cpdef) + end +end diff --git a/elepower_machines/craft.lua b/elepower_machines/craft.lua new file mode 100644 index 0000000..dea06be --- /dev/null +++ b/elepower_machines/craft.lua @@ -0,0 +1,127 @@ + +elepm.craft = {} +elepm.craft.types = {} + +function elepm.register_craft_type(name, def) + elepm.craft.types[name] = { + inputs = def.inputs or 2, + description = def.description or name, + time = def.time or 0 + } + + elepm.craft[name] = {} +end + +function elepm.register_craft(craftdef) + if not craftdef.type or not elepm.craft.types[craftdef.type] then + return nil + end + + local inputs = craftdef.recipe + local outputs = craftdef.output + local ctype = craftdef.type + local time = (craftdef.time or craftdef.cooktime or 5) + (elepm.craft.types[ctype].time or 0) + + local craftrecipe = {} + for _,input in ipairs(inputs) do + local stack = ItemStack(input) + if stack and not stack:is_empty() then + craftrecipe[stack:get_name()] = stack:get_count() + end + end + + local craftresult = {} + if type(outputs) == "table" then + for _,output in ipairs(output) do + local stack = ItemStack(output) + if stack and not stack:is_empty() then + craftresult[stack:get_name()] = stack:get_count() + end + end + else + craftresult = ItemStack(outputs) + end + + local recipe = { + recipe = craftrecipe, + output = craftresult, + time = time + } + + table.insert(elepm.craft[ctype], recipe) +end + +function elepm.get_recipe(type, inputs) + if not elepm.craft[type] then + return nil + end + + -- Minetest's cooking builtin type + if type == "cooking" then + local result, new_input = minetest.get_craft_result({ + method = "cooking", + width = 1, + items = inputs + }) + + if not result or result.time == 0 then + return nil + else + return { + time = result.time, + new_input = new_input.items, + output = result.item + } + end + end + + -- Custom types + local result = nil + for _,recipe in ipairs(elepm.craft[type]) do + local recip_match = true + local inputs_full = {} + local new_input = {} + + for _,input in ipairs(inputs) do + local in_name = input:get_name() + + if not recipe.recipe[in_name] then + recip_match = false + elseif recipe.recipe[in_name] > input:get_count() then + recip_match = false + end + + if not recip_match then break end + + table.insert(inputs_full, in_name) + + local istack = ItemStack(in_name) + istack:set_count(input:get_count() - recipe.recipe[in_name]) + new_input[#new_input + 1] = istack + end + + if recip_match then + for _,ingredient in ipairs(recipe.recipe) do + local its = ItemStack(ingredient) + if not inputs_full[its:get_name()] then + recip_match = false + break + end + end + end + + if recip_match then + result = recipe + result.new_input = new_input + break + end + end + + return result +end + +-- Cooking craft type built-in. +elepm.register_craft_type("cooking", { + description = "Cooking", + inputs = 1, +}) diff --git a/elepower_machines/formspec.lua b/elepower_machines/formspec.lua new file mode 100644 index 0000000..f837004 --- /dev/null +++ b/elepower_machines/formspec.lua @@ -0,0 +1,65 @@ + +-- Specialized formspec for crafters +function ele.formspec.get_crafter_formspec(craft_type, power, percent) + local craftstats = elepm.craft.types[craft_type] + local input_size = craftstats.inputs + + local bar = "image[4,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]" + + if percent ~= nil then + bar = "image[4,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (percent)..":gui_furnace_arrow_fg.png^[transformR270]" + end + + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + "list[context;src;1.5,1.5;"..input_size..",1;]".. + bar.. + "list[context;dst;5,1;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;dst]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +function ele.formspec.get_generator_formspec(power, percent) + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + "list[context;src;3,1.5;1,1;]".. + "image[4,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]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +function ele.formspec.get_storage_formspec(power) + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + "list[context;src;2,1.5;1,1;]".. + "list[context;dst;5,1.5;1,1;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;dst]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end diff --git a/elepower_machines/init.lua b/elepower_machines/init.lua new file mode 100644 index 0000000..526488e --- /dev/null +++ b/elepower_machines/init.lua @@ -0,0 +1,13 @@ +-- Elepower Mod +-- Copyright 2018 Evert "Diamond" Prants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +elepm = rawget(_G, "elepm") or {} +elepm.modpath = modpath + +dofile(modpath.."/craft.lua") +dofile(modpath.."/formspec.lua") +dofile(modpath.."/bases/init.lua") +dofile(modpath.."/nodes.lua") +dofile(modpath.."/register.lua") diff --git a/elepower_machines/mod.conf b/elepower_machines/mod.conf new file mode 100644 index 0000000..4e0c5eb --- /dev/null +++ b/elepower_machines/mod.conf @@ -0,0 +1,3 @@ +name = elepower_machines +description = Elepower machinery! +depends = elepower_dynamics diff --git a/elepower_machines/nodes.lua b/elepower_machines/nodes.lua new file mode 100644 index 0000000..e90cd19 --- /dev/null +++ b/elepower_machines/nodes.lua @@ -0,0 +1,8 @@ +-- Nodes other than machines. +-- Machines are registered in `register.lua`! + +minetest.register_node("elepower_machines:machine_block", { + description = "Machine Block", + tiles = {"elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png"}, + groups = {oddly_breakable_by_hand = 1, cracky = 1}, +}) diff --git a/elepower_machines/register.lua b/elepower_machines/register.lua new file mode 100644 index 0000000..f832d0e --- /dev/null +++ b/elepower_machines/register.lua @@ -0,0 +1,162 @@ + +-------------- +-- Alloying -- +-------------- + +elepm.register_craft_type("alloy", { + description = "Alloying", + inputs = 2, +}) + +elepm.register_craft({ + type = "alloy", + recipe = { "elepower_dynamics:iron_ingot", "elepower_dynamics:coal_dust 4" }, + output = "default:steel_ingot", + time = 6, +}) + +elepm.register_crafter("elepower_machines:alloy_furnace", { + description = "Alloy Furnace", + craft_type = "alloy", + ele_active_node = true, + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_alloy_furnace.png", + }, + ele_active_nodedef = { + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_alloy_furnace_active.png", + }, + }, + groups = {oddly_breakable_by_hand = 1} +}) + +-------------- +-- Grinding -- +-------------- + +elepm.register_craft_type("grind", { + description = "Grinding", + inputs = 1, +}) + +-- Look for item name regardless of mod +local function scan_item_list(item_name) + local found = nil + + for name in pairs(minetest.registered_items) do + local nomod = name:gsub("(%w+):", "") + if nomod == item_name then + found = name + break + end + end + + return found +end + +local keywords = { _ingot = 1, _lump = 2, _block = 9, block = 9 } +for mat, data in pairs(elepd.registered_dusts) do + local kwfound = nil + for keyword,count in pairs(keywords) do + local found = scan_item_list(mat .. keyword) + if found then + if keyword == "_ingot" and not kwfound then + kwfound = found + end + + -- Grind recipe for material + elepm.register_craft({ + type = "grind", + recipe = { found }, + output = data.item .. " " .. count, + time = count + 4, + }) + end + end + + -- Add dust -> ingot smelting + if kwfound then + minetest.register_craft({ + type = "cooking", + recipe = data.item, + output = kwfound + }) + end +end + +elepm.register_crafter("elepower_machines:pulverizer", { + description = "Pulverizer", + craft_type = "grind", + ele_active_node = true, + ele_usage = 32, + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_grinder.png", + }, + ele_active_nodedef = { + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_grinder_active.png", + }, + }, + groups = {oddly_breakable_by_hand = 1} +}) + +------------- +-- Furnace -- +------------- + +elepm.register_crafter("elepower_machines:furnace", { + description = "Powered Furnace", + craft_type = "cooking", + ele_active_node = true, + ele_usage = 32, + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_furnace.png", + }, + ele_active_nodedef = { + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_furnace_active.png", + }, + }, + groups = {oddly_breakable_by_hand = 1} +}) + +---------------------- +-- Power Generation -- +---------------------- + +elepm.register_fuel_generator("elepower_machines:generator", { + description = "Coal-fired Generator", + ele_active_node = true, + ele_capacity = 6400, + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_generator.png", + }, + ele_active_nodedef = { + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_generator_active.png", + } + }, + groups = {oddly_breakable_by_hand = 1} +}) + +------------------- +-- Power Storage -- +------------------- + +elepm.register_storage("elepower_machines:power_cell", { + description = "Power Cell", + ele_capacity = 16000, + tiles = { + "elepower_machine_top.png", "elepower_machine_base.png", "elepower_machine_side.png", + "elepower_machine_side.png", "elepower_machine_side.png", "elepower_power_cell.png", + }, + groups = {oddly_breakable_by_hand = 1} +}) diff --git a/elepower_machines/textures/elepower_alloy_furnace.png b/elepower_machines/textures/elepower_alloy_furnace.png new file mode 100644 index 0000000000000000000000000000000000000000..86806ab68722b5c9fb190d1997bceb0e7575cfb2 GIT binary patch literal 5915 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 literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_alloy_furnace_active.png b/elepower_machines/textures/elepower_alloy_furnace_active.png new file mode 100644 index 0000000000000000000000000000000000000000..a31e6091d7a8c8890f29eb1defea9b09d87dec56 GIT binary patch literal 6125 zcmeHLd010d77r>Qi)iZtSkMrxXxo>(tR#^jI|M-}gsnyKZGk|N7m^1FsECLQ?jk~g zQlxIw4IQiqN>$W~qPSGtaHB3*L{Jo+s;%>0polY$9lx3WG2bVAf!uR{=XcNj-E+=c zazdy253w9=Nu$w*NCSMr$p6Er&tNn1@7PB#AsTJa_Hsq$}5uzpby-u}T#k68}p12b?OJbHZqa@0xs^l{_GocWm3$WJU>&Sm_z z_ovCi>}AfIoSxmPJ=l^vC6~SEj<9P_oies{naDgOy=Kf{*{HK)s?LPWo;Q64D?Dyv zsdeo&hYf;~sunfSVsE5}6bo?hd} zPW3*O%CuKn6lNxiA3f`SI8rMv3prjoq1Nw(=NzQS&+C+VDpViWwe6ekvQ3jV%&Ynm z?X0K|c^0;Pn5~XDTh+<$m^mr3pyX)oZ?Wg9^VnHe&sXy0X zlZY!uS+@n~4iBijRAYX6|HR3Q8*IJ>tVed;b+$}lNGqC4r(?!cfa~FPB?vSX=rh9F3`RG9K-|SJ*rt;DojKm3B zA~tQFKF=?>sJ6TI(7vHRbe4-Q-pDc=>$S*fe$W{|TmCaUc3+1uGslVxe7__0>ThG7>~XpL=*Z>u-M3$uB)P?`J}7gwwoN*{KvQ$$hmwR=>!mr! zurcC+O6hu?oH5Czq`I+CnzcRDB;funS;x}3o)@Bt)+Kw*b%7WCURvUV7`JfHzoh2+ zjE*%``mIfF(}`5@T=Nc>rf4E=c#i#8gty{@>FcLnf(rcaJR6J-F^#Uw_+B!yLssu% zH77mkF*~#*WXHXeFsg1|WONQNT*>HZ1=UDlZ>dPO$j6M77XG3*0$!nux ziMp&owL<@*0-u*ItP+9lpzc&=**+yUZdEz%# zmG@gRT7bI?y=tY;8gFddce(XU{^OnNBJCqtr#5(2r9UbC;y{I@^>)ngY>Ub2#={$& z_f)Zf$_0k-ipQ8!MHp)Rp!meq=7FVC_irt(Z#bV9d8CNxvGM85riOf{WZ~z@4?n41 z$6jTpQ#f2IyZb{7f8D~;wrbOT*9r!#DR)U}&C__? zH~miMXvjFwI`-*<#dp2#{FdEiFga0_d~EB-fd87G_U1oRJ8SUqrwh1U2P>v9?wRfQ zq<)s**H!CJnf)E#dBNwUNo~yGrUopVAR8F`#?GbC5D3+|BsqJBWO`V8KMy)MSn9BR zhmBO{X!_jh-nbnf&v}eq3puuX1hf8ua2@|{-1*2hp>Vj(e5b;Bl2H?Lm*D;@?daF8 zN35~sJRH$c-Q?#;_RO0KvQI__2Z<3}#e`5C#+U|`h75y7bDM0?Ku8is&|xfIp_VW@ z_wHxV6{v&}#SaF9HQrc)A|PFhg{M!IA?Zno2xUxmw{$azNdgr{Ky-sjsn&@N5{8ji zOn#@#EC$^OA(AAF=-^PgH?GC#JSL9`0=@=CDu>~2Nq5tta&efCUoQnYk}whoLL+9e z^m;v0&t>A;cothE60txIi^Bm(1fWY(6OaK=>zpZy9u6N&hiFOd6u6pBaY8VjLP!`4 za-QBxPAThaAdS5XP-7##jzC#ba=;_^LjqVF5EKF+2jGZU{r$<=;NU)QwXRo1Qcsov z(y-V}kfl<+=Ak2eQ(vw3Mh~5gyj-!uFdd$vMKIq~OieiVUsR(^(e+<5MTb!)W86wq z&LV>{uH4_pUm6_R=R?UDuTW`>9u&Gi5=HuOniQ?lh(Qq+ro>caAUcwn{TiP1?{j$L zc8ugkp~OBol0vaaeIyJj05OUq3RG+$NFE^C`rZTLIQyR76N<(5&%3H0|6N3!hkE}>gp=zu^}=fBNZjA*fUfrVQ`q> zD@&*nBILMMC1C_9)G3Bn6EcMg3nw5-G&Y|jV)MBi5ziIm@mxi(K#`bMM`kU>$p)D{ z+eQ(wA4v$2$)iv~@fb^^jyHOcA&b4W7)0P&8ICI@3@Ri#^0qlm5x3{t4&Sla&FaFRo4Nw|+R5+%xKFBua%*DmvX*ykZEURFp7uP%4HRkAT#% zX9`Jx)bSYEC3{Qc54++G*@|Ky$PsX0fCCF*fXC*b01OE@0GEr(L7^*|@!Xzl?PJ&B zazYPjG0%9ihRAa!E68}x^a;i!oA`Px`UH#&@>7s220=#8@%A3~U$Y-R59K2$1Or@- zTn_N~pa2j;aumQYgog?-7{$>4tNoy^JWL>m1puGTaRqpCKG{e>HVp8|jeO%EL`ngf9JUCd~KSAB7Rxg%P9UweKqfsg_?dysAM?41cjh+h5H<=+78VF*$nm|BOwE%g479$ETb&&im3Y~+0cdE3G2yYJ{N zTdK4Dg+IOR;4fT(q<+81JL&sguJ>}ilLGGqexF_M<$5Ot-U<9ZyZ&c#S-yI6fvL$G zaXtB7V)MW%jC`kI22b(#p-HLVEB6}RNQ;FgAVx={Sq-N?CbXij?MS0JAr1C5|JiJq zHE5G|J9GhQvL}3_32$6QJ-gC+AD`%Y1(86fp0%Rp+St-)Chk%nPnob`Sy-*Q&cpim zcC(z#s{*5=zhVtNJMnlifpvcLAYgW`+A+5*(=M=yUUIeN=bJX4A6U});?bp2Rbr7} z&S1s>M%}MpMwD$XTv3PwIWeM{1vDBXE5~%xoZ$o8pN~=2pKvG{f5KYcn0wNOoM5E1 zKYjk0Mo>I$S5!pGfXcSWOCs}Dhvi3+TXT-7r|n$i;RDZ@cA@;9IH~)J+C9Sbd)1aD zM;OJ2$hRPOYi!zUSIi5Hl6U4UP;}0IVH?+E)?Dg1e&}i?_KV>6)sTBOaH6zMcErXk zbHLine8*9;GNii&TuYlzrwLzVTtBk^>--z+O?EAe`t)usKkfUB$OLk8jL0e>bTwzg@589lmF>?yN=&*ZJxy&WjVnj;f^MO`v WyV|rXS7ecL)1ZhHj+R9H$p z@8yP0nrLe?*oH=<*-8Ta!@&RkrjNB1_&dDyB}Sw5T#^|PqYuLjbd6R`$rU7BpP?b? zWV)Q9(b6yNh*qv@9^I#XXQaM&;B_79cm_54tiJM*)tJT;h4Nb$?enc;57rD^x}kmD zQRnv0f`VaUYK~`yT62+DLG;;(mU-y_F9-CQ2* z<&^p4hU;%S*)!p?EiSp-V|jueZo@6k=z}waVTH?nyFY6}4eWXHA4R@}kCjzR;H!S^ z7%#_AJn!VsdA%#fEZXGg99nj1ZnES3v)*+rdxI^%Aflt@ZPCxSX&cP*%k+pnGQMEm znQg{W7t46x(FsLSQ@y6GTl#ahr`t>4CiJ>KJ5zOX*u*fM{DOyY1Z zwwiFhcRbe;;eR^?)iusKecZDDj=KZs;yl+u*>Luvk>ok$v!A5dqj#*2+q-_KLmayM zAJ%IF_8+&KJ8q)y6Lt~j)2FpkFHZ6fmMdj{HqK)8!?d1xRYSN=3!EIU@$>Hl%&nVs zM7Yz&%IK=|&%UTI_PBjzh}W8+Uez{!y)w4D^i36d=Vl$V=rhidU0l06(ca&cy=kdk zPttqPzCCk4PMb8=J1=tlZu)L@wo^;bVVket2*q7`+D#J4Y3>s4={*-V%*igez2WZp z*jq)03i0YGkMBIQY4vO?-}LMH3addgtw$_yfW-y;gSYV<&gL&xj6AuxdB6oc&#k1$ z4*5=Zs=>($Rqtt{+{>Oqij<&urmr|3Ds3C^$@r}|#zv02kn)IkJ|_I92`xz_#(SzK zGwK_QA74I~EM2QCefn{nA~()6cJ1Es%P;5hinmuLY;#_)f|ukM!`!bPQ>wE%bpp2T z_oYSDfTp6t(-%HTEY(rV6Cwo`fpwKzFFW;^mzJ1P5OQzW8T2^+_lfB){YT8nM(><& z&pHtO%P+g5S_QZD?DMNJ*0#yp%cqW{o;x)@aJ)v}w-`#xh$vm+eIYc9_b9rdWLMA# z!^g8T8k+c_Uvldo{Td%__%*gB{^dPJv_pAdhU2*n_YX$gw9Gj)I%#L`w2v|?+MfUL z<;?p9qqLE=+GuU-e(GG~^~vuESI;h=()?pXkWbc79MCerQ!ZtEZy!?##5cB5$|vSG+iD`@m149<51O;O;-Q-#~>* zcw=djYxKCOG>Ie!Y_q)kG;=LoMy3cBrv|QRcCDWlv+UTa=RX`=_xTPx<`>se0_01* zwvVq(VNVh`ERYO+SRL}9KT3 zrE@V+ba42SI$R5sldDy96DKB9r|Lxv1{kMzlAClDr-RPU2~2G>y-rWCB%pzS^#A}1 zX0rtl8-`$%)!iP9N~K-aDqW|FKu=aWreSfIY?e~_nuSg;PJ1=q8!dDZ;51@|kves% z7AM7Nq)PA7eNv4gRo8vaR2^yRGW)F{C>C(aJac!Oi4tjOmyJorM7dI9wlJZ)BMH0< zr%BZ+%oqY^kqS}?9MJ)0&TDvJ-(~Q|<(SFMLJ9rVc&dp-;xA&D91s#}TuunhUpZ_x zhoTT3MBxYJ!TS(!-G){ zAAwOW!iV{6$N= z79XwNpw>sSSBT*z6-5jkmPQihEdV-p4B<(bDv<!N)+n;qDLyiVq}%VGfFLxg?Cg zSMi3x2+oy(0OO-D7eX*l@=*dTPk>@voK3MQ#J%Idcu(SuLIiAZ+PFgkE=K@PFBw=0 zCBPuc9fmDfMdZr?#P zn#CxIzfXkV$AaaYupXQ~;&t=6m3Q!a59BaE}Q(9bnHAk;(+OU1wP1rYb za_we8)m#tTZ*p!p8jX`{1NPhH-%ItKxzJm4){b`m4EvjagvF7!PQ)Tow~|wjrnw{s zIT;sXr=_P-#s}1fM9m0wu~^g?^SEi&tgCI0Dy~!2^yg&U(Duz^EEKA`Lf&l0V-}Uk z(8dX#sVyO*-jx#CmX?qg_Qq{~Th<_z1DBPpuFF5!@9dI9zx#{4PadAa+&PK9GTNzP z=*s6)3?WaVE%UsFS!W%n-XXjZRzb*u3zpjT-O`AD{pq+UpC97ZwbMS|fAs79PsTL? PRcR9OB>z(1gzSF;{E?6@ literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_furnace_active.png b/elepower_machines/textures/elepower_furnace_active.png new file mode 100644 index 0000000000000000000000000000000000000000..261acb231206a0fad65f8858aef04ae8b05e0523 GIT binary patch literal 6692 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 Q8IYAC4GfcP9hEfmUp|S71ONa4 literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_generator.png b/elepower_machines/textures/elepower_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6000961346711c732cccb2ce03cab73fd4a8c6 GIT binary patch literal 6451 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 U0cNGT_zRJml9pn*ymiR`0yq#&JOBUy literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_gui_barbg.png b/elepower_machines/textures/elepower_gui_barbg.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7a8d0ce647f17f435534da1de6b1ff7f1a0156 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!VDxm*B3{XE)7O># z5epL=w_#n`ZAGAvhNp{TNW|f{rxY0(7S6G7^>bP0l+XkKoJ}TC literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_gui_gauge.png b/elepower_machines/textures/elepower_gui_gauge.png new file mode 100644 index 0000000000000000000000000000000000000000..9b38aca62d2403260b42292be10a966561daed89 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A#nDYhhUcNc~uAo#xWY#>mCv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns||VqszvQ!ZM3tdxO)vCPxOF{I+w+q>TDniVA20t|Ex zHQrt9UD&^i|9!_Y!ytLtn5mz8XJskR`Exz8@aT2(%w7a7euwBcrRU zaYr?p+a|xEP-eQf%h98krq=3Dy#Bg$$JxyD{rxg8Rz+^JY+e%YeL{r;)f6qp9lt{t z&1alf(tAJvS;}E*I_JY2O2B&`y7`fyY6s&9UX~Iyz!0>MBmajoUq8}a{ yk$BB|Vrst78d-&B=Kj_1Hz+bJcxUOr8ZygXCpPbY!jI<>Anl&6elF{r5}E*YNuqK9 literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_machine_base.png b/elepower_machines/textures/elepower_machine_base.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2e32fe9a5f3d97f2625adc5801b36f9213770a GIT binary patch literal 5510 zcmeHLdt4J&7LL}60^$QvL|bD(OO?sYgoHdyc$7p)AwYR3T3?fy35?|B%s>L$Rs_XG zSBir8s8#9O`j(0!Dyyp~Xp0s^{i$eOAN5fm%Zm7@itL?0G48r{{q6QY$uA-I-0yt% z-0z-qhD&~2Ohg}7A6Fia*GC(vjt9T{aqnI|!RPRM?HG^u*1@dAWHuhN@vXGQKp9Cs zn`tHaq@6PGc=o0(B~P(xZ;6Xi`FcMrANkqmap-6B*r9jxpXQ10&zbrj8{uzkD_waf zBBnBOY~|4U5yn-`Kgo^4Aeyb2aBK05DR9-8;OTXk@#dZ-!8sRBmYjzu2Tc zwuiUx#-FaNDg1tro2_zp)fe&ucdPTQS>CnYQJuRfS zcHykB0-rt7BPx3AS38TJm7a)MzXXfgc%muT4XqYpr{PMT+O1Jw5SLm9{?8_prj?48Zy4!RlH~T?8Th_=7J{;@4 z`r<4f_|ruN;r^{Cm8rS2z~8*Ip?Sd-{i1yf^|4E*u72lXN%x)C)V8QY4}u>2VO!gr z<5f{HUX4vItr~^L_ONMduOLHNpFLj=yrhj?=h}CWW))g$TiH@~^yB*DHtcrd&-sg( z0|$nb9^9*pJ$z}ZxcL)2Om^P`dCiZGe zSu?0=?4{*QSy`MbXO(t$pX^ZgTY+!;`puM8EBub754;U;F4|ubGVxklvC-{Pj{E0< zlX9P8rmqWfC70s77Y8rHRW;WyH}xO5=5m`ZDYKiXbl~;%{`04RKH^D%-jS?}R^S$s z5F;#lQfN0>K@>cmGQ@7h@HCR;>&X<#tP(U={Z+uH2$f)hM2G0C;bbZmnMIQcSuu%t zRvIoR1R=q$O1lCOm`E1m+f7C@qp+(44qgTL&Y58W-vMFMRDxt(96#JblYFsIEJPrU zoyrgif?fGanlLEh)#ExTz(^%XWm&5NhHW;R&=x4P&?zt~m&;*91dBuvKtN2UnZ@jo znepW)IylrMgVR7d%3|hooS5E{&Z-0gFwgHK=Y-YRfw6M|ZtS3ESOV69ff(!u0ALY< z$RI=niR7@eKbY0&y1dOyr;0#N*p69YREWSP(+eI9tI2r2-b+20M9{+Fc#^TC(>STg zAkD0=^P*N`I^(=%Izw_MN8Coj0E3_$D?9r{XmxR2KAemxl*#Jw;Ly%U0`J0E(`lmv zL*OuJBuyX?1~8*9;DLXa!%Mg0Aa@9*P+RbHjzz0h3Ag|hgaxMvh2txVAgIA0mOutv zj6h-%#UZ&=k3xDxZXgIONFojjbfVIl85T3+Bu53vg%sdHWH=!qL=q?n7fT^AA_d-3 z0)wOyJV;_dF%c?8ohV{y3Zyn>bdHLnA^;UBK}Z6}t^pH3Z6G1YOoPhL%STEDd zC1L|2bx?7_D#GHlDuGCdJh#LdG1g$AO)5b&Wlpz0pGc%kWCDwEqM;Iz9F+v3;1z^O zL>-|y_{Nho1G1LmL=mCL;Z5L*aexp5$wQg26cV=-pYJGM z1%`7fsss#{K@yH506KO|;i;H8g#=x)vqXNiQ!mL@sYHg#0&xsN4G2hh8Hz!AkP?ub z#DYX}QZA8T9Vg$#&R7hr4Wr4h6i`FpoIwRS&YAD;NV4}|jK!8pf*{8rfeHi>bR2Kz zasNL1k>f#noRnY?P8d)~9E3jb~!PiOi3jw=A_H;cTMzHj7u zBiCyw@LJ$E+4V-Q*HYlMz;Cka|0b8~^P4_t27kEPz&)NUkr#vi0rb>IMW}gN?sfjw z4@zL^ZH=7B@OW;X+`AiZ#Y%5rbYZnRjmzbp{oJA9x8=i9foTYCho4s>%4C8 zZ4{fz=k6vGW_t_8!Qb1xKA9gn;{1o9dt8%S^YsTV)Y@GQP{5Dg+OtoTmElDJ=SPj%?w{t4wi_f`M^ literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_machine_side.png b/elepower_machines/textures/elepower_machine_side.png new file mode 100644 index 0000000000000000000000000000000000000000..18372e784aba32d54eb5fc70a50cb94c859816dc GIT binary patch literal 6144 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 literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_power_level_2.png b/elepower_machines/textures/elepower_power_level_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f46b0cbf02c246e492a735bbdebf8b115fab21 GIT binary patch literal 5432 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 B)F1!= literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_power_level_3.png b/elepower_machines/textures/elepower_power_level_3.png new file mode 100644 index 0000000000000000000000000000000000000000..088ac93ef280c6e6800df9f934b3c5c8347b56f5 GIT binary patch literal 5440 zcmeHLX;c$g7EY@yvIvUea$I7>4XmV6B#?>(L_mlVLExykjg?9TN|RKmR7k`fMNv3{ zsAvm{h>F{&jrO=NU<*uxw%WGsg1CS-E!r-v(k-pbtAG%D9D6)7{sT@z-hJQw-hJP@ z_ZBZJBFBe1JM?kja5&ELu;3{0*Oh(Q+k*E2zcyhUPRAQbF_W1n%*55xl$z8KTxO1* z;1Xt1&Ec4DJYKJ*Ylk^4Yci~qb;xo}u9@k-`<3n7Kjs%-lP3-NIebV!;-1oN&e^2A zZZ-Gu>wtwW4L$j<+^0v56PDE_r1V94I%NgyFZ!kS?6D_y3!SUWZ@oz#*zE=FzvIaL zest-)>gUH^b}xUqZfjLTTFv9Mq8B52@6RwZ5g%Ydb3zMb=obrEOHGLmdOJ!CMN(z0u^3c>TPR=Orm~U`K{U8(r$WH2&=PimscE7RMl3cQ0dvFbw52En>v}UN;{TaG-iXTGXC#Wi0EwS z{Efw%p@P9{gKaJ>^B8&2lTgm=+kNMR{J{Ay*LhBJs=9vBdy@O^E+w6MeOX`9PhC)K zTj~5X*7I^8_x{bEQ`EmAlZF@T3u-fEorptpjqk?B%56e*VAtQ7GKU4vDm7-|Kf9t4 z8*F)^#7LvfZ?iIfto7vX^s4OaIO6SwK8u$MswXbJ&s)H_8Z4N>b~tzG&T54V2?9Cr|?5Nik=TI9b@n6d1=LBXNRr_ zMn~3Wq%7_0>DebnyqmndcktNU9_|I_juyDPIqq;jKO*)Y_p-KSiq5HqZ_ge3V8pcq zaY28>x9Iu~1vVQUPfdsO*Di5EOY%eg9)*Sak0mB;U$$F3anG&?Q~LOlJ8Rr?zP>_x zZIVXqTE0(~SikG18MaZ{a{HjrzCM@Bb!&5Ol)esXw3&5i*E61Y=naK))WLB!=N|_T z^>(cp#nG+dtiU%{&fDs0&dRBrr;bTMa<6nQyyRhe)bV^P~`?ph+f*;F*|YK3Q#@5`kg;suI`SI0}MoFcdHx2xk%Y07bU zJM6W*r(hi@Nc~@8w};gNS%CEQuzflg7v3NwaZO#S8Fv@H0yRftFw}u34+m8Khch?z`8c>WGtKU$@hMg@;)p#UQpFP>raQh~r^ zGVx8`e2R_}2vHOjz=!}rAb@}jb94-5hIEEOEJZU%Fk!%HpdCr+xGX28q>PM=#{=`+ z7IIeE5Hm2gEWnN}^ae&Hkb{8;><0h@2nAXt+nZjDMU06|$+ zw)P2?D(Yo9vgsEMd74MYWXOHVWC7O7!h3l%G@G%!*w;~{*w%@V1>7&S#} zWxQ}wXEe7>#E@Ddn!#Angkl7ReNkUu5#r;GAUbUeD24 zO5~lL{6Mz)iX}pcH;zF7HUz_1dMs4x*E zM!gA`P>Tr>u6{ql|9wAx0=BWgJ1#%A^(hom>jU*;TccFYR!p=}uh)uS zw4n7l-IC^PC-{s%E#>nWR{+%Qi+qy4?Q*rt^+^hR61Y9P+U5Er1wIMfo?ZVpxg6SV z`h*Vr<7xu;_+{fS&jsHB*eb_`26N=>Z&m#TKVa#s4~sQ$IF4@Y>kH1t++M(F$H)~S zcK2*uT-|*#7AD>Wrru1*WG0BxvUfdB%XNcmBAIwDdpDW1xJyp}63c@FV+D4@xl8>&rJRolH$zF literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_power_level_4.png b/elepower_machines/textures/elepower_power_level_4.png new file mode 100644 index 0000000000000000000000000000000000000000..8525af7063a71f26050e6de59247c5ec234b5f0c GIT binary patch literal 5458 zcmeHLX;c$g7A`kbWK$V;GzNFAR3&650f7KU*#uf}YpGN!P?Dr#RfPo5793Zk*`!g# z_e0p*3E-v8rphwLZ1a-KX5ueD$Vm6+IrVON!;IZizf=Ad% z0|eP`{<_>m-yPw$u$jqGw=eRVcPA-e>+dd^FXmL;&}Iy~7cnd_?aR{}+)J(%Z3{n6 z);2%OJaE+V_5S*KQ*snx`M!4x4ki`8NH4Yy8+1K=Mq}#3u>1G>yA>vtJQAIP9~AgK zPCwhQFOFB6u#o5cxF=ZbC@41nFLOCP7sj+bcZCg-Tcr++uN4?Lp(U;9bA0Ha*Isdl0IX>zi zeA|vffq93j+MfBDFLEbs)-tAdrEp5W@-@*3!6$vIn__CqxBcmHUg=j)zFLemRz&;N zG5Xy3B^Af&V)UKEHb%JR{<*zml(=HY!PwBn+5Y_vKh^|a3t9pBGSd&77$Clpb+BE) zgiuA74YR9*&ze5HKWeDlTs&awqNLnOrWdCzYbN%?rQU_nw(VZMFV=*4FB?$!sH4Pd z-OgoOM_1L_Rl^e61x+WT?8k2BlkFNkH!i$1*2pg&jbx=?{NsKeCSiYv8HBopZ^sw92l(;*gGe_NwbdTMAw&VF=Z%b+Fr>T|Q#d)bT1&doNk3qUV6~x z_0KyV9CWZLcgpC7(BVrj8BdhPBlVSq;n54?N~s#p#G3J(}fLc6zU0I{ryY-1P7OdWW{wcBFZ4U#f6l#PO)ES5M77@A0y4Q;A)5 za8rV+`_!K^Gpw7({8Id^x^BRlGrRKU{J8kRJ#|^6kIBDo>el6}E{-j#JvD5z|M4sE zz90Nf+RNzEcU-r8S2e@q%$83FpKqFVmPqJ2M_GIAi=~q<9GO!(x!ZmJnJFa&&-41N z9C~+k?WNr-dsH3H@tI$JticP(vfccxZp@eWZtdw=bhT09U-w`j;}`Trh*d@>_>_qgWr-)?Q+V*&O%qO7Ob#JY5(!%0gm8+Nddt{+*Ax~G$^WCsB`*-D# z2{M=a$hPrG6JFNWeY0kdX$e;E=1~&&^4ivooukg@WtFcR?fIl~T+XzN5b@Yc>nj_~ zh^WT&;P6pC zkJPLA36e-O(h@?XkmE9FA}%8;9?wX{6?%SPfUC-`1Oz66#dvm;(ab3AYQBS43BGe? zgwJz8*ic^oIEqpYl&&j<6oR&q|+ zP&+WTF2Ic)^bD&GrSzqTxEk-Njyrz{QIFlo8quzjkpd2eZ`-E#F zW7>Q;8Iwtq#o@uBosoLH4QH{^Mh8ZZBZQGKfj}6*EPMkG{M#Jfx*Z3(Lnx(&!mS*O zR-@)~0VwqpPU@A8uR;_R8Vq6yY{11REGC3FtdQx1untui^mNmgi3lf(Xqp76jTxPz;;8h1ijbg$ z9>*0hA;NU9*bfuIa*;w0>-1usT&IwT4XDgP#R;nniqWe1A_4l^5@W*Z#q#{spIM$;xrS zm!i|1){i4*wTxOCiIH?j#p5}OSBc@AifTTCr4f3^5da-qrtlQZoJ@c&*;*p6?BrXr zRVI-O<$gE@3k@hpc)1XRbs!~R1%XLL3PK@~U@a%##?DX%)`rnUP%@|?aL%BD9Ouj% z;YhNPZ^mLvAwZC$Q9mV$@>`C#^|(LOex!1p&Y*xX1K5gKDAd7n0@uM(P?ca`eqzj^ zcr(KPeLpIMYwWL%OU1Rm$VjF0fvULHsMK;56KAzpj3hz7dC;#C|3BcI{9B9ckKCPM zE#4uNB^~sd6gJvse&_OU0k$wikT_vxsCR|#3~7G=m@Zn1&qDtJsIZO`e}H0L_O z2mEO*pAWbKp#HeXd+Ga8u8(rPmjdqv{+L}K<$5m#-V6LOyZ&!-xxT*X6K3#-s}0=a zYj2Ls1^)wZ(M<@~Kw9qg*Mt=`s1tT$hEJ9wRamQMbmY?psUcStQi6_oU>P;p@8|f_z>qy3!o(>(dQ_ Y9&GY_X?x^y4^Tqd&?wFJ;G}u~1QY?vt^fc4 literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_power_level_5.png b/elepower_machines/textures/elepower_power_level_5.png new file mode 100644 index 0000000000000000000000000000000000000000..8397a276fd72892bfafb86e19568ee796f573b50 GIT binary patch literal 5478 zcmeHLc~leE9u7(s5nMqOr3?WP)JZ0jge(#i2uPH$yZhA1%p^=nGI27Hu&995))mB} z#eLrwiVG@wtRB~=N9AeJTAsYBZGE`%w5^J*?@ovi-}Bk$IrTr`B;?-v{l5FV-)|Xi z=AJc+V)F_{1?-XUDM=+{xdOjXwLRi8@!i%Q?_IH zaq8;JXZZ(?S}LpW6px>)h%X7gU3zfJq8GVeWQPXUaC{$CrkD zWIa)#&K-f)%}-Sm!#&5}JB+Q|eRz67fzQF3n1(YA(2+4u7QXPMs(a-9y|iOY)2bN* z2TWU3b2Y)Qddw>PuGO5ZN1s3n zu57Njr$FOlMrQoO7*^GOeOhRTQ_)5KzW!IPPTa~r@%2h?v6Wog2qhLSIw+{ey7(Kv zuIH`ZxUL^>{L_WAmV9@(e$)s{eV8Jn>#^QDuRmSzebjo%DPtIa^@E8)f>q@U!a^1N zpE`X4#oz-*jVa#UWKZ1HuK3X3Ry-;^8F;zfqrefull?pI9hNFuJxyJ=-))0O_pst1 zH@CoAna|n2d&K+@)Ga0Y&fuc1Q-VgBJ<4V#xc6h-3T_RFA6Z_WEQ*LJOqrA9WxVux zp>OfJ>4QVAq@>oa*_NtZtcO!?-mB~lUkKRuO>FJ-FR9nsZ)c0QPP#NLxMY>*X0+jpzzYv5jvIa&I{Ww4v-85U z6xR!8s&16{_{_+>Ru%I5)J=G}+ONE^cGIDS1-BA>yYmoLYw)qb6C@H!cG>P|c?+<&%jlNt%4G7uVl$BG}p!!i?JaC#S+IIPQ zgXGcaOEbRhHXWKjd-aY7lS9kaxc$tI9}S9K_r@xxEG*7dxoS?0ci}Lv*yhAz9-4ko zbr+2_;G^cwcS9=s&v-)INItvYM{wp*?^^#S!mL5rD^_&+?0D(DpU^q|k31o{4a&|i8|pr?%0CMt2-B)|w-M+)pF3vh$SiyUgVV0aeELORkwnN|FU zHAndnMX2~=q*_F4i6t|sggk~!&r8a{^RjRS!5+oM5K5`0 z@obJoqgL@b2b2VjQ-sp-QG_5OyDNIDnKrv0FM|Wq^JmFgI=OTVTo9Vz&f#<0CCgdA`-_5IU#bPNMoR>EzUwQA;B+QVyvg$WgpX4Cho-@vT@6NjO3PbZl9|GcmJ)1YOcuBCqDD zH)N|!Di_JcI0lRK2uOIj2!nMXC13@KMW6~&A(dh+k#A+U(t6g0F=Vs>)DVa>s31q2 zp)g01g}?5LEt3RJ4no9A1mU-Y*BS2jbDju=L@w5Wek>JBrQCTCSRvPmVSP(eJL&sDt`Bm(lLGGq{*YZC)exjx$%~*=nW=2vKnn%$D19xcIy>< zb6pwtEoL7!ZYo4C6k&w1T|Y!sUbad(q3MP2*=Xo5x^ogqJWzw9gTLd47cVt3#4 z$}TG1toNPNU0?m2H-SEjJawxJKNm`)rS-&`k>up<6b)#Sd5>>| vH8vL)xbHU{cduP}=$nh~@W4^Gvf3pD9`o@|+mRX!w&7{wlGM9mrWF4h92?Gv literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_power_level_6.png b/elepower_machines/textures/elepower_power_level_6.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f368f9549406e3914e78c7975e43ef85311033 GIT binary patch literal 5482 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 Nv{4C>>qcf4{}at@-dq3x literal 0 HcmV?d00001 diff --git a/elepower_machines/textures/elepower_power_port.png b/elepower_machines/textures/elepower_power_port.png new file mode 100644 index 0000000000000000000000000000000000000000..20ea98706dda4cdca6aebf0661dfc3cf3ceec343 GIT binary patch literal 5716 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 + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +elenuclear = rawget(_G, "elenuclear") or {} +elenuclear.modpath = modpath diff --git a/elepower_nuclear/mod.conf b/elepower_nuclear/mod.conf new file mode 100644 index 0000000..0e81c9d --- /dev/null +++ b/elepower_nuclear/mod.conf @@ -0,0 +1,3 @@ +name = elepower_nuclear +description = Atomic Science! +depends = elepower_machines diff --git a/elepower_papi/conductor.lua b/elepower_papi/conductor.lua new file mode 100644 index 0000000..b484bef --- /dev/null +++ b/elepower_papi/conductor.lua @@ -0,0 +1,62 @@ + +function ele.register_conduit(nodename, nodedef) + if not nodedef.groups then + nodedef.groups = {} + end + + -- Ensure this node is in the conductor group + if not nodedef.groups["ele_conductor"] then + nodedef.groups["ele_conductor"] = 1 + end + + -- Cable node density + local cd = 1/8 + + if nodedef.ele_conductor_density then + cd = nodedef.ele_conductor_density + end + + -- Default values, including the nodebox + local defaults = { + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = { + {-cd, -cd, -cd, cd, cd, cd} + }, + connect_front = { + {-cd, -cd, -1/2, cd, cd, -cd} + }, + connect_back = { + {-cd, -cd, cd, cd, cd, 1/2} + }, + connect_top = { + {-cd, cd, -cd, cd, 1/2, cd} + }, + connect_bottom = { + {-cd, -1/2, -cd, cd, -cd, cd} + }, + connect_left = { + {-1/2, -cd, -cd, cd, cd, cd} + }, + connect_right = { + {cd, -cd, -cd, 1/2, cd, cd} + }, + }, + paramtype = "light", + connect_sides = { "top", "bottom", "front", "left", "back", "right" }, + is_ground_content = false, + connects_to = { + "group:ele_machine", + "group:ele_conductor", + }, + } + + for k,v in pairs(defaults) do + if not nodedef[k] then + nodedef[k] = v + end + end + + ele.register_base_device(nodename, nodedef) +end diff --git a/elepower_papi/formspec.lua b/elepower_papi/formspec.lua new file mode 100644 index 0000000..a7bc513 --- /dev/null +++ b/elepower_papi/formspec.lua @@ -0,0 +1,9 @@ +-- Formspec helper: Add power bar + +ele.formspec = {} + +function ele.formspec.power_meter(pw_percent) + return "image[0,0;1,2.8;elepower_gui_barbg.png".. + "^[lowpart:"..pw_percent..":elepower_gui_bar.png]".. + "image[0,0;1,2.8;elepower_gui_gauge.png]" +end diff --git a/elepower_papi/helpers.lua b/elepower_papi/helpers.lua new file mode 100644 index 0000000..923acae --- /dev/null +++ b/elepower_papi/helpers.lua @@ -0,0 +1,74 @@ + +----------------------- +-- Utility Functions -- +----------------------- + +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 + +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) + n.name = noded + noded = n + end + + if node.name == noded.name then + return false + end + + minetest.swap_node(pos, noded) + + return true +end + +function ele.helpers.get_or_load_node(pos) + local node = minetest.get_node_or_nil(pos) + if node then return node end + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + return nil +end + +function ele.helpers.get_item_group(name, grp) + return minetest.get_item_group(name, grp) > 0 +end + +function ele.helpers.flatten(map) + local list = {} + for key, value in pairs(map) do + list[#list + 1] = value + end + return list +end + +function ele.helpers.get_node_property(meta, pos, prop) + local value = meta:get_int(prop) + + if value == 0 or value == nil then + local nname = minetest.get_node(pos).name + local ndef = minetest.registered_nodes[nname] + value = ndef["ele_"..prop] + end + + if not value then return 0 end + + return value +end diff --git a/elepower_papi/init.lua b/elepower_papi/init.lua new file mode 100644 index 0000000..0e49d17 --- /dev/null +++ b/elepower_papi/init.lua @@ -0,0 +1,19 @@ +-- Elepower Mod +-- Copyright 2018 Evert "Diamond" Prants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +ele = rawget(_G, "ele") or {} +ele.modpath = modpath + +-- Constants +ele.unit = "EpU" +ele.unit_description = "Elepower Unit" + +-- APIs +dofile(modpath..'/helpers.lua') +dofile(modpath..'/network.lua') +dofile(modpath..'/formspec.lua') +dofile(modpath..'/machine.lua') +dofile(modpath..'/conductor.lua') +dofile(modpath..'/tool.lua') diff --git a/elepower_papi/machine.lua b/elepower_papi/machine.lua new file mode 100644 index 0000000..d6e9877 --- /dev/null +++ b/elepower_papi/machine.lua @@ -0,0 +1,238 @@ + +-- Machine definitions + +--[[ + Groups: + ele_machine Any machine that does something with power + ele_provider Any machine that can provide power (generator, storage, etc) + ele_user Any machine that uses power + ele_storage Any machine that stores power + ele_conductor A node that is used to connect ele_machine nodes together + + Custom nodedef variables: + ele_capacity = 12000 + Static capacitor for nodes. + ** Can be overridden by metadata: `capacity` + + ele_inrush = 32 + Decides how much power can be inserted into this machine's internal capacitor. + ** Can be overridden by metadata: `inrush` + + ele_output = 64 + Decides how much power a `ele_provider` node can output. + ** SHOULD be overridden by metadata: `output` + + ele_sides = nil + All sides of providers currently output power. All sides of other nodes accept power. + ** SHOULD be overridden by metadata: `sides` + + ele_usage = 16 + How much power this machine uses or generates. + ** Can be overridden by metadata: `usage` + + ele_active_node = nil + Set to true or a string to also register an active variant of this node. + If the parameter is a boolean, "_active" will be appended to the `node_name` + + ele_active_nodedef = nil + If set, the `ele_active_node` will have this table in its nodedef. + Intended use: to set textures or light output. +]] + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if listname == "dst" then + return 0 + end + + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() +end + +function metadata_inventory_changed(pos) + local t = minetest.get_node_timer(pos) + + if not t:is_started() then + t:start(1.0) + end +end + +-- Preserve power storage in the item stack dropped +local function preserve_metadata(pos, oldnode, oldmeta, drops) + 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") + + local nodedesc = minetest.registered_nodes[oldnode.name].description + + if storage == 0 then + return drops + end + + for i,stack in pairs(drops) do + local stack_meta = stack:get_meta() + stack_meta:set_int("storage", storage) + stack_meta:set_string("description", nodedesc.."\nCharge: " .. storage .. "/" .. capacity .. " " .. ele.unit) + drops[i] = stack + end + + return drops +end + +-- Retrieve power storage from itemstack when placed +local function retrieve_metadata(pos, placer, itemstack, pointed_thing) + local item_meta = itemstack:get_meta() + local storage = item_meta:get_int("storage") + + if storage and storage > 0 then + local meta = minetest.get_meta(pos) + meta:set_int("storage", storage) + minetest.get_node_timer(pos):start(1.0) + end + + return false +end + +-- Register a base device +function ele.register_base_device(nodename, nodedef) + -- Override construct callback + local original_on_construct = nodedef.on_construct + nodedef.on_construct = function (pos) + if nodedef.groups and nodedef.groups["ele_machine"] then + local meta = minetest.get_meta(pos) + meta:set_int("storage", 0) + end + + ele.clear_networks(pos) + if original_on_construct then + original_on_construct(pos) + end + end + + -- Override destruct callback + local original_after_destruct = nodedef.after_destruct + nodedef.after_destruct = function (pos) + ele.clear_networks(pos) + if original_after_destruct then + original_after_destruct(pos) + end + end + + -- Save storage amount when picked up + nodedef.preserve_metadata = preserve_metadata + nodedef.after_place_node = retrieve_metadata + + -- Finally, register the damn thing already + minetest.register_node(nodename, nodedef) + + -- Register an active variant if configured. + if nodedef.ele_active_node then + local active_nodedef = ele.helpers.table_copy(nodedef) + local active_name = nodename.."_active" + + if nodedef.ele_active_node ~= true then + active_name = nodedef.ele_active_node + end + + if nodedef.ele_active_nodedef then + for k,v in pairs(nodedef.ele_active_nodedef) do + active_nodedef[k] = v + end + + nodedef.ele_active_nodedef = nil + active_nodedef.ele_active_nodedef = nil + end + + active_nodedef.groups["ele_active"] = 1 + active_nodedef.groups["not_in_creative_inventory"] = 1 + active_nodedef.drop = nodename + minetest.register_node(active_name, active_nodedef) + end +end + +function ele.register_machine(nodename, nodedef) + if not nodedef.groups then + nodedef.groups = {} + end + + -- Start cleaning up the nodedef + local defaults = { + ele_capacity = 1600, + ele_inrush = 64, + ele_usage = 64, + ele_output = 64, + ele_sides = nil, + paramtype2 = "facedir" + } + + -- Ensure everything that's required is present + for k,v in pairs(defaults) do + if not nodedef[k] then + nodedef[k] = v + end + end + + -- Ensure machine group is used properly + if not nodedef.groups["ele_conductor"] and not nodedef.groups["ele_machine"] then + nodedef.groups["ele_machine"] = 1 + elseif nodedef.groups["ele_conductor"] and nodedef.groups["ele_machine"] then + nodedef.groups["ele_machine"] = 0 + end + + -- Add ports to the device's faces + if nodedef.tiles and #nodedef.tiles == 6 then + for i = 1, 5 do + nodedef.tiles[i] = nodedef.tiles[i] .. "^elepower_power_port.png" + end + end + + -- Add ports to the device's active faces + if nodedef.ele_active_nodedef and nodedef.ele_active_nodedef.tiles and #nodedef.ele_active_nodedef.tiles == 6 then + for i = 1, 5 do + nodedef.ele_active_nodedef.tiles[i] = nodedef.ele_active_nodedef.tiles[i] .. "^elepower_power_port.png" + end + end + + -- Default metadata handlers for "src" and "dst" + if not nodedef.allow_metadata_inventory_put then + nodedef.allow_metadata_inventory_put = allow_metadata_inventory_put + nodedef.allow_metadata_inventory_move = allow_metadata_inventory_move + end + + if not nodedef.allow_metadata_inventory_take then + nodedef.allow_metadata_inventory_take = allow_metadata_inventory_take + end + + -- Default metadata changed handlers for inventories + -- Starts the timer on the node + if not nodedef.on_metadata_inventory_move then + nodedef.on_metadata_inventory_move = metadata_inventory_changed + end + + if not nodedef.on_metadata_inventory_put then + nodedef.on_metadata_inventory_put = metadata_inventory_changed + end + + if not nodedef.on_metadata_inventory_take then + nodedef.on_metadata_inventory_take = metadata_inventory_changed + end + + ele.register_base_device(nodename, nodedef) +end diff --git a/elepower_papi/mod.conf b/elepower_papi/mod.conf new file mode 100644 index 0000000..3cec765 --- /dev/null +++ b/elepower_papi/mod.conf @@ -0,0 +1,3 @@ +name = elepower_papi +description = Elepower Power Network API +optional_depends = default diff --git a/elepower_papi/network.lua b/elepower_papi/network.lua new file mode 100644 index 0000000..13aeb79 --- /dev/null +++ b/elepower_papi/network.lua @@ -0,0 +1,398 @@ +-- Network graphs are built eminating from provider nodes. +--[[ + TODO: + Currently, there's a problem where storage nodes are allowed to create their own graph. + When placing the storage onto a cable, it will add itself to the graph of that cable. + But, when placing a cable onto the storage, that cable is added to the storage's own graph + and thus cannot be connected to the previous graph. +]] + +-- Network cache +ele.graphcache = {devices = {}} + +--------------------- +-- Graph Functions -- +--------------------- + +local function clear_networks_from_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("network_id", "") +end + +local function add_node(nodes, pos, pnodeid) + local node_id = minetest.hash_node_position(pos) + if ele.graphcache.devices[node_id] and ele.graphcache.devices[node_id] ~= pnodeid then return end + ele.graphcache.devices[node_id] = pnodeid + if nodes[node_id] then + return false + end + nodes[node_id] = pos + return true +end + +local function add_conductor_node(nodes, pos, pnodeid, queue) + if add_node(nodes, pos, pnodeid) then + queue[#queue + 1] = pos + end +end + +local function check_node(users, providers, all_nodes, pos, pr_pos, pnodeid, queue) + ele.helpers.get_or_load_node(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + + if ele.helpers.get_item_group(node.name, "ele_conductor") then + local nodedef = minetest.registered_nodes[node.name] + local ptransfer = 0 + + if nodedef.elepower_transfer then + ptransfer = nodedef.elepower_transfer + end + + add_conductor_node(all_nodes, pos, pnodeid, queue) + return + end + + if not ele.helpers.get_item_group(node.name, "ele_machine") then + return + end + + -- Don't add already networked nodes to this network + if meta:get_string("network_id") ~= "" and meta:get_string("network_id") ~= pnodeid then + return + end + + meta:set_string("network_id", pnodeid) + + if ele.helpers.get_item_group(node.name, "ele_user") then + add_node(users, pos, pnodeid) + elseif ele.helpers.get_item_group(node.name, "ele_provider") then + if ele.helpers.get_item_group(node.name, "ele_storage") then + -- Storage gets added to users, for now + add_node(users, pos, pnodeid) + else + add_node(providers, pos, pnodeid) + end + end +end + +local function traverse_network(users, providers, all_nodes, pos, pr_pos, pnodeid, queue) + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y+1, z=pos.z}, + {x=pos.x, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}} + for _, cur_pos in pairs(positions) do + check_node(users, providers, all_nodes, cur_pos, pr_pos, pnodeid, queue) + end +end + +local function power_networks(pr_pos, positions) + local provider = minetest.get_node(pr_pos) + local pnodeid = minetest.pos_to_string(pr_pos) + + if ele.graphcache[pnodeid] then + local cached = ele.graphcache[pnodeid] + return cached.users, cached.providers + end + + local users = {} + local providers = {} + local queue = {} + local all_nodes = {} + + for pos in pairs(positions) do + queue = {} + + local node = minetest.get_node(pos) + if node and ele.helpers.get_item_group(node.name, "ele_conductor") then + add_conductor_node(all_nodes, pos, pnodeid, queue) + elseif node and ele.helpers.get_item_group(node.name, "ele_machine") then + queue = {pr_pos} + end + + while next(queue) do + local to_visit = {} + for _, posi in ipairs(queue) do + traverse_network(users, providers, all_nodes, posi, pr_pos, pnodeid, to_visit) + end + queue = to_visit + end + end + + -- Add self to providers + local prov_id = minetest.hash_node_position(pr_pos) + ele.graphcache.devices[prov_id] = pnodeid + providers[prov_id] = pr_pos + + users = ele.helpers.flatten(users) + providers = ele.helpers.flatten(providers) + all_nodes = ele.helpers.flatten(all_nodes) + + ele.graphcache[pnodeid] = {all_nodes = all_nodes, users = users, providers = providers} + + return users, providers +end + +----------------------- +-- Main Transfer ABM -- +----------------------- + +local function give_node_power(pos, available) + local user_meta = minetest.get_meta(pos) + local capacity = ele.helpers.get_node_property(user_meta, pos, "capacity") + local inrush = ele.helpers.get_node_property(user_meta, pos, "inrush") + local storage = user_meta:get_int("storage") + + local total_add = 0 + + if available >= inrush then + total_add = inrush + elseif available < inrush then + total_add = inrush - available + end + + if total_add + storage > capacity then + total_add = (total_add + storage) - capacity + end + + if storage >= capacity then + total_add = 0 + storage = capacity + end + + return total_add, storage +end + +minetest.register_abm({ + nodenames = {"group:ele_provider"}, + label = "elepowerPowerGraphSource", + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) + local meta1 = nil + + -- Check if a provider is attached to a network. + -- If that network has been abolished, we will use this node as the network's root this time. + local netwrkto = meta:get_string("ele_network") + if netwrkto ~= "" and netwrkto ~= nil then + if not ele.helpers.get_item_group(node.name, "ele_storage") then + local lpos = minetest.string_to_pos(netwrkto) + if ele.helpers.get_item_group(minetest.get_node(lpos).name, "ele_provider") then + return + else + ele.graphcache[netwrkto] = nil + end + meta:set_string("ele_network", "") + end + end + + local users = {} + local providers = {} + + local providerdef = minetest.registered_nodes[node.name] + + -- TODO: Customizable output sides + local positions = { + {x=pos.x, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y+1, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z-1}, + {x=pos.x, y=pos.y, z=pos.z+1} + } + + local ntwks = {} + local errored = false + local nw_branches = 0 + for _,pos1 in pairs(positions) do + local name = node.name + local networked = ele.helpers.get_item_group(name, "ele_machine") or ele.helpers.get_item_group(name, "ele_conductor") + if networked then + ntwks[pos1] = true + nw_branches = nw_branches + 1 + end + end + + if errored then + return + end + + if nw_branches == 0 then + minetest.forceload_free_block(pos) + return + else + minetest.forceload_block(pos) + end + + users, providers = power_networks(pos, ntwks) + + -- Calculate power data + local pw_supply = 0 + local pw_demand = 0 + + for _, spos in ipairs(providers) do + local smeta = minetest.get_meta(spos) + local pw_storage = smeta:get_int("storage") + local p_output = ele.helpers.get_node_property(smeta, spos, "output") + + if p_output and pw_storage >= p_output then + pw_supply = pw_supply + p_output + elseif p_output and pw_storage < p_output then + pw_supply = pw_supply + pw_storage + end + end + + -- Give power to users + for _,ndv in ipairs(users) do + if pw_demand >= pw_supply then + break + end + + local user_gets, user_storage = give_node_power(ndv, pw_supply - pw_demand) + pw_demand = pw_demand + user_gets + + local user_meta = minetest.get_meta(ndv) + user_meta:set_int("storage", user_storage + user_gets) + + if user_gets > 0 then + -- Set timer on this node + local t = minetest.get_node_timer(ndv) + if not t:is_started() then + t:start(1.0) + end + end + end + + -- Take the power from a provider node + if pw_demand > 0 then + for _, spos in ipairs(providers) do + local smeta = minetest.get_meta(spos) + local pw_storage = smeta:get_int("storage") + + if pw_storage >= pw_demand then + smeta:set_int("storage", pw_storage - pw_demand) + else + pw_demand = pw_demand - pw_storage + smeta:set_int("storage", 0) + end + minetest.get_node_timer(spos):start(1.0) + end + end + end, +}) + +local function check_connections(pos) + local connections = {} + local positions = { + {x=pos.x+1, y=pos.y, z=pos.z}, + {x=pos.x-1, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y+1, z=pos.z}, + {x=pos.x, y=pos.y-1, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+1}, + {x=pos.x, y=pos.y, z=pos.z-1}} + + for _,connected_pos in pairs(positions) do + local name = minetest.get_node(connected_pos).name + if ele.helpers.get_item_group(name, "ele_conductor") or ele.helpers.get_item_group(name, "ele_machine") then + table.insert(connections, connected_pos) + end + end + return connections +end + +-- Update networks when a node has been placed or removed +function ele.clear_networks(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local name = node.name + local placed = name ~= "air" + local positions = check_connections(pos) + if #positions < 1 then return end + local dead_end = #positions == 1 + for _,connected_pos in pairs(positions) do + local net = ele.graphcache.devices[minetest.hash_node_position(connected_pos)] or minetest.pos_to_string(connected_pos) + if net and ele.graphcache[net] then + if dead_end and placed then + -- Dead end placed, add it to the network + -- Get the network + local node_at = minetest.get_node(positions[1]) + local network_id = ele.graphcache.devices[minetest.hash_node_position(positions[1])] or minetest.pos_to_string(positions[1]) + + if not network_id or not ele.graphcache[network_id] then + -- We're evidently not on a network, nothing to add ourselves to + return + end + local c_pos = minetest.string_to_pos(network_id) + local network = ele.graphcache[network_id] + + -- Actually add it to the (cached) network + -- This is similar to check_node_subp + ele.graphcache.devices[minetest.hash_node_position(pos)] = network_id + pos.visited = 1 + + if ele.helpers.get_item_group(name, "ele_conductor") then + table.insert(network.all_nodes, pos) + end + + if ele.helpers.get_item_group(name, "ele_machine") then + meta:set_string("ele_network", network_id) + + if ele.helpers.get_item_group(name, "ele_provider") then + if ele.helpers.get_item_group(name, "ele_storage") then + -- TODO: Add storage to users for now + table.insert(network.users, pos) + else + table.insert(network.providers, pos) + end + elseif ele.helpers.get_item_group(name, "ele_user") then + table.insert(network.users, pos) + end + end + elseif dead_end and not placed then + -- Dead end removed, remove it from the network + -- Get the network + local network_id = ele.graphcache.devices[minetest.hash_node_position(positions[1])] or minetest.pos_to_string(positions[1]) + if not network_id or not ele.graphcache[network_id] then + -- We're evidently not on a network, nothing to remove ourselves from + return + end + local network = ele.graphcache[network_id] + + -- The network was deleted. + if network_id == minetest.pos_to_string(pos) then + for _,v in pairs(network.all_nodes) do + local pos1 = minetest.hash_node_position(v) + clear_networks_from_node(v) + ele.graphcache.devices[pos1] = nil + end + ele.graphcache[network_id] = nil + return + end + + -- Search for and remove device + ele.graphcache.devices[minetest.hash_node_position(pos)] = nil + for tblname,table in pairs(network) do + if type(table) == "table" then + for devicenum,device in pairs(table) do + if vector.equals(device, pos) then + table[devicenum] = nil + end + end + end + end + else + -- Not a dead end, so the whole network needs to be recalculated + for _,v in pairs(ele.graphcache[net].all_nodes) do + local pos1 = minetest.hash_node_position(v) + clear_networks_from_node(v) + ele.graphcache.devices[pos1] = nil + end + ele.graphcache[net] = nil + end + end + end +end diff --git a/elepower_papi/power/init.lua b/elepower_papi/power/init.lua new file mode 100644 index 0000000..0633847 --- /dev/null +++ b/elepower_papi/power/init.lua @@ -0,0 +1,6 @@ + +dofile(ele.modpath..'/power/network.lua') +dofile(ele.modpath..'/power/formspec.lua') +dofile(ele.modpath..'/power/machine.lua') +dofile(ele.modpath..'/power/conductor.lua') +dofile(ele.modpath..'/power/tool.lua') diff --git a/elepower_papi/tool.lua b/elepower_papi/tool.lua new file mode 100644 index 0000000..e69de29 diff --git a/elepower_tools/init.lua b/elepower_tools/init.lua new file mode 100644 index 0000000..50ac5fc --- /dev/null +++ b/elepower_tools/init.lua @@ -0,0 +1,8 @@ +-- A Elepower Mod +-- Copyright 2018 Evert "Diamond" Prants + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +elepd = rawget(_G, "elepd") or {} +elepd.modpath = modpath + diff --git a/elepower_tools/mod.conf b/elepower_tools/mod.conf new file mode 100644 index 0000000..394522c --- /dev/null +++ b/elepower_tools/mod.conf @@ -0,0 +1,3 @@ +name = elepower_tools +description = Elepower powered tools! +depends = elepower_machines diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29