Merge branch 'master' into newsounds

This commit is contained in:
An0n3m0us 2020-08-27 21:41:57 +01:00 committed by GitHub
commit efa26bc54b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
172 changed files with 2957 additions and 736 deletions

View file

@ -20,5 +20,8 @@ read_globals = {
-- Overwrites minetest.handle_node_drops -- Overwrites minetest.handle_node_drops
files["mods/creative/init.lua"].globals = { "minetest" } files["mods/creative/init.lua"].globals = { "minetest" }
-- Overwrites minetest.calculate_knockback
files["mods/player_api/api.lua"].globals = { "minetest" }
-- Don't report on legacy definitions of globals. -- Don't report on legacy definitions of globals.
files["mods/default/legacy.lua"].global = false files["mods/default/legacy.lua"].global = false

View file

@ -93,16 +93,21 @@ For example,
is used to show all tools. Name is used in the sfinv page name, title is the is used to show all tools. Name is used in the sfinv page name, title is the
human readable title. human readable title.
`is_enabled_for` is used to check whether a player is in creative mode: Creative provides `creative.is_enabled_for(name)`, which is identical in
functionality to the engine's `minetest.creative_is_enabled(name)`.
creative.is_enabled_for(name) Its use is deprecated and it should also not be overriden.
Override this to allow per-player game modes.
The contents of `creative.formspec_add` is appended to every creative inventory The contents of `creative.formspec_add` is appended to every creative inventory
page. Mods can use it to add additional formspec elements onto the default page. Mods can use it to add additional formspec elements onto the default
creative inventory formspec to be drawn after each update. creative inventory formspec to be drawn after each update.
Group overrides can be used for any registered item, node or tool. Use one of
the groups stated below to pick which category it will appear in.
node = 1 -- Appears in the Nodes category
tool = 1 -- Appears in the Tools category
craftitem = 1 -- Appears in the Items category
Chests API Chests API
---------- ----------
@ -129,12 +134,12 @@ The chests API allows the creation of chests, which have their own inventories f
* A table indexed by player name to keep track of who opened what chest. * A table indexed by player name to keep track of who opened what chest.
* Key: The name of the player. * Key: The name of the player.
* Value: A table containing information about the chest the player is looking at. * Value: A table containing information about the chest the player is looking at.
e.g `{ pos = {1, 1, 1}, sound = null, swap = "chest" }` e.g `{ pos = {1, 1, 1}, sound = null, swap = "default:chest" }`
`default.chest.register_chest(name, def)` `default.chest.register_chest(name, def)`
* Registers new chest * Registers new chest
* `name` Name for chest * `name` Name for chest e.g. "default:chest"
* `def` See [#Chest Definition] * `def` See [#Chest Definition]
### Chest Definition ### Chest Definition
@ -424,7 +429,7 @@ Give Initial Stuff API
Players API Players API
----------- -----------
The player API can register player models and update the player's appearence The player API can register player models and update the player's appearance.
* `player_api.register_model(name, def)` * `player_api.register_model(name, def)`
* Register a new model to be used by players * Register a new model to be used by players
@ -457,6 +462,12 @@ The player API can register player models and update the player's appearence
* Any of the fields of the returned table may be nil. * Any of the fields of the returned table may be nil.
* player: PlayerRef * player: PlayerRef
* `player_api.player_attached`
* A table that maps a player name to a boolean.
* If the value for a given player is set to true, the default player
animations (walking, digging, ...) will no longer be updated.
Knockback from damage is also prevented for that player.
### Model Definition ### Model Definition
{ {

View file

@ -79,10 +79,10 @@ beds.register_bed("beds:bed", {
} }
}, },
nodebox = { nodebox = {
bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, bottom = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5},
top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, top = {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5},
}, },
selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.0625, 1.5},
recipe = { recipe = {
{"wool:white", "wool:white", "wool:white"}, {"wool:white", "wool:white", "wool:white"},
{"group:wood", "group:wood", "group:wood"} {"group:wood", "group:wood", "group:wood"}

View file

@ -74,10 +74,10 @@ local function lay_down(player, pos, bed_pos, state, skip)
-- physics, eye_offset, etc -- physics, eye_offset, etc
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player:set_look_horizontal(math.random(1, 180) / 100) player:set_look_horizontal(math.random(1, 180) / 100)
default.player_attached[name] = false player_api.player_attached[name] = false
player:set_physics_override(1, 1, 1) player:set_physics_override(1, 1, 1)
hud_flags.wielditem = true hud_flags.wielditem = true
default.player_set_animation(player, "stand" , 30) player_api.set_animation(player, "stand" , 30)
-- lay down -- lay down
else else
@ -90,12 +90,18 @@ local function lay_down(player, pos, bed_pos, state, skip)
local yaw, param2 = get_look_yaw(bed_pos) local yaw, param2 = get_look_yaw(bed_pos)
player:set_look_horizontal(yaw) player:set_look_horizontal(yaw)
local dir = minetest.facedir_to_dir(param2) local dir = minetest.facedir_to_dir(param2)
local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} -- p.y is just above the nodebox height of the 'Simple Bed' (the highest bed),
-- to avoid sinking down through the bed.
local p = {
x = bed_pos.x + dir.x / 2,
y = bed_pos.y + 0.07,
z = bed_pos.z + dir.z / 2
}
player:set_physics_override(0, 0, 0) player:set_physics_override(0, 0, 0)
player:set_pos(p) player:set_pos(p)
default.player_attached[name] = true player_api.player_attached[name] = true
hud_flags.wielditem = false hud_flags.wielditem = false
default.player_set_animation(player, "lay" , 0) player_api.set_animation(player, "lay" , 0)
end end
player:hud_set_flags(hud_flags) player:hud_set_flags(hud_flags)

View file

@ -0,0 +1,8 @@
# textdomain: beds
Leave Bed=Tinggalkan Dipan
Good morning.=Selamat pagi.
@1 of @2 players are in bed=@1 dari @2 pemain sedang tidur
Force night skip=Paksa lewati malam
You can only sleep at night.=Anda hanya boleh tidur pada waktu malam.
Fancy Bed=Dipan Mewah
Simple Bed=Dipan Sederhana

View file

@ -0,0 +1,9 @@
# textdomain: beds
Fancy Bed=花式床
Simple Bed=簡易床
Leave Bed=離開床
Good morning.=早安!
@1 of @2 players are in bed=@2位玩家中的@1位在床上
Force night skip=強制跳過夜晚
You can only sleep at night.=你只能在晚上睡覺。

View file

@ -1,8 +1,8 @@
# textdomain: beds # textdomain: beds
Fancy Bed=
Simple Bed=
Leave Bed= Leave Bed=
Good morning.= Good morning.=
@1 of @2 players are in bed= @1 of @2 players are in bed=
Force night skip= Force night skip=
You can only sleep at night.= You can only sleep at night.=
Fancy Bed=
Simple Bed=

View file

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=Binokular
Use with 'Zoom' key=Pakai dengan tombol 'Zum'

View file

@ -0,0 +1,3 @@
# textdomain: binoculars
Binoculars=望遠鏡
Use with 'Zoom' key=與“縮放”鍵一起使用

View file

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=Mode perahu jelajah nyala
Boat cruise mode off=Mode perahu jelajah mati
Boat=Perahu

View file

@ -1,4 +1,4 @@
# textdomain: boats # textdomain: boats
Boat cruise mode on=巡航模式开 Boat cruise mode on=巡航模式开
Boat cruise mode off=巡航模式关 Boat cruise mode off=巡航模式关
Boat=船 Boat=船

View file

@ -0,0 +1,4 @@
# textdomain: boats
Boat cruise mode on=巡航模式開啟
Boat cruise mode off=巡航模式關閉
Boat=船

View file

@ -0,0 +1,8 @@
# textdomain: bones
Bones=Tulang
@1's old bones=Tulang lama @1
@1 died at @2.=@1 mati di @2.
@1 died at @2, and dropped their inventory.=@1 mati di @2 dan meninggalkan barangnya.
@1 died at @2, and bones were placed.=@1 mati di @2 dan tulangnya diletakkan.
@1's fresh bones=Tulang segar @1
@1's bones=Tulang @1

View file

@ -0,0 +1,8 @@
# textdomain: bones
Bones=骨骸
@1's old bones=@1的舊骨骸
@1 died at @2.=@1在@2死亡。
@1 died at @2, and dropped their inventory.=@1在@2死亡丟掉了物品欄。
@1 died at @2, and bones were placed.=@1在@2死亡骨骸被放置。
@1's fresh bones=@1的新鮮骨骸
@1's bones=@1的骨骸

View file

@ -225,3 +225,16 @@ minetest.register_craft({
replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}}, replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
}) })
-- Register buckets as dungeon loot
if minetest.global_exists("dungeon_loot") then
dungeon_loot.register({
{name = "bucket:bucket_empty", chance = 0.55},
-- water in deserts/ice or above ground, lava otherwise
{name = "bucket:bucket_water", chance = 0.45,
types = {"sandstone", "desert", "ice"}},
{name = "bucket:bucket_water", chance = 0.45, y = {0, 32768},
types = {"normal"}},
{name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1},
types = {"normal"}},
})
end

View file

@ -0,0 +1,5 @@
# textdomain: bucket
Empty Bucket=Ember Kosong
Water Bucket=Ember Air
River Water Bucket=Ember Air Sungai
Lava Bucket=Ember Lava

View file

@ -2,4 +2,4 @@
Empty Bucket=空桶 Empty Bucket=空桶
Water Bucket=水桶 Water Bucket=水桶
River Water Bucket=河水桶 River Water Bucket=河水桶
Lava Bucket=岩桶 Lava Bucket=岩

View file

@ -0,0 +1,5 @@
# textdomain: bucket
Empty Bucket=空桶
Water Bucket=水桶
River Water Bucket=河水桶
Lava Bucket=岩漿桶

View file

@ -1,3 +1,4 @@
name = bucket name = bucket
description = Minetest Game mod: bucket description = Minetest Game mod: bucket
depends = default depends = default
optional_depends = dungeon_loot

View file

@ -0,0 +1,4 @@
# textdomain: butterflies
White Butterfly=Kupu-Kupu Putih
Red Butterfly=Kupu-Kupu Merah
Violet Butterfly=Kupu-Kupu Ungu

View file

@ -0,0 +1,4 @@
# textdomain: butterflies
White Butterfly=白蝴蝶
Red Butterfly=紅蝴蝶
Violet Butterfly=紫蝴蝶

View file

@ -67,6 +67,7 @@ end
function cart_entity:on_detach_child(child) function cart_entity:on_detach_child(child)
if child and child:get_player_name() == self.driver then if child and child:get_player_name() == self.driver then
self.driver = nil self.driver = nil
carts:manage_attachment(child, nil)
end end
end end
@ -327,11 +328,10 @@ local function rail_on_step(self, dtime)
if self.punched then if self.punched then
-- Collect dropped items -- Collect dropped items
for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do
if not obj_:is_player() and local ent = obj_:get_luaentity()
obj_:get_luaentity() and -- Careful here: physical_state and disable_physics are item-internal APIs
not obj_:get_luaentity().physical_state and if ent and ent.name == "__builtin:item" and ent.physical_state then
obj_:get_luaentity().name == "__builtin:item" then ent:disable_physics()
obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0})
self.attached_items[#self.attached_items + 1] = obj_ self.attached_items[#self.attached_items + 1] = obj_
end end
@ -389,8 +389,8 @@ minetest.register_entity("carts:cart", cart_entity)
minetest.register_craftitem("carts:cart", { minetest.register_craftitem("carts:cart", {
description = S("Cart") .. "\n" .. S("(Sneak+Click to pick up)"), description = S("Cart") .. "\n" .. S("(Sneak+Click to pick up)"),
inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"), inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_front.png", "carts_cart_side.png"),
wield_image = "carts_cart_side.png", wield_image = "carts_cart_front.png",
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local under = pointed_thing.under local under = pointed_thing.under
local node = minetest.get_node(under) local node = minetest.get_node(under)
@ -414,7 +414,7 @@ minetest.register_craftitem("carts:cart", {
end end
minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, minetest.sound_play({name = "default_place_node_metal", gain = 0.5},
{pos = pointed_thing.above}) {pos = pointed_thing.above}, true)
if not (creative and creative.is_enabled_for if not (creative and creative.is_enabled_for
and creative.is_enabled_for(placer:get_player_name())) then and creative.is_enabled_for(placer:get_player_name())) then

View file

@ -19,3 +19,10 @@ carts.path_distance_max = 3
dofile(carts.modpath.."/functions.lua") dofile(carts.modpath.."/functions.lua")
dofile(carts.modpath.."/rails.lua") dofile(carts.modpath.."/rails.lua")
dofile(carts.modpath.."/cart_entity.lua") dofile(carts.modpath.."/cart_entity.lua")
-- Register rails as dungeon loot
if minetest.global_exists("dungeon_loot") then
dungeon_loot.register({
name = "carts:rail", chance = 0.35, count = {1, 6}
})
end

View file

@ -0,0 +1,6 @@
# textdomain: carts
Rail=Rel
Powered Rail=Rel Bertenaga
Brake Rail=Rel Rem
Cart=Kereta
(Sneak+Click to pick up)=(selinap + klik untuk ambil)

View file

@ -1,6 +1,6 @@
# textdomain: carts # textdomain: carts
Cart=矿车 Cart=矿车
(Sneak+Click to pick up)=(潜行+单击以捡起) (Sneak+Click to pick up)=(潜行+单击以捡起)
Rail=铁 Rail=铁
Powered Rail=动力铁 Powered Rail=动力铁
Brake Rail=制动铁 Brake Rail=制动铁

View file

@ -0,0 +1,6 @@
# textdomain: carts
Cart=礦車
(Sneak+Click to pick up)=(潛行+單擊以撿起)
Rail=鐵軌
Powered Rail=動力鐵軌
Brake Rail=制動鐵軌

View file

@ -1,6 +1,6 @@
# textdomain: carts # textdomain: carts
Cart=
(Sneak+Click to pick up)=
Rail= Rail=
Powered Rail= Powered Rail=
Brake Rail= Brake Rail=
Cart=
(Sneak+Click to pick up)=

View file

@ -1,3 +1,4 @@
name = carts name = carts
description = Carts (formerly boost_cart) description = Carts (formerly boost_cart)
depends = default, player_api depends = default, player_api
optional_depends = dungeon_loot

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 B

After

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 B

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

After

Width:  |  Height:  |  Size: 434 B

View file

@ -27,16 +27,25 @@ minetest.register_privilege("creative", {
on_revoke = update_sfinv, on_revoke = update_sfinv,
}) })
local creative_mode_cache = minetest.settings:get_bool("creative_mode") -- Override the engine's creative mode function
local old_is_creative_enabled = minetest.is_creative_enabled
function minetest.is_creative_enabled(name)
if name == "" then
return old_is_creative_enabled(name)
end
return minetest.check_player_privs(name, {creative = true}) or
old_is_creative_enabled(name)
end
-- For backwards compatibility:
function creative.is_enabled_for(name) function creative.is_enabled_for(name)
return creative_mode_cache or return minetest.is_creative_enabled(name)
minetest.check_player_privs(name, {creative = true})
end end
dofile(minetest.get_modpath("creative") .. "/inventory.lua") dofile(minetest.get_modpath("creative") .. "/inventory.lua")
if creative_mode_cache then if minetest.is_creative_enabled("") then
-- Dig time is modified according to difference (leveldiff) between tool -- Dig time is modified according to difference (leveldiff) between tool
-- 'maxlevel' and node 'level'. Digtime is divided by the larger of -- 'maxlevel' and node 'level'. Digtime is divided by the larger of
-- leveldiff and 1. -- leveldiff and 1.

View file

@ -25,7 +25,9 @@ function creative.init_creative_inventory(player)
player_inventory[player_name] = { player_inventory[player_name] = {
size = 0, size = 0,
filter = "", filter = "",
start_i = 0 start_i = 0,
old_filter = nil, -- use only for caching in update_creative_inventory
old_content = nil
} }
minetest.create_detached_inventory("creative_" .. player_name, { minetest.create_detached_inventory("creative_" .. player_name, {
@ -59,6 +61,7 @@ function creative.init_creative_inventory(player)
return player_inventory[player_name] return player_inventory[player_name]
end end
local NO_MATCH = 999
local function match(s, filter) local function match(s, filter)
if filter == "" then if filter == "" then
return 0 return 0
@ -66,7 +69,15 @@ local function match(s, filter)
if s:lower():find(filter, 1, true) then if s:lower():find(filter, 1, true) then
return #s - #filter return #s - #filter
end end
return nil return NO_MATCH
end
local function description(def, lang_code)
local s = def.description
if lang_code then
s = minetest.get_translated_string(lang_code, s)
end
return s:gsub("\n.*", "") -- First line only
end end
function creative.update_creative_inventory(player_name, tab_content) function creative.update_creative_inventory(player_name, tab_content)
@ -74,15 +85,34 @@ function creative.update_creative_inventory(player_name, tab_content)
creative.init_creative_inventory(minetest.get_player_by_name(player_name)) creative.init_creative_inventory(minetest.get_player_by_name(player_name))
local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
if inv.filter == inv.old_filter and tab_content == inv.old_content then
return
end
inv.old_filter = inv.filter
inv.old_content = tab_content
local items = inventory_cache[tab_content] or init_creative_cache(tab_content) local items = inventory_cache[tab_content] or init_creative_cache(tab_content)
local lang
local player_info = minetest.get_player_information(player_name)
if player_info and player_info.lang_code ~= "" then
lang = player_info.lang_code
end
local creative_list = {} local creative_list = {}
local order = {} local order = {}
for name, def in pairs(items) do for name, def in pairs(items) do
local m = match(def.description, inv.filter) or match(def.name, inv.filter) local m = match(description(def), inv.filter)
if m then if m > 0 then
m = math.min(m, match(description(def, lang), inv.filter))
end
if m > 0 then
m = math.min(m, match(name, inv.filter))
end
if m < NO_MATCH then
creative_list[#creative_list+1] = name creative_list[#creative_list+1] = name
-- Sort by description length first so closer matches appear earlier -- Sort by match value first so closer matches appear earlier
order[name] = string.format("%02d", m) .. name order[name] = string.format("%02d", m) .. name
end end
end end
@ -119,8 +149,7 @@ function creative.register_tab(name, title, items)
local player_name = player:get_player_name() local player_name = player:get_player_name()
creative.update_creative_inventory(player_name, items) creative.update_creative_inventory(player_name, items)
local inv = player_inventory[player_name] local inv = player_inventory[player_name]
local start_i = inv.start_i or 0 local pagenum = math.floor(inv.start_i / (4*8) + 1)
local pagenum = math.floor(start_i / (4*8) + 1)
local pagemax = math.ceil(inv.size / (4*8)) local pagemax = math.ceil(inv.size / (4*8))
local esc = minetest.formspec_escape local esc = minetest.formspec_escape
return sfinv.make_formspec(player, context, return sfinv.make_formspec(player, context,
@ -143,7 +172,7 @@ function creative.register_tab(name, title, items)
"field_close_on_enter[creative_filter;false]" .. "field_close_on_enter[creative_filter;false]" ..
"field[0.3,4.2;2.8,1.2;creative_filter;;" .. esc(inv.filter) .. "]" .. "field[0.3,4.2;2.8,1.2;creative_filter;;" .. esc(inv.filter) .. "]" ..
"listring[detached:creative_" .. player_name .. ";main]" .. "listring[detached:creative_" .. player_name .. ";main]" ..
"list[detached:creative_" .. player_name .. ";main;0,0;8,4;" .. tostring(start_i) .. "]" .. "list[detached:creative_" .. player_name .. ";main;0,0;8,4;" .. tostring(inv.start_i) .. "]" ..
creative.formspec_add, true) creative.formspec_add, true)
end, end,
on_enter = function(self, player, context) on_enter = function(self, player, context)
@ -161,13 +190,11 @@ function creative.register_tab(name, title, items)
if fields.creative_clear then if fields.creative_clear then
inv.start_i = 0 inv.start_i = 0
inv.filter = "" inv.filter = ""
creative.update_creative_inventory(player_name, items)
sfinv.set_player_inventory_formspec(player, context) sfinv.set_player_inventory_formspec(player, context)
elseif fields.creative_search or elseif fields.creative_search or
fields.key_enter_field == "creative_filter" then fields.key_enter_field == "creative_filter" then
inv.start_i = 0 inv.start_i = 0
inv.filter = fields.creative_filter:lower() inv.filter = fields.creative_filter:lower()
creative.update_creative_inventory(player_name, items)
sfinv.set_player_inventory_formspec(player, context) sfinv.set_player_inventory_formspec(player, context)
elseif not fields.quit then elseif not fields.quit then
local start_i = inv.start_i or 0 local start_i = inv.start_i or 0
@ -194,10 +221,30 @@ function creative.register_tab(name, title, items)
}) })
end end
-- Sort registered items
local registered_nodes = {}
local registered_tools = {}
local registered_craftitems = {}
minetest.register_on_mods_loaded(function()
for name, def in pairs(minetest.registered_items) do
local group = def.groups or {}
local nogroup = not (group.node or group.tool or group.craftitem)
if group.node or (nogroup and minetest.registered_nodes[name]) then
registered_nodes[name] = def
elseif group.tool or (nogroup and minetest.registered_tools[name]) then
registered_tools[name] = def
elseif group.craftitem or (nogroup and minetest.registered_craftitems[name]) then
registered_craftitems[name] = def
end
end
end)
creative.register_tab("all", S("All"), minetest.registered_items) creative.register_tab("all", S("All"), minetest.registered_items)
creative.register_tab("nodes", S("Nodes"), minetest.registered_nodes) creative.register_tab("nodes", S("Nodes"), registered_nodes)
creative.register_tab("tools", S("Tools"), minetest.registered_tools) creative.register_tab("tools", S("Tools"), registered_tools)
creative.register_tab("craftitems", S("Items"), minetest.registered_craftitems) creative.register_tab("craftitems", S("Items"), registered_craftitems)
local old_homepage_name = sfinv.get_homepage_name local old_homepage_name = sfinv.get_homepage_name
function sfinv.get_homepage_name(player) function sfinv.get_homepage_name(player)

View file

@ -0,0 +1,10 @@
# textdomain: creative
Search=Cari
Reset=Atur ulang
Previous page=Halaman sebelumnya
Next page=Halaman selanjutnya
All=Semua
Nodes=Nodus
Tools=Perkakas
Items=Barang
Allow player to use creative inventory=Bolehkan pemain memakai inventaris kreatif

View file

@ -0,0 +1,10 @@
# textdomain: creative
Allow player to use creative inventory=允許玩家使用創造模式物品欄
Search=搜索
Reset=重置
Previous page=上一頁
Next page=下一頁
All=所有
Nodes=節點
Tools=工具
Items=物品

View file

@ -1,5 +1,4 @@
# textdomain: creative # textdomain: creative
Allow player to use creative inventory=
Search= Search=
Reset= Reset=
Previous page= Previous page=
@ -8,3 +7,4 @@ All=
Nodes= Nodes=
Tools= Tools=
Items= Items=
Allow player to use creative inventory=

View file

@ -151,7 +151,6 @@ BlockMen (CC BY-SA 3.0):
default_chest_top.png default_chest_top.png
default_mineral_mese.png default_mineral_mese.png
default_meselamp.png default_meselamp.png
bubble.png
gui_formbg.png gui_formbg.png
gui_furnace_arrow_bg.png gui_furnace_arrow_bg.png
gui_furnace_arrow_fg.png gui_furnace_arrow_fg.png
@ -196,9 +195,6 @@ Gambit (CC BY-SA 3.0):
asl97 (CC BY-SA 3.0): asl97 (CC BY-SA 3.0):
default_ice.png default_ice.png
KevDoy (CC BY-SA 3.0):
heart.png
Pithydon (CC BY-SA 3.0) Pithydon (CC BY-SA 3.0)
default_coral_brown.png default_coral_brown.png
default_coral_orange.png default_coral_orange.png
@ -253,6 +249,11 @@ Topywo (CC BY-SA 3.0)
Extex101 (CC BY-SA 3.0) Extex101 (CC BY-SA 3.0)
default_large_cactus_seedling.png default_large_cactus_seedling.png
default_dry_shrub.png -- Derived from the original texture by celeron55
An0n3m0us (CC BY-SA 3.0):
heart.png -- Derived from a texture by KevDoy (CC BY-SA 3.0)
bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0)
Sounds Sounds
@ -357,6 +358,10 @@ Angel_Perez_Grandi (CC BY 3.0):
https://freesound.org/people/Angel_Perez_Grandi/sounds/49190/ https://freesound.org/people/Angel_Perez_Grandi/sounds/49190/
default_ice_dug.ogg default_ice_dug.ogg
iankath (CC0 1.0)
https://freesound.org/people/iankath/sounds/173991/
default_furnace_active.ogg
Models Models
------ ------

View file

@ -44,9 +44,10 @@ function default.chest.chest_lid_close(pn)
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, minetest.after(0.2, minetest.swap_node, pos, { name = swap,
param2 = node.param2 }) param2 = node.param2 })
minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) minetest.sound_play(sound, {gain = 0.3, pos = pos,
max_hear_distance = 10}, true)
end end
default.chest.open_chests = {} default.chest.open_chests = {}
@ -75,7 +76,8 @@ minetest.register_on_leaveplayer(function(player)
end end
end) end)
function default.chest.register_chest(name, d) function default.chest.register_chest(prefixed_name, d)
local name = prefixed_name:sub(1,1) == ':' and prefixed_name:sub(2,-1) or prefixed_name
local def = table.copy(d) local def = table.copy(d)
def.drawtype = "mesh" def.drawtype = "mesh"
def.visual = "mesh" def.visual = "mesh"
@ -128,10 +130,10 @@ function default.chest.register_chest(name, d)
end end
minetest.sound_play(def.sound_open, {gain = 0.3, minetest.sound_play(def.sound_open, {gain = 0.3,
pos = pos, max_hear_distance = 10}) pos = pos, max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then if not default.chest.chest_lid_obstructed(pos) then
minetest.swap_node(pos, minetest.swap_node(pos,
{ name = "default:" .. name .. "_open", { name = name .. "_open",
param2 = node.param2 }) param2 = node.param2 })
end end
minetest.after(0.2, minetest.show_formspec, minetest.after(0.2, minetest.show_formspec,
@ -199,10 +201,10 @@ function default.chest.register_chest(name, d)
end end
def.on_rightclick = function(pos, node, clicker) def.on_rightclick = function(pos, node, clicker)
minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos,
max_hear_distance = 10}) max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then if not default.chest.chest_lid_obstructed(pos) then
minetest.swap_node(pos, { minetest.swap_node(pos, {
name = "default:" .. name .. "_open", name = name .. "_open",
param2 = node.param2 }) param2 = node.param2 })
end end
minetest.after(0.2, minetest.show_formspec, minetest.after(0.2, minetest.show_formspec,
@ -214,7 +216,7 @@ function default.chest.register_chest(name, d)
def.on_blast = function(pos) def.on_blast = function(pos)
local drops = {} local drops = {}
default.get_inventory_drops(pos, "main", drops) default.get_inventory_drops(pos, "main", drops)
drops[#drops+1] = "default:" .. name drops[#drops+1] = name
minetest.remove_node(pos) minetest.remove_node(pos)
return drops return drops
end end
@ -247,7 +249,7 @@ function default.chest.register_chest(name, d)
def_opened.tiles[i].backface_culling = true def_opened.tiles[i].backface_culling = true
end end
end end
def_opened.drop = "default:" .. name def_opened.drop = name
def_opened.groups.not_in_creative_inventory = 1 def_opened.groups.not_in_creative_inventory = 1
def_opened.selection_box = { def_opened.selection_box = {
type = "fixed", type = "fixed",
@ -264,14 +266,15 @@ function default.chest.register_chest(name, d)
def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh
def_closed.tiles[3] = def.tiles[3].."^[transformFX" def_closed.tiles[3] = def.tiles[3].."^[transformFX"
minetest.register_node("default:" .. name, def_closed) minetest.register_node(prefixed_name, def_closed)
minetest.register_node("default:" .. name .. "_open", def_opened) minetest.register_node(prefixed_name .. "_open", def_opened)
-- convert old chests to this new variant -- convert old chests to this new variant
if name == "default:chest" or name == "default:chest_locked" then
minetest.register_lbm({ minetest.register_lbm({
label = "update chests to opening chests", label = "update chests to opening chests",
name = "default:upgrade_" .. name .. "_v2", name = "default:upgrade_" .. name:sub(9,-1) .. "_v2",
nodenames = {"default:" .. name}, nodenames = {name},
action = function(pos, node) action = function(pos, node)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", nil) meta:set_string("formspec", nil)
@ -285,8 +288,9 @@ function default.chest.register_chest(name, d)
end end
}) })
end end
end
default.chest.register_chest("chest", { default.chest.register_chest("default:chest", {
description = S("Chest"), description = S("Chest"),
tiles = { tiles = {
"default_chest_top.png", "default_chest_top.png",
@ -302,7 +306,7 @@ default.chest.register_chest("chest", {
groups = {choppy = 2, oddly_breakable_by_hand = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2},
}) })
default.chest.register_chest("chest_locked", { default.chest.register_chest("default:chest_locked", {
description = S("Locked Chest"), description = S("Locked Chest"),
tiles = { tiles = {
"default_chest_top.png", "default_chest_top.png",

View file

@ -300,15 +300,6 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({
output = "default:mese_post_light 3",
recipe = {
{"", "default:glass", ""},
{"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"},
{"", "group:wood", ""},
}
})
minetest.register_craft({ minetest.register_craft({
output = "default:obsidian", output = "default:obsidian",
recipe = { recipe = {

View file

@ -155,7 +155,7 @@ default.cool_lava = function(pos, node)
minetest.set_node(pos, {name = "default:stone"}) minetest.set_node(pos, {name = "default:stone"})
end end
minetest.sound_play("default_cool_lava", minetest.sound_play("default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.25}) {pos = pos, max_hear_distance = 16, gain = 0.25}, true)
end end
if minetest.settings:get_bool("enable_lavacooling") ~= false then if minetest.settings:get_bool("enable_lavacooling") ~= false then
@ -224,7 +224,12 @@ end
function default.grow_papyrus(pos, node) function default.grow_papyrus(pos, node)
pos.y = pos.y - 1 pos.y = pos.y - 1
local name = minetest.get_node(pos).name local name = minetest.get_node(pos).name
if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then if name ~= "default:dirt" and
name ~= "default:dirt_with_grass" and
name ~= "default:dirt_with_dry_grass" and
name ~= "default:dirt_with_rainforest_litter" and
name ~= "default:dry_dirt" and
name ~= "default:dry_dirt_with_dry_grass" then
return return
end end
if not minetest.find_node_near(pos, 3, {"group:water"}) then if not minetest.find_node_near(pos, 3, {"group:water"}) then
@ -261,7 +266,17 @@ minetest.register_abm({
minetest.register_abm({ minetest.register_abm({
label = "Grow papyrus", label = "Grow papyrus",
nodenames = {"default:papyrus"}, nodenames = {"default:papyrus"},
neighbors = {"default:dirt", "default:dirt_with_grass"}, -- Grows on the dirt and surface dirt nodes of the biomes papyrus appears in,
-- including the old savanna nodes.
-- 'default:dirt_with_grass' is here only because it was allowed before.
neighbors = {
"default:dirt",
"default:dirt_with_grass",
"default:dirt_with_dry_grass",
"default:dirt_with_rainforest_litter",
"default:dry_dirt",
"default:dry_dirt_with_dry_grass",
},
interval = 14, interval = 14,
chance = 71, chance = 71,
action = function(...) action = function(...)
@ -420,6 +435,51 @@ function default.register_fence_rail(name, def)
minetest.register_node(name, def) minetest.register_node(name, def)
end end
--
-- Mese post registration helper
--
function default.register_mesepost(name, def)
minetest.register_craft({
output = name .. " 4",
recipe = {
{'', 'default:glass', ''},
{'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
{'', def.material, ''},
}
})
local post_texture = def.texture .. "^default_mese_post_light_side.png^[makealpha:0,0,0"
local post_texture_dark = def.texture .. "^default_mese_post_light_side_dark.png^[makealpha:0,0,0"
-- Allow almost everything to be overridden
local default_fields = {
wield_image = post_texture,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16},
},
},
paramtype = "light",
tiles = {def.texture, def.texture, post_texture_dark, post_texture_dark, post_texture, post_texture},
light_source = default.LIGHT_MAX,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(),
}
for k, v in pairs(default_fields) do
if def[k] == nil then
def[k] = v
end
end
def.texture = nil
def.material = nil
minetest.register_node(name, def)
end
-- --
-- Leafdecay -- Leafdecay
@ -447,6 +507,9 @@ local function leafdecay_after_destruct(pos, oldnode, def)
end end
end end
local movement_gravity = tonumber(
minetest.settings:get("movement_gravity")) or 9.81
local function leafdecay_on_timer(pos, def) local function leafdecay_on_timer(pos, def)
if minetest.find_node_near(pos, def.radius, def.trunks) then if minetest.find_node_near(pos, def.radius, def.trunks) then
return false return false
@ -473,6 +536,21 @@ local function leafdecay_on_timer(pos, def)
minetest.remove_node(pos) minetest.remove_node(pos)
minetest.check_for_falling(pos) minetest.check_for_falling(pos)
-- spawn a few particles for the removed node
minetest.add_particlespawner({
amount = 8,
time = 0.001,
minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}),
maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}),
minvel = vector.new(-0.5, -1, -0.5),
maxvel = vector.new(0.5, 0, 0.5),
minacc = vector.new(0, -movement_gravity, 0),
maxacc = vector.new(0, -movement_gravity, 0),
minsize = 0,
maxsize = 0,
node = node,
})
end end
function default.register_leafdecay(def) function default.register_leafdecay(def)
@ -497,7 +575,7 @@ end
-- --
-- Convert dirt to something that fits the environment -- Convert default:dirt to something that fits the environment
-- --
minetest.register_abm({ minetest.register_abm({
@ -506,6 +584,7 @@ minetest.register_abm({
neighbors = { neighbors = {
"air", "air",
"group:grass", "group:grass",
"group:dry_grass",
"default:snow", "default:snow",
}, },
interval = 6, interval = 6,
@ -534,6 +613,8 @@ minetest.register_abm({
minetest.set_node(pos, {name = "default:dirt_with_snow"}) minetest.set_node(pos, {name = "default:dirt_with_snow"})
elseif minetest.get_item_group(name, "grass") ~= 0 then elseif minetest.get_item_group(name, "grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_grass"}) minetest.set_node(pos, {name = "default:dirt_with_grass"})
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_dry_grass"})
end end
end end
}) })

View file

@ -113,6 +113,9 @@ local function furnace_node_timer(pos, elapsed)
local srclist, fuellist local srclist, fuellist
local dst_full = false local dst_full = false
local timer_elapsed = meta:get_int("timer_elapsed") or 0
meta:set_int("timer_elapsed", timer_elapsed + 1)
local cookable, cooked local cookable, cooked
local fuel local fuel
@ -154,6 +157,9 @@ local function furnace_node_timer(pos, elapsed)
else else
dst_full = true dst_full = true
end end
-- Play cooling sound
minetest.sound_play("default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.1}, true)
else else
-- Item could not be cooked: probably missing fuel -- Item could not be cooked: probably missing fuel
update = true update = true
@ -237,6 +243,12 @@ local function furnace_node_timer(pos, elapsed)
swap_node(pos, "default:furnace_active") swap_node(pos, "default:furnace_active")
-- make sure timer restarts automatically -- make sure timer restarts automatically
result = true result = true
-- Play sound every 5 seconds while the furnace is active
if timer_elapsed == 0 or (timer_elapsed+1) % 5 == 0 then
minetest.sound_play("default_furnace_active",
{pos = pos, max_hear_distance = 16, gain = 0.5}, true)
end
else else
if fuellist and not fuellist[1]:is_empty() then if fuellist and not fuellist[1]:is_empty() then
fuel_state = S("@1%", 0) fuel_state = S("@1%", 0)
@ -245,6 +257,7 @@ local function furnace_node_timer(pos, elapsed)
swap_node(pos, "default:furnace") swap_node(pos, "default:furnace")
-- stop timer on the inactive furnace -- stop timer on the inactive furnace
minetest.get_node_timer(pos):stop() minetest.get_node_timer(pos):stop()
meta:set_int("timer_elapsed", 0)
end end

View file

@ -15,12 +15,12 @@ local item = {
burn_up = function(self) burn_up = function(self)
-- disappear in a smoke puff -- disappear in a smoke puff
self.object:remove()
local p = self.object:get_pos() local p = self.object:get_pos()
self.object:remove()
minetest.sound_play("default_item_smoke", { minetest.sound_play("default_item_smoke", {
pos = p, pos = p,
max_hear_distance = 8, max_hear_distance = 8,
}) }, true)
minetest.add_particlespawner({ minetest.add_particlespawner({
amount = 3, amount = 3,
time = 0.1, time = 0.1,
@ -39,16 +39,20 @@ local item = {
}) })
end, end,
on_step = function(self, dtime) on_step = function(self, dtime, ...)
builtin_item.on_step(self, dtime) builtin_item.on_step(self, dtime, ...)
if self.flammable then if self.flammable then
-- flammable, check for igniters -- flammable, check for igniters every 10 s
self.ignite_timer = (self.ignite_timer or 0) + dtime self.ignite_timer = (self.ignite_timer or 0) + dtime
if self.ignite_timer > 10 then if self.ignite_timer > 10 then
self.ignite_timer = 0 self.ignite_timer = 0
local node = minetest.get_node_or_nil(self.object:get_pos()) local pos = self.object:get_pos()
if pos == nil then
return -- object already deleted
end
local node = minetest.get_node_or_nil(pos)
if not node then if not node then
return return
end end

View file

@ -51,6 +51,7 @@ Copyright (C) 2010-2018:
Mossmanikin Mossmanikin
random-geek random-geek
Extex101 Extex101
An0n3m0us
You are free to: You are free to:
Share — copy and redistribute the material in any medium or format. Share — copy and redistribute the material in any medium or format.

View file

@ -62,12 +62,12 @@ Obsidian Block=Obsidianblock
Dirt=Erde Dirt=Erde
Dirt with Grass=Erde mit Gras Dirt with Grass=Erde mit Gras
Dirt with Grass and Footsteps=Erde mit Gras und Fußstapfen Dirt with Grass and Footsteps=Erde mit Gras und Fußstapfen
Dirt with Dry Grass=Erde mit trockenem Gras Dirt with Savanna Grass=Erde mit Savannengras
Dirt with Snow=Erde mit Schnee Dirt with Snow=Erde mit Schnee
Dirt with Rainforest Litter=Erde mit Regenwaldboden Dirt with Rainforest Litter=Erde mit Regenwaldboden
Dirt with Coniferous Litter=Erde mit Nadelwaldboden Dirt with Coniferous Litter=Erde mit Nadelwaldboden
Dry Dirt=Trockene Erde Savanna Dirt=Savannenerde
Dry Dirt with Dry Grass=Trockene Erde mit trockenem Gras Savanna Dirt with Savanna Grass=Savannenerde mit Savannengras
Permafrost=Permafrost Permafrost=Permafrost
Permafrost with Stones=Permafrost mit Steinen Permafrost with Stones=Permafrost mit Steinen
Permafrost with Moss=Permafrost mit Moos Permafrost with Moss=Permafrost mit Moos
@ -124,7 +124,7 @@ Papyrus=Papyrus
Dry Shrub=Trockener Busch Dry Shrub=Trockener Busch
Jungle Grass=Dschungelgras Jungle Grass=Dschungelgras
Grass=Gras Grass=Gras
Dry Grass=Trockenes Gras Savanna Grass=Savannengras
Fern=Farn Fern=Farn
Marram Grass=Dünengras Marram Grass=Dünengras
Bush Stem=Buschstamm Bush Stem=Buschstamm

View file

@ -0,0 +1,211 @@
# textdomain: default
Stone=Batu
Cobblestone=Bongkahan Batu
Stone Brick=Tembok Batu
Stone Block=Balok Batu
Mossy Cobblestone=Bongkahan Batu Berlumut
Desert Stone=Batu Gurun
Desert Cobblestone=Bongkahan Batu Gurun
Desert Stone Brick=Tembok Batu Gurun
Desert Stone Block=Balok Batu Gurun
Sandstone=Batu Pasir
Sandstone Brick=Tembok Batu Pasir
Sandstone Block=Balok Batu Pasir
Desert Sandstone=Batu Pasir Gurun
Desert Sandstone Brick=Tembok Batu Pasir Gurun
Desert Sandstone Block=Balok Batu Pasir Gurun
Silver Sandstone=Batu Pasir Perak
Silver Sandstone Brick=Tembok Batu Pasir Perak
Silver Sandstone Block=Balok Batu Pasir Perak
Obsidian=Obsidian
Obsidian Brick=Tembok Obsidian
Obsidian Block=Balok Obsidian
Dirt=Tanah
Dirt with Grass=Tanah Berumput
Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki
Dirt with Savanna Grass=Tanah Berumput Sabana
Dirt with Snow=Tanah Bersalju
Dirt with Rainforest Litter=Tanah Berserasah Hutan Hujan
Dirt with Coniferous Litter=Tanah Berserasah Hutan Konifer
Savanna Dirt=Tanah Sabana
Savanna Dirt with Savanna Grass=Tanah Sabana Berumput Sabana
Permafrost=Ibun Abadi
Permafrost with Stones=Ibun Abadi Berbatu
Permafrost with Moss=Ibun Abadi Berlumut
Sand=Pasir
Desert Sand=Pasir Gurun
Silver Sand=Pasir Perak
Gravel=Kerikil
Clay=Semen
Snow=Salju
Snow Block=Balok Salju
Ice=Es
Cave Ice=Es Gua
Apple Tree=Pohon Apel
Apple Wood Planks=Papan Kayu Pohon Apel
Apple Tree Sapling=Bibit Apel
Apple Tree Leaves=Daun Pohon Apel
Apple=Apel
Apple Marker=Penanda Apel
Jungle Tree=Pohon Hutan Rimba
Jungle Wood Planks=Papan Kayu Pohon Rimba
Jungle Tree Leaves=Daun Pohon Rimba
Jungle Tree Sapling=Bibit Pohon Rimba
Emergent Jungle Tree Sapling=Bibit Bertumbuh Pohon Rimba
Pine Tree=Pohon Pinus
Pine Wood Planks=Papan Kayu Pinus
Pine Needles=Daun Pinus
Pine Tree Sapling=Bibit Pinus
Acacia Tree=Pohon Akasia
Acacia Wood Planks=Papan Kayu Akasia
Acacia Tree Leaves=Daun Akasia
Acacia Tree Sapling=Bibit Akasia
Aspen Tree=Pohon Aspen
Aspen Wood Planks=Papan Kayu Aspen
Aspen Tree Leaves=Daun Aspen
Aspen Tree Sapling=Bibit Aspen
Coal Ore=Bijih Batu Bara
Coal Block=Balok Batu Bara
Iron Ore=Biji Besi
Steel Block=Balok Baja
Copper Ore=Bijih Tembaga
Copper Block=Balok Tembaga
Tin Ore=Bijih Timah
Tin Block=Balok Timah
Bronze Block=Balok Perunggu
Mese Ore=Bijih Mese
Mese Block=Balok Mese
Gold Ore=Bijih Emas
Gold Block=Balok Emas
Diamond Ore=Bijih Berlian
Diamond Block=Balok Berlian
Cactus=Kaktus
Large Cactus Seedling=Bibit Kaktus Besar
Papyrus=Papirus
Dry Shrub=Semak Kering
Jungle Grass=Rumput Rimba
Grass=Rumput
Savanna Grass=Rumput Sabana
Fern=Pakis
Marram Grass=Rumput Pantai
Bush Stem=Batang Semak
Bush Leaves=Daun Semak
Bush Sapling=Bibit Semak
Blueberry Bush Leaves with Berries=Daun Bluberi Berbuah
Blueberry Bush Leaves=Daun Bluberi
Blueberry Bush Sapling=Bibit Bluberi
Acacia Bush Stem=Batang Semak Akasia
Acacia Bush Leaves=Daun Semak Akasia
Acacia Bush Sapling=Bibit Semak Akasia
Pine Bush Stem=Batang Semak Pinus
Pine Bush Needles=Daun Semak Pinus
Pine Bush Sapling=Bibit Semak Pinus
Kelp=Kelp
Green Coral=Koral Hijau
Pink Coral=Koral Jambon
Cyan Coral=Koral Sian
Brown Coral=Koral Cokelat
Orange Coral=Koral Oranye
Coral Skeleton=Kerangka Koral
Water Source=Mata Air
Flowing Water=Aliran Air
River Water Source=Mata Air Sungai
Flowing River Water=Aliran Air Sungai
Lava Source=Sumber Lava
Flowing Lava=Aliran Lava
Empty Bookshelf=Rak Buku Kosong
Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku tertulis, @2 buku kosong)
Bookshelf=Rak Buku
Text too long=Teks terlalu panjang
Wooden Sign=Penanda Kayu
Steel Sign=Penanda Baja
Wooden Ladder=Tangga Kayu
Steel Ladder=Tangga Baja
Apple Wood Fence=Pagar Kayu Apel
Acacia Wood Fence=Pagar Akasia
Jungle Wood Fence=Pagar Kayu Rimba
Pine Wood Fence=Pagar Pinus
Aspen Wood Fence=Pagar Aspen
Apple Wood Fence Rail=Rel Pagar Kayu Apel
Acacia Wood Fence Rail=Rel Pagar Akasia
Jungle Wood Fence Rail=Rel Pagar Kayu Rimba
Pine Wood Fence Rail=Rel Pagar Pinus
Aspen Wood Fence Rail=Rel Pagar Aspen
Glass=Kaca
Obsidian Glass=Kaca Obsidian
Brick Block=Balok Bata
Mese Lamp=Lampu Mese
Mese Post Light=Lampu Taman Mese
Cloud=Awan
@1 will intersect protection on growth.=@1 akan memotong perlindungan ketika tumbuh.
Torch=Obor
Wooden Pickaxe=Beliung Kayu
Stone Pickaxe=Beliung Batu
Bronze Pickaxe=Beliung Perunggu
Steel Pickaxe=Beliung Baja
Mese Pickaxe=Beliung Mese
Diamond Pickaxe=Beliung Berlian
Wooden Shovel=Sekop Kayu
Stone Shovel=Sekop Batu
Bronze Shovel=Sekop Perunggu
Steel Shovel=Sekop Baja
Mese Shovel=Sekop Mese
Diamond Shovel=Sekop Berlian
Wooden Axe=Kapak Kayu
Stone Axe=Kapak Batu
Bronze Axe=Kapak Perunggu
Steel Axe=Kapak Baja
Mese Axe=Kapak Mese
Diamond Axe=Kapak Berlian
Wooden Sword=Pedang Kayu
Stone Sword=Pedang Batu
Bronze Sword=Pedang Perunggu
Steel Sword=Pedang Baja
Mese Sword=Pedang Mese
Diamond Sword=Pedang Berlian
Key=Kunci
Furnace is empty=Tungku kosong
100% (output full)=100% (keluaran penuh)
@1%=@1%
Not cookable=Tidak bisa dimasak
Empty=Kosong
Furnace active=Tungku nyala
Furnace inactive=Tungku mati
(Item: @1; Fuel: @2)=(Barang: @1; Bahan Bakar: @2)
Furnace=Tungku
Title:=Judul:
Contents:=Isi:
Save=Simpan
by @1=oleh @1
Page @1 of @2=Halaman @1 dari @2
"@1"="@1"
"@1" by @2="@1" oleh @2
Skeleton Key=Kunci Induk
Key to @1's @2=Kunci @2 milik @1
Blueberries=Bluberi
Book=Buku
Book with Text=Buku Tertulis
Bronze Ingot=Perunggu Batangan
Clay Brick=Bata
Clay Lump=Bongkahan Semen
Coal Lump=Bongkahan Batu Bara
Copper Ingot=Tembaga Batangan
Copper Lump=Bongkahan Tembaga
Diamond=Berlian
Flint=Batu Api
Gold Ingot=Emas Batangan
Gold Lump=Bongkahan Emas
Iron Lump=Bongkahan Besi
Mese Crystal=Kristal Mese
Mese Crystal Fragment=Pecahan Kristal Mese
Obsidian Shard=Pecahan Obsidian
Paper=Kertas
Steel Ingot=Baja Batangan
Stick=Tongkat
Tin Ingot=Timah Batangan
Tin Lump=Bongkahan Timah
Locked Chest=Peti Terkunci
Locked Chest (owned by @1)=Peti Terkunci (milik @1)
You do not own this chest.=Anda bukan pemilik peti ini.
a locked chest=suatu peti terkunci
Chest=Peti

View file

@ -1,8 +1,8 @@
# textdomain: default # textdomain: default
Locked Chest=锁的箱子 Locked Chest=已上锁的箱子
Locked Chest (owned by @1)=锁着的箱子(由@1拥有) Locked Chest (owned by @1)=已上锁的箱子(属于@1所有)
You do not own this chest.=您不拥有该箱子 You do not own this chest.=这个箱子不属于你所有
a locked chest=一个锁的箱子 a locked chest=一个已上锁的箱子
Chest=箱子 Chest=箱子
Stick=棒 Stick=棒
Paper=纸 Paper=纸
@ -11,20 +11,20 @@ Book=书
Book with Text=带文字的书 Book with Text=带文字的书
Skeleton Key=万能钥匙 Skeleton Key=万能钥匙
Key to @1's @2=@1的@2的钥匙 Key to @1's @2=@1的@2的钥匙
Coal Lump=煤 Coal Lump=煤
Iron Lump=铁 Iron Lump=铁
Copper Lump=铜 Copper Lump=铜
Tin Lump=锡 Tin Lump=锡
Mese Crystal=黄石 Mese Crystal=黄石晶
Gold Lump=金 Gold Lump=金
Diamond=钻石 Diamond=钻石
Clay Lump=粘土 Clay Lump=粘土
Steel Ingot=铁锭 Steel Ingot=铁锭
Copper Ingot=铜锭 Copper Ingot=铜锭
Tin Ingot=锡锭 Tin Ingot=锡锭
Bronze Ingot=青铜锭 Bronze Ingot=青铜锭
Gold Ingot=金锭 Gold Ingot=金锭
Mese Crystal Fragment=黄石晶碎片 Mese Crystal Fragment=黄石晶碎片
Clay Brick=粘土砖 Clay Brick=粘土砖
Obsidian Shard=黑曜石碎片 Obsidian Shard=黑曜石碎片
Flint=燧石 Flint=燧石
@ -34,50 +34,50 @@ Furnace is empty=熔炉是空的
@1%=@1% @1%=@1%
Empty=空 Empty=空
Not cookable=不可烹饪 Not cookable=不可烹饪
Furnace active=熔炉活跃 Furnace active=熔炉正在运转
Furnace inactive=熔炉非活跃 Furnace inactive=熔炉未使用
(Item: @1; Fuel: @2)=(项目:@1;燃料:@2 (Item: @1; Fuel: @2)=(项目:@1;燃料:@2
Furnace=熔炉 Furnace=熔炉
Stone=石 Stone=石
Cobblestone=鹅卵石 Cobblestone=鹅卵石
Stone Brick=石砖 Stone Brick=石砖
Stone Block=石块 Stone Block=石
Mossy Cobblestone=苔的鹅卵石 Mossy Cobblestone=苔藓覆盖的鹅卵石
Desert Stone=沙漠石 Desert Stone=沙漠石
Desert Cobblestone=沙漠鹅卵石 Desert Cobblestone=沙漠鹅卵石
Desert Stone Brick=沙漠鹅卵石砖 Desert Stone Brick=沙漠鹅卵石砖
Desert Stone Block=沙漠鹅卵石块 Desert Stone Block=沙漠鹅卵石
Sandstone=砂岩 Sandstone=砂岩
Sandstone Brick=砂岩砖 Sandstone Brick=砂岩砖
Sandstone Block=砂岩块 Sandstone Block=砂岩
Desert Sandstone=沙漠砂岩 Desert Sandstone=沙漠砂岩
Desert Sandstone Brick=沙漠砂岩砖 Desert Sandstone Brick=沙漠砂岩砖
Desert Sandstone Block=沙漠砂岩块 Desert Sandstone Block=沙漠砂岩
Silver Sandstone=银砂岩 Silver Sandstone=银砂岩
Silver Sandstone Brick=银砂岩砖 Silver Sandstone Brick=银砂岩砖
Silver Sandstone Block=银砂岩块 Silver Sandstone Block=银砂岩
Obsidian=黑曜石 Obsidian=黑曜石
Obsidian Brick=黑曜石砖 Obsidian Brick=黑曜石砖
Obsidian Block=黑曜石块 Obsidian Block=黑曜石
Dirt=土 Dirt=土
Dirt with Grass=带草的土 Dirt with Grass=带草的土
Dirt with Grass and Footsteps=带草的土及脚印 Dirt with Grass and Footsteps=带草的土及脚印
Dirt with Dry Grass=土和干草 Dirt with Dry Grass=带干草的
Dirt with Snow=土和雪 Dirt with Snow=带雪的
Dirt with Rainforest Litter=雨林腐土 Dirt with Rainforest Litter=雨林腐土
Dirt with Coniferous Litter=针叶林腐土 Dirt with Coniferous Litter=针叶林腐土
Dry Dirt=干土 Dry Dirt=干土
Dry Dirt with Dry Grass=干土和干草 Dry Dirt with Dry Grass=干土和干草
Permafrost=多年冻土 Permafrost=多年冻土
Permafrost with Stones=多年冻土和石头 Permafrost with Stones=带石头的多年冻土
Permafrost with Moss=生苔的多年冻土 Permafrost with Moss=生苔的多年冻土
Sand=沙 Sand=沙
Desert Sand=沙漠沙 Desert Sand=沙漠沙
Silver Sand=银沙 Silver Sand=银沙
Gravel=砾 Gravel=
Clay=粘土 Clay=粘土
Snow=雪 Snow=雪
Snow Block=雪块 Snow Block=雪
Ice=冰 Ice=冰
Cave Ice=洞穴冰 Cave Ice=洞穴冰
Apple Tree=苹果树 Apple Tree=苹果树
@ -103,26 +103,26 @@ Aspen Tree=白杨树
Aspen Wood Planks=白杨树木板 Aspen Wood Planks=白杨树木板
Aspen Tree Leaves=白杨树叶 Aspen Tree Leaves=白杨树叶
Aspen Tree Sapling=白杨树树苗 Aspen Tree Sapling=白杨树树苗
Coal Ore=煤矿石 Coal Ore=煤矿石
Coal Block=煤块 Coal Block=煤炭方
Iron Ore=铁矿石 Iron Ore=铁矿石
Steel Block=钢块 Steel Block=钢
Copper Ore=铜矿石 Copper Ore=铜矿石
Copper Block=铜块 Copper Block=铜
Tin Ore=锡矿石 Tin Ore=锡矿石
Tin Block=锡块 Tin Block=锡
Bronze Block=青铜块 Bronze Block=青铜
Mese Ore=黄石矿石 Mese Ore=黄石矿石
Mese Block=黄石块 Mese Block=黄石
Gold Ore=金矿石 Gold Ore=金矿石
Gold Block=金块 Gold Block=金
Diamond Ore=钻石矿石 Diamond Ore=钻石矿石
Diamond Block=钻石块 Diamond Block=钻石
Cactus=仙人掌 Cactus=仙人掌
Large Cactus Seedling=大仙人掌苗 Large Cactus Seedling=大仙人掌苗
Papyrus=莎草纸 Papyrus=莎草纸
Dry Shrub=干灌木 Dry Shrub=干灌木
Jungle Grass= Jungle Grass=丛林草
Grass=草 Grass=草
Dry Grass=干草 Dry Grass=干草
Fern=蕨 Fern=蕨
@ -148,20 +148,20 @@ Orange Coral=橙珊瑚
Coral Skeleton=珊瑚骨架 Coral Skeleton=珊瑚骨架
Water Source=水方块 Water Source=水方块
Flowing Water=流动的水 Flowing Water=流动的水
River Water Source=河水方块 River Water Source=河水方块
Flowing River Water=流动的河 Flowing River Water=流动的河水
Lava Source=岩方块 Lava Source=岩方块
Flowing Lava=流动的 Flowing Lava=流动的岩
Empty Bookshelf=空书架 Empty Bookshelf=空书架
Bookshelf (@1 written, @2 empty books)=书架(@1本有字的书@2本空书 Bookshelf (@1 written, @2 empty books)=书架(@1本有字的书@2本空书
Bookshelf=书架 Bookshelf=书架
Text too long=文字太长 Text too long=文字太长
Wooden Sign=木牌 Wooden Sign=木牌
Steel Sign=铁牌 Steel Sign=铁牌
Wooden Ladder=木 Wooden Ladder=木梯
Steel Ladder=铁 Steel Ladder=铁梯
Apple Wood Fence=苹果木 Apple Wood Fence=苹果木
Acacia Wood Fence=相思木 Acacia Wood Fence=相思木
Jungle Wood Fence=丛林木栅栏 Jungle Wood Fence=丛林木栅栏
Pine Wood Fence=松木栅栏 Pine Wood Fence=松木栅栏
Aspen Wood Fence=白杨木栅栏 Aspen Wood Fence=白杨木栅栏
@ -172,7 +172,7 @@ Pine Wood Fence Rail=松木栏杆
Aspen Wood Fence Rail=白杨木栏杆 Aspen Wood Fence Rail=白杨木栏杆
Glass=玻璃 Glass=玻璃
Obsidian Glass=黑曜石玻璃 Obsidian Glass=黑曜石玻璃
Brick Block=砖块 Brick Block=砖
Mese Lamp=黄石灯 Mese Lamp=黄石灯
Mese Post Light=黄石柱灯 Mese Post Light=黄石柱灯
Cloud=云 Cloud=云

View file

@ -0,0 +1,211 @@
# textdomain: default
Locked Chest=已上鎖的箱子
Locked Chest (owned by @1)=已上鎖的箱子(屬於@1所有
You do not own this chest.=這個箱子不屬於你所有。
a locked chest=一個已上鎖的箱子
Chest=箱子
Stick=棒
Paper=紙
"@1" by @2="@1" by @2
Book=書
Book with Text=帶文字的書
Skeleton Key=萬能鑰匙
Key to @1's @2=@1的@2的鑰匙
Coal Lump=煤塊
Iron Lump=鐵塊
Copper Lump=銅塊
Tin Lump=錫塊
Mese Crystal=黃石晶體
Gold Lump=金塊
Diamond=鑽石
Clay Lump=粘土塊
Steel Ingot=鐵錠
Copper Ingot=銅錠
Tin Ingot=錫錠
Bronze Ingot=青銅錠
Gold Ingot=金錠
Mese Crystal Fragment=黃石晶體碎片
Clay Brick=粘土磚
Obsidian Shard=黑曜石碎片
Flint=燧石
Blueberries=藍莓
Furnace is empty=熔爐是空的
100% (output full)=100輸出已滿
@1%=@1%
Empty=空
Not cookable=不可烹飪
Furnace active=熔爐正在運轉
Furnace inactive=熔爐未使用
(Item: @1; Fuel: @2)=(項目:@1;燃料:@2
Furnace=熔爐
Stone=石
Cobblestone=鵝卵石
Stone Brick=石磚
Stone Block=石方塊
Mossy Cobblestone=苔蘚覆蓋的鵝卵石
Desert Stone=沙漠石
Desert Cobblestone=沙漠鵝卵石
Desert Stone Brick=沙漠鵝卵石磚
Desert Stone Block=沙漠鵝卵石方塊
Sandstone=砂岩
Sandstone Brick=砂岩磚
Sandstone Block=砂岩方塊
Desert Sandstone=沙漠砂岩
Desert Sandstone Brick=沙漠砂岩磚
Desert Sandstone Block=沙漠砂岩方塊
Silver Sandstone=銀砂岩
Silver Sandstone Brick=銀砂岩磚
Silver Sandstone Block=銀砂岩方塊
Obsidian=黑曜石
Obsidian Brick=黑曜石磚
Obsidian Block=黑曜石方塊
Dirt=土
Dirt with Grass=帶草的土
Dirt with Grass and Footsteps=帶草的土及腳印
Dirt with Dry Grass=帶乾草的土
Dirt with Snow=帶雪的土
Dirt with Rainforest Litter=雨林腐土
Dirt with Coniferous Litter=針葉林腐土
Dry Dirt=乾土
Dry Dirt with Dry Grass=乾土和乾草
Permafrost=多年凍土
Permafrost with Stones=帶石頭的多年凍土
Permafrost with Moss=生苔的多年凍土
Sand=沙
Desert Sand=沙漠沙
Silver Sand=銀沙
Gravel=沙礫
Clay=粘土
Snow=雪
Snow Block=雪方塊
Ice=冰
Cave Ice=洞穴冰
Apple Tree=蘋果樹
Apple Wood Planks=蘋果樹木板
Apple Tree Sapling=蘋果樹苗
Apple Tree Leaves=蘋果樹葉
Apple=蘋果
Apple Marker=蘋果標記
Jungle Tree=叢林樹
Jungle Wood Planks=叢林樹木板
Jungle Tree Leaves=叢林樹葉
Jungle Tree Sapling=叢林樹苗
Emergent Jungle Tree Sapling=應急叢林樹苗
Pine Tree=松樹
Pine Wood Planks=松樹木板
Pine Needles=松針
Pine Tree Sapling=松樹樹苗
Acacia Tree=相思樹
Acacia Wood Planks=相思樹木板
Acacia Tree Leaves=相思樹葉
Acacia Tree Sapling=相思樹樹苗
Aspen Tree=白楊樹
Aspen Wood Planks=白楊樹木板
Aspen Tree Leaves=白楊樹葉
Aspen Tree Sapling=白楊樹樹苗
Coal Ore=煤炭礦石
Coal Block=煤炭方塊
Iron Ore=鐵礦石
Steel Block=鋼方塊
Copper Ore=銅礦石
Copper Block=銅方塊
Tin Ore=錫礦石
Tin Block=錫方塊
Bronze Block=青銅方塊
Mese Ore=黃石礦石
Mese Block=黃石方塊
Gold Ore=金礦石
Gold Block=金方塊
Diamond Ore=鑽石礦石
Diamond Block=鑽石方塊
Cactus=仙人掌
Large Cactus Seedling=大仙人掌苗
Papyrus=莎草紙
Dry Shrub=幹灌木
Jungle Grass=叢林草
Grass=草
Dry Grass=乾草
Fern=蕨
Marram Grass=濱草
Bush Stem=灌木
Bush Leaves=灌木葉
Bush Sapling=灌木苗
Blueberry Bush Leaves with Berries=藍莓灌木葉與漿果
Blueberry Bush Leaves=藍莓灌木葉
Blueberry Bush Sapling=藍莓灌木苗
Acacia Bush Stem=相思灌木
Acacia Bush Leaves=相思灌木葉
Acacia Bush Sapling=相思灌木苗
Pine Bush Stem=松樹灌木
Pine Bush Needles=松樹灌木針
Pine Bush Sapling=松樹灌木苗
Kelp=海帶
Green Coral=綠珊瑚
Pink Coral=淡紅珊瑚
Cyan Coral=青珊瑚
Brown Coral=棕珊瑚
Orange Coral=橙珊瑚
Coral Skeleton=珊瑚骨架
Water Source=水方塊
Flowing Water=流動的水
River Water Source=河水方塊
Flowing River Water=流動的河水
Lava Source=岩漿方塊
Flowing Lava=流動的岩漿
Empty Bookshelf=空書架
Bookshelf (@1 written, @2 empty books)=書架(@1本有字的書@2本空書
Bookshelf=書架
Text too long=文字太長
Wooden Sign=木牌
Steel Sign=鐵牌
Wooden Ladder=木梯子
Steel Ladder=鐵梯子
Apple Wood Fence=蘋果木柵欄
Acacia Wood Fence=相思木柵欄
Jungle Wood Fence=叢林木柵欄
Pine Wood Fence=松木柵欄
Aspen Wood Fence=白楊木柵欄
Apple Wood Fence Rail=蘋果木欄杆
Acacia Wood Fence Rail=相思木欄杆
Jungle Wood Fence Rail=叢林木欄杆
Pine Wood Fence Rail=松木欄杆
Aspen Wood Fence Rail=白楊木欄杆
Glass=玻璃
Obsidian Glass=黑曜石玻璃
Brick Block=磚方塊
Mese Lamp=黃石燈
Mese Post Light=黃石柱燈
Cloud=雲
Wooden Pickaxe=木鎬
Stone Pickaxe=石鎬
Bronze Pickaxe=青銅鎬
Steel Pickaxe=鐵鎬
Mese Pickaxe=黃石鎬
Diamond Pickaxe=鑽石鎬
Wooden Shovel=木鏟
Stone Shovel=石鏟
Bronze Shovel=青銅鏟
Steel Shovel=鐵鏟
Mese Shovel=黃石鏟
Diamond Shovel=鑽石鏟
Wooden Axe=木斧
Stone Axe=石斧
Bronze Axe=青銅斧
Steel Axe=鐵斧
Mese Axe=黃石斧
Diamond Axe=鑽石斧
Wooden Sword=木劍
Stone Sword=石劍
Bronze Sword=青銅劍
Steel Sword=鐵劍
Mese Sword=黃石劍
Diamond Sword=鑽石劍
Key=鑰匙
Torch=火把
@1 will intersect protection on growth.=@1將與增長的保護相交。
Title:=標題:
Contents:=內容:
Save=保存
by @1=由@1
Page @1 of @2=第@1頁共@2頁。
"@1"="@1"

View file

@ -1,43 +1,4 @@
# textdomain: default # textdomain: default
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=
Stick=
Paper=
"@1" by @2=
Book=
Book with Text=
Skeleton Key=
Key to @1's @2=
Coal Lump=
Iron Lump=
Copper Lump=
Tin Lump=
Mese Crystal=
Gold Lump=
Diamond=
Clay Lump=
Steel Ingot=
Copper Ingot=
Tin Ingot=
Bronze Ingot=
Gold Ingot=
Mese Crystal Fragment=
Clay Brick=
Obsidian Shard=
Flint=
Blueberries=
Furnace is empty=
100% (output full)=
@1%=
Empty=
Not cookable=
Furnace active=
Furnace inactive=
(Item: @1; Fuel: @2)=
Furnace=
Stone= Stone=
Cobblestone= Cobblestone=
Stone Brick= Stone Brick=
@ -62,12 +23,12 @@ Obsidian Block=
Dirt= Dirt=
Dirt with Grass= Dirt with Grass=
Dirt with Grass and Footsteps= Dirt with Grass and Footsteps=
Dirt with Dry Grass= Dirt with Savanna Grass=
Dirt with Snow= Dirt with Snow=
Dirt with Rainforest Litter= Dirt with Rainforest Litter=
Dirt with Coniferous Litter= Dirt with Coniferous Litter=
Dry Dirt= Savanna Dirt=
Dry Dirt with Dry Grass= Savanna Dirt with Savanna Grass=
Permafrost= Permafrost=
Permafrost with Stones= Permafrost with Stones=
Permafrost with Moss= Permafrost with Moss=
@ -124,7 +85,7 @@ Papyrus=
Dry Shrub= Dry Shrub=
Jungle Grass= Jungle Grass=
Grass= Grass=
Dry Grass= Savanna Grass=
Fern= Fern=
Marram Grass= Marram Grass=
Bush Stem= Bush Stem=
@ -176,6 +137,8 @@ Brick Block=
Mese Lamp= Mese Lamp=
Mese Post Light= Mese Post Light=
Cloud= Cloud=
@1 will intersect protection on growth.=
Torch=
Wooden Pickaxe= Wooden Pickaxe=
Stone Pickaxe= Stone Pickaxe=
Bronze Pickaxe= Bronze Pickaxe=
@ -201,11 +164,48 @@ Steel Sword=
Mese Sword= Mese Sword=
Diamond Sword= Diamond Sword=
Key= Key=
Torch= Furnace is empty=
@1 will intersect protection on growth.= 100% (output full)=
@1%=
Not cookable=
Empty=
Furnace active=
Furnace inactive=
(Item: @1; Fuel: @2)=
Furnace=
Title:= Title:=
Contents:= Contents:=
Save= Save=
by @1= by @1=
Page @1 of @2= Page @1 of @2=
"@1"= "@1"=
"@1" by @2=
Skeleton Key=
Key to @1's @2=
Blueberries=
Book=
Book with Text=
Bronze Ingot=
Clay Brick=
Clay Lump=
Coal Lump=
Copper Ingot=
Copper Lump=
Diamond=
Flint=
Gold Ingot=
Gold Lump=
Iron Lump=
Mese Crystal=
Mese Crystal Fragment=
Obsidian Shard=
Paper=
Steel Ingot=
Stick=
Tin Ingot=
Tin Lump=
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=

View file

@ -2143,8 +2143,10 @@ function default.register_decorations()
-- Papyrus -- Papyrus
-- Dirt version for rainforest swamp
minetest.register_decoration({ minetest.register_decoration({
name = "default:papyrus", name = "default:papyrus_on_dirt",
deco_type = "schematic", deco_type = "schematic",
place_on = {"default:dirt"}, place_on = {"default:dirt"},
sidelen = 16, sidelen = 16,
@ -2156,10 +2158,32 @@ function default.register_decorations()
octaves = 3, octaves = 3,
persist = 0.7 persist = 0.7
}, },
biomes = {"savanna_shore", "rainforest_swamp"}, biomes = {"rainforest_swamp"},
y_max = 0, y_max = 0,
y_min = 0, y_min = 0,
schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts", schematic = minetest.get_modpath("default") .. "/schematics/papyrus_on_dirt.mts",
})
-- Dry dirt version for savanna shore
minetest.register_decoration({
name = "default:papyrus_on_dry_dirt",
deco_type = "schematic",
place_on = {"default:dry_dirt"},
sidelen = 16,
noise_params = {
offset = -0.3,
scale = 0.7,
spread = {x = 200, y = 200, z = 200},
seed = 354,
octaves = 3,
persist = 0.7
},
biomes = {"savanna_shore"},
y_max = 0,
y_min = 0,
schematic = minetest.get_modpath("default") ..
"/schematics/papyrus_on_dry_dirt.mts",
}) })
-- Bush -- Bush

View file

@ -221,6 +221,10 @@ default:brick
default:meselamp default:meselamp
default:mese_post_light default:mese_post_light
default:mese_post_light_acacia_wood
default:mese_post_light_junglewood
default:mese_post_light_pine_wood
default:mese_post_light_aspen_wood
Misc Misc
---- ----
@ -458,12 +462,12 @@ minetest.register_node("default:dirt_with_grass_footsteps", {
}) })
minetest.register_node("default:dirt_with_dry_grass", { minetest.register_node("default:dirt_with_dry_grass", {
description = S("Dirt with Dry Grass"), description = S("Dirt with Savanna Grass"),
tiles = {"default_dry_grass.png", tiles = {"default_dry_grass.png",
"default_dirt.png", "default_dirt.png",
{name = "default_dirt.png^default_dry_grass_side.png", {name = "default_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}}, tileable_vertical = false}},
groups = {crumbly = 3, soil = 1}, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
drop = "default:dirt", drop = "default:dirt",
sounds = default.node_sound_dirt_defaults({ sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_grass_footstep", gain = 0.4}, footstep = {name = "default_grass_footstep", gain = 0.4},
@ -513,14 +517,14 @@ minetest.register_node("default:dirt_with_coniferous_litter", {
}) })
minetest.register_node("default:dry_dirt", { minetest.register_node("default:dry_dirt", {
description = S("Dry Dirt"), description = S("Savanna Dirt"),
tiles = {"default_dry_dirt.png"}, tiles = {"default_dry_dirt.png"},
groups = {crumbly = 3, soil = 1}, groups = {crumbly = 3, soil = 1},
sounds = default.node_sound_dirt_defaults(), sounds = default.node_sound_dirt_defaults(),
}) })
minetest.register_node("default:dry_dirt_with_dry_grass", { minetest.register_node("default:dry_dirt_with_dry_grass", {
description = S("Dry Dirt with Dry Grass"), description = S("Savanna Dirt with Savanna Grass"),
tiles = {"default_dry_grass.png", "default_dry_dirt.png", tiles = {"default_dry_grass.png", "default_dry_dirt.png",
{name = "default_dry_dirt.png^default_dry_grass_side.png", {name = "default_dry_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}}, tileable_vertical = false}},
@ -621,7 +625,7 @@ minetest.register_node("default:snow", {
collision_box = { collision_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5},
}, },
}, },
groups = {crumbly = 3, falling_node = 1, snowy = 1}, groups = {crumbly = 3, falling_node = 1, snowy = 1},
@ -1497,7 +1501,7 @@ end
minetest.register_node("default:dry_grass_1", { minetest.register_node("default:dry_grass_1", {
description = S("Dry Grass"), description = S("Savanna Grass"),
drawtype = "plantlike", drawtype = "plantlike",
waving = 1, waving = 1,
tiles = {"default_dry_grass_1.png"}, tiles = {"default_dry_grass_1.png"},
@ -1526,7 +1530,7 @@ minetest.register_node("default:dry_grass_1", {
for i = 2, 5 do for i = 2, 5 do
minetest.register_node("default:dry_grass_" .. i, { minetest.register_node("default:dry_grass_" .. i, {
description = S("Dry Grass"), description = S("Savanna Grass"),
drawtype = "plantlike", drawtype = "plantlike",
waving = 1, waving = 1,
tiles = {"default_dry_grass_" .. i .. ".png"}, tiles = {"default_dry_grass_" .. i .. ".png"},
@ -2234,7 +2238,7 @@ minetest.register_node("default:water_flowing", {
type = "vertical_frames", type = "vertical_frames",
aspect_w = 16, aspect_w = 16,
aspect_h = 16, aspect_h = 16,
length = 0.8, length = 0.5,
}, },
}, },
{ {
@ -2244,7 +2248,7 @@ minetest.register_node("default:water_flowing", {
type = "vertical_frames", type = "vertical_frames",
aspect_w = 16, aspect_w = 16,
aspect_h = 16, aspect_h = 16,
length = 0.8, length = 0.5,
}, },
}, },
}, },
@ -2330,7 +2334,7 @@ minetest.register_node("default:river_water_flowing", {
type = "vertical_frames", type = "vertical_frames",
aspect_w = 16, aspect_w = 16,
aspect_h = 16, aspect_h = 16,
length = 0.8, length = 0.5,
}, },
}, },
{ {
@ -2340,7 +2344,7 @@ minetest.register_node("default:river_water_flowing", {
type = "vertical_frames", type = "vertical_frames",
aspect_w = 16, aspect_w = 16,
aspect_h = 16, aspect_h = 16,
length = 0.8, length = 0.5,
}, },
}, },
}, },
@ -2579,12 +2583,10 @@ local function register_sign(material, desc, def)
sounds = def.sounds, sounds = def.sounds,
on_construct = function(pos) on_construct = function(pos)
--local n = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", "field[text;;${text}]") meta:set_string("formspec", "field[text;;${text}]")
end, end,
on_receive_fields = function(pos, formname, fields, sender) on_receive_fields = function(pos, formname, fields, sender)
--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
local player_name = sender:get_player_name() local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) then if minetest.is_protected(pos, player_name) then
minetest.record_protection_violation(pos, player_name) minetest.record_protection_violation(pos, player_name)
@ -2598,8 +2600,8 @@ local function register_sign(material, desc, def)
minetest.chat_send_player(player_name, S("Text too long")) minetest.chat_send_player(player_name, S("Text too long"))
return return
end end
minetest.log("action", (player_name or "") .. " wrote \"" .. minetest.log("action", player_name .. " wrote \"" .. text ..
text .. "\" to sign at " .. minetest.pos_to_string(pos)) "\" to the sign at " .. minetest.pos_to_string(pos))
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("text", text) meta:set_string("text", text)
@ -2816,7 +2818,10 @@ minetest.register_node("default:brick", {
description = S("Brick Block"), description = S("Brick Block"),
paramtype2 = "facedir", paramtype2 = "facedir",
place_param2 = 0, place_param2 = 0,
tiles = {"default_brick.png"}, tiles = {
"default_brick.png^[transformFX",
"default_brick.png",
},
is_ground_content = false, is_ground_content = false,
groups = {cracky = 3}, groups = {cracky = 3},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
@ -2835,25 +2840,34 @@ minetest.register_node("default:meselamp", {
light_source = default.LIGHT_MAX, light_source = default.LIGHT_MAX,
}) })
minetest.register_node("default:mese_post_light", { default.register_mesepost("default:mese_post_light", {
description = S("Mese Post Light"), description = S("Apple Wood Mese Post Light"),
tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png", texture = "default_fence_wood.png",
"default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png", material = "default:wood",
"default_mese_post_light_side.png", "default_mese_post_light_side.png"}, })
wield_image = "default_mese_post_light_side.png",
drawtype = "nodebox", default.register_mesepost("default:mese_post_light_acacia", {
node_box = { description = S("Acacia Wood Mese Post Light"),
type = "fixed", texture = "default_fence_acacia_wood.png",
fixed = { material = "default:acacia_wood",
{-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16}, })
},
}, default.register_mesepost("default:mese_post_light_junglewood", {
paramtype = "light", description = S("Jungle Wood Mese Post Light"),
light_source = default.LIGHT_MAX, texture = "default_fence_junglewood.png",
sunlight_propagates = true, material = "default:junglewood",
is_ground_content = false, })
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(), default.register_mesepost("default:mese_post_light_pine_wood", {
description = S("Pine Wood Mese Post Light"),
texture = "default_fence_pine_wood.png",
material = "default:pine_wood",
})
default.register_mesepost("default:mese_post_light_aspen_wood", {
description = S("Aspen Wood Mese Post Light"),
texture = "default_fence_aspen_wood.png",
material = "default:aspen_wood",
}) })
-- --

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 279 B

View file

@ -11,7 +11,8 @@ local function on_flood(pos, oldnode, newnode)
nodedef.groups.igniter and nodedef.groups.igniter > 0) then nodedef.groups.igniter and nodedef.groups.igniter > 0) then
minetest.sound_play( minetest.sound_play(
"default_cool_lava", "default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.1} {pos = pos, max_hear_distance = 16, gain = 0.1},
true
) )
end end
-- Remove the torch node -- Remove the torch node
@ -70,6 +71,7 @@ minetest.register_node("default:torch", {
end, end,
floodable = true, floodable = true,
on_flood = on_flood, on_flood = on_flood,
on_rotate = false
}) })
minetest.register_node("default:torch_wall", { minetest.register_node("default:torch_wall", {
@ -93,6 +95,7 @@ minetest.register_node("default:torch_wall", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
floodable = true, floodable = true,
on_flood = on_flood, on_flood = on_flood,
on_rotate = false
}) })
minetest.register_node("default:torch_ceiling", { minetest.register_node("default:torch_ceiling", {
@ -116,6 +119,7 @@ minetest.register_node("default:torch_ceiling", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
floodable = true, floodable = true,
on_flood = on_flood, on_flood = on_flood,
on_rotate = false
}) })
minetest.register_lbm({ minetest.register_lbm({

View file

@ -16,9 +16,7 @@ function default.can_grow(pos)
if not node_under then if not node_under then
return false return false
end end
local name_under = node_under.name if minetest.get_item_group(node_under.name, "soil") == 0 then
local is_soil = minetest.get_item_group(name_under, "soil")
if is_soil == 0 then
return false return false
end end
local light_level = minetest.get_node_light(pos) local light_level = minetest.get_node_light(pos)

View file

@ -78,9 +78,7 @@ end
-- nodes from being placed in the top half of the door. -- nodes from being placed in the top half of the door.
minetest.register_node("doors:hidden", { minetest.register_node("doors:hidden", {
description = S("Hidden Door Segment"), description = S("Hidden Door Segment"),
-- can't use airlike otherwise falling nodes will turn to entities drawtype = "airlike",
-- and will be forever stuck until door is removed.
drawtype = "nodebox",
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
sunlight_propagates = true, sunlight_propagates = true,
@ -93,13 +91,7 @@ minetest.register_node("doors:hidden", {
drop = "", drop = "",
groups = {not_in_creative_inventory = 1}, groups = {not_in_creative_inventory = 1},
on_blast = function() end, on_blast = function() end,
tiles = {"doors_blank.png"}, -- 1px block inside door hinge near node top
-- 1px transparent block inside door hinge near node top.
node_box = {
type = "fixed",
fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
},
-- collision_box needed otherise selection box would be full node size
collision_box = { collision_box = {
type = "fixed", type = "fixed",
fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
@ -115,10 +107,10 @@ local transform = {
{v = "_a", param2 = 2}, {v = "_a", param2 = 2},
}, },
{ {
{v = "_b", param2 = 1}, {v = "_c", param2 = 1},
{v = "_b", param2 = 2}, {v = "_c", param2 = 2},
{v = "_b", param2 = 3}, {v = "_c", param2 = 3},
{v = "_b", param2 = 0}, {v = "_c", param2 = 0},
}, },
{ {
{v = "_b", param2 = 1}, {v = "_b", param2 = 1},
@ -127,10 +119,10 @@ local transform = {
{v = "_b", param2 = 0}, {v = "_b", param2 = 0},
}, },
{ {
{v = "_a", param2 = 3}, {v = "_d", param2 = 3},
{v = "_a", param2 = 0}, {v = "_d", param2 = 0},
{v = "_a", param2 = 1}, {v = "_d", param2 = 1},
{v = "_a", param2 = 2}, {v = "_d", param2 = 2},
}, },
} }
@ -176,10 +168,10 @@ function doors.door_toggle(pos, node, clicker)
if state % 2 == 0 then if state % 2 == 0 then
minetest.sound_play(def.door.sounds[1], minetest.sound_play(def.door.sounds[1],
{pos = pos, gain = 0.3, max_hear_distance = 10}) {pos = pos, gain = 0.3, max_hear_distance = 10}, true)
else else
minetest.sound_play(def.door.sounds[2], minetest.sound_play(def.door.sounds[2],
{pos = pos, gain = 0.3, max_hear_distance = 10}) {pos = pos, gain = 0.3, max_hear_distance = 10}, true)
end end
minetest.swap_node(pos, { minetest.swap_node(pos, {
@ -340,7 +332,7 @@ function doors.register(name, def)
itemstack:take_item() itemstack:take_item()
end end
minetest.sound_play(def.sounds.place, {pos = pos}) minetest.sound_play(def.sounds.place, {pos = pos}, true)
on_place_node(pos, minetest.get_node(pos), on_place_node(pos, minetest.get_node(pos),
placer, node, itemstack, pointed_thing) placer, node, itemstack, pointed_thing)
@ -449,15 +441,23 @@ function doors.register(name, def)
def.mesh = "door_b.obj" def.mesh = "door_b.obj"
minetest.register_node(":" .. name .. "_b", def) minetest.register_node(":" .. name .. "_b", def)
def.mesh = "door_a2.obj"
minetest.register_node(":" .. name .. "_c", def)
def.mesh = "door_b2.obj"
minetest.register_node(":" .. name .. "_d", def)
doors.registered_doors[name .. "_a"] = true doors.registered_doors[name .. "_a"] = true
doors.registered_doors[name .. "_b"] = true doors.registered_doors[name .. "_b"] = true
doors.registered_doors[name .. "_c"] = true
doors.registered_doors[name .. "_d"] = true
end end
doors.register("door_wood", { doors.register("door_wood", {
tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, tiles = {{ name = "doors_door_wood.png", backface_culling = true }},
description = S("Wooden Door"), description = S("Wooden Door"),
inventory_image = "doors_item_wood.png", inventory_image = "doors_item_wood.png",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
recipe = { recipe = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
@ -470,7 +470,7 @@ doors.register("door_steel", {
description = S("Steel Door"), description = S("Steel Door"),
inventory_image = "doors_item_steel.png", inventory_image = "doors_item_steel.png",
protected = true, protected = true,
groups = {cracky = 1, level = 2}, groups = {node = 1, cracky = 1, level = 2},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
sound_open = "doors_steel_door_open", sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close", sound_close = "doors_steel_door_close",
@ -485,7 +485,7 @@ doors.register("door_glass", {
tiles = {"doors_door_glass.png"}, tiles = {"doors_door_glass.png"},
description = S("Glass Door"), description = S("Glass Door"),
inventory_image = "doors_item_glass.png", inventory_image = "doors_item_glass.png",
groups = {cracky=3, oddly_breakable_by_hand=3}, groups = {node = 1, cracky=3, oddly_breakable_by_hand=3},
sounds = default.node_sound_glass_defaults(), sounds = default.node_sound_glass_defaults(),
sound_open = "doors_glass_door_open", sound_open = "doors_glass_door_open",
sound_close = "doors_glass_door_close", sound_close = "doors_glass_door_close",
@ -500,7 +500,7 @@ doors.register("door_obsidian_glass", {
tiles = {"doors_door_obsidian_glass.png"}, tiles = {"doors_door_obsidian_glass.png"},
description = S("Obsidian Glass Door"), description = S("Obsidian Glass Door"),
inventory_image = "doors_item_obsidian_glass.png", inventory_image = "doors_item_obsidian_glass.png",
groups = {cracky=3}, groups = {node = 1, cracky=3},
sounds = default.node_sound_glass_defaults(), sounds = default.node_sound_glass_defaults(),
sound_open = "doors_glass_door_open", sound_open = "doors_glass_door_open",
sound_close = "doors_glass_door_close", sound_close = "doors_glass_door_close",
@ -550,12 +550,12 @@ function doors.trapdoor_toggle(pos, node, clicker)
if string.sub(node.name, -5) == "_open" then if string.sub(node.name, -5) == "_open" then
minetest.sound_play(def.sound_close, minetest.sound_play(def.sound_close,
{pos = pos, gain = 0.3, max_hear_distance = 10}) {pos = pos, gain = 0.3, max_hear_distance = 10}, true)
minetest.swap_node(pos, {name = string.sub(node.name, 1, minetest.swap_node(pos, {name = string.sub(node.name, 1,
string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) string.len(node.name) - 5), param1 = node.param1, param2 = node.param2})
else else
minetest.sound_play(def.sound_open, minetest.sound_play(def.sound_open,
{pos = pos, gain = 0.3, max_hear_distance = 10}) {pos = pos, gain = 0.3, max_hear_distance = 10}, true)
minetest.swap_node(pos, {name = node.name .. "_open", minetest.swap_node(pos, {name = node.name .. "_open",
param1 = node.param1, param2 = node.param2}) param1 = node.param1, param2 = node.param2})
end end
@ -744,7 +744,7 @@ function doors.register_fencegate(name, def)
local node_def = minetest.registered_nodes[node.name] local node_def = minetest.registered_nodes[node.name]
minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2})
minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3, minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3,
max_hear_distance = 8}) max_hear_distance = 8}, true)
return itemstack return itemstack
end, end,
selection_box = { selection_box = {

View file

@ -0,0 +1,18 @@
# textdomain: doors
Hidden Door Segment=Bagian Pintu Tersembunyi
Owned by @1=Milik @1
You do not own this locked door.=Anda bukan pemilik pintu terkunci ini.
a locked door=pintu terkunci
Wooden Door=Pintu Kayu
Steel Door=Pintu Baja
Glass Door=Pintu Kaca
Obsidian Glass Door=Pintu Kaca Obsidian
You do not own this trapdoor.=Anda bukan pemilik pintu kolong ini.
a locked trapdoor=pintu kolong terkunci
Wooden Trapdoor=Pintu Kolong Kayu
Steel Trapdoor=Pintu Kolong Baja
Apple Wood Fence Gate=Gerbang Kayu Pohon Apel
Acacia Wood Fence Gate=Gerbang Kayu Akasia
Jungle Wood Fence Gate=Gerbang Kayu Pohon Rimba
Pine Wood Fence Gate=Gerbang Kayu Pinus
Aspen Wood Fence Gate=Gerbang Kayu Aspen

View file

@ -4,7 +4,7 @@ Owned by @1=Di proprietà di @1
You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave. You do not own this locked door.=Non sei il proprietario di questa porta chiusa a chiave.
a locked door=una porta chiusa a chiave a locked door=una porta chiusa a chiave
Wooden Door=Porta di legno Wooden Door=Porta di legno
Steel Door=Porta d'acciacio Steel Door=Porta d'acciaio
Glass Door=Porta di vetro Glass Door=Porta di vetro
Obsidian Glass Door=Porta di vetro d'ossidiana Obsidian Glass Door=Porta di vetro d'ossidiana
Owned by @1=Di proprietà di @1 Owned by @1=Di proprietà di @1

View file

@ -1,14 +1,14 @@
# textdomain: doors # textdomain: doors
Hidden Door Segment=隐藏门段 Hidden Door Segment=隐藏门段
Owned by @1=由@1拥有 Owned by @1=由@1拥有
You do not own this locked door.=您不拥有此锁着的门 You do not own this locked door.=这个门不属于你所有
a locked door=一扇锁的门 a locked door=一扇已上锁的门
Wooden Door=木门 Wooden Door=木门
Steel Door=铁门 Steel Door=铁门
Glass Door=玻璃门 Glass Door=玻璃门
Obsidian Glass Door=黑曜石玻璃门 Obsidian Glass Door=黑曜石玻璃门
You do not own this trapdoor.=您不拥有此活板门 You do not own this trapdoor.=这个活板门不属于你所有
a locked trapdoor=一扇上锁的活板门 a locked trapdoor=一扇上锁的活板门
Wooden Trapdoor=木活板门 Wooden Trapdoor=木活板门
Steel Trapdoor=铁活板门 Steel Trapdoor=铁活板门
Apple Wood Fence Gate=用苹果树做的木栅栏门 Apple Wood Fence Gate=用苹果树做的木栅栏门

View file

@ -0,0 +1,18 @@
# textdomain: doors
Hidden Door Segment=隱藏門段
Owned by @1=由@1擁有
You do not own this locked door.=這個門不屬於你所有。
a locked door=一扇已上鎖的門
Wooden Door=木門
Steel Door=鐵門
Glass Door=玻璃門
Obsidian Glass Door=黑曜石玻璃門
You do not own this trapdoor.=這個活板門不屬於你所有。
a locked trapdoor=一扇已上鎖的活板門
Wooden Trapdoor=木活板門
Steel Trapdoor=鐵活板門
Apple Wood Fence Gate=用蘋果樹做的木柵欄門
Acacia Wood Fence Gate=相思木柵欄門
Jungle Wood Fence Gate=叢林木柵欄門
Pine Wood Fence Gate=松木柵欄門
Aspen Wood Fence Gate=白楊木柵欄門

View file

@ -1,7 +1,7 @@
# Blender v2.76 (sub 0) OBJ File: 'door_a.blend' # Blender v2.76 (sub 0) OBJ File: 'door_a.blend'
# www.blender.org # www.blender.org
mtllib door_a.mtl mtllib door_a.mtl
o Cube_Cube.001 o door_a
v 0.499000 -0.499000 -0.499000 v 0.499000 -0.499000 -0.499000
v 0.499000 1.499000 -0.499000 v 0.499000 1.499000 -0.499000
v 0.499000 -0.499000 -0.375000 v 0.499000 -0.499000 -0.375000

View file

@ -0,0 +1,50 @@
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib door_a2.mtl
o door_a2
v -0.499000 1.499000 -0.499000
v -0.499000 -0.499000 -0.499000
v -0.499000 -0.499000 -0.375000
v -0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.375000
v 0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.499000
v 0.499000 1.499000 -0.499000
vt 0.894737 1.000000
vt 0.894737 0.000000
vt 0.842105 0.000000
vt 0.842105 1.000000
vt 0.421052 1.000000
vt 0.421052 0.000000
vt 0.000001 0.000000
vt 0.000001 1.000000
vt 0.894737 1.000000
vt 0.894737 0.000000
vt 0.947368 0.000000
vt 0.947368 1.000000
vt 0.842105 1.000000
vt 0.842105 0.000000
vt 0.421052 0.000000
vt 0.421052 1.000000
vt 0.947368 0.000000
vt 0.947368 0.500000
vt 1.000000 0.500000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.500000
vt 0.947368 0.500000
vt 0.947368 1.000000
vn -1.0000 -0.0000 0.0000
vn 0.0000 -0.0000 1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl None.009
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 4/5/2 3/6/2 5/7/2 6/8/2
f 6/9/3 5/10/3 7/11/3 8/12/3
f 8/13/4 7/14/4 2/15/4 1/16/4
f 2/17/5 7/18/5 5/19/5 3/20/5
f 8/21/6 1/22/6 4/23/6 6/24/6

View file

@ -1,40 +1,50 @@
# Blender v2.76 (sub 0) OBJ File: 'door_b.blend' # Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org # www.blender.org
mtllib door_b.mtl mtllib door_b.mtl
o Cube_Cube.001 o door_b
v -0.499000 -0.499000 -0.499000
v -0.499000 1.499000 -0.499000
v -0.499000 -0.499000 -0.375000
v -0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.499000
v 0.499000 1.499000 -0.499000 v 0.499000 1.499000 -0.499000
v 0.499000 -0.499000 -0.375000
v 0.499000 1.499000 -0.375000 v 0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.375000
v 0.499000 -0.499000 -0.499000
v -0.499000 1.499000 -0.375000
v -0.499000 -0.499000 -0.375000
v -0.499000 1.499000 -0.499000
v -0.499000 -0.499000 -0.499000
vt 0.894736 1.000000
vt 0.947368 1.000000
vt 0.947368 0.000000
vt 0.894736 0.000000
vt 0.842105 1.000000 vt 0.842105 1.000000
vt 0.842105 0.000000
vt 0.894737 0.000000
vt 0.894737 1.000000
vt 0.421053 1.000000 vt 0.421053 1.000000
vt 0.421053 0.000000 vt 0.421053 0.000000
vt 0.947368 0.000000 vt 0.842105 0.000000
vt 0.947368 1.000000 vt 0.842105 1.000000
vt 0.894736 1.000000
vt 0.894736 0.000000
vt 0.842105 0.000000
vt 0.421053 1.000000
vt 0.000000 1.000000 vt 0.000000 1.000000
vt 0.000000 0.000000 vt 0.000000 0.000000
vt 1.000000 0.000000 vt 0.421053 0.000000
vt 1.000000 0.500000 vt 1.000000 0.500000
vt 0.947368 0.500000 vt 0.947368 0.500000
vt 0.947368 1.000000
vt 1.000000 1.000000 vt 1.000000 1.000000
vn -1.000000 0.000000 0.000000 vt 1.000000 0.000000
vn 0.000000 0.000000 1.000000 vt 0.947368 0.000000
vn 1.000000 0.000000 0.000000 vt 0.947368 0.500000
vn 0.000000 0.000000 -1.000000 vt 1.000000 0.500000
vn 0.000000 -1.000000 0.000000 vn 1.0000 0.0000 0.0000
vn 0.000000 1.000000 0.000000 vn 0.0000 -0.0000 1.0000
usemtl None vn -1.0000 0.0000 0.0000
s off vn 0.0000 0.0000 -1.0000
f 2/1/1 1/2/1 3/3/1 4/4/1 vn 0.0000 -1.0000 0.0000
f 4/5/2 3/6/2 7/2/2 8/1/2 vn 0.0000 1.0000 0.0000
f 8/4/3 7/3/3 5/7/3 6/8/3 usemtl None.007
f 6/9/4 5/10/4 1/6/4 2/5/4 s 1
f 1/11/5 5/12/5 7/13/5 3/7/5 f 1/1/1 2/2/1 3/3/1 4/4/1
f 6/8/6 2/13/6 4/12/6 8/14/6 f 2/5/2 5/6/2 6/7/2 3/8/2
f 5/9/3 7/10/3 8/11/3 6/12/3
f 7/13/4 1/14/4 4/15/4 8/16/4
f 4/17/5 3/18/5 6/19/5 8/20/5
f 7/21/6 5/22/6 2/23/6 1/24/6

View file

@ -0,0 +1,50 @@
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib door_b2.mtl
o door_b2
v 0.499000 1.499000 -0.499000
v 0.499000 1.499000 -0.375000
v 0.499000 -0.499000 -0.375000
v 0.499000 -0.499000 -0.499000
v -0.499000 1.499000 -0.375000
v -0.499000 -0.499000 -0.375000
v -0.499000 1.499000 -0.499000
v -0.499000 -0.499000 -0.499000
vt 0.842105 1.000000
vt 0.894737 1.000000
vt 0.894737 0.000000
vt 0.842105 0.000000
vt 0.421052 1.000000
vt 0.000001 1.000000
vt 0.000001 0.000000
vt 0.421052 0.000000
vt 0.894737 1.000000
vt 0.947368 1.000000
vt 0.947368 0.000000
vt 0.894737 0.000000
vt 0.842105 1.000000
vt 0.421052 1.000000
vt 0.421052 0.000000
vt 0.842105 0.000000
vt 1.000000 0.500000
vt 0.947368 0.500000
vt 0.947368 1.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
vt 0.947368 0.000000
vt 0.947368 0.500000
vt 1.000000 0.500000
vn 1.0000 0.0000 0.0000
vn 0.0000 -0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl None.010
s 1
f 1/1/1 2/2/1 3/3/1 4/4/1
f 2/5/2 5/6/2 6/7/2 3/8/2
f 5/9/3 7/10/3 8/11/3 6/12/3
f 7/13/4 1/14/4 4/15/4 8/16/4
f 4/17/5 3/18/5 6/19/5 8/20/5
f 7/21/6 5/22/6 2/23/6 1/24/6

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

View file

@ -1,26 +1,13 @@
dungeon_loot.registered_loot = { -- Loot from the `default` mod is registered here,
-- buckets -- with the rest being registered in the respective mods
{name = "bucket:bucket_empty", chance = 0.55},
-- water in deserts/ice or above ground, lava otherwise
{name = "bucket:bucket_water", chance = 0.45,
types = {"sandstone", "desert", "ice"}},
{name = "bucket:bucket_water", chance = 0.45, y = {0, 32768},
types = {"normal"}},
{name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1},
types = {"normal"}},
dungeon_loot.registered_loot = {
-- various items -- various items
{name = "default:stick", chance = 0.6, count = {3, 6}}, {name = "default:stick", chance = 0.6, count = {3, 6}},
{name = "default:flint", chance = 0.4, count = {1, 3}}, {name = "default:flint", chance = 0.4, count = {1, 3}},
{name = "vessels:glass_fragments", chance = 0.35, count = {1, 4}},
{name = "carts:rail", chance = 0.35, count = {1, 6}},
-- farming / consumable -- farming / consumable
{name = "farming:string", chance = 0.5, count = {1, 8}},
{name = "farming:wheat", chance = 0.5, count = {2, 5}},
{name = "default:apple", chance = 0.4, count = {1, 4}}, {name = "default:apple", chance = 0.4, count = {1, 4}},
{name = "farming:seed_cotton", chance = 0.4, count = {1, 4},
types = {"normal"}},
{name = "default:cactus", chance = 0.4, count = {1, 4}, {name = "default:cactus", chance = 0.4, count = {1, 4},
types = {"sandstone", "desert"}}, types = {"sandstone", "desert"}},

View file

@ -89,8 +89,9 @@ local function populate_chest(pos, rand, dungeontype)
amount = rand:next(loot.count[1], loot.count[2]) amount = rand:next(loot.count[1], loot.count[2])
end end
if itemdef then if not itemdef then
if itemdef.tool_capabilities then minetest.log("warning", "Registered loot item " .. loot.name .. " does not exist")
elseif itemdef.tool_capabilities then
for n = 1, amount do for n = 1, amount do
local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear local wear = rand:next(0.20 * 65535, 0.75 * 65535) -- 20% to 75% wear
table.insert(items, ItemStack({name = loot.name, wear = wear})) table.insert(items, ItemStack({name = loot.name, wear = wear}))
@ -105,7 +106,6 @@ local function populate_chest(pos, rand, dungeontype)
end end
end end
end end
end
-- place items at random places in chest -- place items at random places in chest
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()

16
mods/dye/locale/dye.id.tr Normal file
View file

@ -0,0 +1,16 @@
# textdomain: dye
White Dye=Pewarna Putih
Grey Dye=Pewarna Abu
Dark Grey Dye=Pewarna Abu Tua
Black Dye=Pewarna Hitam
Violet Dye=Pewarna Ungu
Blue Dye=Pewarna Biru
Cyan Dye=Pewarna Sian
Dark Green Dye=Pewarna Hijau Tua
Green Dye=Pewarna Hijau
Yellow Dye=Pewarna Kuning
Brown Dye=Pewarna Cokelat
Orange Dye=Pewarna Oranye
Red Dye=Pewarna Merah
Magenta Dye=Pewarna Magenta
Pink Dye=Pewarna Jambon

View file

@ -2,8 +2,8 @@
White Dye=白染料 White Dye=白染料
Grey Dye=灰染料 Grey Dye=灰染料
Dark Grey Dye=暗灰染料 Dark Grey Dye=暗灰染料
Black Dye=染料 Black Dye=染料
Violet Dye=染料 Violet Dye=染料
Blue Dye=蓝染料 Blue Dye=蓝染料
Cyan Dye=青染料 Cyan Dye=青染料
Dark Green Dye=暗绿染料 Dark Green Dye=暗绿染料
@ -13,4 +13,4 @@ Brown Dye=棕染料
Orange Dye=橙染料 Orange Dye=橙染料
Red Dye=红染料 Red Dye=红染料
Magenta Dye=品红染料 Magenta Dye=品红染料
Pink Dye=红染料 Pink Dye=红染料

View file

@ -0,0 +1,16 @@
# textdomain: dye
White Dye=白染料
Grey Dye=灰染料
Dark Grey Dye=暗灰染料
Black Dye=黑染料
Violet Dye=紫染料
Blue Dye=藍染料
Cyan Dye=青染料
Dark Green Dye=暗綠染料
Green Dye=綠染料
Yellow Dye=黃染料
Brown Dye=棕染料
Orange Dye=橙染料
Red Dye=紅染料
Magenta Dye=品紅染料
Pink Dye=粉紅染料

View file

@ -11,3 +11,7 @@ Authors of media (sounds)
Yuval (CC0 1.0) Yuval (CC0 1.0)
https://freesound.org/people/Yuval/sounds/197023/ https://freesound.org/people/Yuval/sounds/197023/
env_sounds_water.*.ogg env_sounds_water.*.ogg
Halion (CC0 1.0)
https://freesound.org/people/Halion/sounds/17785/
env_sounds_lava.*.ogg

View file

@ -1,11 +1,41 @@
-- Parameters -- Parameters
local radius = 8 -- Water node search radius around player -- Node search radius around player
local radius = 8
-- End of parameters local allsounds = {
["env_sounds_water"] = {
trigger = {"default:water_flowing", "default:river_water_flowing"},
base_volume = 0.04,
max_volume = 0.4,
per_node = 0.004,
},
["env_sounds_lava"] = {
trigger = {"default:lava_source", "default:lava_flowing"},
base_volume = 0,
max_volume = 0.6,
per_node = {
["default:lava_source"] = 0.008,
["default:lava_flowing"] = 0.002,
},
},
}
if minetest.settings:get_bool("river_source_sounds") then
table.insert(allsounds["env_sounds_water"].trigger,
"default:river_water_source")
end
local river_source_sounds = minetest.settings:get_bool("river_source_sounds") -- Cache the union of all trigger nodes
local cache_triggers = {}
for sound, def in pairs(allsounds) do
for _, name in ipairs(def.trigger) do
table.insert(cache_triggers, name)
end
end
-- Update sound for player -- Update sound for player
@ -13,39 +43,57 @@ local river_source_sounds = minetest.settings:get_bool("river_source_sounds")
local function update_sound(player) local function update_sound(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local ppos = player:get_pos() local ppos = player:get_pos()
ppos = vector.add(ppos, player:get_properties().eye_height)
local areamin = vector.subtract(ppos, radius) local areamin = vector.subtract(ppos, radius)
local areamax = vector.add(ppos, radius) local areamax = vector.add(ppos, radius)
local water_nodes = {"default:water_flowing", "default:river_water_flowing"}
if river_source_sounds then local pos = minetest.find_nodes_in_area(areamin, areamax, cache_triggers, true)
table.insert(water_nodes, "default:river_water_source") if next(pos) == nil then -- If table empty
end
local wpos, _ = minetest.find_nodes_in_area(areamin, areamax, water_nodes)
local waters = #wpos
if waters == 0 then
return return
end end
for sound, def in pairs(allsounds) do
-- Find average position of water positions -- Find average position
local wposav = vector.new() local posav = {0, 0, 0}
for _, pos in ipairs(wpos) do local count = 0
wposav.x = wposav.x + pos.x for _, name in ipairs(def.trigger) do
wposav.y = wposav.y + pos.y if pos[name] then
wposav.z = wposav.z + pos.z for _, p in ipairs(pos[name]) do
posav[1] = posav[1] + p.x
posav[2] = posav[2] + p.y
posav[3] = posav[3] + p.z
end
count = count + #pos[name]
end
end end
wposav = vector.divide(wposav, waters)
minetest.sound_play( if count > 0 then
"env_sounds_water", posav = vector.new(posav[1] / count, posav[2] / count,
{ posav[3] / count)
pos = wposav,
-- Calculate gain
local gain = def.base_volume
if type(def.per_node) == 'table' then
for name, multiplier in pairs(def.per_node) do
if pos[name] then
gain = gain + #pos[name] * multiplier
end
end
else
gain = gain + count * def.per_node
end
gain = math.min(gain, def.max_volume)
minetest.sound_play(sound, {
pos = posav,
to_player = player_name, to_player = player_name,
gain = math.min(0.04 + waters * 0.004, 0.4), gain = gain,
} }, true)
) end
end
end end
-- Update sound 'on joinplayer' -- Update sound when player joins
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
update_sound(player) update_sound(player)

Binary file not shown.

Binary file not shown.

View file

@ -38,3 +38,6 @@ Created by Gambit (CC BY 3.0):
Created by Napiophelios (CC BY-SA 3.0): Created by Napiophelios (CC BY-SA 3.0):
farming_cotton.png farming_cotton.png
Created by Extex101 (CC BY-SA 3.0):
farming_cotton_wild.png

View file

@ -59,7 +59,7 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
minetest.sound_play("default_dig_crumbly", { minetest.sound_play("default_dig_crumbly", {
pos = pt.under, pos = pt.under,
gain = 0.5, gain = 0.5,
}) }, true)
if not (creative and creative.is_enabled_for if not (creative and creative.is_enabled_for
and creative.is_enabled_for(user:get_player_name())) then and creative.is_enabled_for(user:get_player_name())) then
@ -68,7 +68,8 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
itemstack:add_wear(65535/(uses-1)) itemstack:add_wear(65535/(uses-1))
-- tool break sound -- tool break sound
if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5}) minetest.sound_play(wdef.sound.breaks, {pos = pt.above,
gain = 0.5}, true)
end end
end end
return itemstack return itemstack
@ -176,6 +177,8 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname)
end end
-- add the node and remove 1 item from the itemstack -- add the node and remove 1 item from the itemstack
minetest.log("action", player_name .. " places node " .. plantname .. " at " ..
minetest.pos_to_string(pt.above))
minetest.add_node(pt.above, {name = plantname, param2 = 1}) minetest.add_node(pt.above, {name = plantname, param2 = 1})
tick(pt.above) tick(pt.above)
if not (creative and creative.is_enabled_for if not (creative and creative.is_enabled_for

View file

@ -16,7 +16,7 @@ dofile(farming.path .. "/nodes.lua")
dofile(farming.path .. "/hoes.lua") dofile(farming.path .. "/hoes.lua")
-- WHEAT -- Wheat
farming.register_plant("farming:wheat", { farming.register_plant("farming:wheat", {
description = S("Wheat Seed"), description = S("Wheat Seed"),
@ -71,6 +71,25 @@ farming.register_plant("farming:cotton", {
groups = {flammable = 4}, groups = {flammable = 4},
}) })
minetest.register_decoration({
name = "farming:cotton_wild",
deco_type = "simple",
place_on = {"default:dry_dirt_with_dry_grass"},
sidelen = 16,
noise_params = {
offset = -0.1,
scale = 0.1,
spread = {x = 50, y = 50, z = 50},
seed = 4242,
octaves = 3,
persist = 0.7
},
biomes = {"savanna"},
y_max = 31000,
y_min = 1,
decoration = "farming:cotton_wild",
})
minetest.register_craftitem("farming:string", { minetest.register_craftitem("farming:string", {
description = S("String"), description = S("String"),
inventory_image = "farming_string.png", inventory_image = "farming_string.png",
@ -115,12 +134,6 @@ minetest.register_craft({
-- Fuels -- Fuels
minetest.register_craft({
type = "fuel",
recipe = "farming:straw",
burntime = 3,
})
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "farming:wheat", recipe = "farming:wheat",
@ -144,3 +157,15 @@ minetest.register_craft({
recipe = "farming:hoe_wood", recipe = "farming:hoe_wood",
burntime = 5, burntime = 5,
}) })
-- Register farming items as dungeon loot
if minetest.global_exists("dungeon_loot") then
dungeon_loot.register({
{name = "farming:string", chance = 0.5, count = {1, 8}},
{name = "farming:wheat", chance = 0.5, count = {2, 5}},
{name = "farming:seed_cotton", chance = 0.4, count = {1, 4},
types = {"normal"}},
})
end

View file

@ -59,3 +59,37 @@ rights may limit how you use the material.
For more details: For more details:
http://creativecommons.org/licenses/by/3.0/ http://creativecommons.org/licenses/by/3.0/
-----------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
Copyright (C) 2017 Napiophelios
Copyright (C) 2020 Extex101
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
ShareAlike — If you remix, transform, or build upon the material, you must distribute
your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by-sa/3.0/

View file

@ -12,9 +12,9 @@ Cotton Seed=Baumwollsamen
String=Faden String=Faden
Soil=Ackerboden Soil=Ackerboden
Wet Soil=Nasser Ackerboden Wet Soil=Nasser Ackerboden
Dry Soil=Trockener Ackerboden Savanna Soil=Savannenackerboden
Wet Dry Soil=Nasser trockener Ackerboden Wet Savanna Soil=Nasser Savannenackerboden
Desert Sand Soil=Wüsensandackerboden Desert Sand Soil=Wüstensandackerboden
Wet Desert Sand Soil=Nasser Wüstensandackerboden Wet Desert Sand Soil=Nasser Wüstensandackerboden
Straw=Stroh Straw=Stroh
Straw Stair=Strohtreppe Straw Stair=Strohtreppe
@ -23,3 +23,6 @@ Inner Straw Stair=Innere Strohtreppe
Outer Straw Stair=Äußere Strohtreppe Outer Straw Stair=Äußere Strohtreppe
Wheat=Weizen Wheat=Weizen
Cotton=Baumwolle Cotton=Baumwolle
Hoe=Hacke
Seed=Samen
Wild Cotton=Wilde Baumwolle

View file

@ -23,3 +23,4 @@ Inner Straw Stair=Escalera de paja interior
Outer Straw Stair=Escalera de paja exterior Outer Straw Stair=Escalera de paja exterior
Wheat=Trigo Wheat=Trigo
Cotton=Algodón Cotton=Algodón
Wild Cotton=Algodón silvestre

View file

@ -0,0 +1,28 @@
# textdomain: farming
Soil=Tanah Tanam
Wet Soil=Tanah Tanam Basah
Savanna Soil=Tanah Tanam Sabana
Wet Savanna Soil=Tanah Tanam Sabana Basah
Desert Sand Soil=Pasir Tanam Gurun
Wet Desert Sand Soil=Pasir Tanam Gurun Basah
Straw=Jerami
Straw Stair=Tangga Jerami
Inner Straw Stair=Tangga Jerami Dalam
Outer Straw Stair=Tangga Jerami Luar
Straw Slab=Lempengan Jerami
Wild Cotton=Kapas Liar
Wheat Seed=Benih Gandum
Wheat=Gandum
Flour=Tepung
Bread=Roti
Cotton Seed=Benih Kapas
Cotton=Kapas
String=Benang
Wooden Hoe=Cangkul Kayu
Stone Hoe=Cangkul Batu
Steel Hoe=Cangkul Baja
Bronze Hoe=Cangkul Perunggu
Mese Hoe=Cangkul Mese
Diamond Hoe=Cangkul Berlian
Hoe=Cangkul
Seed=Benih

View file

@ -1,10 +1,10 @@
# textdomain: farming # textdomain: farming
Wooden Hoe=木锄 Wooden Hoe=木锄
Stone Hoe=石锄 Stone Hoe=石锄
Steel Hoe=铁锄 Steel Hoe=铁锄
Bronze Hoe=青铜锄 Bronze Hoe=青铜锄
Mese Hoe=Mese锄 Mese Hoe=黄石锄头
Diamond Hoe=钻石锄 Diamond Hoe=钻石锄
Wheat Seed=小麦种子 Wheat Seed=小麦种子
Flour=面粉 Flour=面粉
Bread=面包 Bread=面包

View file

@ -0,0 +1,25 @@
# textdomain: farming
Wooden Hoe=木鋤頭
Stone Hoe=石鋤頭
Steel Hoe=鐵鋤頭
Bronze Hoe=青銅鋤頭
Mese Hoe=黃石鋤頭
Diamond Hoe=鑽石鋤頭
Wheat Seed=小麥種子
Flour=麵粉
Bread=麵包
Cotton Seed=棉花種子
String=線
Soil=土
Wet Soil=溼土
Dry Soil=乾土
Wet Dry Soil=溼乾土
Desert Sand Soil=沙漠沙土
Wet Desert Sand Soil=溼沙漠沙土
Straw=稻草
Straw Stair=稻草臺階
Inner Straw Stair=稻草內樓梯
Outer Straw Stair=稻草外樓梯
Straw Slab=稻草板
Wheat=小麥
Cotton=棉

View file

@ -1,19 +1,8 @@
# textdomain: farming # textdomain: farming
Wooden Hoe=
Stone Hoe=
Steel Hoe=
Bronze Hoe=
Mese Hoe=
Diamond Hoe=
Wheat Seed=
Flour=
Bread=
Cotton Seed=
String=
Soil= Soil=
Wet Soil= Wet Soil=
Dry Soil= Savanna Soil=
Wet Dry Soil= Wet Savanna Soil=
Desert Sand Soil= Desert Sand Soil=
Wet Desert Sand Soil= Wet Desert Sand Soil=
Straw= Straw=
@ -21,5 +10,19 @@ Straw Stair=
Inner Straw Stair= Inner Straw Stair=
Outer Straw Stair= Outer Straw Stair=
Straw Slab= Straw Slab=
Wild Cotton=
Wheat Seed=
Wheat= Wheat=
Flour=
Bread=
Cotton Seed=
Cotton= Cotton=
String=
Wooden Hoe=
Stone Hoe=
Steel Hoe=
Bronze Hoe=
Mese Hoe=
Diamond Hoe=
Hoe=
Seed=

View file

@ -1,3 +1,4 @@
name = farming name = farming
description = Minetest Game mod: farming description = Minetest Game mod: farming
depends = default, wool, stairs depends = default, wool, stairs
optional_depends = dungeon_loot

View file

@ -86,7 +86,7 @@ minetest.register_node("farming:soil_wet", {
}) })
minetest.register_node("farming:dry_soil", { minetest.register_node("farming:dry_soil", {
description = S("Dry Soil"), description = S("Savanna Soil"),
tiles = {"default_dry_dirt.png^farming_soil.png", "default_dry_dirt.png"}, tiles = {"default_dry_dirt.png^farming_soil.png", "default_dry_dirt.png"},
drop = "default:dry_dirt", drop = "default:dry_dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1},
@ -99,7 +99,7 @@ minetest.register_node("farming:dry_soil", {
}) })
minetest.register_node("farming:dry_soil_wet", { minetest.register_node("farming:dry_soil_wet", {
description = S("Wet Dry Soil"), description = S("Wet Savanna Soil"),
tiles = {"default_dry_dirt.png^farming_soil_wet.png", "default_dry_dirt.png^farming_soil_wet_side.png"}, tiles = {"default_dry_dirt.png^farming_soil_wet.png", "default_dry_dirt.png^farming_soil_wet_side.png"},
drop = "default:dry_dirt", drop = "default:dry_dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1},
@ -153,6 +153,13 @@ minetest.register_node("farming:straw", {
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
}) })
-- Registered before the stairs so the stairs get fuel recipes.
minetest.register_craft({
type = "fuel",
recipe = "farming:straw",
burntime = 3,
})
do do
local recipe = "farming:straw" local recipe = "farming:straw"
local groups = {snappy = 3, flammable = 4} local groups = {snappy = 3, flammable = 4}
@ -223,6 +230,8 @@ minetest.register_abm({
}) })
-- Make default:grass_* occasionally drop wheat seed
for i = 1, 5 do for i = 1, 5 do
minetest.override_item("default:grass_"..i, {drop = { minetest.override_item("default:grass_"..i, {drop = {
max_items = 1, max_items = 1,
@ -233,6 +242,14 @@ for i = 1, 5 do
}}) }})
end end
-- Make default:junglegrass occasionally drop cotton seed.
-- This is the old source of cotton seeds that makes no sense. It is a leftover
-- from Mapgen V6 where junglegrass was the only plant available to be a source.
-- This source is kept for now to avoid disruption but should probably be
-- removed in future as players get used to the new source.
minetest.override_item("default:junglegrass", {drop = { minetest.override_item("default:junglegrass", {drop = {
max_items = 1, max_items = 1,
items = { items = {
@ -240,3 +257,26 @@ minetest.override_item("default:junglegrass", {drop = {
{items = {"default:junglegrass"}}, {items = {"default:junglegrass"}},
} }
}}) }})
-- Wild cotton as a source of cotton seed
minetest.register_node("farming:cotton_wild", {
description = S("Wild Cotton"),
drawtype = "plantlike",
waving = 1,
tiles = {"farming_cotton_wild.png"},
inventory_image = "farming_cotton_wild.png",
wield_image = "farming_cotton_wild.png",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
buildable_to = true,
groups = {snappy = 3, attached_node = 1, flammable = 4},
drop = "farming:seed_cotton",
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-6 / 16, -8 / 16, -6 / 16, 6 / 16, 5 / 16, 6 / 16},
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

View file

@ -1,15 +1,12 @@
-- fire/init.lua -- fire/init.lua
-- Global namespace for functions -- Global namespace for functions
fire = {} fire = {}
-- Load support for MT game translation. -- Load support for MT game translation.
local S = minetest.get_translator("fire") local S = minetest.get_translator("fire")
-- 'Enable fire' setting -- 'Enable fire' setting
local fire_enabled = minetest.settings:get_bool("enable_fire") local fire_enabled = minetest.settings:get_bool("enable_fire")
if fire_enabled == nil then if fire_enabled == nil then
-- enable_fire setting not specified, check for disable_fire -- enable_fire setting not specified, check for disable_fire
@ -27,33 +24,27 @@ end
-- --
-- Flood flame function -- Flood flame function
local function flood_flame(pos, _, newnode)
local function flood_flame(pos, oldnode, newnode)
-- Play flame extinguish sound if liquid is not an 'igniter' -- Play flame extinguish sound if liquid is not an 'igniter'
local nodedef = minetest.registered_items[newnode.name] if minetest.get_item_group(newnode.name, "igniter") == 0 then
if not (nodedef and nodedef.groups and
nodedef.groups.igniter and nodedef.groups.igniter > 0) then
minetest.sound_play("fire_extinguish_flame", minetest.sound_play("fire_extinguish_flame",
{pos = pos, max_hear_distance = 16, gain = 0.15}) {pos = pos, max_hear_distance = 16, gain = 0.15}, true)
end end
-- Remove the flame -- Remove the flame
return false return false
end end
-- Flame nodes -- Flame nodes
local fire_node = {
minetest.register_node("fire:basic_flame", {
drawtype = "firelike", drawtype = "firelike",
tiles = { tiles = {{
{
name = "fire_basic_flame_animated.png", name = "fire_basic_flame_animated.png",
animation = { animation = {
type = "vertical_frames", type = "vertical_frames",
aspect_w = 16, aspect_w = 16,
aspect_h = 16, aspect_h = 16,
length = 1 length = 1
}, }}
},
}, },
inventory_image = "fire_basic_flame.png", inventory_image = "fire_basic_flame.png",
paramtype = "light", paramtype = "light",
@ -63,61 +54,36 @@ minetest.register_node("fire:basic_flame", {
sunlight_propagates = true, sunlight_propagates = true,
floodable = true, floodable = true,
damage_per_second = 4, damage_per_second = 4,
groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1}, groups = {igniter = 2, dig_immediate = 3, fire = 1},
drop = "", drop = "",
on_flood = flood_flame
}
on_timer = function(pos) -- Basic flame node
local f = minetest.find_node_near(pos, 1, {"group:flammable"}) local flame_fire_node = table.copy(fire_node)
if not fire_enabled or not f then flame_fire_node.description = S("Fire")
flame_fire_node.groups.not_in_creative_inventory = 1
flame_fire_node.on_timer = function(pos)
if not minetest.find_node_near(pos, 1, {"group:flammable"}) then
minetest.remove_node(pos) minetest.remove_node(pos)
return return
end end
-- Restart timer -- Restart timer
return true return true
end, end
flame_fire_node.on_construct = function(pos)
on_construct = function(pos)
if not fire_enabled then
minetest.remove_node(pos)
else
minetest.get_node_timer(pos):start(math.random(30, 60)) minetest.get_node_timer(pos):start(math.random(30, 60))
end end
end,
on_flood = flood_flame, minetest.register_node("fire:basic_flame", flame_fire_node)
})
minetest.register_node("fire:permanent_flame", { -- Permanent flame node
description = S("Permanent Flame"), local permanent_fire_node = table.copy(fire_node)
drawtype = "firelike", permanent_fire_node.description = S("Permanent Fire")
tiles = {
{
name = "fire_basic_flame_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
},
},
inventory_image = "fire_basic_flame.png",
paramtype = "light",
light_source = 13,
walkable = false,
buildable_to = true,
sunlight_propagates = true,
floodable = true,
damage_per_second = 4,
groups = {igniter = 2, dig_immediate = 3},
drop = "",
on_flood = flood_flame, minetest.register_node("fire:permanent_flame", permanent_fire_node)
})
-- Flint and steel
-- Flint and Steel
minetest.register_tool("fire:flint_and_steel", { minetest.register_tool("fire:flint_and_steel", {
description = S("Flint and Steel"), description = S("Flint and Steel"),
inventory_image = "fire_flint_steel.png", inventory_image = "fire_flint_steel.png",
@ -125,10 +91,8 @@ minetest.register_tool("fire:flint_and_steel", {
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
local sound_pos = pointed_thing.above or user:get_pos() local sound_pos = pointed_thing.above or user:get_pos()
minetest.sound_play( minetest.sound_play("fire_flint_and_steel",
"fire_flint_and_steel", {pos = sound_pos, gain = 0.5, max_hear_distance = 8}, true)
{pos = sound_pos, gain = 0.5, max_hear_distance = 8}
)
local player_name = user:get_player_name() local player_name = user:get_player_name()
if pointed_thing.type == "node" then if pointed_thing.type == "node" then
local node_under = minetest.get_node(pointed_thing.under).name local node_under = minetest.get_node(pointed_thing.under).name
@ -152,9 +116,11 @@ minetest.register_tool("fire:flint_and_steel", {
-- Wear tool -- Wear tool
local wdef = itemstack:get_definition() local wdef = itemstack:get_definition()
itemstack:add_wear(1000) itemstack:add_wear(1000)
-- Tool break sound -- Tool break sound
if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks, {pos = sound_pos, gain = 0.5}) minetest.sound_play(wdef.sound.breaks,
{pos = sound_pos, gain = 0.5}, true)
end end
return itemstack return itemstack
end end
@ -168,23 +134,21 @@ minetest.register_craft({
} }
}) })
-- Override coalblock to enable permanent flame above -- Override coalblock to enable permanent flame above
-- Coalblock is non-flammable to avoid unwanted basic_flame nodes -- Coalblock is non-flammable to avoid unwanted basic_flame nodes
minetest.override_item("default:coalblock", { minetest.override_item("default:coalblock", {
after_destruct = function(pos, oldnode) after_destruct = function(pos)
pos.y = pos.y + 1 pos.y = pos.y + 1
if minetest.get_node(pos).name == "fire:permanent_flame" then if minetest.get_node(pos).name == "fire:permanent_flame" then
minetest.remove_node(pos) minetest.remove_node(pos)
end end
end, end,
on_ignite = function(pos, igniter) on_ignite = function(pos)
local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
if minetest.get_node(flame_pos).name == "air" then if minetest.get_node(flame_pos).name == "air" then
minetest.set_node(flame_pos, {name = "fire:permanent_flame"}) minetest.set_node(flame_pos, {name = "fire:permanent_flame"})
end end
end, end
}) })
@ -192,24 +156,18 @@ minetest.override_item("default:coalblock", {
-- Sound -- Sound
-- --
local flame_sound = minetest.settings:get_bool("flame_sound")
if flame_sound == nil then
-- Enable if no setting present -- Enable if no setting present
flame_sound = true local flame_sound = minetest.settings:get_bool("flame_sound", true)
end
if flame_sound then if flame_sound then
local handles = {} local handles = {}
local timer = 0 local timer = 0
-- Parameters -- Parameters
local radius = 8 -- Flame node search radius around player local radius = 8 -- Flame node search radius around player
local cycle = 3 -- Cycle time for sound updates local cycle = 3 -- Cycle time for sound updates
-- Update sound for player -- Update sound for player
function fire.update_player_sound(player) function fire.update_player_sound(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
-- Search for flame nodes in radius around player -- Search for flame nodes in radius around player
@ -261,16 +219,13 @@ if flame_sound then
fposmid = vector.divide(vector.add(fposmin, fposmax), 2) fposmid = vector.divide(vector.add(fposmin, fposmax), 2)
end end
-- Play sound -- Play sound
local handle = minetest.sound_play( local handle = minetest.sound_play("fire_fire", {
"fire_fire",
{
pos = fposmid, pos = fposmid,
to_player = player_name, to_player = player_name,
gain = math.min(0.06 * (1 + flames * 0.125), 0.18), gain = math.min(0.06 * (1 + flames * 0.125), 0.18),
max_hear_distance = 32, max_hear_distance = 32,
loop = true, -- In case of lag loop = true -- In case of lag
} })
)
-- Store sound handle for this player -- Store sound handle for this player
if handle then if handle then
handles[player_name] = handle handles[player_name] = handle
@ -279,7 +234,6 @@ if flame_sound then
end end
-- Cycle for updating players sounds -- Cycle for updating players sounds
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
timer = timer + dtime timer = timer + dtime
if timer < cycle then if timer < cycle then
@ -294,7 +248,6 @@ if flame_sound then
end) end)
-- Stop sound and clear handle on player leave -- Stop sound and clear handle on player leave
minetest.register_on_leaveplayer(function(player) minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
if handles[player_name] then if handles[player_name] then
@ -306,19 +259,14 @@ end
-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it -- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it
function fire.update_sounds_around() end
function fire.update_sounds_around(pos)
end
-- --
-- ABMs -- ABMs
-- --
if fire_enabled then if fire_enabled then
-- Ignite neighboring nodes, add basic flames -- Ignite neighboring nodes, add basic flames
minetest.register_abm({ minetest.register_abm({
label = "Ignite flame", label = "Ignite flame",
nodenames = {"group:flammable"}, nodenames = {"group:flammable"},
@ -331,11 +279,10 @@ if fire_enabled then
if p then if p then
minetest.set_node(p, {name = "fire:basic_flame"}) minetest.set_node(p, {name = "fire:basic_flame"})
end end
end, end
}) })
-- Remove flammable nodes around basic flame -- Remove flammable nodes around basic flame
minetest.register_abm({ minetest.register_abm({
label = "Remove flammable nodes", label = "Remove flammable nodes",
nodenames = {"fire:basic_flame"}, nodenames = {"fire:basic_flame"},
@ -356,7 +303,6 @@ if fire_enabled then
minetest.remove_node(p) minetest.remove_node(p)
minetest.check_for_falling(p) minetest.check_for_falling(p)
end end
end, end
}) })
end end

View file

@ -1,3 +1,4 @@
# textdomain: fire # textdomain: fire
Permanent Flame=Permanente Flamme Fire=Feuer
Permanent Fire=Permanentes Feuer
Flint and Steel=Feuerstein und Stahl Flint and Steel=Feuerstein und Stahl

View file

@ -0,0 +1,4 @@
# textdomain: fire
Fire=Api
Permanent Fire=Api Abadi
Flint and Steel=Pemantik

Some files were not shown because too many files have changed in this diff Show more