From f078dc0a6e0439f705b2aa6a2bed4999ad989a52 Mon Sep 17 00:00:00 2001 From: Andrey2470T Date: Thu, 26 Sep 2019 22:04:32 +0300 Subject: [PATCH] Alpha version and WIP --- depends.txt | 1 + init.lua | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 depends.txt create mode 100644 init.lua diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..0c5220c --- /dev/null +++ b/init.lua @@ -0,0 +1,89 @@ +-- ENERGY LIB WRITTEN BY Andrey01. + + +-- THE UNITS CONCERNING TO THE ENERGY. + +-- The energy amount is throughout measured in *kilojoules* (kj). +-- The velocity of energy emitting/energizement measured in *kilojoules per a second* (kj/s). + + +--Initial heat emitting values of just put-in world nodes (first field) and velocities of their emitting & energizing (second field). + +heat = {} +heat.default_nodes_heat_data = { + ["default:lava_source"] = {40, 0.003}, + ["default:lava_flowing"] = {50, 0.010}, + ["default:water_flowing"] = {1.5, 0.0002}, + ["default:furnace_active"] = {25, 0.05}, + ["default:meselamp"] = {5, 0.4}, + ["default:mese_post_light"] = {2.5, 0.8}, + ["default:torch"] = {13, 0.0008}, + ["fire:basic_flame"] = {22, 2}, + ["fire:permanent_flame"] = {22, 2}, + ["default:mese"] = {3, 0.2}, + ["default:stone"] = {0, 0.0005}, + ["default:cobble"] = {0, 0.0013}, + ["default:stonebrick"] = {0, 0.001}, + ["default:stone_block"] = {0, 0.0002}, + ["default:mossycobble"] = {0, 0.001}, + ["default:desert_stone"] = {0, 0.0012}, + ["default:desert_stonebrick"] = {0, 0.0007}, + ["default:desert_stone_block"] = {0, 0.001}, + ["default:dirt"] = {0, 0.0002}, + ["default:dirt_with_grass"] = {0, 0.0005}, + ["air"] = {0, 0.5} +} + +-- Runs node defs of all nodes listed in default_nodes_heat_data and overrides them with new params 'init_heat_emit' and 'heat_vel'. +for name, def in pairs(minetest.registered_nodes) do + if heat.default_nodes_heat_data[name] then + def.init_heat_emit = heat.default_nodes_heat_data[name][1] + def.heat_vel = heat.default_nodes_heat_data[name][2] + end + + def.on_construct = function (pos) + local meta = minetest.get_meta(pos) + meta:set_string("cur_heat_amount", (heat.default_nodes_heat_data[name] or 0) or heat.default_nodes_heat_data[name][1]) + end + minetest.register_node(":"..name, def) + +end + +--[[A node that wanted to be energized is finding out neighbour nodes with a heat value > 0 around itself in radius 1 node. +*e_node is energizing node. +*e_nodepos is position of energizing node.]] +heat.find_nodes_with_heat = function (e_node, e_nodepos) + local surround_nodes = minetest.find_nodes_with_meta({x=e_nodepos.x-1, y=e_nodepos.y-1, z=e_nodepos.z-1}, {x=e_nodepos.x+1, y=e_nodepos.y+1, z=e_nodepos.z+1}) + local surround_nodes_with_energy = {} + for i, pos in pairs(surround_nodes) do + -- *t_node is transmitting an energy node. + local t_node = minetest.get_node(pos) + local meta = minetest.get_meta() + local name = t_node.name + if minetest.registered_node[name].heat_vel and meta:get_string("cur_heat_amount") > 0 then + surround_nodes_with_energy[i] = pos + end + end + return surround_nodes_with_energy +end + +-- Increases a heat value of *e_node and takes away it from *t_node. Amount of transmitted energy depends on heat energizement velocity of *e_node. +heat.energize = function (e_node, e_nodepos) + local name = e_node.name + local heat_vel = minetest.registered_nodes[name].heat_vel + if not heat_vel then + return + end + + local surround_nodes = heat.find_nodes_with_heat(e_node, e_nodepos) + for i, pos in pairs(surround_nodes) do + local node = minetest.get_node(pos) + local t_node_meta, e_node_meta = minetest.get_meta(pos), minetest.get_meta(e_nodepos) + local t_node_heat, e_node_heat = t_node_meta:get_string("cur_heat_amount"), e_node_meta:get_string("cur_heat_amount") + local rand_energy_trans = math.random(t_node_heat/2, t_node_heat) + t_node_meta:set_string("cur_heat_amount", t_node_heat-rand_energy_trans) + e_node_meta:set_string("cur_heat_amount", e_node_heat+rand_energy_trans) + end +end + +