master
commit
3c41212599
|
@ -0,0 +1 @@
|
||||||
|
default
|
|
@ -0,0 +1,208 @@
|
||||||
|
--[[
|
||||||
|
|
||||||
|
______ __ __ _____ ______
|
||||||
|
\____ \| | \/ \\____ \
|
||||||
|
| |_> > | / Y Y \ |_> >
|
||||||
|
| __/|____/|__|_| / __/
|
||||||
|
|__| \/|__|
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local load_time_start = os.clock()
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
|
||||||
|
-- Something to save meta information instead of getting is all time:
|
||||||
|
local get_data, set_data, hard_data
|
||||||
|
do
|
||||||
|
local data = {}
|
||||||
|
function get_data(pos)
|
||||||
|
local hashed_pos = minetest.hash_node_position(pos)
|
||||||
|
if not data[hashed_pos] then
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
data[hashed_pos] = meta:to_table().fields
|
||||||
|
end
|
||||||
|
return data[hashed_pos]
|
||||||
|
end
|
||||||
|
function set_data(pos, t, hard)
|
||||||
|
local hashed_pos = minetest.hash_node_position(pos)
|
||||||
|
data[hashed_pos] = t
|
||||||
|
if not hard then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:from_table({fields = t})
|
||||||
|
end
|
||||||
|
function hard_data(pos)
|
||||||
|
local hashed_pos = minetest.hash_node_position(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:from_table({fields = data[hashed_pos]})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
--~ minetest.register_on_dignode(function(pos, oldnode, digger)
|
||||||
|
--~ set_data(pos, nil, true)
|
||||||
|
--~ end)
|
||||||
|
|
||||||
|
local liquids = {}
|
||||||
|
minetest.after(0, function()
|
||||||
|
for node_name, node_def in pairs(minetest.registered_nodes) do
|
||||||
|
if node_def.liquidtype == "source" and
|
||||||
|
minetest.get_item_group(node_name, "not_pumpable") ~= 1 then
|
||||||
|
liquids[node_name] = {
|
||||||
|
source = node_def.liquid_alternative_source,
|
||||||
|
flowing = node_def.liquid_alternative_flowing,
|
||||||
|
viscosity = node_def.liquid_viscosity,
|
||||||
|
renewable = node_def.liquid_renewable,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local function is_liquid(pos)
|
||||||
|
local node_name = minetest.get_node(pos).name
|
||||||
|
for liquid, def in pairs(liquids) do
|
||||||
|
if node_name == def.source then
|
||||||
|
return "source", liquid
|
||||||
|
elseif node_name == def.flowing then
|
||||||
|
return "flowing", liquid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Returns the pos of the liquid source that should be pumped next.
|
||||||
|
local function get_liquid_pos(pos, liquid)
|
||||||
|
return pos -- TODO
|
||||||
|
end
|
||||||
|
|
||||||
|
local function step(pos)
|
||||||
|
local data = get_data(pos)
|
||||||
|
if data.mode == "extend" then
|
||||||
|
local old_pos = vector.new(pos)
|
||||||
|
data.pipe_length = data.pipe_length or 0
|
||||||
|
pos.y = pos.y - data.pipe_length
|
||||||
|
local node
|
||||||
|
repeat
|
||||||
|
data.pipe_length = data.pipe_length + 1
|
||||||
|
pos.y = pos.y - 1
|
||||||
|
node = minetest.get_node(pos)
|
||||||
|
until node.name ~= "pump:pipe"
|
||||||
|
set_data(old_pos, data)
|
||||||
|
if node.name == "air" then
|
||||||
|
minetest.set_node(pos, {name = "pump:pipe"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local sof, l = is_liquid(pos)
|
||||||
|
if not sof then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
data.liquid = data.liquid or l
|
||||||
|
if data.liquid ~= l then
|
||||||
|
data.mode = "error"
|
||||||
|
set_data(old_pos, data)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if sof == "flowing" then
|
||||||
|
minetest.set_node(pos, {name = "pump:pipe"})
|
||||||
|
return
|
||||||
|
end
|
||||||
|
data.mode = "pump"
|
||||||
|
set_data(old_pos, data, true)
|
||||||
|
step(old_pos, data.mode)
|
||||||
|
elseif data.mode == "error" then
|
||||||
|
minetest.chat_send_all("error")
|
||||||
|
elseif data.mode == "pump" then
|
||||||
|
if not data.liquid then
|
||||||
|
data.mode = "error"
|
||||||
|
set_data(pos, data)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local dstpos = vector.new(pos)
|
||||||
|
dstpos.y = dstpos.y + 1
|
||||||
|
if minetest.get_node(dstpos).name ~= "air" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local srcpos = vector.new(pos)
|
||||||
|
data.pipe_length = data.pipe_length or 0
|
||||||
|
srcpos.y = srcpos.y - data.pipe_length
|
||||||
|
local node = minetest.get_node(srcpos)
|
||||||
|
while node.name == "pump:pipe" do
|
||||||
|
data.pipe_length = data.pipe_length + 1
|
||||||
|
srcpos.y = srcpos.y - 1
|
||||||
|
node = minetest.get_node(srcpos)
|
||||||
|
end
|
||||||
|
set_data(pos, data)
|
||||||
|
if node.name ~= liquids[data.liquid].source then
|
||||||
|
data.mode = "extend"
|
||||||
|
data.pipe_length = data.pipe_length - 1
|
||||||
|
set_data(pos, data, true)
|
||||||
|
step(pos)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
srcpos = get_liquid_pos(srcpos, data.liquid)
|
||||||
|
minetest.remove_node(srcpos)
|
||||||
|
minetest.set_node(dstpos, {name = liquids[data.liquid].source})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function remove_pipes(pos)
|
||||||
|
pos.y = pos.y - 1
|
||||||
|
minetest.after(0.4, function(pos)
|
||||||
|
if minetest.get_node(pos).name == "pump:pipe" then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
end
|
||||||
|
end, pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_node("pump:pump", {
|
||||||
|
description = "Pump",
|
||||||
|
tiles = {"default_steel_block.png^pump_side.png"},
|
||||||
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
on_construct = function(pos)
|
||||||
|
set_data(pos, {mode = "extend", dir = "-y", pipe_length = 0}, true)
|
||||||
|
end,
|
||||||
|
--~ on_receive_fields = function(pos, formanme, fields, sender) -- TODO
|
||||||
|
--~ end,
|
||||||
|
on_punch = function(pos, node, puncher, pointed_thing)
|
||||||
|
step(pos)
|
||||||
|
end,
|
||||||
|
on_destruct = function(pos)
|
||||||
|
remove_pipes(pos)
|
||||||
|
set_data(pos, {}, true)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node("pump:pipe", {
|
||||||
|
description = "You hacker you!",
|
||||||
|
tiles = {"pump_pipe_side.png"},
|
||||||
|
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2,
|
||||||
|
not_in_creative_inventory = 1},
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
drop = "",
|
||||||
|
on_destruct = function(pos)
|
||||||
|
remove_pipes(vector.new(pos))
|
||||||
|
local i = -1
|
||||||
|
local node
|
||||||
|
repeat
|
||||||
|
i = i + 1
|
||||||
|
pos.y = pos.y + 1
|
||||||
|
node = minetest.get_node(pos)
|
||||||
|
until node.name ~= "pump:pipe"
|
||||||
|
if node.name ~= "pump:pump" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local data = get_data(pos)
|
||||||
|
data.pipe_length = i
|
||||||
|
data.mode = "extend"
|
||||||
|
set_data(pos, data)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
local time = math.floor(tonumber(os.clock()-load_time_start)*100+0.5)/100
|
||||||
|
local msg = "["..modname.."] loaded after ca. "..time
|
||||||
|
if time > 0.05 then
|
||||||
|
print(msg)
|
||||||
|
else
|
||||||
|
minetest.log("info", msg)
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
CC0
|
|
@ -0,0 +1,117 @@
|
||||||
|
local function table_has(t, v, v_is_vector)
|
||||||
|
if type(t) ~= "table" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
for i = 1, #t do
|
||||||
|
if t[i] == v or (v_is_vector and vector.equals(t[i], v)) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_connected1(start_pos, node_names, poss) -- TODO: use voxel manipulation
|
||||||
|
local poss = poss or {}
|
||||||
|
local distances = {}
|
||||||
|
local xyz = {"x", "y", "z", "x", "y", "z"}
|
||||||
|
for i = 1, 6 do
|
||||||
|
local pos = vector.new(start_pos)
|
||||||
|
local diff = 1
|
||||||
|
if i <= 3 then
|
||||||
|
diff = -1
|
||||||
|
end
|
||||||
|
pos[xyz[i]] = pos[xyz[i]] + diff
|
||||||
|
if not table_has(poss, pos, true) and table_has(node_names, minetest.get_node(pos).name) then
|
||||||
|
distances[pos] = vector.distance(start_pos, pos)
|
||||||
|
poss[#poss+1] = pos
|
||||||
|
poss = get_connected1(pos, node_names, poss)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return poss, distances
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_craftitem("technic:pump_test1",{
|
||||||
|
description = "Pumptester",
|
||||||
|
inventory_image = "default_tool_steelshovel.png",
|
||||||
|
stack_max = 1,
|
||||||
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
|
minetest.chat_send_all("bla")
|
||||||
|
local pos = pointed_thing.under
|
||||||
|
local poss, distances = get_connected1(pos, {minetest.get_node(pos).name})
|
||||||
|
local count = #poss
|
||||||
|
--~ minetest.chat_send_all(dump(poss))
|
||||||
|
minetest.chat_send_all(count or "mhm")
|
||||||
|
local farest = 0
|
||||||
|
local farest_pos
|
||||||
|
for p, d in pairs(distances) do
|
||||||
|
if d > farest then
|
||||||
|
farest = d
|
||||||
|
farest_pos = p
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.chat_send_all(minetest.pos_to_string(farest_pos))
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
local function get_connected(start_pos, node_names)
|
||||||
|
local node_ids = {}
|
||||||
|
for i = 1, #node_names do
|
||||||
|
node_ids[i] = minetest.get_content_id(node_names[i])
|
||||||
|
end
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
local map = {}
|
||||||
|
local pmin, pmax = manip:read_from_map(vector.add(start_pos, -256), vector.add(start_pos, 256))
|
||||||
|
manip:get_data(map)
|
||||||
|
--~ VoxelArea:new{MinEdge=pmin, MaxEdge=pmax}
|
||||||
|
local count = 0
|
||||||
|
for k = 1, #node_ids do
|
||||||
|
for i = 1, #map do
|
||||||
|
if map[i] == node_ids[k] then
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.chat_send_all(count)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function run(pos, node)
|
||||||
|
local liquids = {"default:lava_source", "default:lava_flowing"}
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
--~ minetest.chat_send_all("run")
|
||||||
|
meta:set_int("LV_EU_demand", 600)
|
||||||
|
--~ minetest.chat_send_all(meta:get_int("LV_EU_input"))
|
||||||
|
meta:set_string("infotext", "Pump")
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_node("technic:pump_pipe", {
|
||||||
|
description = "You hacker you!",
|
||||||
|
tiles = {"default_dirt.png^default_leaves.png"},
|
||||||
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
drop = "",
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node("technic:pump", {
|
||||||
|
description = "Pump",
|
||||||
|
tiles = {"default_dirt.png^default_glass.png"},
|
||||||
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
||||||
|
technic_machine=1, technic_lv=1},
|
||||||
|
connect_sides = {"all"},
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
--~ on_construct = function(pos)
|
||||||
|
--~ end,
|
||||||
|
--~ on_receive_fields = function(pos, formanme, fields, sender)
|
||||||
|
--~ end,
|
||||||
|
technic_run = run,
|
||||||
|
technic_on_disable = function(pos, node)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_int("LV_EU_demand", 0)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
technic.register_machine("LV", "technic:pump", technic.receiver)
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 145 B |
Binary file not shown.
After Width: | Height: | Size: 200 B |
Loading…
Reference in New Issue