master
DS-Minetest 2017-05-06 15:34:29 +02:00
commit 3c41212599
9 changed files with 328 additions and 0 deletions

0
README.md Normal file
View File

1
depends.txt Normal file
View File

@ -0,0 +1 @@
default

0
description.txt Normal file
View File

208
init.lua Normal file
View File

@ -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

1
license.txt Normal file
View File

@ -0,0 +1 @@
CC0

1
mod.conf Normal file
View File

@ -0,0 +1 @@
name = pump

117
pump.lua Normal file
View File

@ -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)

BIN
textures/pump_pipe_side.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

BIN
textures/pump_side.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B