update
This commit is contained in:
parent
9a1372cd6a
commit
0e3c55ffc3
10 changed files with 345 additions and 27 deletions
|
@ -7,20 +7,33 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.1.0] - 2020-12-14
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Clean Glass versions of Trap and (Super) Glowing Glass.
|
||||||
|
- Compressed desert cobblestone.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Revised placing strategy that takes into account which side of the face
|
||||||
|
(top/bottom for horizontal, left/right for vertical placement) is being clicked.
|
||||||
|
Aux (sprint/special, default E) key can be used to place the node with the orientation
|
||||||
|
it would have if placed from the other side.
|
||||||
|
When placing nodes next to nodes of the same gategory (e.g.slab to slab) the other
|
||||||
|
node's orientation is copied, flipping it placing on top or below an upright or
|
||||||
|
upside-down node. In this case the aux key will disable the special processing of
|
||||||
|
same-category nodes.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Revised minetest_game crafting recipe overrides to match Minetest 5.0.0 and later.
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
- Legacy Stairs+ conversion code.
|
- Legacy Stairs+ conversion code.
|
||||||
- It was only required to import worlds last edited before Q3 2013.
|
- It was only required to import worlds last edited before Q3 2013.
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Switch to GitHub Actions.
|
|
||||||
- Benefits include faster responses.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Compressed desert cobblestone.
|
|
||||||
|
|
||||||
## [2.0.0] - 2019-11-25
|
## [2.0.0] - 2019-11-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@ -104,7 +117,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||||
|
|
||||||
- Initial versioned release.
|
- Initial versioned release.
|
||||||
|
|
||||||
[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.0.0...HEAD
|
[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...HEAD
|
||||||
|
[2.1.0]: https://github.com/minetest-mods/moreblocks/compare/v2.0.0...v2.1.0
|
||||||
[2.0.0]: https://github.com/minetest-mods/moreblocks/compare/v1.3.0...v2.0.0
|
[2.0.0]: https://github.com/minetest-mods/moreblocks/compare/v1.3.0...v2.0.0
|
||||||
[1.3.0]: https://github.com/minetest-mods/moreblocks/compare/v1.2.0...v1.3.0
|
[1.3.0]: https://github.com/minetest-mods/moreblocks/compare/v1.2.0...v1.3.0
|
||||||
[1.2.0]: https://github.com/minetest-mods/moreblocks/compare/v1.1.0...v1.2.0
|
[1.2.0]: https://github.com/minetest-mods/moreblocks/compare/v1.1.0...v1.2.0
|
||||||
|
|
|
@ -58,7 +58,7 @@ on that line.
|
||||||
|
|
||||||
## Version compatibility
|
## Version compatibility
|
||||||
|
|
||||||
More Blocks is currently primarily tested with Minetest 5.1.0.
|
More Blocks is currently primarily tested with Minetest 5.3.0.
|
||||||
It may or may not work with newer or older versions. Issues arising in older
|
It may or may not work with newer or older versions. Issues arising in older
|
||||||
versions than 5.0.0 will generally not be fixed.
|
versions than 5.0.0 will generally not be fixed.
|
||||||
|
|
||||||
|
|
|
@ -348,12 +348,36 @@ minetest.register_craft({
|
||||||
recipe = {"moreblocks:sweeper", "default:glass"},
|
recipe = {"moreblocks:sweeper", "default:glass"},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"moreblocks:sweeper", "moreblocks:trap_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "moreblocks:glow_glass",
|
output = "moreblocks:glow_glass",
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
recipe = {"default:torch", "default:glass"},
|
recipe = {"default:torch", "default:glass"},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:clean_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:torch", "moreblocks:clean_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:clean_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"moreblocks:sweeper", "moreblocks:glow_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "moreblocks:trap_glow_glass",
|
output = "moreblocks:trap_glow_glass",
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
|
@ -366,6 +390,26 @@ minetest.register_craft({
|
||||||
recipe = {"default:mese_crystal_fragment", "moreblocks:glow_glass"},
|
recipe = {"default:mese_crystal_fragment", "moreblocks:glow_glass"},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- several recipes are possible for the trap+clean+glow, we only present 3 of them
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glow_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glass", "default:torch"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"moreblocks:sweeper", "moreblocks:trap_glow_glass" },
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "moreblocks:super_glow_glass",
|
output = "moreblocks:super_glow_glass",
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
|
@ -378,6 +422,24 @@ minetest.register_craft({
|
||||||
recipe = {"default:torch", "moreblocks:glow_glass"},
|
recipe = {"default:torch", "moreblocks:glow_glass"},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:torch", "default:torch", "moreblocks:clean_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:torch", "moreblocks:clean_glow_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"moreblocks:sweeper", "moreblocks:super_glow_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "moreblocks:trap_super_glow_glass",
|
output = "moreblocks:trap_super_glow_glass",
|
||||||
|
@ -391,6 +453,32 @@ minetest.register_craft({
|
||||||
recipe = {"default:mese_crystal_fragment", "moreblocks:super_glow_glass"},
|
recipe = {"default:mese_crystal_fragment", "moreblocks:super_glow_glass"},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- several recipes are possible for the trap+clean+glow, we only present 4 of them
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:mese_crystal_fragment", "moreblocks:clean_super_glow_glass"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glow_glass", "default:torch"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"default:mese_crystal_fragment", "moreblocks:clean_glass", "default:torch", "default:torch"},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "moreblocks:trap_clean_super_glow_glass",
|
||||||
|
type = "shapeless",
|
||||||
|
recipe = {"moreblocks:sweeper", "moreblocks:trap_super_glow_glass" },
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "moreblocks:coal_stone",
|
output = "moreblocks:coal_stone",
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
|
|
|
@ -349,6 +349,19 @@ local nodes = {
|
||||||
sounds = sound_stone,
|
sounds = sound_stone,
|
||||||
no_stairs = true,
|
no_stairs = true,
|
||||||
},
|
},
|
||||||
|
["trap_clean_glass"] = {
|
||||||
|
description = S("Trap Clean Glass"),
|
||||||
|
drawtype = "glasslike_framed_optional",
|
||||||
|
tiles = {"moreblocks_clean_glass.png^moreblocks_trap_box_glass.png", "moreblocks_clean_glass_detail.png"},
|
||||||
|
use_texture_alpha = true,
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
is_ground_content = false,
|
||||||
|
walkable = false,
|
||||||
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
|
sounds = sound_glass,
|
||||||
|
no_stairs = true,
|
||||||
|
},
|
||||||
["trap_sandstone"] = {
|
["trap_sandstone"] = {
|
||||||
description = S("Trap Sandstone"),
|
description = S("Trap Sandstone"),
|
||||||
drawtype = "glasslike_framed",
|
drawtype = "glasslike_framed",
|
||||||
|
@ -407,6 +420,18 @@ local nodes = {
|
||||||
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
sounds = sound_glass,
|
sounds = sound_glass,
|
||||||
},
|
},
|
||||||
|
["clean_glow_glass"] = {
|
||||||
|
description = S("Clean Glow Glass"),
|
||||||
|
drawtype = "glasslike_framed_optional",
|
||||||
|
tiles = {"moreblocks_clean_glass.png^[colorize:#E9CD61", "moreblocks_clean_glass_detail.png^[colorize:#E9CD61"},
|
||||||
|
use_texture_alpha = true,
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
is_ground_content = false,
|
||||||
|
light_source = 11,
|
||||||
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
|
sounds = sound_glass,
|
||||||
|
},
|
||||||
["trap_glow_glass"] = {
|
["trap_glow_glass"] = {
|
||||||
description = S("Trap Glow Glass"),
|
description = S("Trap Glow Glass"),
|
||||||
drawtype = "glasslike_framed_optional",
|
drawtype = "glasslike_framed_optional",
|
||||||
|
@ -421,6 +446,20 @@ local nodes = {
|
||||||
sounds = sound_glass,
|
sounds = sound_glass,
|
||||||
no_stairs = true,
|
no_stairs = true,
|
||||||
},
|
},
|
||||||
|
["trap_clean_glow_glass"] = {
|
||||||
|
description = S("Trap Clean Glow Glass"),
|
||||||
|
drawtype = "glasslike_framed_optional",
|
||||||
|
tiles = {"moreblocks_clean_glass.png^[colorize:#E9CD61^moreblocks_trap_box_glass.png", "moreblocks_clean_glass_detail.png^[colorize:#E9CD61"},
|
||||||
|
use_texture_alpha = true,
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
is_ground_content = false,
|
||||||
|
light_source = 11,
|
||||||
|
walkable = false,
|
||||||
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
|
sounds = sound_glass,
|
||||||
|
no_stairs = true,
|
||||||
|
},
|
||||||
["super_glow_glass"] = {
|
["super_glow_glass"] = {
|
||||||
description = S("Super Glow Glass"),
|
description = S("Super Glow Glass"),
|
||||||
drawtype = "glasslike_framed_optional",
|
drawtype = "glasslike_framed_optional",
|
||||||
|
@ -433,6 +472,18 @@ local nodes = {
|
||||||
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
sounds = sound_glass,
|
sounds = sound_glass,
|
||||||
},
|
},
|
||||||
|
["clean_super_glow_glass"] = {
|
||||||
|
description = S("Clean Super Glow Glass"),
|
||||||
|
drawtype = "glasslike_framed_optional",
|
||||||
|
tiles = {"moreblocks_clean_glass.png^[colorize:#FFFF78", "moreblocks_clean_glass_detail.png^[colorize:#FFFF78"},
|
||||||
|
use_texture_alpha = true,
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
is_ground_content = false,
|
||||||
|
light_source = default.LIGHT_MAX,
|
||||||
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
|
sounds = sound_glass,
|
||||||
|
},
|
||||||
["trap_super_glow_glass"] = {
|
["trap_super_glow_glass"] = {
|
||||||
description = S("Trap Super Glow Glass"),
|
description = S("Trap Super Glow Glass"),
|
||||||
drawtype = "glasslike_framed_optional",
|
drawtype = "glasslike_framed_optional",
|
||||||
|
@ -447,6 +498,20 @@ local nodes = {
|
||||||
sounds = sound_glass,
|
sounds = sound_glass,
|
||||||
no_stairs = true,
|
no_stairs = true,
|
||||||
},
|
},
|
||||||
|
["trap_clean_super_glow_glass"] = {
|
||||||
|
description = S("Trap Clean Super Glow Glass"),
|
||||||
|
drawtype = "glasslike_framed_optional",
|
||||||
|
tiles = {"moreblocks_clean_glass.png^[colorize:#FFFF78^moreblocks_trap_box_glass.png", "moreblocks_clean_glass_detail.png^[colorize:#FFFF78"},
|
||||||
|
use_texture_alpha = true,
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
is_ground_content = false,
|
||||||
|
light_source = default.LIGHT_MAX,
|
||||||
|
walkable = false,
|
||||||
|
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||||
|
sounds = sound_glass,
|
||||||
|
no_stairs = true,
|
||||||
|
},
|
||||||
["rope"] = {
|
["rope"] = {
|
||||||
description = S("Rope"),
|
description = S("Rope"),
|
||||||
drawtype = "signlike",
|
drawtype = "signlike",
|
||||||
|
|
|
@ -7,24 +7,42 @@ Licensed under the zlib license. See LICENSE.md for more information.
|
||||||
|
|
||||||
-- Redefinitions of some default crafting recipes:
|
-- Redefinitions of some default crafting recipes:
|
||||||
|
|
||||||
minetest.register_craft({
|
-- Signs: +1
|
||||||
output = "default:sign_wall 4",
|
minetest.clear_craft({
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:wood", "default:wood", "default:wood"},
|
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
|
||||||
{"default:wood", "default:wood", "default:wood"},
|
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
|
||||||
{"", "default:stick", ""},
|
{'', 'group:stick', ''},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.clear_craft({
|
||||||
|
recipe = {
|
||||||
|
{'group:wood', 'group:wood', 'group:wood'},
|
||||||
|
{'group:wood', 'group:wood', 'group:wood'},
|
||||||
|
{'', 'group:stick', ''},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "default:ladder 4",
|
output = 'default:sign_wall_steel 4',
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:stick", "", "default:stick"},
|
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
|
||||||
{"default:stick", "default:stick", "default:stick"},
|
{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
|
||||||
{"default:stick", "", "default:stick"},
|
{'', 'group:stick', ''},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = 'default:sign_wall_wood 4',
|
||||||
|
recipe = {
|
||||||
|
{'group:wood', 'group:wood', 'group:wood'},
|
||||||
|
{'group:wood', 'group:wood', 'group:wood'},
|
||||||
|
{'', 'group:stick', ''},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
minetest.clear_craft({
|
minetest.clear_craft({
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:papyrus", "default:papyrus", "default:papyrus"}
|
{"default:papyrus", "default:papyrus", "default:papyrus"}
|
||||||
|
@ -37,6 +55,7 @@ minetest.register_craft({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "default:rail 24",
|
output = "default:rail 24",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
|
|
@ -15,6 +15,97 @@ local descriptions = {
|
||||||
["stair"] = S("%s Stairs"),
|
["stair"] = S("%s Stairs"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- Extends the standad rotate_node placement so that it takes into account
|
||||||
|
-- the side (top/bottom or left/right) of the face being pointed at.
|
||||||
|
-- As with the standard rotate_node, sneak can be used to force the perpendicular
|
||||||
|
-- placement (wall placement on floor/ceiling, floor/ceiling placement on walls).
|
||||||
|
-- Additionally, the aux / sprint / special key can be used to place the node
|
||||||
|
-- as if from the opposite side.
|
||||||
|
--
|
||||||
|
-- When placing a node next to one of the same category (e.g. slab to slab or
|
||||||
|
-- stair to stair), the default placement (regardless of sneak) is to copy the
|
||||||
|
-- under node's param2, flipping if placed above or below it. The aux key disable
|
||||||
|
-- this behavior.
|
||||||
|
local wall_right_dirmap = {9, 18, 7, 12}
|
||||||
|
local wall_left_dirmap = {11, 16, 5, 14}
|
||||||
|
local ceil_dirmap = {20, 23, 22, 21}
|
||||||
|
|
||||||
|
stairsplus.rotate_node_aux = function(itemstack, placer, pointed_thing)
|
||||||
|
local sneak = placer and placer:get_player_control().sneak
|
||||||
|
local aux = placer and placer:get_player_control().aux1
|
||||||
|
|
||||||
|
-- namestring for what we are placing, up to the first _ (exclusive)
|
||||||
|
local item_prefix = itemstack:get_name():gsub("_.*$", "")
|
||||||
|
-- namestring for what we are placing against
|
||||||
|
local under = pointed_thing.under
|
||||||
|
local under_node = minetest.get_node(under)
|
||||||
|
local under_prefix = under_node and under_node.name:gsub("_.*$", "")
|
||||||
|
|
||||||
|
local same_cat = item_prefix == under_prefix
|
||||||
|
|
||||||
|
-- standard (floor) facedir, also used for sneak placement against the lower half of the wall
|
||||||
|
local p2 = placer and minetest.dir_to_facedir(placer:get_look_dir()) or 0
|
||||||
|
|
||||||
|
-- check which face and which quadrant we are interested in
|
||||||
|
-- this is used both to check if we're handling parallel placement in the same-category case,
|
||||||
|
-- and in general for sneak placement
|
||||||
|
local face_pos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
|
||||||
|
local face_off = vector.subtract(face_pos, under)
|
||||||
|
local wallmounted = minetest.dir_to_wallmounted(face_off)
|
||||||
|
|
||||||
|
if same_cat and not aux then
|
||||||
|
p2 = under_node.param2
|
||||||
|
-- flip if placing above or below an upright or upside-down node
|
||||||
|
-- TODO should we also flip when placing next to a side-mounted node?
|
||||||
|
if wallmounted < 2 then
|
||||||
|
if p2 < 4 then
|
||||||
|
p2 = (p2 + 2) % 4
|
||||||
|
p2 = ceil_dirmap[p2 + 1]
|
||||||
|
elseif p2 > 19 then
|
||||||
|
p2 = ceil_dirmap[p2 - 19] - 20
|
||||||
|
p2 = (p2 + 2) % 4
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- for same-cat placement, aux is used to disable param2 copying
|
||||||
|
if same_cat then
|
||||||
|
aux = not aux
|
||||||
|
end
|
||||||
|
|
||||||
|
local remap = nil
|
||||||
|
|
||||||
|
-- standard placement against the wall
|
||||||
|
local use_wallmap = (wallmounted > 1 and not sneak) or (wallmounted < 2 and sneak)
|
||||||
|
|
||||||
|
-- standard placement against the ceiling, or sneak placement against the upper half of the wall
|
||||||
|
local use_ceilmap = wallmounted == 1 and not sneak
|
||||||
|
use_ceilmap = use_ceilmap or (wallmounted > 1 and sneak and face_off.y > 0)
|
||||||
|
|
||||||
|
if use_wallmap then
|
||||||
|
local left = (p2 == 0 and face_off.x < 0) or
|
||||||
|
(p2 == 1 and face_off.z > 0) or
|
||||||
|
(p2 == 2 and face_off.x > 0) or
|
||||||
|
(p2 == 3 and face_off.z < 0)
|
||||||
|
if aux then
|
||||||
|
left = not left
|
||||||
|
end
|
||||||
|
remap = left and wall_left_dirmap or wall_right_dirmap
|
||||||
|
elseif use_ceilmap then
|
||||||
|
remap = ceil_dirmap
|
||||||
|
end
|
||||||
|
|
||||||
|
if aux then
|
||||||
|
p2 = (p2 + 2) % 4
|
||||||
|
end
|
||||||
|
|
||||||
|
if remap then
|
||||||
|
p2 = remap[p2 + 1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return minetest.item_place(itemstack, placer, pointed_thing, p2)
|
||||||
|
end
|
||||||
|
|
||||||
stairsplus.register_single = function(category, alternate, info, modname, subname, recipeitem, fields)
|
stairsplus.register_single = function(category, alternate, info, modname, subname, recipeitem, fields)
|
||||||
local src_def = minetest.registered_nodes[recipeitem] or {}
|
local src_def = minetest.registered_nodes[recipeitem] or {}
|
||||||
local desc_base = descriptions[category]:format(fields.description)
|
local desc_base = descriptions[category]:format(fields.description)
|
||||||
|
@ -42,7 +133,7 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam
|
||||||
-- Darken light sources slightly to make up for their smaller visual size
|
-- Darken light sources slightly to make up for their smaller visual size
|
||||||
def.light_source = math.max(0, (def.light_source or 0) - 1)
|
def.light_source = math.max(0, (def.light_source or 0) - 1)
|
||||||
|
|
||||||
def.on_place = minetest.rotate_node
|
def.on_place = stairsplus.rotate_node_aux
|
||||||
def.groups = stairsplus:prepare_groups(fields.groups)
|
def.groups = stairsplus:prepare_groups(fields.groups)
|
||||||
|
|
||||||
if category == "slab" then
|
if category == "slab" then
|
||||||
|
|
|
@ -35,6 +35,15 @@ local Tube = tubelib2.Tube:new({
|
||||||
|
|
||||||
tubelib.Tube = Tube
|
tubelib.Tube = Tube
|
||||||
|
|
||||||
|
local function ON_BLAST(id)
|
||||||
|
return function (pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
Tube:after_dig_tube(pos, node)
|
||||||
|
return {id}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_node("tubelib:tubeS", {
|
minetest.register_node("tubelib:tubeS", {
|
||||||
description = S("Tubelib Tube"),
|
description = S("Tubelib Tube"),
|
||||||
tiles = { -- Top, base, right, left, front, back
|
tiles = { -- Top, base, right, left, front, back
|
||||||
|
@ -80,6 +89,7 @@ minetest.register_node("tubelib:tubeS", {
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
groups = {choppy=2, cracky=3},
|
groups = {choppy=2, cracky=3},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
on_blast = ON_BLAST("tubelib:tubeS"),
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("tubelib:tubeA", {
|
minetest.register_node("tubelib:tubeA", {
|
||||||
|
@ -121,6 +131,7 @@ minetest.register_node("tubelib:tubeA", {
|
||||||
groups = {choppy=2, cracky=3, not_in_creative_inventory=1},
|
groups = {choppy=2, cracky=3, not_in_creative_inventory=1},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
drop = "tubelib:tubeS",
|
drop = "tubelib:tubeS",
|
||||||
|
on_blast = ON_BLAST("tubelib:tubeA"),
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
|
|
|
@ -119,7 +119,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||||
local inv = M(pos):get_inventory()
|
local inv = M(pos):get_inventory()
|
||||||
if listname == "main" then
|
if listname == "main" then
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
elseif listname == "fuel" and stack:get_name() == "tubelib_addons1:biofuel" then
|
elseif listname == "fuel" and tubelib.is_fuel(stack) then
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
end
|
||||||
return 0
|
return 0
|
||||||
|
@ -147,6 +147,16 @@ local function remove_all_sapling_items(pos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function is_plantable_ground(node)
|
||||||
|
if minetest.get_item_group(node.name, "soil") ~= 0 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if minetest.get_item_group(node.name, "sand") ~= 0 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
-- Remove wood/leave nodes and place sapling if necessary
|
-- Remove wood/leave nodes and place sapling if necessary
|
||||||
-- Return false if inventory is full
|
-- Return false if inventory is full
|
||||||
-- else return true
|
-- else return true
|
||||||
|
@ -163,7 +173,7 @@ local function remove_or_replace_node(this, pos, inv, node, order)
|
||||||
minetest.remove_node(pos)
|
minetest.remove_node(pos)
|
||||||
inv:add_item("main", ItemStack(order.drop))
|
inv:add_item("main", ItemStack(order.drop))
|
||||||
this.num_items = this.num_items + 1
|
this.num_items = this.num_items + 1
|
||||||
if tubelib_addons1.GroundNodes[next_node.name] ~= nil and order.plant then -- hit the ground?
|
if is_plantable_ground(next_node) and order.plant then -- hit the ground?
|
||||||
minetest.set_node(pos, {name=order.plant, paramtype2 = "wallmounted", param2=1})
|
minetest.set_node(pos, {name=order.plant, paramtype2 = "wallmounted", param2=1})
|
||||||
if order.t1 ~= nil then
|
if order.t1 ~= nil then
|
||||||
-- We have to simulate "on_place" and start the timer by hand
|
-- We have to simulate "on_place" and start the timer by hand
|
||||||
|
@ -180,7 +190,12 @@ end
|
||||||
-- check the fuel level and return false if empty
|
-- check the fuel level and return false if empty
|
||||||
local function check_fuel(pos, this, meta)
|
local function check_fuel(pos, this, meta)
|
||||||
if this.fuel <= 0 then
|
if this.fuel <= 0 then
|
||||||
if tubelib.get_this_item(meta, "fuel", 1) == nil then
|
local fuel_item = tubelib.get_this_item(meta, "fuel", 1)
|
||||||
|
if fuel_item == nil then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if not tubelib.is_fuel(fuel_item) then
|
||||||
|
tubelib.put_item(meta, "fuel", fuel_item)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
this.fuel = BURNING_TIME
|
this.fuel = BURNING_TIME
|
||||||
|
@ -222,7 +237,7 @@ local function harvest_field(this, meta)
|
||||||
if node and node.name ~= "air" then
|
if node and node.name ~= "air" then
|
||||||
local order = tubelib_addons1.FarmingNodes[node.name] or tubelib_addons1.Flowers[node.name]
|
local order = tubelib_addons1.FarmingNodes[node.name] or tubelib_addons1.Flowers[node.name]
|
||||||
if order then
|
if order then
|
||||||
if not remove_or_replace_node(this, pos, inv, node, order) then
|
if not minetest.is_protected(pos, this.owner) and not remove_or_replace_node(this, pos, inv, node, order) then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -433,6 +448,9 @@ tubelib.register_node("tubelib_addons1:harvester_base", {"tubelib_addons1:harves
|
||||||
return tubelib.get_item(M(pos), "main")
|
return tubelib.get_item(M(pos), "main")
|
||||||
end,
|
end,
|
||||||
on_push_item = function(pos, side, item)
|
on_push_item = function(pos, side, item)
|
||||||
|
if not tubelib.is_fuel(item) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
return tubelib.put_item(M(pos), "fuel", item)
|
return tubelib.put_item(M(pos), "fuel", item)
|
||||||
end,
|
end,
|
||||||
on_unpull_item = function(pos, side, item)
|
on_unpull_item = function(pos, side, item)
|
||||||
|
|
|
@ -122,7 +122,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||||
local inv = M(pos):get_inventory()
|
local inv = M(pos):get_inventory()
|
||||||
if listname == "main" then
|
if listname == "main" then
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
elseif listname == "fuel" and stack:get_name() == "tubelib_addons1:biofuel" then
|
elseif listname == "fuel" and tubelib.is_fuel(stack) then
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
end
|
||||||
return 0
|
return 0
|
||||||
|
@ -164,10 +164,16 @@ local function quarry_next_node(pos, meta)
|
||||||
-- check fuel
|
-- check fuel
|
||||||
local fuel = meta:get_int("fuel") or 0
|
local fuel = meta:get_int("fuel") or 0
|
||||||
if fuel <= 0 then
|
if fuel <= 0 then
|
||||||
if tubelib.get_this_item(meta, "fuel", 1) == nil then
|
local fuel_item = tubelib.get_this_item(meta, "fuel", 1)
|
||||||
|
if fuel_item == nil then
|
||||||
State:fault(pos, meta)
|
State:fault(pos, meta)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
if not tubelib.is_fuel(fuel_item) then
|
||||||
|
State:fault(pos, meta)
|
||||||
|
tubelib.put_item(meta, "fuel", fuel_item)
|
||||||
|
return
|
||||||
|
end
|
||||||
fuel = BURNING_TIME
|
fuel = BURNING_TIME
|
||||||
else
|
else
|
||||||
fuel = fuel - 1
|
fuel = fuel - 1
|
||||||
|
@ -443,6 +449,9 @@ tubelib.register_node("tubelib_addons1:quarry",
|
||||||
return tubelib.get_item(M(pos), "main")
|
return tubelib.get_item(M(pos), "main")
|
||||||
end,
|
end,
|
||||||
on_push_item = function(pos, side, item)
|
on_push_item = function(pos, side, item)
|
||||||
|
if not tubelib.is_fuel(item) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
return tubelib.put_item(M(pos), "fuel", item)
|
return tubelib.put_item(M(pos), "fuel", item)
|
||||||
end,
|
end,
|
||||||
on_unpull_item = function(pos, side, item)
|
on_unpull_item = function(pos, side, item)
|
||||||
|
|
|
@ -342,6 +342,9 @@ minetest.register_craft({
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function tubelib.is_fuel(stack)
|
||||||
|
return stack:get_name() == "tubelib_addons1:biofuel"
|
||||||
|
end
|
||||||
|
|
||||||
tubelib.register_node("tubelib_addons1:reformer", {"tubelib_addons1:reformer_defect"}, {
|
tubelib.register_node("tubelib_addons1:reformer", {"tubelib_addons1:reformer_defect"}, {
|
||||||
on_pull_item = function(pos, side)
|
on_pull_item = function(pos, side)
|
||||||
|
|
Loading…
Reference in a new issue