mods that hopefully work for a TechAge-based pack

This commit is contained in:
2026-09-09 06:27:51 -06:00
parent 4e6b08d194
commit c27db2a537
6234 changed files with 375578 additions and 0 deletions
@@ -0,0 +1,178 @@
--[[
TechAge
=======
Copyright (C) 2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA1 Mill
]]--
local M = minetest.get_meta
local S = techage.S
local function start_mill(pos)
local obj = minetest.add_entity(pos, "techage:ta1_mill_entity")
minetest.remove_node(pos)
end
local function stop_mill(pos, self)
minetest.swap_node(pos, {name = "techage:ta1_mill", param2 = 0})
minetest.get_node_timer(pos):start(2)
self.object:remove()
end
local function has_power(pos, y_offs)
local pos1 = {x = pos.x, y = pos.y + y_offs, z = pos.z}
local nvm = techage.get_nvm(pos1)
nvm.watermill_trigger = (nvm.watermill_trigger or 1) - 1
return nvm.watermill_trigger > 0
end
techage.ta1_mill_has_power = has_power
minetest.register_node("techage:ta1_mill_gear", {
description = S("TA1 Mill Gear"),
tiles = {
"default_wood.png^techage_axle_bearing.png^[transformR90",
"default_wood.png^techage_axle_bearing.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/2, -1/2, -1/2, 1/2, -1/8, 1/2},
{-1/8, -1/8, -1/2, 1/8, 1/8, 1/2},
},
},
after_place_node = function(pos, placer)
techage.TA1Axle:after_place_node(pos)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
techage.TA1Axle:after_dig_node(pos)
end,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 2, crumbly = 2, choppy = 2},
})
techage.register_node({"techage:ta1_mill_gear"}, {
on_transfer = function(pos, in_dir, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "trigger" then
nvm.watermill_trigger = 4
return true
end
end,
})
minetest.register_node("techage:ta1_mill", {
description = S("TA1 Mill"),
tiles = {
-- up, down, right, left, back, front
"techage_mill_side.png",
"techage_mill_side.png",
"techage_mill_side.png",
"techage_mill_side.png",
"techage_mill_front.png",
"techage_mill_front.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/8, -1/8, -1/8, 1/8, 4/8, 1/8},
{-3/8, -3/8, -4/8, -1/8, 3/8, 4/8},
{-3/8, -4/8, -3/8, -1/8, 4/8, 3/8},
{ 1/8, -3/8, -4/8, 3/8, 3/8, 4/8},
{ 1/8, -4/8, -3/8, 3/8, 4/8, 3/8},
},
},
after_place_node = function(pos, placer)
minetest.get_node_timer(pos):start(2)
end,
on_rightclick = function(pos, node, clicker)
start_mill(pos)
end,
on_timer = function(pos, elapsed)
if has_power(pos, 1) then
start_mill(pos)
end
return true
end,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 2, crumbly = 2, choppy = 2},
})
minetest.register_entity("techage:ta1_mill_entity", {
initial_properties = {
physical = true,
visual = "wielditem",
wield_item = "techage:ta1_mill",
visual_size = {x=0.67, y=0.67, z=0.67},
static_save = true,
automatic_rotate = -math.pi * 0.2,
pointable = false,
},
on_step = function(self, dtime)
self.dtime = (self.dtime or 0) + dtime
if self.dtime > 2 then
local pos = vector.round(self.object:get_pos())
if not has_power(pos, 1) then
stop_mill(pos, self)
end
self.dtime = 0
minetest.sound_play("techage_mill", {gain = 0.3, pos = pos,
max_hear_distance = 10}, true)
end
end,
on_rightclick = function(self, clicker)
local pos = vector.round(self.object:get_pos())
stop_mill(pos, self)
end,
})
techage.register_node({"techage:ta1_mill"}, {
on_node_load = function(pos, node)
minetest.get_node_timer(pos):start(2)
end,
})
minetest.register_craft({
output = "techage:ta1_mill_gear",
recipe = {
{"default:wood", "", "default:wood"},
{"techage:ta1_axle", "default:wood", "techage:ta1_axle"},
{"default:wood", "techage:ta1_axle", "default:wood"},
},
})
minetest.register_craft({
output = "techage:ta1_mill",
recipe = {
{"", "techage:iron_ingot", ""},
{"stairs:slab_stone", "techage:iron_ingot", "stairs:slab_stone"},
{"", "", ""},
},
})
@@ -0,0 +1,91 @@
--[[
TechAge
=======
Copyright (C) 2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA1 mill boards
]]--
local M = minetest.get_meta
local S = techage.S
local function register_board1(output, description, tiles, input)
minetest.register_node(output, {
description = description,
tiles = tiles,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/2, -4/8, -1/2, 1/2, -3/8, 1/2},
},
},
paramtype2 = "wallmounted",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_craft({
output = output .. " 3",
recipe = {
{"", "", input},
{"", "", input},
{"", "", input},
},
})
end
local function register_board2(output, description, tiles, input1, input2)
minetest.register_node(output, {
description = description,
tiles = tiles,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/2, 3/8, -1/2, 1/2, 4/8, 1/2},
{-1/2, 3/16, -2/16, 1/2, 6/16, 2/16},
{-1/2, -5/16, -1/16, 1/2, -3/16, 1/16},
},
},
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, fence = 1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_craft({
output = output,
recipe = {
{"", input1, ""},
{"", input2, ""},
{"", "", ""},
},
})
end
register_board1("techage:ta1_board1_apple", S("TA1 Apple Wood Board"), {"default_wood.png"}, "stairs:slab_wood")
register_board1("techage:ta1_board1_jungle", S("TA1 Jungle Wood Board"), {"default_junglewood.png"}, "stairs:slab_junglewood")
register_board1("techage:ta1_board1_pine", S("TA1 Pine Wood Board"), {"default_pine_wood.png"}, "stairs:slab_pine_wood")
register_board1("techage:ta1_board1_acacia", S("TA1 Acacia Wood Board"), {"default_acacia_wood.png"}, "stairs:slab_acacia_wood")
register_board1("techage:ta1_board1_aspen", S("TA1 Aspen Wood Board"), {"default_aspen_wood.png"}, "stairs:slab_aspen_wood")
register_board2("techage:ta1_board2_apple", S("TA1 Apple Millrace Board"), {"default_wood.png"}, "techage:ta1_board1_apple", "default:fence_rail_wood")
register_board2("techage:ta1_board2_jungle", S("TA1 Jungle Millrace Board"), {"default_junglewood.png"}, "techage:ta1_board1_jungle", "default:fence_rail_junglewood")
register_board2("techage:ta1_board2_pine", S("TA1 Pine Millrace Board"), {"default_pine_wood.png"}, "techage:ta1_board1_pine", "default:fence_rail_pine_wood")
register_board2("techage:ta1_board2_acacia", S("TA1 Acacia Millrace Board"), {"default_acacia_wood.png"}, "techage:ta1_board1_acacia", "default:fence_rail_acacia_wood")
register_board2("techage:ta1_board2_aspen", S("TA1 Aspen Millrace Board"), {"default_aspen_wood.png"}, "techage:ta1_board1_aspen", "default:fence_rail_aspen_wood")
@@ -0,0 +1,195 @@
--[[
TechAge
=======
Copyright (C) 2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA1 Sluice Gate
]]--
local S = techage.S
local M = minetest.get_meta
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local S2P = minetest.string_to_pos
local function check_position(pos, facedir)
local dir = minetest.facedir_to_dir(facedir)
local pos_ = vector.add(pos, dir)
local node = minetest.get_node(pos_)
return (node.name == "default:water_source" or node.name == "default:water_flowing"), pos_
end
-- Function checks if water is avaliable and
-- returns the pos for the new water block, and the result (true/false).
local function has_water(pos, facedir)
local res1, pos1 = check_position(pos, (facedir + 1) % 4)
local res2, pos2 = check_position(pos, (facedir + 3) % 4)
if res1 and not res2 then
M(pos):set_string("millrace_pos", P2S(pos2))
return pos2, true
end
if not res1 and res2 then
M(pos):set_string("millrace_pos", P2S(pos1))
return pos1, true
end
local pos3 = S2P(M(pos):get_string("millrace_pos"))
if pos3 then
return pos3, true
end
return pos1, false
end
local function on_rightclick(pos, node, clicker, itemstack, pointed_thing)
if minetest.is_protected(pos, clicker:get_player_name()) then
return
end
local pos2 = vector.add(pos, {x = 0, y = -1, z = 0})
local node2 = minetest.get_node(pos2)
local pos3, res = has_water(pos2, node2.param2)
local node3 = minetest.get_node(pos3)
if node2.name == "techage:ta1_sluice_closed" then
minetest.swap_node(pos, {name = "techage:ta1_sluice_handle_open", param2 = node.param2})
minetest.swap_node(pos2, {name = "techage:ta1_sluice_open", param2 = node.param2})
if res and (node3.name == "air" or node3.name == "default:water_flowing") then
minetest.add_node(pos3, {name = "default:water_source"})
minetest.get_node_timer(pos3):start(2)
end
minetest.sound_play("doors_door_open", {gain = 0.5, pos = pos,
max_hear_distance = 10}, true)
elseif node2.name == "techage:ta1_sluice_open" then
minetest.swap_node(pos, {name = "techage:ta1_sluice_handle_closed", param2 = node.param2})
minetest.swap_node(pos2, {name = "techage:ta1_sluice_closed", param2 = node.param2})
if res and node3.name == "default:water_source" then
minetest.add_node(pos3, {name = "air"})
end
minetest.sound_play("doors_door_close", {gain = 0.5, pos = pos,
max_hear_distance = 10}, true)
end
end
minetest.register_node("techage:ta1_sluice_closed", {
description = S("TA1 Sluice Gate"),
tiles = {
"default_wood.png^techage_junglewood_top.png",
"default_wood.png",
"default_wood.png^techage_junglewood.png",
"default_wood.png^techage_junglewood.png",
"default_wood.png",
"default_wood.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, 5/16, 8/16, 8/16, 8/16},
{-8/16, -8/16, -8/16, 8/16, 8/16, -5/16},
{-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},
{-1/16, -5/16, -7/16, 1/16, 8/16, 7/16},
},
},
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:ta1_sluice_open", {
description = S("TA1 Sluice Gate"),
tiles = {"default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, 5/16, 8/16, 8/16, 8/16},
{-8/16, -8/16, -8/16, 8/16, 8/16, -5/16},
{-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},
},
},
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_wood_defaults(),
drop = "techage:ta1_sluice_closed",
})
minetest.register_node("techage:ta1_sluice_handle_closed", {
description = S("TA1 Sluice Handle"),
tiles = {"default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, 0/16, 8/16},
{-1/16, 0/16, -1/16, 1/16, 4/16, 1/16},
{-1/16, 2/16, -4/16, 1/16, 4/16, 4/16},
},
},
on_rightclick = on_rightclick,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:ta1_sluice_handle_open", {
description = S("TA1 Sluice Handle"),
tiles = {"default_wood.png"},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, 0/16, 8/16},
{-1/16, 0/16, -1/16, 1/16, 14/16, 1/16},
{-1/16, 14/16, -4/16, 1/16, 16/16, 4/16},
},
},
on_rightclick = on_rightclick,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_wood_defaults(),
drop = "techage:ta1_sluice_handle_closed",
})
minetest.register_craft({
output = "techage:ta1_sluice_closed",
recipe = {
{"", "", ""},
{"techage:ta1_board1_apple", "techage:ta1_board1_jungle", "techage:ta1_board1_apple"},
{"", "techage:ta1_board1_apple", ""},
},
})
minetest.register_craft({
output = "techage:ta1_sluice_handle_closed",
recipe = {
{"default:stick", "default:stick", "default:stick"},
{"", "default:stick", ""},
{"", "stairs:slab_wood", ""},
},
})
@@ -0,0 +1,176 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA1 Axles for the Watermill
]]--
-- for lazy programmers
local P = minetest.string_to_pos
local M = minetest.get_meta
local S = techage.S
local Axle = tubelib2.Tube:new({
dirs_to_check = {1,2,3,4,5,6},
max_tube_length = 10,
show_infotext = false,
tube_type = "axle1",
primary_node_names = {"techage:ta1_axle"},
secondary_node_names = {"techage:ta1_mill_gear", "techage:ta1_axle_bearing1", "techage:ta1_axle_bearing2"},
after_place_tube = function(pos, param2, tube_type, num_tubes, state)
minetest.swap_node(pos, {name = "techage:ta1_axle", param2 = param2})
end,
})
Axle:set_valid_sides("techage:ta1_mill_gear", {"F", "B"})
Axle:set_valid_sides("techage:ta1_axle_bearing1", {"F", "B"})
Axle:set_valid_sides("techage:ta1_axle_bearing2", {"F", "B"})
minetest.register_node("techage:ta1_axle", {
description = S("TA1 Axle"),
tiles = {
"techage_axle_bearing.png^[transformR90",
"techage_axle_bearing.png^[transformR90",
"techage_axle_bearing.png",
"techage_axle_bearing.png",
"techage_axle_bearing.png",
"techage_axle_bearing.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/8, -1/8, -4/8, 1/8, 1/8, 4/8},
},
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Axle:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Axle:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "facedir", -- important!
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {crumbly = 3, cracky = 3, snappy = 3},
sounds = default.node_sound_wood_defaults(),
})
-- Bearings are defined as secondary nodes which forward received 'on_transfer' commands
minetest.register_node("techage:ta1_axle_bearing1", {
description = S("TA1 Axle Bearing"),
tiles = {
"default_stone_brick.png^techage_axle_bearing.png^[transformR90",
"default_stone_brick.png^techage_axle_bearing.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/2, -1/2, -1/2, 1/2, -1/8, 1/2},
{-1/8, -1/8, -1/2, 1/8, 1/8, 1/2},
},
},
after_place_node = function(pos, placer)
Axle:after_place_node(pos)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Axle:after_dig_node(pos)
end,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 2, crumbly = 2, choppy = 2},
})
minetest.register_node("techage:ta1_axle_bearing2", {
description = S("TA1 Axle Bearing"),
tiles = {
-- up, down, right, left, back, front
"default_stone_brick.png",
"default_stone_brick.png",
"default_stone_brick.png",
"default_stone_brick.png",
"default_stone_brick.png^techage_axle_bearing_front.png",
"default_stone_brick.png^techage_axle_bearing_front.png",
},
after_place_node = function(pos, placer)
Axle:after_place_node(pos)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Axle:after_dig_node(pos)
end,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 2, crumbly = 2, choppy = 2},
})
techage.register_node({"techage:ta1_axle_bearing1", "techage:ta1_axle_bearing2"}, {
on_transfer = function(pos, in_dir, topic, payload)
return techage.transfer(
pos,
in_dir, -- outdir
topic,
payload,
Axle, -- network
nil) -- valid nodes
end,
})
minetest.register_craft({
output = "techage:ta1_axle",
recipe = {
{"", "", ""},
{"techage:iron_ingot", "dye:black", "techage:iron_ingot"},
{"", "", ""},
},
})
minetest.register_craft({
output = "techage:ta1_axle_bearing1",
recipe = {
{"", "", ""},
{"", "techage:ta1_axle", ""},
{"", "stairs:slab_stonebrick", ""},
},
})
minetest.register_craft({
output = "techage:ta1_axle_bearing2",
recipe = {
{"", "", ""},
{"", "techage:ta1_axle", ""},
{"", "default:stonebrick", ""},
},
})
techage.TA1Axle = Axle
@@ -0,0 +1,319 @@
--[[
TechAge
=======
Copyright (C) 2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA1 Watermill
]]--
local M = minetest.get_meta
local S = techage.S
local function calc_dir(dir, facedir)
if facedir == 1 then
return {x = dir.z, y = dir.y, z = -dir.x}
elseif facedir == 2 then
return {x = -dir.x, y = dir.y, z = -dir.z}
elseif facedir == 3 then
return {x = -dir.z, y = dir.y, z = dir.x}
end
return {x = dir.x, y = dir.y, z = dir.z}
end
local function add_node(pos, dir, facedir, node_name)
local pos2 = vector.add(pos, calc_dir(dir, facedir))
local node = minetest.get_node(pos2)
if techage.is_air_like(node.name) then
minetest.swap_node(pos2, {name = node_name})
end
end
local function remove_node(pos, dir, facedir, node_name)
local pos2 = vector.add(pos, calc_dir(dir, facedir))
local node = minetest.get_node(pos2)
if node.name == node_name then
minetest.swap_node(pos2, {name = "air"})
end
end
local function water_flowing(pos, facedir, tRes)
facedir = ((facedir or 0) + 1) % 4
local dir = minetest.facedir_to_dir(facedir)
local pos2 = vector.add(pos, dir)
pos2.y = pos2.y + 1
local node = minetest.get_node(pos2)
if node.name == "default:water_flowing" or node.name == "default:river_water_flowing" then
tRes.backward = false
return true
end
pos2 = vector.subtract(pos, dir)
pos2.y = pos2.y + 1
node = minetest.get_node(pos2)
if node.name == "default:water_flowing" or node.name == "default:river_water_flowing" then
tRes.backward = true
return true
end
end
local function enough_space(pos, facedir)
local pos1 = vector.add(pos, calc_dir({x =-1, y =-1, z = 0}, facedir))
local pos2 = vector.add(pos, calc_dir({x = 1, y = 1, z = 0}, facedir))
local _, nodes = minetest.find_nodes_in_area(pos1, pos2, {"air"})
return nodes["air"] and nodes["air"] == 8
end
local function remove_nodes(pos, facedir)
remove_node(pos, {x = 0, y = 1, z = 0}, facedir, "techage:water_stop")
remove_node(pos, {x =-1, y = 0, z = 0}, facedir, "techage:water_stop")
remove_node(pos, {x = 1, y = 0, z = 0}, facedir, "techage:water_stop")
remove_node(pos, {x =-1, y = 1, z =-1}, facedir, "techage:water_stop")
remove_node(pos, {x = 1, y = 1, z =-1}, facedir, "techage:water_stop")
remove_node(pos, {x =-1, y = 1, z = 1}, facedir, "techage:water_stop")
remove_node(pos, {x = 1, y = 1, z = 1}, facedir, "techage:water_stop")
end
local function start_wheel(pos, facedir, backward)
local obj = minetest.add_entity(pos, "techage:ta1_watermill_entity")
local dir = minetest.facedir_to_dir(facedir)
local yaw = minetest.dir_to_yaw(dir)
if backward then
obj:set_rotation({x=-math.pi/2, y=yaw, z=0})
else
obj:set_rotation({x=math.pi/2, y=yaw, z=0})
end
local self = obj:get_luaentity()
self.facedir = facedir
add_node(pos, {x = 0, y = 1, z = 0}, facedir, "techage:water_stop")
add_node(pos, {x =-1, y = 0, z = 0}, facedir, "techage:water_stop")
add_node(pos, {x = 1, y = 0, z = 0}, facedir, "techage:water_stop")
add_node(pos, {x =-1, y = 1, z =-1}, facedir, "techage:water_stop")
add_node(pos, {x = 1, y = 1, z =-1}, facedir, "techage:water_stop")
add_node(pos, {x =-1, y = 1, z = 1}, facedir, "techage:water_stop")
add_node(pos, {x = 1, y = 1, z = 1}, facedir, "techage:water_stop")
minetest.remove_node(pos)
end
local function stop_wheel(pos, self)
self.facedir = self.facedir or 0
if self.facedir == 0 or self.facedir == 2 then
minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 4})
M(pos):set_int("facedir", self.facedir)
minetest.get_node_timer(pos):start(2)
elseif self.facedir == 1 or self.facedir == 3 then
minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 13})
M(pos):set_int("facedir", self.facedir)
minetest.get_node_timer(pos):start(2)
end
remove_nodes(pos, self.facedir)
self.object:remove()
end
local function trigger_consumer(pos, facedir)
local outdir = facedir + 1
local resp = techage.transfer(
pos,
outdir, -- outdir
"trigger", -- topic
nil, -- payload
techage.TA1Axle, -- network
nil) -- valid nodes
if not resp then
outdir = tubelib2.Turn180Deg[outdir]
resp = techage.transfer(
pos,
outdir, -- outdir
"trigger", -- topic
nil, -- payload
techage.TA1Axle, -- network
nil) -- valid nodes
end
end
minetest.register_node("techage:ta1_watermill", {
description = S("TA1 Watermill"),
tiles = {
-- up, down, right, left, back, front
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
{-4.5/2, -1/2, 0.8/2, 4.5/2, 1/2, 1.0/2},
{-4.5/2, -1/2, -1.0/2, 4.5/2, 1/2, -0.8/2},
{-3.8/2, -1/2, 2.1/2, 3.8/2, 1/2, 2.3/2},
{-3.8/2, -1/2, -2.3/2, 3.8/2, 1/2, -2.1/2},
{ 0.8/2, -1/2, -4.5/2, 1.0/2, 1/2, 4.5/2},
{-1.0/2, -1/2, -4.5/2, -0.8/2, 1/2, 4.5/2},
{ 2.1/2, -1/2, -3.8/2, 2.3/2, 1/2, 3.8/2},
{-2.3/2, -1/2, -3.8/2, -2.1/2, 1/2, 3.8/2},
},
},
on_rightclick = function(pos, node, clicker)
start_wheel(pos, M(pos):get_int("facedir"))
end,
on_timer = function(pos, elapsed)
local tRes = {}
if water_flowing(pos, M(pos):get_int("facedir"), tRes) then
start_wheel(pos, M(pos):get_int("facedir"), tRes.backward)
end
return true
end,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 2, crumbly = 2, choppy = 2, not_in_creative_inventory = 1},
node_placement_prediction = "",
drop = "techage:ta1_watermill_inv",
})
-- A smaller one for the inventory
minetest.register_node("techage:ta1_watermill_inv", {
description = S("TA1 Watermill"),
--inventory_image = "techage_waterwheel_inv.png",
--wield_image = "techage_waterwheel_inv.png",
tiles = {
-- up, down, right, left, back, front
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
{-4.5/4, 0.8/4, -1/4, 4.5/4, 1.0/4, 1/4},
{-4.5/4, -1.0/4, -1/4, 4.5/4, -0.8/4, 1/4},
{-3.8/4, 2.1/4, -1/4, 3.8/4, 2.3/4, 1/4},
{-3.8/4, -2.3/4, -1/4, 3.8/4, -2.1/4, 1/4},
{ 0.8/4, -4.5/4, -1/4, 1.0/4, 4.5/4, 1/4},
{-1.0/4, -4.5/4, -1/4, -0.8/4, 4.5/4, 1/4},
{ 2.1/4, -3.8/4, -1/4, 2.3/4, 3.8/4, 1/4},
{-2.3/4, -3.8/4, -1/4, -2.1/4, 3.8/4, 1/4},
},
},
after_place_node = function(pos, placer)
local node = minetest.get_node(pos)
M(pos):set_int("facedir", node.param2)
remove_nodes(pos, node.param2)
if (node.param2 == 0 or node.param2 == 2) and enough_space(pos, node.param2) then
minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 4})
minetest.get_node_timer(pos):start(2)
elseif (node.param2 == 1 or node.param2 == 3) and enough_space(pos, node.param2) then
minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 13})
minetest.get_node_timer(pos):start(2)
else
minetest.remove_node(pos)
return true
end
end,
paramtype2 = "facedir",
node_placement_prediction = "",
diggable = false,
})
techage.register_node({"techage:ta1_watermill"}, {
on_node_load = function(pos, node)
minetest.get_node_timer(pos):start(2)
end,
})
minetest.register_entity("techage:ta1_watermill_entity", {
initial_properties = {
physical = true,
collisionbox = {-0.5, -1.5, -1.5, 0.5, 1.5, 1.5},
visual = "wielditem",
wield_item = "techage:ta1_watermill",
visual_size = {x=0.67, y=0.67, z=0.67},
static_save = true,
automatic_rotate = -math.pi * 0.2,
pointable = false,
},
on_step = function(self, dtime)
self.dtime = (self.dtime or 0) + dtime
if self.dtime > 2 then
self.dtime = 0
local pos = vector.round(self.object:get_pos())
if not water_flowing(pos, self.facedir, {}) then
stop_wheel(pos, self)
end
trigger_consumer(pos, self.facedir)
minetest.sound_play("techage_watermill", {gain = 0.5, pos = pos,
max_hear_distance = 10}, true)
end
end,
on_rightclick = function(self, clicker)
local pos = vector.round(self.object:get_pos())
stop_wheel(pos, self)
end,
on_activate = function(self, staticdata)
self.facedir = tonumber(staticdata) or 0
end,
get_staticdata = function(self)
return self.facedir
end,
})
minetest.register_node("techage:water_stop", {
description = "Water Stop",
drawtype = "glasslike_framed_optional",
tiles = {"blank.png"},
inventory_image = 'techage_invisible_inv.png',
use_texture_alpha = "blend",
paramtype = "light",
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 3},
sounds = default.node_sound_glass_defaults(),
drop = "",
})
minetest.register_craft({
output = "techage:ta1_watermill_inv",
recipe = {
{"techage:ta1_board1_apple", "techage:ta1_board1_apple", "techage:ta1_board1_apple"},
{"techage:ta1_board1_apple", "default:wood", "techage:ta1_board1_apple"},
{"techage:ta1_board1_apple", "techage:ta1_board1_apple", "techage:ta1_board1_apple"},
},
})