mods that hopefully work for a TechAge-based pack
This commit is contained in:
@@ -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"},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user