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