18 Commits

Author SHA1 Message Date
1f1959ba54 Bump to version 2.2.0 2021-06-29 00:41:22 +02:00
3b97ea5697 Fix deprecated use of use_texture_alpha (#180)
Co-authored-by: sys4 <bricassa@sys4.fr>
2021-03-20 00:19:35 +01:00
bcd1a5688b Update the changelog with recent fixes 2021-02-26 12:06:41 +01:00
1a03b041dd Handle shapeless recipes in redefinitions (#171)
They can be recognized from having width == 0, and don't need the items
list to be massaged to be transformed into the recipe field for the Lua
API.
2021-02-26 12:04:45 +01:00
b39bb31295 Resolve aliases in cost calculation (#175)
If stairs from stairs mod were crafted before moreblocks was enabled, the old (now aliased) stairs variant is kept in inventory. If the player tried to recycle that stair variant, `inv:contains_item("output", stackname)` would return true as `contains_item` resolves alias names, but `circular_saw:get_cost` would return nil as it's expecting exact `stackname` matches which would later crash due to nil arithmetic.

This PR fixes this issue by resolving alias using `minetest.registered_aliases` table.
`circular_saw:get_cost` should work now in every scenario where `inv:contains_item("output", stackname)` returns true.
2021-02-10 17:52:55 +01:00
ddf8b39f5a Realign the rail craft recipes (#169)
Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
2020-12-30 22:55:52 +01:00
ff7e85094f Fix strange placement behavior for non-default Stairs+ nodes (#168)
Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
2020-12-28 03:27:58 +01:00
0c2c3ad4ef Add in prepare_groups tree and wool (#128)
Tree for glitch with furnace
Wool  move for more coherence
2020-12-27 19:42:15 +01:00
8a14250127 Fix stairs placement over oddly-shaped nodes (#166) 2020-12-18 17:59:57 +01:00
cf0f875709 Bump to version 2.1.0 2020-12-14 14:52:04 +01:00
c3b45149b0 Update the changelog with recent fixes 2020-12-14 14:50:02 +01:00
ab91ad967a Improve the placement logic for slabs, etc (#160)
Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
2020-12-14 14:46:50 +01:00
5aacb05b14 Add Clean (Super) Glow Glass and traps (#159) 2020-12-14 14:44:21 +01:00
87e27d9f20 Refresh built-in crafting recipe overrides (#161) 2020-12-14 14:38:16 +01:00
26ca7af997 Update pre-commit hooks to version 3.3.0 2020-10-28 16:41:16 +01:00
3cfff98fc9 Replace Travis CI with GitHub Actions (#158)
Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro>
2020-10-02 11:21:10 +02:00
b67028a417 Fix use_texture_alpha warnings since 5.4.0-dev 2020-08-16 10:14:18 +02:00
c081caf494 Add Chinese Translation (#153) 2020-08-01 20:21:55 +02:00
14 changed files with 994 additions and 63 deletions

24
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,24 @@
name: build
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: actions/setup-python@master
- run: |
sudo apt-get update -qq
sudo apt-get install -qqq luarocks
- name: Install pre-commit
run: pip3 install pre-commit
- name: Install LuaCheck
run: luarocks install --local luacheck
- name: Run LuaCheck using pre-commit
run: |
pre-commit run --all-files
$HOME/.luarocks/bin/luacheck .

View File

@ -1,7 +1,8 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
rev: v3.3.0
hooks:
- id: fix-byte-order-marker
- id: end-of-file-fixer
- id: trailing-whitespace

View File

@ -1,15 +0,0 @@
dist: bionic
language: python
python:
- 3.7.1
install:
- sudo apt-get update -qq
- sudo apt-get install -qqq luarocks
- pip3 install pre-commit
- luarocks install --local luacheck
script:
- pre-commit run --all-files
- $HOME/.luarocks/bin/luacheck .

View File

@ -7,15 +7,49 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## [Unreleased]
## [2.2.0] - 2021-06-28
### Changed
- Refactored recipe override mechanism to avoid re-coding recipes
when we only want to change the amount produced.
- [Realigned rail recipe to the changes made in Minetest Game.](https://github.com/minetest-mods/moreblocks/pull/169)
- All rail recipes (standard, power, break) were boosted by 50%.
### Fixed
- [Shapeless crafting recipes are now handled in redefinitions.](https://github.com/minetest-mods/moreblocks/pull/171)
- [Aliases are now resolved in Stairs+ circular saw cost calculation.](https://github.com/minetest-mods/moreblocks/pull/175)
- [Fixed strange placement behavior for non-default Stairs+ nodes.](https://github.com/minetest-mods/moreblocks/pull/168)
- [Fixed stairs placement over oddly-shaped nodes.](https://github.com/minetest-mods/moreblocks/pull/166)
## [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
- Legacy Stairs+ conversion code.
- It was only required to import worlds last edited before Q3 2013.
### Added
- Compressed desert cobblestone.
## [2.0.0] - 2019-11-25
### Added
@ -99,7 +133,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Initial versioned release.
[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.0.0...HEAD
[Unreleased]: https://github.com/minetest-mods/moreblocks/compare/v2.2.0...HEAD
[2.2.0]: https://github.com/minetest-mods/moreblocks/compare/v2.1.0...v2.2.0
[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
[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

View File

@ -1,4 +1,4 @@
# More Blocks
# More Blocks [![Build status](https://github.com/minetest-mods/moreblocks/workflows/build/badge.svg)](https://github.com/minetest-mods/moreblocks/actions)
More Blocks for [Minetest](https://www.minetest.net/), a free and open source infinite
world block sandbox game.
@ -58,7 +58,7 @@ on that line.
## 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
versions than 5.0.0 will generally not be fixed.

View File

@ -89,8 +89,9 @@ circular_saw.names = {
}
function circular_saw:get_cost(inv, stackname)
local name = minetest.registered_aliases[stackname] or stackname
for i, item in pairs(inv:get_list("output")) do
if item:get_name() == stackname then
if item:get_name() == name then
return circular_saw.cost_in_microblocks[i]
end
end

View File

@ -348,12 +348,36 @@ minetest.register_craft({
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({
output = "moreblocks:glow_glass",
type = "shapeless",
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({
output = "moreblocks:trap_glow_glass",
type = "shapeless",
@ -366,6 +390,26 @@ minetest.register_craft({
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({
output = "moreblocks:super_glow_glass",
type = "shapeless",
@ -378,6 +422,24 @@ minetest.register_craft({
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({
output = "moreblocks:trap_super_glow_glass",
@ -391,6 +453,32 @@ minetest.register_craft({
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({
output = "moreblocks:coal_stone",
type = "shapeless",

288
locale/zh_CN.po Normal file
View File

@ -0,0 +1,288 @@
# Template translation for More Blocks.
# Copyright © 2011-2020 Hugo Locurcio and contributors
# This file is distributed under the same license as the More Blocks package.
# IFRFSX <IFRFSX@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: More Blocks\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-13 12:37+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: CodeXP <codexp@gmx.net>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: circular_saw.lua
msgid "Circular Saw"
msgstr "圆锯"
#: circular_saw.lua
msgid ""
"Input\n"
"material"
msgstr ""
"输入\n"
"材料"
#: circular_saw.lua
msgid "Left-over"
msgstr "剩余材料"
#: circular_saw.lua
msgid "Max"
msgstr "最大值"
#: circular_saw.lua
msgid ""
"Recycle\n"
"output"
msgstr ""
"回收\n"
"输出物"
#: circular_saw.lua
msgid "Set"
msgstr "设置"
#: circular_saw.lua
msgid "owned by @1"
msgstr "属于@1所有"
#: circular_saw.lua
msgid "Circular Saw is empty"
msgstr "圆锯是空的"
#: circular_saw.lua
msgid "Circular Saw is working on @1"
msgstr "圆锯正在加工@1"
#: init.lua
msgid "[moreblocks] loaded."
msgstr "[moreblocks] 已加载"
#: nodes.lua
msgid "Deprecated"
msgstr "弃用"
#: nodes.lua
msgid "All-faces Acacia Tree"
msgstr "全切面相思树木方块"
#: nodes.lua
msgid "All-faces Aspen Tree"
msgstr "全切面白杨树木方块"
#: nodes.lua
msgid "All-faces Jungle Tree"
msgstr "全切面丛林树木方块"
#: nodes.lua
msgid "All-faces Pine Tree"
msgstr "全切面松树木方块"
#: nodes.lua
msgid "All-faces Tree"
msgstr "全切面树木方块"
#: nodes.lua
msgid "Cactus Brick"
msgstr "仙人掌砖"
#: nodes.lua
msgid "Cactus Checker"
msgstr "仙人掌棋盘方块"
#: nodes.lua
msgid "Centered Wooden Tile"
msgstr "居中的木瓦"
#: nodes.lua
msgid "Checker Stone Tile"
msgstr "棋盘石瓦"
#: nodes.lua
msgid "Circle Stone Bricks"
msgstr "圆石砖"
#: nodes.lua
msgid "Clean Glass"
msgstr "干净的玻璃"
#: nodes.lua
msgid "Coal Checker"
msgstr "棋盘煤块"
#: nodes.lua
msgid "Coal Glass"
msgstr "煤玻璃"
#: nodes.lua
msgid "Coal Stone"
msgstr "煤炭石"
#: nodes.lua
msgid "Coal Stone Bricks"
msgstr "煤炭石砖"
#: nodes.lua
msgid "Compressed Cobblestone"
msgstr "压缩圆石"
#: nodes.lua
msgid "Compressed Dirt"
msgstr "压缩土"
#: nodes.lua
msgid "Copper Patina Block"
msgstr "铜绿方块"
#: nodes.lua
msgid "Empty Shelf"
msgstr "空书架"
#: nodes.lua
msgid "Full Wooden Tile"
msgstr "全木瓦"
#: nodes.lua
msgid "Glow Glass"
msgstr "发光玻璃"
#: nodes.lua
msgid "Iron Checker"
msgstr "棋盘铁方块"
#: nodes.lua
msgid "Iron Glass"
msgstr "铁玻璃"
#: nodes.lua
msgid "Iron Stone"
msgstr "铁石"
#: nodes.lua
msgid "Iron Stone Bricks"
msgstr "铁石砖"
#: nodes.lua
msgid "Plankstone"
msgstr "板石"
#: nodes.lua
msgid "Rope"
msgstr "绳子"
#: nodes.lua
msgid "Split Stone Tile"
msgstr "裂石砖"
#: nodes.lua
msgid "Stone Bricks"
msgstr "石砖"
#: nodes.lua
msgid "Stone Tile"
msgstr "石瓦"
#: nodes.lua
msgid "Super Glow Glass"
msgstr "超级发光玻璃"
#: nodes.lua
msgid "Sweeper"
msgstr "清扫器"
#: nodes.lua
msgid "Tar"
msgstr "焦油"
#: nodes.lua
msgid "Trap Desert Stone"
msgstr "陷阱沙漠石"
#: nodes.lua
msgid "Trap Glass"
msgstr "陷阱玻璃"
#: nodes.lua
msgid "Trap Glow Glass"
msgstr "陷阱发光玻璃"
#: nodes.lua
msgid "Trap Obsidian"
msgstr "陷阱黑耀石"
#: nodes.lua
msgid "Trap Obsidian Glass"
msgstr "陷阱黑耀石玻璃"
#: nodes.lua
msgid "Trap Sandstone"
msgstr "陷阱沙石"
#: nodes.lua
msgid "Trap Stone"
msgstr "陷阱石"
#: nodes.lua
msgid "Trap Super Glow Glass"
msgstr "陷阱超级发光玻璃"
#: nodes.lua
msgid "Wooden Tile"
msgstr "木瓦"
#: nodes.lua
msgid "Offset Wooden Tile"
msgstr "胶合木瓦"
# @deprecated
#: nodes.lua
msgid "Downwards Wooden Tile"
msgstr "向下的木瓦"
# @deprecated
#: nodes.lua
msgid "Leftwards Wooden Tile"
msgstr "向左的木瓦"
# @deprecated
#: nodes.lua
msgid "Rightwards Wooden Tile"
msgstr "向右的木瓦"
#: ownership.lua
msgid "Sorry, @1 owns that spot."
msgstr "抱歉,那个位置是@1的。"
#: ownership.lua
msgid "someone"
msgstr "某人"
#: stairsplus/common.lua
#, lua-format
msgid "%s Microblock"
msgstr "%s 小方块"
#: stairsplus/common.lua stairsplus/slabs.lua
#, lua-format
msgid "%s Slab"
msgstr "%s 台阶"
#: stairsplus/common.lua
#, lua-format
msgid "%s Slope"
msgstr "%s 斜坡"
#: stairsplus/common.lua
#, lua-format
msgid "%s Panel"
msgstr "%s 嵌板"
#: stairsplus/common.lua
#, lua-format
msgid "%s Stairs"
msgstr "%s 楼梯"

288
locale/zh_TW.po Normal file
View File

@ -0,0 +1,288 @@
# Template translation for More Blocks.
# Copyright © 2011-2020 Hugo Locurcio and contributors
# This file is distributed under the same license as the More Blocks package.
# IFRFSX <IFRFSX@protonmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: More Blocks\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-13 12:37+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: CodeXP <codexp@gmx.net>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: circular_saw.lua
msgid "Circular Saw"
msgstr "圓鋸"
#: circular_saw.lua
msgid ""
"Input\n"
"material"
msgstr ""
"輸入\n"
"材料"
#: circular_saw.lua
msgid "Left-over"
msgstr "剩餘材料"
#: circular_saw.lua
msgid "Max"
msgstr "最大值"
#: circular_saw.lua
msgid ""
"Recycle\n"
"output"
msgstr ""
"回收\n"
"輸出物"
#: circular_saw.lua
msgid "Set"
msgstr "設置"
#: circular_saw.lua
msgid "owned by @1"
msgstr "屬於@1所有"
#: circular_saw.lua
msgid "Circular Saw is empty"
msgstr "圓鋸是空的"
#: circular_saw.lua
msgid "Circular Saw is working on @1"
msgstr "圓鋸正在加工@1"
#: init.lua
msgid "[moreblocks] loaded."
msgstr "[moreblocks] 已加載"
#: nodes.lua
msgid "Deprecated"
msgstr "棄用"
#: nodes.lua
msgid "All-faces Acacia Tree"
msgstr "全切面相思樹木方塊"
#: nodes.lua
msgid "All-faces Aspen Tree"
msgstr "全切面白楊樹木方塊"
#: nodes.lua
msgid "All-faces Jungle Tree"
msgstr "全切面叢林樹木方塊"
#: nodes.lua
msgid "All-faces Pine Tree"
msgstr "全切面松樹木方塊"
#: nodes.lua
msgid "All-faces Tree"
msgstr "全切面樹木方塊"
#: nodes.lua
msgid "Cactus Brick"
msgstr "仙人掌磚"
#: nodes.lua
msgid "Cactus Checker"
msgstr "仙人掌棋盤方塊"
#: nodes.lua
msgid "Centered Wooden Tile"
msgstr "居中的木瓦"
#: nodes.lua
msgid "Checker Stone Tile"
msgstr "棋盤石瓦"
#: nodes.lua
msgid "Circle Stone Bricks"
msgstr "圓石磚"
#: nodes.lua
msgid "Clean Glass"
msgstr "乾淨的玻璃"
#: nodes.lua
msgid "Coal Checker"
msgstr "棋盤煤塊"
#: nodes.lua
msgid "Coal Glass"
msgstr "煤玻璃"
#: nodes.lua
msgid "Coal Stone"
msgstr "煤炭石"
#: nodes.lua
msgid "Coal Stone Bricks"
msgstr "煤炭石磚"
#: nodes.lua
msgid "Compressed Cobblestone"
msgstr "壓縮圓石"
#: nodes.lua
msgid "Compressed Dirt"
msgstr "壓縮土"
#: nodes.lua
msgid "Copper Patina Block"
msgstr "銅綠方塊"
#: nodes.lua
msgid "Empty Shelf"
msgstr "空書架"
#: nodes.lua
msgid "Full Wooden Tile"
msgstr "全木瓦"
#: nodes.lua
msgid "Glow Glass"
msgstr "發光玻璃"
#: nodes.lua
msgid "Iron Checker"
msgstr "棋盤鐵方塊"
#: nodes.lua
msgid "Iron Glass"
msgstr "鐵玻璃"
#: nodes.lua
msgid "Iron Stone"
msgstr "鐵石"
#: nodes.lua
msgid "Iron Stone Bricks"
msgstr "鐵石磚"
#: nodes.lua
msgid "Plankstone"
msgstr "板石"
#: nodes.lua
msgid "Rope"
msgstr "繩子"
#: nodes.lua
msgid "Split Stone Tile"
msgstr "裂石磚"
#: nodes.lua
msgid "Stone Bricks"
msgstr "石磚"
#: nodes.lua
msgid "Stone Tile"
msgstr "石瓦"
#: nodes.lua
msgid "Super Glow Glass"
msgstr "超級發光玻璃"
#: nodes.lua
msgid "Sweeper"
msgstr "清掃器"
#: nodes.lua
msgid "Tar"
msgstr "焦油"
#: nodes.lua
msgid "Trap Desert Stone"
msgstr "陷阱沙漠石"
#: nodes.lua
msgid "Trap Glass"
msgstr "陷阱玻璃"
#: nodes.lua
msgid "Trap Glow Glass"
msgstr "陷阱發光玻璃"
#: nodes.lua
msgid "Trap Obsidian"
msgstr "陷阱黑耀石"
#: nodes.lua
msgid "Trap Obsidian Glass"
msgstr "陷阱黑耀石玻璃"
#: nodes.lua
msgid "Trap Sandstone"
msgstr "陷阱沙石"
#: nodes.lua
msgid "Trap Stone"
msgstr "陷阱石"
#: nodes.lua
msgid "Trap Super Glow Glass"
msgstr "陷阱超級發光玻璃"
#: nodes.lua
msgid "Wooden Tile"
msgstr "木瓦"
#: nodes.lua
msgid "Offset Wooden Tile"
msgstr "膠合木瓦"
# @deprecated
#: nodes.lua
msgid "Downwards Wooden Tile"
msgstr "向下的木瓦"
# @deprecated
#: nodes.lua
msgid "Leftwards Wooden Tile"
msgstr "向左的木瓦"
# @deprecated
#: nodes.lua
msgid "Rightwards Wooden Tile"
msgstr "向右的木瓦"
#: ownership.lua
msgid "Sorry, @1 owns that spot."
msgstr "抱歉,那個位置是@1的。"
#: ownership.lua
msgid "someone"
msgstr "某人"
#: stairsplus/common.lua
#, lua-format
msgid "%s Microblock"
msgstr "%s 小方塊"
#: stairsplus/common.lua stairsplus/slabs.lua
#, lua-format
msgid "%s Slab"
msgstr "%s 臺階"
#: stairsplus/common.lua
#, lua-format
msgid "%s Slope"
msgstr "%s 斜坡"
#: stairsplus/common.lua
#, lua-format
msgid "%s Panel"
msgstr "%s 嵌板"
#: stairsplus/common.lua
#, lua-format
msgid "%s Stairs"
msgstr "%s 樓梯"

View File

@ -194,6 +194,7 @@ local nodes = {
description = S("Iron Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^[colorize:#DEDEDE", "default_glass_detail.png^[colorize:#DEDEDE"},
use_texture_alpha = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -204,6 +205,7 @@ local nodes = {
description = S("Coal Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^[colorize:#828282", "default_glass_detail.png^[colorize:#828282"},
use_texture_alpha = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -214,6 +216,7 @@ local nodes = {
description = S("Clean Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"moreblocks_clean_glass.png", "moreblocks_clean_glass_detail.png"},
use_texture_alpha = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -313,6 +316,7 @@ local nodes = {
description = S("Trap Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^moreblocks_trap_box_glass.png", "default_glass_detail.png"},
use_texture_alpha = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -325,6 +329,7 @@ local nodes = {
description = S("Trap Obsidian Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_obsidian_glass.png^moreblocks_trap_box_glass.png", "default_obsidian_glass_detail.png"},
use_texture_alpha = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -344,6 +349,19 @@ local nodes = {
sounds = sound_stone,
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 = "clip",
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"] = {
description = S("Trap Sandstone"),
drawtype = "glasslike_framed",
@ -394,6 +412,19 @@ local nodes = {
description = S("Glow Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^[colorize:#E9CD61", "default_glass_detail.png^[colorize:#E9CD61"},
use_texture_alpha = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
light_source = 11,
groups = {cracky = 3, oddly_breakable_by_hand = 3},
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 = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -405,6 +436,21 @@ local nodes = {
description = S("Trap Glow Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^[colorize:#E9CD61^moreblocks_trap_box_glass.png", "default_glass_detail.png^[colorize:#E9CD61"},
use_texture_alpha = "clip",
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,
},
["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 = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -418,6 +464,19 @@ local nodes = {
description = S("Super Glow Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^[colorize:#FFFF78", "default_glass_detail.png^[colorize:#FFFF78"},
use_texture_alpha = "clip",
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,
},
["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 = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
@ -429,6 +488,21 @@ local nodes = {
description = S("Trap Super Glow Glass"),
drawtype = "glasslike_framed_optional",
tiles = {"default_glass.png^[colorize:#FFFF78^moreblocks_trap_box_glass.png", "default_glass_detail.png^[colorize:#FFFF78"},
use_texture_alpha = "clip",
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,
},
["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 = "clip",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,

View File

@ -5,45 +5,87 @@ Copyright © 2011-2020 Hugo Locurcio and contributors.
Licensed under the zlib license. See LICENSE.md for more information.
--]]
-- Redefinitions of some default crafting recipes:
local modname = minetest.get_current_modname()
minetest.register_craft({
output = "default:sign_wall 4",
recipe = {
{"default:wood", "default:wood", "default:wood"},
{"default:wood", "default:wood", "default:wood"},
{"", "default:stick", ""},
}
})
-- Redefine some of the default crafting recipes to be more productive
minetest.register_craft({
output = "default:ladder 4",
recipe = {
{"default:stick", "", "default:stick"},
{"default:stick", "default:stick", "default:stick"},
{"default:stick", "", "default:stick"},
-- Auxiliary function: take a recipe as returned by get_all_craft_recipes
-- and turn it into a table that can be used to clear a craft or declare a new one
local reconstruct_internal_craft = function(recipe)
local recp = {
{ "", "", "" },
{ "", "", "" },
{ "", "", "" },
}
})
local width = recipe.width
for idx, item in pairs(recipe.items) do
local row = math.ceil(idx / width)
local col = idx - (row-1)*width
recp[row][col] = item
end
return recp
end
minetest.clear_craft({
recipe = {
{"default:papyrus", "default:papyrus", "default:papyrus"}
}
})
minetest.register_craft({
output = "default:paper 4",
recipe = {
{"default:papyrus", "default:papyrus", "default:papyrus"},
}
})
-- Change the amount produced by recipe by apply func to the old amount
local change_recipe_amount = function(product, recipe, func)
-- if width == 0, this is a shapeless recipe, for which the
-- internal and Lua API recipe table is the same.
-- Otherwise we need to reconstruct the table for the shaped recipe.
local shapeless = (recipe.width == 0)
local recp = shapeless and recipe.items or reconstruct_internal_craft(recipe)
minetest.register_craft({
output = "default:rail 24",
recipe = {
{"default:steel_ingot", "", "default:steel_ingot"},
{"default:steel_ingot", "default:stick", "default:steel_ingot"},
{"default:steel_ingot", "", "default:steel_ingot"},
}
local oldamount = tonumber(recipe.output:match(" [0-9]+$") or "1")
local newamount = func(oldamount)
-- remove old crafting recipe
local redo = { recipe = recp }
-- preserve shapelessness
if shapeless then
redo.type = "shapeless"
end
minetest.clear_craft(redo)
-- new output
redo.output = ("%s %d"):format(product, newamount)
minetest.register_craft(redo)
minetest.log("action", ("[MOD]%s: recipe for %s production: %d => %d"):format(modname, product, oldamount, newamount))
end
local increase_craft_production = function(product, func)
local recipes = minetest.get_all_craft_recipes(product)
for _, r in pairs(recipes) do
if r.type == "normal" or r.method == "normal" then
change_recipe_amount(product, r, func)
end
end
end
-- Increase the crafting production according to the rules from the table, which is in the form:
-- {
-- { detector, amount changing function }
-- { detector, amount changing function }
-- }
-- TODO: consider exporting this function to other mods
local increase_craft_production_table = function(map_table)
for product, _ in pairs(minetest.registered_items) do
for _, tab in pairs(map_table) do
local detector = tab[1]
local func = tab[2]
if detector(product) then
increase_craft_production(product, func)
-- only apply one boost
break
end
end
end
end
increase_craft_production_table({
{ function(n) return n:match('^default:sign_wall') end, function(old) return old + 1 end },
{ function(n) return n == 'default:paper' end, function(old) return old*4 end },
{ function(n) return n:match('^carts:.*rail$') or n:match('^default:.*rail$') end, function(old) return old + old/2 end },
})
minetest.register_craft({

View File

@ -15,7 +15,111 @@ local descriptions = {
["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}
-- extract the stairsplus category from a node name
-- assumes the name is in the form mod_name:category_original_ndoe_name
local function name_to_category(name)
local colon = name:find(":") or 0
colon = colon + 1
local under = name:find("_", colon)
return name:sub(colon, under)
end
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
-- category for what we are placing
local item_prefix = name_to_category(itemstack:get_name())
-- category for what we are placing against
local under = pointed_thing.under
local under_node = minetest.get_node(under)
local under_prefix = under_node and name_to_category(under_node.name)
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)
-- we cannot trust face_off to tell us the correct directionif the
-- under node has a non-standard shape, so use the distance between under and above
local wallmounted = minetest.dir_to_wallmounted(vector.subtract(pointed_thing.above, under))
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)
local src_def = minetest.registered_nodes[recipeitem] or {}
local desc_base = descriptions[category]:format(fields.description)
local def = {}
@ -31,6 +135,9 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam
def.drawtype = "nodebox"
def.paramtype = "light"
def.paramtype2 = def.paramtype2 or "facedir"
if def.use_texture_alpha == nil then
def.use_texture_alpha = src_def.use_texture_alpha
end
-- This makes node rotation work on placement
def.place_param2 = nil
@ -38,7 +145,7 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam
-- 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.on_place = minetest.rotate_node
def.on_place = stairsplus.rotate_node_aux
def.groups = stairsplus:prepare_groups(fields.groups)
if category == "slab" then

View File

@ -25,7 +25,7 @@ function stairsplus:prepare_groups(groups)
local result = {}
if groups then
for k, v in pairs(groups) do
if k ~= "wood" and k ~= "stone" then
if k ~= "wood" and k ~= "stone" and k ~= "wool" and k ~= "tree" then
result[k] = v
end
end

View File

@ -106,9 +106,6 @@ if minetest.get_modpath("wool") then
local ndef = table.copy(minetest.registered_nodes[nodename])
ndef.sunlight_propagates = true
-- Prevent dye+cut wool recipy from creating a full wool block.
ndef.groups.wool = nil
stairsplus:register_all(mod, name, nodename, ndef)
end
end