summaryrefslogtreecommitdiff
path: root/mesecons
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2017-06-16 18:12:21 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2017-06-16 18:12:21 -0400
commit75e0a665ce2a45e1158a427d3f70f854f5f4d5a8 (patch)
tree881209e2c8f7efcbce69482bc3caa19b4828e290 /mesecons
parentb8cd2f723c7c9079e631d7a4078862ff47b24915 (diff)
downloaddreambuilder_modpack-75e0a665ce2a45e1158a427d3f70f854f5f4d5a8.tar
dreambuilder_modpack-75e0a665ce2a45e1158a427d3f70f854f5f4d5a8.tar.gz
dreambuilder_modpack-75e0a665ce2a45e1158a427d3f70f854f5f4d5a8.tar.bz2
dreambuilder_modpack-75e0a665ce2a45e1158a427d3f70f854f5f4d5a8.tar.xz
dreambuilder_modpack-75e0a665ce2a45e1158a427d3f70f854f5f4d5a8.zip
Updated several mods for Minetest 0.4.16
castles modpack, areas, biome_lib, blox, boost_cart, plantlife modpack caverealms, coloredwood, concrete, currency, farming redo, home decor, ilights, mesecons, moreores, pipeworks, signs_lib, technic, unified inventory unified bricks, unified dyes, worldedit, and xban2
Diffstat (limited to 'mesecons')
-rw-r--r--mesecons/services.lua67
1 files changed, 50 insertions, 17 deletions
diff --git a/mesecons/services.lua b/mesecons/services.lua
index 1abbc0c..1e12de0 100644
--- a/mesecons/services.lua
+++ b/mesecons/services.lua
@@ -66,30 +66,63 @@ minetest.register_on_placenode(mesecon.on_placenode)
minetest.register_on_dignode(mesecon.on_dignode)
-- Overheating service for fast circuits
+local OVERHEAT_MAX = mesecon.setting("overheat_max", 20)
+local COOLDOWN_TIME = mesecon.setting("cooldown_time", 2.0)
+local COOLDOWN_STEP = mesecon.setting("cooldown_granularity", 0.5)
+local COOLDOWN_MULTIPLIER = OVERHEAT_MAX / COOLDOWN_TIME
+local cooldown_timer = 0.0
+local object_heat = {}
-- returns true if heat is too high
-mesecon.do_overheat = function(pos)
- local meta = minetest.get_meta(pos)
- local heat = meta:get_int("heat") or 0
-
- heat = heat + 1
- meta:set_int("heat", heat)
-
- if heat < mesecon.setting("overheat_max", 20) then
- mesecon.queue:add_action(pos, "cooldown", {}, 1, nil, 0)
- else
+function mesecon.do_overheat(pos)
+ local id = minetest.hash_node_position(pos)
+ local heat = (object_heat[id] or 0) + 1
+ object_heat[id] = heat
+ if heat >= OVERHEAT_MAX then
+ minetest.log("action", "Node overheats at " .. minetest.pos_to_string(pos))
+ object_heat[id] = nil
return true
end
-
return false
end
+function mesecon.do_cooldown(pos)
+ local id = minetest.hash_node_position(pos)
+ object_heat[id] = nil
+end
-mesecon.queue:add_function("cooldown", function (pos)
- local meta = minetest.get_meta(pos)
- local heat = meta:get_int("heat")
+function mesecon.get_heat(pos)
+ local id = minetest.hash_node_position(pos)
+ return object_heat[id] or 0
+end
- if (heat > 0) then
- meta:set_int("heat", heat - 1)
+function mesecon.move_hot_nodes(moved_nodes)
+ local new_heat = {}
+ for _, n in ipairs(moved_nodes) do
+ local old_id = minetest.hash_node_position(n.oldpos)
+ local new_id = minetest.hash_node_position(n.pos)
+ new_heat[new_id] = object_heat[old_id]
+ object_heat[old_id] = nil
+ end
+ for id, heat in pairs(new_heat) do
+ object_heat[id] = heat
end
-end)
+end
+
+local function global_cooldown(dtime)
+ cooldown_timer = cooldown_timer + dtime
+ if cooldown_timer < COOLDOWN_STEP then
+ return -- don't overload the CPU
+ end
+ local cooldown = COOLDOWN_MULTIPLIER * cooldown_timer
+ cooldown_timer = 0
+ for id, heat in pairs(object_heat) do
+ heat = heat - cooldown
+ if heat <= 0 then
+ object_heat[id] = nil -- free some RAM
+ else
+ object_heat[id] = heat
+ end
+ end
+end
+minetest.register_globalstep(global_cooldown)